上溢和下溢
定义
- 下溢指接近零的数被四舍五入为零后作为分母,求对数等,有些软件会抛出异常,有些会分会NaN做占位符
- 上溢指计算出的数字接近无穷,进一步计算会导致出现非数字
解决方法
- softmax函数
s
o
f
t
m
a
x
(
x
)
=
e
x
p
(
x
i
)
/
∑
e
x
p
(
x
i
)
softmax(x) = exp(x_i)/∑exp(x_i)
softmax(x)=exp(xi)/∑exp(xi)
使用该函数并不能完全避免上下溢,但可以用来做一个数值稳定
病态条件
定义
- (神经网络中的)条件数:函数相对于输入的微小变化而变化的快慢程度
- 考虑函数 f ( x ) = A − 1 x f(x) = A^{-1}x f(x)=A−1x,当 A ∈ R n × n A \in R^{n \times n} A∈Rn×n具有特征值分解时,其条件数为 max i , j ∣ λ i λ j ∣ \max \limits_{i, j} \left| \frac{\lambda_i}{\lambda_j} \right| i,jmax∣∣∣λjλi∣∣∣, 即 ∣ λ m a x λ m i n ∣ \left| \frac{\lambda_{max}}{\lambda_{min}} \right| ∣∣∣λminλmax∣∣∣。条件数越大,该函数越病态,即矩阵求逆对输入的误差越敏感。
示例
- 病态程度高:
[
10000
2
0
1
]
x
=
[
10000
10000
]
\begin{bmatrix} 10000 &2\\ 0& 1 \end{bmatrix} x = \begin{bmatrix} 10000\\ 10000 \end{bmatrix}
[10000021]x=[1000010000]
特征值10000和1,条件数10000
解得
x
1
=
−
10000
,
x
2
=
10000
x_1=-10000,x_2=10000
x1=−10000,x2=10000
轻微扰动后
[
10000
2
0
2
]
x
=
[
10000
10000
]
\begin{bmatrix} 10000 &2\\ 0& 2 \end{bmatrix} x = \begin{bmatrix} 10000\\ 10000 \end{bmatrix}
[10000022]x=[1000010000]
解得
x
1
=
0
,
x
2
=
5000
x_1=0,x_2=5000
x1=0,x2=5000
可见差别巨大
- 病态程度低:
[
10
2
0
5
]
x
=
[
100
100
]
\begin{bmatrix} 10 &2\\ 0& 5 \end{bmatrix} x = \begin{bmatrix} 100\\ 100 \end{bmatrix}
[10025]x=[100100]
特征值10和1,条件数2
解得
x
1
=
6
,
x
2
=
20
x_1=6,x_2=20
x1=6,x2=20
轻微扰动后
[
10
2
0
4
]
x
=
[
100
100
]
\begin{bmatrix} 10 &2\\ 0& 4 \end{bmatrix} x = \begin{bmatrix} 100\\ 100 \end{bmatrix}
[10024]x=[100100]
解得
x
1
=
5
,
x
2
=
25
x_1=5,x_2=25
x1=5,x2=25
基于梯度的优化方法
梯度下降法
- 梯度下降法的思想较为简单,且在网络上有详细的介绍,在此不做赘述,一篇文章。
- 梯度下降法中学习率α的选取,普遍的方式是选择一个小常数,更好的方法是选取几个常数进行计算,在其中有策略的挑选出最优参数,这种策略被称为线搜索。
- 值得注意的是,梯度下降法被限制在连续空间,但其迭代的概念可以推广到离散空间。其中,递增且带有离散参数的目标函数成为爬山算法。
梯度之上的雅可比矩阵和海森矩阵
雅可比(Jacobin)矩阵
- 输入和输出都是向量的函数的所有偏导数.
- J i , j = ∂ ∂ x j f ( x ) i J_{i,j} = \frac{\partial}{\partial x_j} f(x)_i Ji,j=∂xj∂f(x)i
海森(hessian)矩阵
- 二阶导数的矩阵,等价于梯度的雅可比矩阵
- H ( f ) ( x ) i , j = ∂ 2 ∂ x i ∂ y j f ( x ) H(f)(x)_{i,j} = \frac{\partial^2}{\partial x_i \partial y_j}f(x) H(f)(x)i,j=∂xi∂yj∂2f(x)
应用
寻找最优学习率
- 泰勒展开式
f ( x ) = f ( x ( 0 ) ) + ( x − x ( 0 ) ) ⊤ g + 1 2 ( x − x ( 0 ) ) ⊤ H ( x − x ( 0 ) ) f(x) = f(x^{(0)}) + (x-x^{(0)})^\top g + \frac{1}{2}(x-x^{(0)})^\top H(x-x^{(0)}) f(x)=f(x(0))+(x−x(0))⊤g+21(x−x(0))⊤H(x−x(0))
其中g是 f ( x ) f(x) f(x)的一阶梯度,H是 f ( x ) f(x) f(x)的二阶海森矩阵。使用学习率 ϵ \epsilon ϵ,则下一步迭代所使用的点 x = x ( 0 ) − ϵ g x = x^{(0)} - \epsilon g x=x(0)−ϵg,代入泰勒展式,得
f ( x ( 0 ) − ϵ g ) = f ( x ( 0 ) ) − ϵ g ⊤ g + 1 2 ϵ 2 g ⊤ H g f(x^{(0)} - \epsilon g) = f(x^{(0)}) - \epsilon g^\top g + \frac{1}{2}\epsilon^2g^\top Hg f(x(0)−ϵg)=f(x(0))−ϵg⊤g+21ϵ2g⊤Hg
现更改变量(变分法)为 ϵ \epsilon ϵ,则 f ( x ( 0 ) − ϵ g ) f(x^{(0)} - \epsilon g) f(x(0)−ϵg)的最小值一阶导数的零点,故最优步长为
ϵ ∗ = g ⊤ g g ⊤ H g \epsilon^* = \frac{g^\top g}{g^\top Hg} ϵ∗=g⊤Hgg⊤g
在最坏的情况下, g g g与 H H H的最大特征值 λ m a x \lambda_{max} λmax对应的特征向量对齐,则最优步长是 1 λ m a x \frac{1}{\lambda_{max}} λmax1
然而,当海森矩阵的条件数很差时,即病态程度较高时,梯度下降法的迭代速度会很慢,如下图所示,在最大特征值所对应的特征向量方向上浪费太多时间。因此可以利用海森矩阵的性质预测下一步迭代是否是一个有前途的方向。
- 牛顿法
由泰勒展开式对
x
x
x求导,可得
f
′
(
x
)
=
g
+
H
(
x
−
x
(
0
)
)
f'(x) = g + H(x-x^{(0)})
f′(x)=g+H(x−x(0))
另
f
′
(
x
)
=
0
f'(x) = 0
f′(x)=0,可得
x
∗
=
x
(
0
)
−
H
−
1
g
x^* = x^{(0)} - H^{-1}g
x∗=x(0)−H−1g
当f是一个正定二次函数时,牛顿法只需要一次迭代就能直接跳到最优点,相反则需要多次迭代。
- 优化算法
仅使用一阶梯度的优化算法成为一阶优化算法
使用海森矩阵的优化算法称为二阶最优化算法,如牛顿法