李宏毅学习笔记9Tips for Training DNN

前言

打开就吓到,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} wC实际上是代表参数 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=01+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(1p%)一样样。
关于抓爆,李宏毅的另外一个解释:
在这里插入图片描述

抓爆的科学解释

有很多流派来解释抓爆,但是李宏毅认为这种比较科学:
在这里插入图片描述
在这里插入图片描述
类似随机森林。抓爆就是终极的ensemble的方式,理论上抓爆就是吹了一大把的network structure
在这里插入图片描述
在test的过程中,按照ensemble的逻辑本来应该是把上面的吹好的一大把的network 拿出来,然后把testing data丢入这些个network中,然后把最后的结果做average,就是结果,但是实际上这个计算量太大啊,这里可是一大把network啊(如下图左边)。神奇的事情就是右边红色部分的结果和左边是约等于的。
在这里插入图片描述
为什么是约等于?下面是简单例子说明,假设网络的形状是这样:
在这里插入图片描述
那么可能经过抓爆后变成:
在这里插入图片描述
可以算出来,上面的是个形式进行平均以后变成:
在这里插入图片描述
当然这里等于关系是因为激活函数是线性函数(ReLU,Maxout的时候抓爆比较好用),如果是sigmoid函数就变成约等于拉。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

oldmao_2000

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值