神经网络与深度学习-性能优化
1. 动量法
1.1. 病态曲率
SGD问题: 病态曲率
图为损失函数轮廓。在进入以蓝色标记的山沟状区域之前随机开始。颜色实际上表示损失函数在特定点处的值有多大,红色表示最大值,蓝色表示最小值。我们想要达到最小值点,为此但需要我们穿过山沟。这个区域就是所谓的病态曲率
梯度下降沿着山沟的山脊反弹,向极小的方向移动较慢。这是因为脊的表面在W1方向上弯曲得更陡峭
1.2. 动量法
- 如果把原始的 SGD 想象成一个纸团在重力作用向下滚动,由于质量小受到山壁弹力的干扰大,导致来回震荡;或者在鞍点处因为质量小速度很快减为 0,导致无法离开这块平地。
- 动量方法相当于把纸团换成了铁球;不容易受到外力的干扰,轨迹更加稳定;同时因为在鞍点处因为惯性的作用,更有可能离开平地
动量法更新公式: v t = α v t − 1 − ϵ g t Δ θ ← v t θ t + 1 ← θ t + Δ θ \begin{aligned} & v_t=\alpha v_{t-1}-\epsilon g_t \\ & \Delta \theta \leftarrow v_t \\ & \theta_{t+1} \leftarrow \theta_t+\Delta \theta \end{aligned} vt=αvt−1−ϵgtΔθ←vtθt+1←θt+Δθ
动量法效果比较
2. 自适应梯度算法
2.1. AdaGrad
Adaptive Gradient:自适应梯度
- 参数自适应变化:具有较大偏导的参数相应有一个较大的学习率,而具有小偏导的参数则对应一个较小的学习率
- 具体来说,每个参数的学习率会缩放各参数反比于其历史梯度平方值总和的平方根
AdaGrad问题:
- 学习率是单调递减的,训练后期学习率过小会导致训练困难,甚至提前结束
- 需要设置一个全局的初始学习率
2.2. RMSProp
RMSProp: Root Mean Square Prop
- RMSProp 解决 AdaGrad 方法中学习率过度衰减的问题
- RMSProp 使用指数衰减平均以丢弃遥远的历史,使其能够快速收敛;此外,RMSProp 还加入了超参数 𝜌 控制衰减速率
- 具体来说(对比 AdaGrad 的算法描述),即修改
r
r
r为:
r
←
E
[
g
2
]
t
=
ρ
⋅
E
[
g
2
]
t
−
1
+
(
1
−
ρ
)
⋅
g
2
r \leftarrow \mathbb{E}\left[g^2\right]_t=\rho \cdot \mathbb{E}\left[g^2\right]_{t-1}+(1-\rho) \cdot g^2
r←E[g2]t=ρ⋅E[g2]t−1+(1−ρ)⋅g2
记: R M S [ g ] t = E [ g 2 ] t + δ R M S[g]_t=\sqrt{\mathbb{E}\left[g^2\right]_t+\delta} RMS[g]t=E[g2]t+δ
则: Δ θ t = − ϵ R M S [ g ] t ⊙ g t \Delta \theta_t=-\frac{\epsilon}{R M S[g]_t} \odot g_t Δθt=−RMS[g]tϵ⊙gt
RMSProp算法:
2.3. Adam
Adam算法:
- Adam 在 RMSProp 方法的基础上更进一步
- 除了加入历史梯度平方的指数衰减平均(𝑟)外
- 还保留了历史梯度的指数衰减平均(𝑠),相当于动量
- Adam 行为就像一个带有摩擦力的小球,在误差面上倾向于平坦的极小值
3. 性能优化问题描述
3.1. 待解决问题
待解决问题:
权值𝐰取何值,指标函数𝐽(𝐰)最小?
恰恰是最优化方法中的基本问题:函数最小化
进一步,我们希望建立迭代形式,并且形式尽量简单,类似基本BP算法(最速梯度法): w k + 1 = w k + α k p k w_{k+1}=w_k+\alpha_kp_k wk+1=wk+αkpk如何选取 α k , p k \alpha_k,p_k αk,pk构成优化核心内容
3.2. 基本思想
考虑函数 f ( x ) f(x) f(x), 在某点 x ∗ x^* x∗上进行Taylor展开, f ( x ) = f ( x ∗ ) + d f d x ∣ x = x ∗ Δ x + 1 2 d 2 f d x 2 ∣ x = x ∗ ( Δ x ) 2 + ⋯ f(x)=f\left(x^*\right)+\left.\frac{d f}{d x}\right|_{x=x^*} \Delta x+\left.\frac{1}{2} \frac{d^2 f}{d x^2}\right|_{x=x^*}(\Delta x)^2+\cdots f(x)=f(x∗)+dxdf x=x∗Δx+21dx2d2f x=x∗(Δx)2+⋯考虑函数 f ( x ) f(x) f(x),在某点 x ∗ x^* x∗展开,类似的,有: f ( x ) = f ( x ∗ ) + [ d f d x ] T ∣ ( x = x ∗ ) Δ x + 1 2 ( Δ x ) T H ( x ∗ ) ( Δ x ) + ⋯ f(\mathbf{x})=f\left(\mathbf{x}^*\right)+\left.\left[\frac{d f}{d x}\right]^{\mathrm{T}}\right|_{\left(\mathbf{x}=\mathbf{x}^*\right)} \Delta \mathbf{x}+\frac{1}{2}(\Delta \mathbf{x})^{\mathrm{T}} H\left(\mathbf{x}^*\right)(\Delta \mathbf{x})+\cdots f(x)=f(x∗)+[dxdf]T (x=x∗)Δx+21(Δx)TH(x∗)(Δx)+⋯
二次展开在邻域内已较精确;因此我们后面将主要围绕二次型进行讨论
- 全局极小点, 局部极小点
- 一阶条件:必要条件 ∇ f ( x ∗ ) = 0 \nabla f(x^*)=0 ∇f(x∗)=0(驻点)
- 二阶条件:充分条件 H H H半正定
- 鞍点:沿某方向是极大值点,沿另一方向是极小值
F
(
x
)
=
(
x
1
2
−
1.5
x
1
x
2
+
2
x
2
2
)
x
1
2
F(x)=(x_1^2-1.5x_1x_2+2x_2^2)x_1^2
F(x)=(x12−1.5x1x2+2x22)x12
- 前面讲述:二次型近似任意函数
- 进一步 :某一算法是有效的<->对二次型应该有好的效果
- 所以:下面一般以二次型函数为例进行优化
4. 二阶算法
4.1. 牛顿法
对于二次型,有:
f
(
w
k
+
1
)
=
f
(
w
k
)
+
g
k
T
Δ
w
k
+
1
2
(
Δ
w
)
T
A
k
(
Δ
w
)
+
⋯
f\left(\mathbf{w}_{k+1}\right)=f\left(\mathbf{w}_k\right)+\mathbf{g}_k^{\mathrm{T}} \Delta \mathbf{w}_k+\frac{1}{2}(\Delta \mathbf{w})^{\mathrm{T}} A_k(\Delta \mathbf{w})+\cdots
f(wk+1)=f(wk)+gkTΔwk+21(Δw)TAk(Δw)+⋯
为求得
w
k
=
?
w_k=?
wk=?,
f
f
f最小,根据
d
f
d
Δ
w
k
=
0
\frac{df}{d\varDelta w_k}=0
dΔwkdf=0
有: g k + A k Δ w k = 0 g_k+A_k\varDelta w_k=0 gk+AkΔwk=0
最终得到: w k + 1 = w k − A k − 1 g k w_{k+1}=w_k-A^{-1}_kg_k wk+1=wk−Ak−1gk
问题: 二次导数项(Hessian矩阵)求逆
常规梯度:
4.2. 其他二阶算法
- 高斯-牛顿法
- Levenberg-Marquardt算法
5. 常用技巧
模型初始化:
简单的考虑,把所有权值在 [ − 1 , 1 ] [-1,1] [−1,1]区间内按均值或高斯分布进行初始化
Xavier初始化:为了使得网络中信息更好的流动,每一层输出的方差应该尽量相等。因此需要实现下面的均匀分布:
W
∼
U
[
−
6
n
j
+
n
j
+
1
,
6
n
j
+
n
j
+
1
]
W \sim U\left[-\frac{\sqrt{6}}{\sqrt{n_{j}+n_{j+1}}}, \frac{\sqrt{6}}{\sqrt{n_{j}+n_{j+1}}}\right]
W∼U[−nj+nj+16,nj+nj+16]
训练数据与测试数据:
数据包括:
- 训练数据
- 验证数据
- 测试数据
通常三者的比例为 70 % , 15 % , 15 % 70\%,15\%,15\% 70%,15%,15%或 60 , 20 , 20 60,20,20 60,20,20
当数据很多时,训练和验证数据可适当减少
训练数据与测试数据:𝐾折交叉验证
原始训练数据被分成 K K K个不重叠的子集。 然后执行 K K K次模型训练和验证,每次在 K − 1 K−1 K−1个子集上进行训练, 并在剩余的一个子集(在该轮中没有用于训练的子集)上进行验证。 最后,通过对 K K K次实验的结果取平均来估计训练和验证误差
欠拟合与过拟合:
- 欠拟合:误差一直比较大
- 过拟合:在训练数据集上误差小而在测试数据集上误差大
权重衰减 (𝐿2正则化)
为防止过拟合和权值震荡,加入新的指标函数项: J ( w ) + λ 2 ∣ ∣ w ∣ ∣ 2 J(w)+\frac{\lambda}{2}||w||^2 J(w)+2λ∣∣w∣∣2第二项约束了权值不能过大。在梯度下降时,导数容易计算: J ( w ) d w + λ w \frac{J(w)}{dw}+\lambda w dwJ(w)+λw
Dropout(暂退)
在整个训练过程的每一次迭代中,标准暂退法包括在计算下一层之前将当前层中的一些节点置零
模型初始化:
简单的考虑,把所有权值在[-1,1]区间内按均值或高斯分布进行初始化。
Xavier初始化:为了使得网络中信息更好的流动,每一层输出的方差应该尽量相等。因此需要实现下面的均匀分布: W ∼ U [ − 6 n j + n j + 1 , 6 n j + n j + 1 ] W \sim U\left[-\frac{\sqrt{6}}{\sqrt{n_j+n_{j+1}}}, \frac{\sqrt{6}}{\sqrt{n_j+n_{j+1}}}\right] W∼U[−nj+nj+16,nj+nj+16]
6. 总结
- 动量法可有效改善收敛速度,以及避免一些陷入局部极小值
- AdaGrad及Adam等算法可自适应调节学习速率,加速收敛