这节课从解决2个方面问题:
- 在training data上表现不好,没有train好,解决方面有:激活函数(主要解决梯度消失)、学习率(主要解决损失变化很大情况)
激活函数:sigmoid激活函数会导致梯度消失问题,即在靠近输入层的参数会有更小的梯度,所以更新的更慢。相反,而靠近输出层的参数会有更大的参数,更新的更快。使用ReLU可以一定程度上解决梯度消失问题,同时由于左右两边不一样,多个组合就能进行非线性表示。还有更强大的Maxout。
学习率:在ML-LHY-3 Gradient Descent 中很详细介绍了各种学习率算法:Adagrad、SGDM、RMSProp、Adam- 在testing data上表现不好,overfitting,解决方面有:Dropout(随机丢弃神经元)、正则项、early stopping
Dropout:设置重重障碍(Dropout),所以用了Dropout的训练结果肯定比没用的要差。但是,如果用了Dropout也得到还不错的结果,那么在测试的时候应该会比训练时好很多。
解释ensemble:简单来说,Ensemble就是组合多种不同的模型进行学习的方式。在ML-LHY-22: Ensemble更详细介绍
pdf 视频
什么情况是overfitting?
在training data上得到好的结果,而在testing data上得到不好的结果,才是overfitting。解决overfitting时,要确保training data上没有变坏。
都是overfitting?
上图56层网络是在testing data 和 training data表现的都不好,这个不是overfitting,是在训练时就没训练好。所以,并不是网络约深越好,达到一定深度就会达到瓶颈,这是由于(还是引用知乎大神的介绍比较明白):
按理说,当我们堆叠一个模型时,理所当然的会认为效果会越堆越好。因为,假设一个比较浅的网络已经可以达到不错的效果,那么即使之后堆上去的网络什么也不做,模型的效果也不会变差。
然而事实上,这却是问题所在。“什么都不做”恰好是当前神经网络最难做到的东西之一。
也许赋予神经网络无限可能性的“非线性”让神经网络模型走得太远,却也让它忘记了为什么出发(想想还挺哲学)。这也使得特征随着层层前向传播得到完整保留(什么也不做)的可能性都微乎其微。用学术点的话说,这种神经网络丢失的“不忘初心”/“什么都不做”的品质叫做恒等映射(identity mapping)。因此,可以认为Residual Learning的初衷,其实是让模型的内部结构至少有恒等映射的能力。以保证在堆叠网络的过程中,网络至少不会因为继续堆叠而产生退化!
作者:薰风初入弦
链接:https://www.zhihu.com/question/64494691/answer/786270699
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
————————————————
版权声明:本文为CSDN博主「zzig」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_29598161/article/details/106604135
所以凯明大佬就提出了ResNet,具体看ResNet笔记,通过引入残差学习(residual learning)来解决退化问题(残差的思想都是去掉相同的主体部分,从而突出微小的变化)。
总结1
所以在training data上出现问题和在testing data上出现问题解决方法是不一样的,比如dropout,这个方法是解决在testing data效果不好时使用,也就是为了解决overfitting,如果在training data上效果不好也使用dropout,那只会越来越糟糕。
下面开始说在Training Data上结果不好怎么做
New activation function
梯度消失问题
如上图,简单的手写数字识别,当层数很多时,准确度下降。而我们可以看到这不是overfitting,而是在training data上就train坏了!这种就是梯度消失导致的。
为什么会有梯度消失问题
在靠近输入层的参数会有更小的梯度,所以更新的更慢。相反,而靠近输出层的参数会有更大的参数,更新的更快。那么,当靠近输出层的参数已经更新到一个极值的地方,而此时靠近输出层的还是一个初始的随机参数。这就导致后面层的参数是基于前面随机参数来得到的,所以不可靠。
那么假设在靠近输出层的地方,给参数
+
Δ
w
+\Delta w
+Δw,而经过sigmoid函数会发生什么呢,
+
Δ
w
+\Delta w
+Δw会变小,这样累计下去前面的
+
Δ
w
+\Delta w
+Δw就会变得很小,也就是梯度消失。为了解决梯度消失问题,最先提出使用受限玻尔兹曼机(RBM)方法,先训练1层的网络,得到第1层参数,训练2层网络,得到第2层参数…这样确保最训练所以层网络时,虽然改变第1层比较小,但是在pre train时已经得到了第一层的参数了。后来又发现可以直接改激活函数,也就下面要说的激活函数的选择
激活函数的选择
Rectified Linear Unit (ReLU)
ReLu如上图,当输入>0时,输出就是输入,也就不存在衰减问题,但是输入<0时,总是等于0还不太好,又提出<0保留一些的𝐿𝑒𝑎𝑘𝑦 𝑅𝑒𝐿𝑈和可以学习的𝑃𝑎𝑟𝑎𝑚𝑒𝑡𝑟𝑖𝑐 𝑅𝑒𝐿𝑈:
使用ReLU就会导致网络变得更廋
怎么训练?
训练是这样的:我们知道ReLU在0的地方不可微,但是实际操作时很少输入刚好等于0,>0梯度就是1,<0就是
α
\alpha
α。
如何保证非线性?
如果改变前后
z
z
z属于不同的函数(ReLU是分段函数),那么region就发生改变,此时来自不同的函数组合着改变参数,那么就是非线性的。否则就是线性,实际操作总会发生前后属于不用region,所以ReLU也可以保证非线性。
Maxout
可以联系maxpooling
Maxout:假设每2个输出分为1组,然后选组里最大的
Maxout可以模拟ReLU:
当然还可以模拟其他:
还可以模拟3段函数, 4段、5段…取决于分组元素数量
还是2个问题:怎么训练?如何保证非线性?
在给定输入后,根据max,就确定了结构,所以我们可以看ReLU只能回答这2个问题,这里也是一样。注意:每次输入输出结构不一样,那么根据max产生的分段函数也就不一样,而数据量很大时,每个参数都会更新到
Adaptive Learning Rate
这些在笔记:ML-LHY-3 Gradient Descent已经详细记录了,这里简单回顾一下Adagard、RMSProp、SGDM、Adam
Adagard
w
t
+
1
←
w
t
−
η
∑
i
=
0
t
(
g
i
)
2
g
t
w^{t+1} \leftarrow w^{t}-\frac{\eta}{\sqrt{\sum_{i=0}^{t}\left(g^{i}\right)^{2}}} g^{t}
wt+1←wt−∑i=0t(gi)2ηgt
学习率考虑了之前的情况,有记忆性,会符合整体趋势
RMSProp
θ
t
=
θ
t
−
1
−
η
v
t
g
t
−
1
\theta_{t}=\theta_{t-1}-\frac{\eta}{\sqrt{v_{t}}} g_{t-1}
θt=θt−1−vtηgt−1
v
1
=
g
0
2
v_{1}=g_{0}^{2}
v1=g02
v
t
=
α
v
t
−
1
+
(
1
−
α
)
(
g
t
−
1
)
2
v_{t}=\alpha v_{t-1}+(1-\alpha)\left(g_{t-1}\right)^{2}
vt=αvt−1+(1−α)(gt−1)2
Adagrad会累加之前的多有梯度,如果一开始的梯度很大,就会导致学习率很小,导致卡住。而RMSProp在增加当前梯度时乘了
1
−
α
1-\alpha
1−α,对之前累加结果乘了
α
\alpha
α,所以次数越多,前面的梯度会多次乘
α
\alpha
α,所以
v
v
v不会无限增加。
SGDM
定义Movement 为 v v v,包括之前计算的所有梯度,所以在梯度为0或接近0的地方,不会停下来,因为根据整体趋势,会继续走。而在最右边的点,虽然当时那个点的梯度是往极值点,但是考虑整体趋势,还是会继续往右走。
v
0
=
0
v^{0}=0
v0=0
v
i
=
λ
v
i
−
1
−
η
∇
L
(
θ
i
−
1
)
v^{i}=\lambda v^{i-1}-\eta \nabla L\left(\theta^{i-1}\right)
vi=λvi−1−η∇L(θi−1)
θ
i
=
θ
i
−
1
+
v
i
\theta^{i}=\theta^{i-1}+v^{i}
θi=θi−1+vi
李宏毅老师举了一个例子:小球下坡的惯性
Adam(SGDM+RMSProp)
公式:
θ
t
=
θ
t
−
1
−
η
v
^
t
+
ε
m
^
t
\theta_{t}=\theta_{t-1}-\frac{\eta}{\sqrt{\hat{v}_{t}}+\varepsilon} \hat{m}_{t}
θt=θt−1−v^t+εηm^t
其中
m
m
m提现SGDM思想,
v
v
v提现RMSProp思想。
m
m
m展开:
θ
t
=
θ
t
−
1
−
m
t
m
t
=
β
1
m
t
−
1
+
(
1
−
β
1
)
g
t
−
1
\begin{array}{l} \theta_{t}=\theta_{t-1}-m_{t} \\ m_{t}=\beta_{1} m_{t-1}+\left(1-\beta_{1}\right) g_{t-1} \end{array}
θt=θt−1−mtmt=β1mt−1+(1−β1)gt−1
v
v
v展开:
θ
t
=
θ
t
−
1
−
η
v
t
g
t
−
1
v
1
=
g
0
2
v
t
=
β
2
v
t
−
1
+
(
1
−
β
2
)
(
g
t
−
1
)
2
\begin{array}{l} \theta_{t}=\theta_{t-1}-\frac{\eta}{\sqrt{v_{t}}} g_{t-1} \\ v_{1}=g_{0}^{2} \\ v_{t}=\beta_{2} v_{t-1}+\left(1-\beta_{2}\right)\left(g_{t-1}\right)^{2} \end{array}
θt=θt−1−vtηgt−1v1=g02vt=β2vt−1+(1−β2)(gt−1)2
但是发现Adam公式中有
m
m
m和
v
v
v都有hat,其实是为了防止最开始时
β
1
m
\beta_{1}m
β1m和
β
2
v
\beta_{2}v
β2v太小导致不起作用,所以除以
1
−
β
1-\beta
1−β就有
β
1
m
1
−
β
1
\frac{\beta_{1}m}{1-\beta_{1}}
1−β1β1m和
β
2
v
1
−
β
2
\frac{\beta_{2}v}{1-\beta_{2}}
1−β2β2v不至于太小
m ^ t = m t 1 − β 1 t v ^ t = v t 1 − β 2 t β 1 = 0.9 β 2 = 0.999 ε = 1 0 − 8 \begin{array}{l} \hat{m}_{t}=\frac{m_{t}}{1-\beta_{1}^{t}} \\ \hat{v}_{t}=\frac{v_{t}}{1-\beta_{2}^{t}} \\ \beta_{1}=0.9 \\ \beta_{2}=0.999 \\ \varepsilon=10^{-8} \end{array} m^t=1−β1tmtv^t=1−β2tvtβ1=0.9β2=0.999ε=10−8
总结:Adagrad、RMSProp、Adam都是自适应算法
下面开始说在Testing Data上结果不好怎么做
Early Stopping和 Regularization是很传统的做法,Dropout是具有深度学习特色的做法
Early Stopping
就是会有这种情况,Training set一直下降,而Testing set反而会在一定阈值后升高。所以就有很自然的思想,想要在升高前就停止。具体做法:就是用Validation set当Testing set用,模拟Testing set在哪个地方降到最低了。这里需要区分什么是Training set、Validation set、Testing set
- Training set 训练数据集合,梯度下降主要在Training set上
- Validation set 验证数据集,主要用于辅助,比如这里,或者求一些超参数
- Testing set 测试数据集,用于模拟真实的数据来测试性能,不要根据Testing set的结果来修改模型,这会导致模型拟合Testing set而产生偏差,更详细之前课程已经分析过了ML-LHY-2 Bias v.s. Variance
Regularization
L
′
(
θ
)
=
L
(
θ
)
+
λ
1
2
∥
θ
∥
2
\mathrm{L}^{\prime}(\theta)={L}(\theta)+\lambda \frac{1}{2}\|\theta\|_{2}
L′(θ)=L(θ)+λ21∥θ∥2
λ
1
2
∥
θ
∥
2
\lambda \frac{1}{2}\|\theta\|_{2}
λ21∥θ∥2就是正则项,
θ
=
{
w
1
,
w
2
,
…
}
\theta=\left\{w_{1}, w_{2}, \ldots\right\}
θ={w1,w2,…},
L2范数:
∥
θ
∥
2
=
(
w
1
)
2
+
(
w
2
)
2
+
…
\|\theta\|_{2}=\left(w_{1}\right)^{2}+\left(w_{2}\right)^{2}+\ldots
∥θ∥2=(w1)2+(w2)2+…
加正则只会让函数拟合的更平滑,并不会考虑偏差
求梯度:
∂
L
′
∂
w
=
∂
L
∂
w
+
λ
w
\frac{\partial \mathrm{L}^{\prime}}{\partial w}=\frac{\partial \mathrm{L}}{\partial w}+\lambda w
∂w∂L′=∂w∂L+λw
更新:
w
t
+
1
→
w
t
−
η
∂
L
′
∂
w
=
w
t
−
η
(
∂
L
∂
w
+
λ
w
t
)
=
(
1
−
η
λ
)
w
t
−
η
∂
L
∂
w
w^{t+1} \rightarrow w^{t}-\eta \frac{\partial \mathrm{L}^{\prime}}{\partial w}=w^{t}-\eta\left(\frac{\partial \mathrm{L}}{\partial w}+\lambda w^{t}\right)\\ =(1-\eta \lambda) w^{t}-\eta \frac{\partial \mathrm{L}}{\partial w}
wt+1→wt−η∂w∂L′=wt−η(∂w∂L+λwt)=(1−ηλ)wt−η∂w∂L
(
1
−
η
λ
)
(1-\eta \lambda)
(1−ηλ)是一个接近1的数,那么每次更新参数都乘一个小于1的数,那么会使得参数越来越靠近0,这样会导参数都变为0吗?其实不会,因为还有后面一项
η
∂
L
∂
w
\eta\frac{\partial \mathrm{L}}{\partial w}
η∂w∂L,会权衡。这种做法称为:Weight Decay
为什么Weight Decay可以减轻过拟合?
过拟合的时候,拟合函数的系数往往非常大,这就意味着函数在某些小区间里的导数值(绝对值)非常大,由于自变量值可大可小,所以只有系数足够大,才能保证导数值很大。而正则化是通过约束参数的范数使其不要太大,所以可以在一定程度上减少过拟合情况。
正则项除了2次的还有1次的L1正则项: ∥ θ ∥ 1 = ∣ w 1 ∣ + ∣ w 2 ∣ + … \|\theta\|_{1}=\left|w_{1}\right|+\left|w_{2}\right|+\ldots ∥θ∥1=∣w1∣+∣w2∣+…
L
′
(
θ
)
=
L
(
θ
)
+
λ
1
2
∥
θ
∥
1
∂
L
′
∂
w
=
∂
L
∂
w
+
λ
sgn
(
w
)
\mathrm{L}^{\prime}(\theta)=L(\theta)+\lambda \frac{1}{2}\|\theta\|_{1} \quad \frac{\partial \mathrm{L}^{\prime}}{\partial w}=\frac{\partial \mathrm{L}}{\partial w}+\lambda \operatorname{sgn}(w)
L′(θ)=L(θ)+λ21∥θ∥1∂w∂L′=∂w∂L+λsgn(w)
sgn就是当sign函数,>0为1,<0为-1
更新参数:
w
t
+
1
→
w
t
−
η
∂
L
′
∂
w
=
w
t
−
η
(
∂
L
∂
w
+
λ
sgn
(
w
t
)
)
=
w
t
−
η
∂
L
∂
w
−
η
λ
sgn
(
w
t
)
=
(
1
−
η
λ
)
w
t
−
η
∂
L
∂
w
\begin{array}{l} w^{t+1} \rightarrow w^{t}-\eta \frac{\partial \mathrm{L}^{\prime}}{\partial w}=w^{t}-\eta\left(\frac{\partial \mathrm{L}}{\partial w}+\lambda \operatorname{sgn}\left(w^{t}\right)\right) \\ =w^{t}-\eta \frac{\partial \mathrm{L}}{\partial w}-\eta \lambda \operatorname{sgn}\left(w^{t}\right) \\ =(1-\eta \lambda) w^{t}-\eta \frac{\partial \mathrm{L}}{\partial w} \end{array}
wt+1→wt−η∂w∂L′=wt−η(∂w∂L+λsgn(wt))=wt−η∂w∂L−ηλsgn(wt)=(1−ηλ)wt−η∂w∂L
那么每次更新参数都减或加一个小于1的数,也是让参数越来越靠近0,但是没有L2更新那么快。
总结一下:用L2可能导致很多参数很小、用L2就可能还保留很多非常大的参数
Dropout
Dropout之前也做过记录,这里更详细说明下。
训练的时候:
开始更新参数前,先根据丢弃概率为p,确定本次网络结构:
变得更瘦了,然后根据本次网络结构更新参数。就是对于每个min-batch(比如batch= 10,那么min-batch就有10笔example,在这10笔内用同种网络结构),重新根据丢弃概率p丢弃神经元(For each mini-batch, we resample the dropout neurons)
测试的时候:
用完整的网络:
需要注意的是:每个参数需要乘以1-p,为什么?
如果在p=0.5,训练时的参数少,值大,而测试时参数多,值理应更小,所以就有上面近似关系。
直觉解释
Dropout的形象描述1:
意思就是在训练的时候,设置重重障碍(Dropout),所以用了Dropout的训练结果肯定比没用的要差。但是,如果用了Dropout也得到还不错的结果,那么在测试的时候应该会比训练时好很多
Dropout的形象描述2:
在完成一个工作的时候,会想到其他人可能做不好(Dropout),所以自己任务需要做的更好,弥补别人,才能达到总目标。然后每个人都这么认为,都做的更好。事实上,在测试时,每没有人做不好(Dropout),但是每个人有做的更好了。
Dropout的形象描述3:
动机论
来自这里
虽然直观上看dropout是ensemble在分类性能上的一个近似,然而实际中,dropout毕竟还是在一个神经网络上进行的,只训练出了一套模型参数。那么他到底是因何而有效呢?这就要从动机上进行分析了。论文中作者对dropout的动机做了一个十分精彩的类比:
在自然界中,在中大型动物中,一般是有性繁殖,有性繁殖是指后代的基因从父母两方各继承一半。但是从直观上看,似乎无性繁殖更加合理,因为无性繁殖可以保留大段大段的优秀基因。而有性繁殖则将基因随机拆了又拆,破坏了大段基因的联合适应性。
但是自然选择中毕竟没有选择无性繁殖,而选择了有性繁殖,须知物竞天择,适者生存。我们先做一个假设,那就是基因的力量在于混合的能力而非单个基因的能力。不管是有性繁殖还是无性繁殖都得遵循这个假设。为了证明有性繁殖的强大,我们先看一个概率学小知识。
比如要搞一次恐怖袭击,两种方式:
- 集中50人,让这50个人密切精准分工,搞一次大爆破。
- 将50人分成10组,每组5人,分头行事,去随便什么地方搞点动作,成功一次就算。
哪一个成功的概率比较大? 显然是后者。因为将一个大团队作战变成了游击战。
那么,类比过来,有性繁殖的方式不仅仅可以将优秀的基因传下来,还可以降低基因之间的联合适应性,使得复杂的大段大段基因联合适应性变成比较小的一个一个小段基因的联合适应性。
dropout也能达到同样的效果,它强迫一个神经单元,和随机挑选出来的其他神经单元共同工作,达到好的效果。消除减弱了神经元节点间的联合适应性,增强了泛化能力。
个人补充一点:那就是植物和微生物大多采用无性繁殖,因为他们的生存环境的变化很小,因而不需要太强的适应新环境的能力,所以保留大段大段优秀的基因适应当前环境就足够了。而高等动物却不一样,要准备随时适应新的环境,因而将基因之间的联合适应性变成一个一个小的,更能提高生存的概率。
解释就这么多,都是网上找的
Dropout 是一种集成(ensemble)方法
首先解释一下上面是ensemble方法:
把Training Data分成几部分,分被用不同网络训练,最后平均结合起来。模型很复杂时,偏差小,但是方差大。而拆除很多部分后,平均起来,在保证偏差不会变差情况下,方差会减小。
Dropout就是在每次mini-batch后都新来一个网络,可以到达
2
M
2^M
2M多个(M是神经元数目),而且参数是共享的
举个最简单神经网络丽珍例子,只有1个神经元:
拆分成4个
对4个加起来平均:
z
=
1
2
w
1
x
1
+
1
2
w
2
x
2
z=\frac{1}{2} w_{1} x_{1}+\frac{1}{2} w_{2} x_{2}
z=21w1x1+21w2x2
直接用Dropout:
这也再次解释为什么Dropout要乘以1-p
以上参考李宏毅老师视频和ppt,仅作为学习笔记交流使用