如果神经网络训练不起来(优化失败)怎么办。。。
一、判断局部最小值与鞍点
为什么会优化失败?
优化失败即损失没有办法再下降,有两种可能的情况:
- 训练时loss达不到足够小
- loss一直就无法下降
原因如下:
- 参数对loss的微分趋于0,训练卡在了 驻点 => 无法更新参数:
- 局部最小值
- 鞍点(saddle point)
因此需要鉴别到底是局部最小值还是鞍点,以便分别处理问题。
参考Taylor展开式(展开到二阶),将其变为矩阵的形式 ⇒ 黑塞矩阵(Hessian Matrix)1:
走到驻点,意味着一阶导数(绿色的这一项)为0,只剩下红色的二阶:
L
(
θ
)
≈
L
(
θ
′
)
+
1
2
(
θ
−
θ
′
)
T
H
(
θ
−
θ
′
)
L(\theta)≈L(\theta')+\frac{1}{2}(\theta-\theta')^TH(\theta-\theta')
L(θ)≈L(θ′)+21(θ−θ′)TH(θ−θ′)
其中,
(
θ
−
θ
′
)
T
H
(
θ
−
θ
′
)
(\theta-\theta')^TH(\theta-\theta')
(θ−θ′)TH(θ−θ′) 可写作向量形式
v
T
H
v
v^THv
vTHv. 现有如下情况:
结论:算出黑塞矩阵,判断其特征值大小
特征值大小 | 结果 |
---|---|
正 | 局部最小值 |
负 | 局部最大值 |
有正有负 | 鞍点 |
局部最小值和鞍点谁更常见?
- 从最小比率的分布看出,只有一半的特征值是正的,一半是负的,代表着在所有纬度上,还有一半的程度可以让损失下降。
- 从经验上看起来, 局部最小值并不常见
二、批次与动量
1. 批次(batch)
- 实际上在计算微分的时候,并不是对所有数据算出来的损失函数 L L L 做微分,而是把所有的数据分成一个一个的 batch 来计算,这里把其中一个 batch 记作 B i B_i Bi。
- 每次在更新参数的时候,是先计算 B 1 B_1 B1 的 L o s s Loss Loss、梯度,然后更新参数;再计算 B 2 B_2 B2的 L o s s Loss Loss、梯度,然后更新参数,…,以此类推。
- 1 epoch:把所有的 batch 都计算一轮次。每次epoch之后,需要重新 打乱(shuffle) 数据,再进行计算。
为什么训练的时候要使用 batch ?
大小批次比较:
- batch 是一个超参数2,需要我们自行调参
- 用大的batch size做训练,使用并行运算增加效率,同时能得到好的结果是有可能的
2. 动量(Momentum)
- 在物理世界,现象一个球从高坡滚下,Loss的大小看作山坡的海拔。
- 由于重力的作用,球会从高出滚下;由于惯性,当球滚到坑中(如局部最小值)时,若它的动量够大,会摆脱坑的束缚,继续下滑:
- 因此球不会被驻点卡住
梯度下降 + 动量
移动方向 = 梯度的反方向 + 上一步移动的方向
三、自动调整学习率
背景
随着训练次数的增加,loss越来越小,最后“卡住”了(loss不再下降),没法更新参数。此时,真的是因为梯度很小导致的吗?并不是,而是走到了一个临界点(critical point)处:
学习率可调整步伐的大小,它要为每一个参数“定制”(不同参数需不同学习率)
学习率的自动调整
在 《李宏毅机器学习》Task 3 中,一种自动调整学习率的算法为 Adagrad 算法,其参数调整方法为:
θ
i
t
+
1
←
θ
i
t
−
η
σ
i
t
g
i
t
\theta_i^{t+1} \leftarrow \theta_i^t-\frac{\eta}{\sigma_i^t}g_i^t
θit+1←θit−σitηgit
- g i t g_i^t git 为第 t 次迭代的梯度: ∂ L ∂ θ i ∣ θ = θ t \frac{\partial L}{\partial \theta_i}|_{\theta=\theta_t} ∂θi∂L∣θ=θt
- η σ i t \frac{\eta}{\sigma_i^t} σitη 取决于参数 θ i \theta_i θi
斜率 | 学习率 |
---|---|
大 | 小 |
小 | 大 |
对于同一个参数,同一个方向,我们也期望学习率能动态调整,这就引出 RMSProp 算法
RMSProp 算法
步骤:
Adam算法3:RMSProp + Momentum
Learning Rate Scheduling
- 将上面的学习率 η \eta η 变为与时间 t t t 有关 η t \eta^t ηt
- 最常见的策略是 学习率衰减(Learning Rate Decay)
- 随着参数的更新,我们距离终点越来越近,于是减小参数更新的步伐
- 随着参数的更新,我们距离终点越来越近,于是减小参数更新的步伐
- 另一个策略是 学习率预热(Warm up):
- 学习率先变大,后变小
- 先搜集有关 σ \sigma σ的统计数据,等统计得比较精准以后,再让学习率慢慢变大
- 例如:残差网络(Residual Network) 4
本优化总结:
四、损失函数的影响
回归与分类
- softmax函数的作用就是将
y
y
y 的值转换为0到1之间
示例:分类的损失函数 Cross-entropy
- Softmax内嵌于 cross-entropy 。当使用了cross-entropy这个损失函数的时候,其自动将Softmax加到网络的最后一层。
为什么 cross-entropy 比较好?
- 现在我们做三个分类,Network先输出y1, y2, y3,再通过softmax产生y1’, y2’, y3’。假设正确答案是 ( 1 , 0 , 0 ) T (1, 0, 0)^T (1,0,0)T,用 e e e 表示该向量与预测值 y i ′ y_i' yi′的距离。
- 假设y1和y2的范围为[-10, 10],y3固定为-1000
如上图所示,y1>y2时,损失较小。
- 假设开始为左上方
- 若选择Cross-entropy,这里是有斜率的,因此能通过梯度下降往右下方走
- 若选择Mean Square Error,则一开始就卡住了——梯度趋于0,且距离目标远
上述例子说明,就算是损失函数的定义都可能影响训练是否容易。
五、批标准化
在《李宏毅机器学习》Task 3 的特征缩放中学过,若输入的两个特征的范围相差很大,那么在平面直角坐标系中展现的等高线是一个椭圆,即产生了一个不同方向、斜率坡度非常不同的 误差曲面(error surface)。
如果我们有方法让特征中不同的纬度有相同的数值范围,那么我们可能制造一个比较好的误差曲面,让训练变得更容易一些。对于此有很多不同的方法,其统称为 批标准化(Batch Normalization)5。
课程中所讲的方法只是批标准化的一种可能性。
1. 训练部分
- 三个独立的变量相互关联变成了一个大的网络
- 实际在做的时候,不会让网络考虑整个训练集的所有例子,只会让其考虑一个batch里面的例子——批标准化(Batch Normalization)
现在加上一个步骤对
z
~
\widetilde z
z
进行处理,
β
\beta
β和
γ
\gamma
γ作为参数,是另外被学习出来的。当该层输出为0时,若我们不想让其输出平均为0,则可加上这两个参数来调整输出的分布。
2. 测试部分
在标准化的时候,
μ
\mu
μ和
σ
\sigma
σ是根据batch算出来的。如果根本就没有batch,如何计算
μ
\mu
μ和
σ
\sigma
σ?
解法:在训练的时候,每一个计算出来 μ \mu μ和 σ \sigma σ都用于计算 滑动平均(moving average)6,如上图所示。那么计算 z ~ \widetilde z z 只需要 μ \mu μ和 σ \sigma σ的滑动平均值。