2021李宏毅机器学习(3):类神经网络训练不起来怎么办
1 任务攻略
1.1 如果在训练集上的 loss 始终不够小
- 情况一:model bias(模型本身有很大限制)——构造更复杂的模型
- 情况二:优化问题(使用的优化方法始终没办法优化到 loss 最小值)——更有效的优化方法
如何判断是哪种情况?
- 首先在更容易优化的浅层网络上训练
- 如果深层网络不能在训练集上得到比上面更小的 loss,则是情况二
1.2 如果 loss 在训练集上小,在测试集上大
- 情况一:overfitting——最简单的解决方法就是增加训练数据Data augmentation:
 可以对原有数据进行处理,得到新的可以添加进训练集的数据:上面的第一幅图是原图,第二、三幅图是对原图进行反转和局部放大。而第四幅图是图片颠倒,这会让模型识别变得更困难,所以第四幅图的方法是不行的。 第二种方法是给模型增加限制,比如说模型一定要是二次曲线,但是要注意限制也不要过多。 如何选择模型?  - 情况二:mismatch
overfitting可以通过增加训练集的数据来解决,但是mismatch的training和testing的分布不一样,不能那样解决 
1.3 任务攻略的示意图

2 局部最小值 (local minima) 与鞍点 (saddle point)
当 loss 无法下降时,可能梯度已经接近0了,这是,局部最小值 (local minima) 与鞍点 (saddle point)都有可能,它们统称为critical point。 此时,我们需要判断属于哪种情况,计算Hessian即可:  举例:  如果是鞍点 (saddle point),还可以寻找下降的方向继续训练。  但是其实这种情况很少见。
3 批次(batch)与动量(momentum)
3.1 批次(batch)
小的batch size有更好的结果。  有很多文章想要鱼与熊掌兼得: 
3.2 动量(momentum)
有了动量,就不会停留在critical point,而是会继续向下:  以前的梯度下降是这样的: 
加上动量以后,就是加上了对前一个动作的考虑,则下一个动作就是前一个动作与前一个动作相结合的结果。  下面的红线是梯度,蓝虚线是动量,蓝实线是前两者结合的结果,可以看到,甚至可能翻越小丘,到达真正的 loss 最小值。 
4 自动调整学习率 (Learning Rate)
前面在 loss 不下降的时候,我们说可能是critical point,但是也有可能是下面这种情况:  learning rate应该为每一个参数特制化:  原来的参数的第
t
+
1
t+1
t+1 次迭代种中,学习率
η
\eta
η 是不变的;而我们修改之后,
η
\eta
η 变成了
η
σ
i
t
\frac{\eta}{\sigma^t_i}
σit?η?,这样修改之后,学习率就是 parameter independent 的了,同时也是 iteration independent 的(参数独立、迭代独立)。
4.1 最常见的一种修改学习率的方法是均方根
 这种方法被用在Adagrad里面:  当梯度较小时,计算出来的
σ
i
t
\sigma^t_i
σit? 就小,则学习率就大;反之学习率变小。
4.2 可以自己调整现在的gradient的重要性——RMSProp
这种方法通过设置
α
\alpha
α 来调整现在的梯度的重要性:  如下图所示:  可以调整
α
\alpha
α 比较小,让
σ
i
t
\sigma^t_i
σit? 更依赖
g
i
t
g^t_i
git?,这样,当梯度突然由平滑变陡峭的时候,
g
i
t
g^t_i
git? 变大,
σ
i
t
\sigma^t_i
σit? 也变大,就会使这时的步伐变得小一点;同理,梯度再次转为平滑的时候,
σ
i
t
\sigma^t_i
σit? 就会迅速变小,步伐就会变大。 其实就是让每一步能够根据变化的情况快速反应过来。
4.3 Adam: RMSProp + Momentum

4.4 Learning Rate Scheduling
使学习率
η
\eta
η 随时间变化: 
4.5 总结
加上前面的3.2,我们采用了三种方法来改进梯度下降:动量、调整学习率的大小、学习率随时间变化。
m
i
t
m^t_i
mit? 和
σ
i
t
\sigma^t_i
σit? 不会相互抵消,因为
m
i
t
m^t_i
mit? 包括了方向,而
σ
i
t
\sigma^t_i
σit? 只有大小。 
5 损失函数 (Loss) 也可能有影响
 在分类中,通常会加上softmax:  如果是分类成两类,则更常用sigmoid,但其实这两者的方法结果是一样的。
下面是损失函数:  事实上,交叉熵在分类中是最常用的,在PyTorch中,CrossEntropyLoss这个函数已经包含了softmax,这两者是绑定在一起的。
为什么?  从图中可以看出,当 loss 很大时,MSE很平坦,不能梯度下降到 loss 小的地方,卡住了;但是交叉熵可以一路梯度下降下去。
6 批次标准化(Batch Normalization)
希望对于不同的参数,对 loss 的影响范围都比较均匀,像下面的右图:  方法是特征归一化(Feature Normalization):  归一化之后,每个维度的特征的平均值为0,方差为1。 一般来说,特征归一化使梯度下降收敛更快。
后一步的输出同样也需要归一化,这些归一化都是针对于一个Batch的:  为了让输出的均值不为0,方差不为1,就会加上
β
\beta
β 和
γ
\gamma
γ: 
β
\beta
β 和
γ
\gamma
γ 这两个向量初始值分别是0和1,然后一步步在网络中学习更新,所以一开始的时候,dimension的分布是接近的,后续error surface的表现比较好之后,才会把
β
\beta
β 和
γ
\gamma
γ 加进去。
在Testing中:将train的参数用进test中。  一些比较有名的Normalization: 
|