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:
在这里插入图片描述