目录
3. 自动调整学习速率(Adaptive Learning Rate)
(一)如何把进行更好的training,如下图:
如果在kaggle上结果不满意,首先检查training data的loss。
1. training data的loss很大
说明在训练资料上没学好,在训练资料上没学好的可能原因:
-
- model Bias——把model变大
- Optimization Issue——见下面详述
那么在training data上的loss很大到底是原因a还是b呢?先用一个浅的network或一些其他的小model训练,这些模型比较容易optimize。然后在深的networks上训练,如果没有获得比浅的network更低的loss,那么就是Optimization Issue。具体流程如下图:
下面讨论Optimization的时候,怎么把Gradient descent做的更好:
——解决类神经网络训练不起来的问题
Optimization失败的原因可能是走到了critical point(包括local minima和saddle point),如下图:
用Hessian矩阵的正定性、负定性及不定性可以判断出critical point属于哪种类型:
正定——local minima,负定——local maxima,不定——Saddle point
不过在实际操作中通常不会这么做,因为计算出Hessian矩阵以及对Hessian矩阵进行一系列的运算,运算量是非常大的。
local minima vs saddle point:从经验上看,在高维数据的情况下,local minima是很少出现的,主要出现的都是saddle point。
2. training data的loss较小
training data的loss较小的话,就可以看testing data的loss了。testing data的loss小就可以结束了,如果testing data的loss大,可能原因:
-
- Overfitting
- Mismatch
Mismatch: Training data and testing data have different distributions. 这个问题会在HW11中遇到,解决办法在HW11的作业讲解中。
解决Overfitting的办法——增加资料:
解决Overfitting的办法——constrained model,不让model有太大的弹性:
-
实际操作
实际在作业中,我们应该把Training Set的data分为Training Set和Validation Set(可以按Training Set占原Training Set的90%,Validation Set占原Training Set的10%的比例来分,当然也可以是别的比例)。用Training Set训练得到模型后,测试模型在Validation Set上的效果,效果好的时候再把Testing Set的data放到训练好的model上跑。流程如下图:
(二)类神经网络训练不起来——解决办法
1. Critical point
Critical point have zero gradients.
Optimization失败的原因可能是走到了critical point(包括local minima和saddle point),如下图:
用Hessian矩阵的正定性、负定性及不定性可以判断出critical point属于哪种类型:
正定——local minima,负定——local maxima,不定——Saddle point
沿着Hessian矩阵(负特征值)对应的特征向量的方向,是有可能escape saddle points的,不过在实际操作中通常不会这么做,因为计算出Hessian矩阵以及对Hessian矩阵进行一系列的运算,运算量是非常大的。
local minima vs saddle point:从经验上看,在高维数据的情况下,local minima是很少出现的,主要出现的都是saddle point。
2. batch and momentum
——Smaller batch size and momentum help escape critical points.
1. batch
Batch size is a hyperparameter.
Review: Optimization with Batch.
Small Batch v.s. Large Batch:
2. Momentum
——有可能可以对抗Critical point的技术。通俗的讲就是考虑上一步移动的惯性对目前这一步移动的影响。
3. 自动调整学习速率(Adaptive Learning Rate)
上面讲到了Critical point的问题,但Critical point不一定是训练一个network时会遇到的最大障碍。训练过程中loss不再下降的时候gradient不一定真的变得很小,例如下图:
所以我们需要去使用一个Adaptive Learning Rate。下面介绍三个版本的Learning Rate
① 首先是训练过程中一直不会改变的一个Learning Rate:
② 改进之后如下,这一版本的learning rate被用于Adagrad:
下面看看使用Adagrad后的改进效果,下图左上角是使用固定不变的Learning Rate训练出来的结果,可以看到训练推进不下去,下图右边是使用Adagrad后,可以看到训练继续下去了。
从上图可以看出Adagrad会出现走着走着突然爆炸的问题,可以用Learning Rate Scheduling解决这个问题。
③ 继续改进:
今天最常用的optimization的策略是Adam。
Adam: RMSProp + Momentum
最后做个总结,Summary of Optimization:
4. 损失函数(Loss)也可能有影响
——Changing the loss function can change the difficulty of optimization
注:这一节知识更加详细的原理讲解参见Lecture1(Extra Material)的Pokemon classification和Logistic Regression两个小节,这里仅简短的说明不同的loss function会对训练过程造成很大的影响
Cross-entropy比Mean Square Error更加适合用在分类上。如下图,假设我们开始training的地方都是左上角。
如果选择Cross-entropy作为loss function,那么左上角的的地方是有斜率的,所以有办法通过gradient一路往右下的地方走。
如果选择Mean Square Error作为loss function,就会在左上角卡住。Mean Square Error在左上角这种Loss很大的地方是非常平坦的,它的gradient非常小趋近于0。如果初始的时候在左上方,离目标很远,但是gradient又很小,就会没办法用gradient descent顺利走到右下角的地方(在没有好的optimizer的情况下,如果用Adam,也许还是有机会走到右下角,不过training还是会困难一点)。
Cross-entropy和Softmax在pytorch中是被绑定在一起的,是一个set,用Cross-entropy时已经包含了Softmax,而不需要在network里面再加一层Softmax。