文章目录
前言
打开就吓到,86min的课程,这节课有很多老师独特的视角和见解,另外老师的台普so正-。-!很多算法可以结合ng的深度学习看下。
在线Latex公式
DL的菜谱(方法)Recipe
下图相当于炼丹的总纲~!!!
注意:1一般的机器学习方法(KNN,决策树等)不会在train好的模型上检查training data的结果,因为NN在training data上都没有办法获得很好的正确率,所以要先回头看一下要对模型做什么修改,才能使得在training set上取得比较好的正确率。
注意:2在training set获得好的结果,但在testing set上获得不好的结果,这个才是overfitting,并不是说在training set获得好的结果就是overfitting。这个时候要回去做一些工作解决overfitting这个问题。当然ng也在深度学习课程中有说,解决overfitting的同时会使得结果在training set上的结果性能变差,这个时候要回到注意1上。
上图中,56层的模型对比20层的模型,无论是在training set还是testing set上表现都要差,这个事情并不是Overfitting的原因,而是没有训练好(没训练好的原因:局部最小值,鞍点,平原)。
但也不是 underfitting,模型的参数不够多,没有能力解决某一个问题。
有意思的观点:56层的模型肯定要比20层的牛叉,原因很简单,如果我56层前面20层和下面的20层一样,后面26层啥事也不做,至少来说他的性能要和下面的一样,因此结论就是56层的模型是没有训练好,老师也没有专业名词称呼它。我瞎掰一个:undertraining。
不同问题不同方法
从上节看出会有两个问题,如何解决?在ng的课里面是从bais和variance两个方面分析,老师这里是从不同数据集的表现中分析的。
老师举例:抓爆,这个玩意如果training set表现很好,testing set上不行,用抓爆可以提高准确率。如果training set表现不行,testing set上也不行,用抓爆就会越来越差。
Training data性能差
激活函数改进
上面这个例子(minst数据集)不是overfitting,如果是overfitting那么在training set获得好的结果,但在testing set上获得不好的结果。上面的曲线是training data的,在第七层的时候准确率就坏掉,什么地方有问题(training的时候出问题)?跟老师实例看看吧:
上图对比了靠近输入层和靠近输出层的参数,在层数很多是时候经常会出现这个情况,也就是从一个随机参数进行收敛在一个局部极值点。这个原因可以从反向传播的推导过程计算出来,这里简单点,用看的:
从图中可以看到:
∂
C
∂
w
\cfrac{\partial C}{\partial w}
∂w∂C实际上是代表参数
w
w
w的变化
△
w
△w
△w对于损失函数
C
C
C的影响
△
C
△C
△C,这个影响是随着神经网络的传播是逐渐变小的。因为经过的神经元是使用sigmoid作为激活函数,它的图像如下:
可以看到sigmoid是把
(
−
∞
,
+
∞
)
(-∞,+∞)
(−∞,+∞)的东西映射到
(
0
,
1
)
(0,1)
(0,1)上,所以这个输入→输出的过程值是变小的。整个现象就是梯度消失。
ReLU
好处:
1、比起sigmoid,计算速度快(看形状就知道啦)
2、看原作者论文提到,这个是有生物学上有一定原因
3、相当于无限个不同bias的sigmoid函数叠加
4、解决了梯度消失问题(最重要),如何解决请往下看:
右上角的线忘记处理。。。
ReLU可以分成两部分,小于0的输出0,大于0的输出原值,也就是线性的,所以上面的神经网络可以看成:
输出为0的神经元对整个神经网络是没有影响的,可以忽略,变成:
剩下的所有神经元都是线性的,所以整个网络变成一个瘦长的线性网络:A Thinner linear network,在这个线性神经元的网络中梯度在传递的过程中是不会递减的。
虽然单个神经元是线性的,但是整个神经网络是非线性的,原因是:很多个线性的神经元可以形成非线性的结果,例如用很小的方块可以拼成一个大圆是一个道理。
面试常问:ReLU是不可导的,如何进行反向传播(要计算偏导)?
忽略不可导的那个点。
ReLU变种
很简单,防止小于零的输入求导后为0。右边的进一步把0.01参数变成一个超参数。
Maxout
上图中多少个element放在一个group里面(黄色椭圆)是一个超参数。放在一个组的就做类似max pooling的操作,整个看做一个神经元(红框)。
如何理解蓝字?ReLU是Maxout方法的特例?
左边是以ReLU为激活函数的神经元,输入的参数是w和b,计算后的
z
=
w
x
+
b
z=wx+b
z=wx+b,在下面的图像中用蓝色表示,通过ReLU激活函数后,变成
a
a
a(绿色部分)
右边是Maxout为激活函数的神经元,这个神经元按上上一张图是有
z
1
z_1
z1和
z
2
z_2
z2的,同理,这里
z
1
z_1
z1对应的参数是
w
w
w和
b
b
b,
z
2
z_2
z2对应的两个参数为0,在图像上表示:
z
1
=
w
x
+
b
z_1=wx+b
z1=wx+b是蓝色线,
z
2
=
0
⋅
1
+
0
=
0
z_2=0·1+0=0
z2=0⋅1+0=0是红色线,对
z
1
z_1
z1和
z
2
z_2
z2求
m
a
x
{
z
1
,
z
2
}
max\{z_1,z_2\}
max{z1,z2}操作,就变成了绿色部分,和左边一样样的。
推广一下,如果
z
2
z_2
z2的参数不为0,为
w
′
w'
w′和
b
′
b'
b′,这里同样用红色表示,对应的直线也是红色表示,则如下图所示:
Maxout的特点就是根据不同的参数,激活函数也不一样。按原作者的说法就是根据你的group中的element个数n,可以有n个pieces组成的凸的激活函数。
怎么吹(Train)Maxout
红色框中是group中大的那个,那么这个网络可以变成:
因为小的element是变为0,对网络无影响,可以去掉。眼熟吗,这里也是一个thin and linear network。
有可能有同学会问,那些没有被框起来的element是不是就没有办法被吹到?
不会,不同的输入的时候,group中的最大值是不一样的,我们的train set有很多笔data,每次不同的data输入,网络的结构都不一样,每个element都会被吹到。
老师这里随口还提了一个max pooling和吹的方法和Maxout一样样,这个是CNN的方法,有兴趣自己查一下.后面也有讲。
自适应学习率
回顾之前有学过一个自适应学习率的一个算法:Adagrad
RMSprop
小知识:这个算法并不是在学术论文中提出的,而是Jeff Hinton在Coursera的课程上提出来并广泛流传的(ng也拿这个吹过NB)。
看最后的
σ
t
σ^t
σt的公式,其实也是和adagrad一样实际上是求梯度的均方根(root mean square),不同的是,在RMSprop中,可以给新的gradient比较大的权重,之前的gradient比较小的权重。这个解释和ng的不一样,ng的解释更加详细,而且和Momentum动量梯度下降结合起来弄了。(ng深度学习:第二课的2.3至2.8)
Momentum
讲这个之前,老师回顾了一下吹DL容易出现的三个问题(这个图之前出现过):
saddle point那当然没有灵魂画手ng的传神(可以看上一篇笔记:李宏毅学习笔记8.Hello world of DL)
并说了这么一个小知识,在复杂网络里面出现局部mini马的几率很低,因为无论是局部还是全局的mini马,在这个点上的各个dimension的偏导都为0,复杂网络中的dimension这么多,所以同时出现这个情况的几率比中六合彩还低,所以一旦出现,就是全局mini马。接下来讲解决上面问题的方法就是动量梯度下降法。这个ng也讲了,我也偷懒截图吧,李宏毅的观点和ng有些不一样(ng的好理解些,先讲的指数加权平均数,李宏毅倒过来了),两个都看会有不同感悟!
PS:Momentum相当于利用指数加权平均给Loss function加入了一个惯性,RMSprop给△梯度加了摩擦力。(本观点由支书提供)
Momentum不能保证全局最优,但是有希望跳出局部最优
Adam
实际上是RMSProp + Momentum,这个ng也讲了,这里就是要注意Adam的参数值一般来说就按推荐的取,不用调。
下面伪代码中的
m
0
m_0
m0是momentum,
v
0
v_0
v0是RMSprop中的
σ
\sigma
σ
testing data 性能差
有三个,除了Dropout(抓爆)另外两个是从传统机器学习借鉴过来的。
Early Stopping
ng的深度学习第二课的1.8里面有讲,如何防止过早结束训练?ng给出的答案是:Orthogonalization (正交化)
原谅我潦草的笔记。
Regularization
这个上过机器学习的应该很熟悉。。。
解释一下上图中的
1
−
η
λ
1-\eta\lambda
1−ηλ这项是小于1,接近1的,这个东西乘以参数
w
t
w^t
wt经过若干时间步会使得参数慢慢变小,接近0.
独特观点 : Regularization虽然在传统机器学习中有不错的表现,但在NN中效果不怎么样,因为在NN中初始化参数的时候参数会比较小(接近0),然后随着训练后慢慢变化(离0越来越远),而Regularization如上图所示,它算法思想是希望参数不要离0太远,这个效果在NN中等同于减少参数更新次数一样样。所以在SVM中是把Regularization显式写到算法中的,因为SVM可能是一次(没有迭代)就解出结果。意思就是说NN天生可以迭代,如果希望参数离0近一点,可以用减少更新次数来达到同样效果。(这里写得有点乱,看不懂也没关系,理解就好)
有L2的Regularization就有L1的Regularization,看老师的台普口型(L two 弄,L one弄)
这里老师不但给出了L1 Regularization的推导过程,还解释了L1和L2 Regularization的不一样的地方,为什么ng还有cs231n中老是听到L1 Regularization的结果是稀疏的。
上图中的sgn表示符号函数,如果w是正的,sgn(w)>0,如果w是负的,sgn(w)<0
先来看L1的结果:
先看蓝色字,意思是:如果
w
t
w^t
wt是正的就是减去一个值;
w
t
w^t
wt是负的就是加上一个值。L2总是把参数乘上一个小于且接近1的值(看L2蓝色字部分)。
如果
w
t
w^t
wt很大,例如100万,对于L2,它乘以一个0.99,它衰减也很大;而对于L1每次减去的值是固定不变的。那么这个很大的
w
t
w^t
wt在L2弄时下降很快;在L1弄下降很慢,L1弄无论
w
t
w^t
wt是大是小,下降速度都一样,因此通过L1 Regularization 训练以后,
w
t
w^t
wt还是会有很大很大的值。
如果
w
t
w^t
wt很小,对于L2,它乘以一个0.99,它衰减很小;而对于L1每次减去的值是固定不变的。那么这个很小的
w
t
w^t
wt在L2弄时下降很慢;在L1弄下降很快(每次减的固定值)。
结论:L1弄在吹完以后
w
t
w^t
wt大的还是很大,
w
t
w^t
wt小的非常接近0,这不就是稀疏矩阵么。
应用结论:当我们想要看比较sparse的结果的时候就要用L one 弄来弄!
整个使得参数变化得快还是慢除了学习率还取决于我们的Regularization方式,这个变化总体是下降的,我们称之为:weight decay。
Dropout 抓爆
这个ng的深度学习也有讲(第二课1.6)
注意:抓爆不能同时用在training和testing set上,一般只在前者上用,ng如是说。李宏毅对于这个有一个非常NB的观点,抓爆是一个非常厉害的武功招式(听名字就知道啦),这个武功就好像绑住你的手去训练(train),实战(test)的时候放开手,当然会更强。
ng在讲这里是介绍的反向随机失活(inverted dropout)就是要用
输
出
z
/
p
%
输出z/p\%
输出z/p%和这里的
w
(
1
−
p
%
)
w(1-p\%)
w(1−p%)一样样。
关于抓爆,李宏毅的另外一个解释:
抓爆的科学解释
有很多流派来解释抓爆,但是李宏毅认为这种比较科学:
类似随机森林。抓爆就是终极的ensemble的方式,理论上抓爆就是吹了一大把的network structure
在test的过程中,按照ensemble的逻辑本来应该是把上面的吹好的一大把的network 拿出来,然后把testing data丢入这些个network中,然后把最后的结果做average,就是结果,但是实际上这个计算量太大啊,这里可是一大把network啊(如下图左边)。神奇的事情就是右边红色部分的结果和左边是约等于的。
为什么是约等于?下面是简单例子说明,假设网络的形状是这样:
那么可能经过抓爆后变成:
可以算出来,上面的是个形式进行平均以后变成:
当然这里等于关系是因为激活函数是线性函数(ReLU,Maxout的时候抓爆比较好用),如果是sigmoid函数就变成约等于拉。