文章目录
一、机器学习任务攻略
因为在训练集中,56层的network一定至少和20层的一样好,所以在测试集中,56层network比20层表现差,也不是过拟合。
更多的训练数据可以限制函数的freestyle,但是往往获取训练数据并不容易,所以可以采用data augmentation,将已有训练数据变化,如翻转、旋转,来获得新的数据。但注意不要做无意义的变化,如图片识别中的倒置。
不建议根据测试集的表现,来选择模型:
可以用交叉验证的方法,去寻找合适的模型:
mismatch 是因为训练数据和测试数据分布不一致导致的。据收集增多,也不会解决该问题。
二、优化失败
1、梯度很小的情况
critical point:梯度为零的点
critical point 有两种,极值点和鞍点saddle point
举例:有一笔训练数据 (1,1),模型为
y
=
w
1
w
2
x
y=w_1w_2x
y=w1w2x
由于海森矩阵计算量比较大,所以一般不用改方法。
在低纬度是局部最小值点,但是在高纬度有可能是鞍点。
2、Batch and Momentum
因为每个batch算出的loss都略有不同,上一个batch算的梯度为0时,下一个batch有可能不是0,从而可以继续训练。
此外,就算在训练时,大的和小的batch都训练的性能差不多,而在测试时,小的batch也往往表现更好。
可能的解释是,小的batch,参数更新时,由于有噪声,梯度方向有一定的随机性,而狭窄的局部最小值点区域困不住它。
Momentum:
三、自适应学习率 Adaptive Learning Rate
学习率设置较大,在梯度大的地方,参数更新步幅会较大,遇到峡谷会两边震荡。
学习率设置较小,在梯度小的地方,参数更新步幅又很小,就会训练不动。
error surface中的同一个方向,即同一个参数,它的梯度也是有变化的,我们也希望学习率可以动态调整。
.
使用warm up效果更好的一个可能的解释是:
σ
\sigma
σ是基于统计数据计算得到的,刚开始数据比较少,所以不精准,开始的参数更新步幅小一些,然后随着统计数据多了,再慢慢增大参数更新步幅,效果可能更好一些。
四、分类问题简述
softmax不仅可以使输出值变为0~1之间,还可以拉大输出大、小值之间的差距。
二分类问题往往直接套用sigmoid函数,而不是用softmax,实际上二者是等价的。
五、重温神奇宝贝和数码宝贝分类器
模型未知数取值的可能性数量,叫做模型的复杂度。
以下的讨论是一般化的原理,和模型没有关系,对数据的分布也没有假设,适用于任何 loss 函数。
往往我们不容易使N变大,即让训练数据变多,H变得太小也会使最好的h不在H中。
六、深度学习的优化
这些背景知识不会可以以后再补。
这里我们重点关注 off-line 的情况。
为解决训练时,SGD卡在梯度为零的地方,可以采用Adam算法。
m
^
t
\widehat m_t
m
t的分母作用是去偏de-biasing,这样在开始的几个time step中,它的值也不会很小,和其他time step的大小保持差不多。
v
^
t
\widehat v_t
v
t的分母作用同上。
ε
\varepsilon
ε的作用是防止分母为零。
Adagrad、RMSProp、Adam算法是自适应学习率adaptibe learning rate
该方法主要解决的是梯度普遍比较小的时候,学习率较大的情况。但该方法会造成学习率单调减少,可能会使训练卡住不动。
AdaBound是解决梯度太大,从而学习率太小的问题。
Clip函数为梯度裁剪函数,输入的张量x的各值如果超出上下限,则输出上下限对应的值,没超出,则输出x的原值。
和Cyclical LR方法大同小异
Adam也需要warm-up,因为经验显示,前10个time step的梯度比较乱,学习率也会忽大忽小。
这里的
r
t
r_t
rt和梯度没有关系,是因为我们假设梯度来自某个分布,所以
r
t
r_t
rt只与 t 有关系。梯度的方差越大,
v
t
v_t
vt的方差就越大,
1
v
t
\frac 1 {v_t}
vt1的方差也就越大,进而
r
t
r_t
rt也就越小。梯度的方差越小,即越稳定,
r
t
r_t
rt也就越大。所以
r
t
r_t
rt可以直接乘到学习率上面,去调整学习率。
当
ρ
≤
4
\rho \le 4
ρ≤4,使用SGDM,当
ρ
>
4
\rho \gt 4
ρ>4,可以将
r
t
r_t
rt(warm-up learning rate)乘到学习率上。
这张图改成从小球从右往左走,来看。
γ
θ
t
−
1
\gamma \theta_{t-1}
γθt−1项叫做weight decay 项。
在计算
m
t
m_t
mt和
v
t
v_t
vt时,有weight decay 项,叫做weight decay。
在计算
m
t
m_t
mt和
v
t
v_t
vt时,没有weight decay 项,叫做L2 regularuzation
通常使用weight decay算法,效果比较好。
本篇博文,最重要的优化算法是AdamW,做NLP时经常使用。
一些帮助优化的方法
①增加模型随机性的方法:
shuffling: 每个epoch的data打乱顺序,重新划分mini-batch,这样计算的梯度可能方向不同。
Dropout: 鼓励每个神经元都去学到有意义的信息。在训练过程中,有一些神经元会被随机丢掉,来减少网络对特定神经元的依赖。
Gradient noise: 算完梯度后,加个高斯噪声。随着t增大,噪音变小。
g
t
,
i
=
g
t
,
i
+
N
(
0
,
σ
t
2
)
g_{t,i}=g_{t,i}+N(0,\sigma_t^2)
gt,i=gt,i+N(0,σt2)
σ
t
=
c
(
1
+
t
)
γ
\sigma_t=\frac c {(1+t)^{\gamma}}
σt=(1+t)γc
增加随机性,可以在训练时,让模型有更多的探索,进而有可能得到更好的表现。
②和学习率调整有关的方法:
warm-up: 一开始学习率比较小,等到训练稳定再调大。
curriculem learning: 先用容易的数据,例如没有噪音的数据、或者接近均值的数据,去训练模型。再用困难的数据去训练。这样可能会提高泛化能力。因为开始的数据可能会决定整个模型大的走向,后面会在某个极值附近移动。
fine-tuning: 用一些预训练模型,站在巨人的肩膀上训练。
③其他方法:
总结: