【李宏毅ML笔记】16 Tips for Training DNN

DeepLearning 训练Network的流程,三个Step

1. 定义Network Structure,得到function set,2 决定loss function  3 训练选优 4 得到Network1, 5检查Network1在training set上有没有得到好的结果。否则,在前三个step上得到好的结果。Network的overfitting问题比较少,其遇到的第一个问题是在trainingset上就得不到好的正确率,得到好了的,在testset上可能就好的多了。



2 如下,先看testdata,再看train data,横坐标是在做gradient descent时的update的次数。纵坐标是错误率。

下图说明,在训练集上,56层可能就比20层的Network的性能差,所以,在testdataset上56层的Network的性能仍然比20层的差。

underfiting是model的参数不够多,它的能力不足以解出这个问题。但是对于56层的Network的参数足够多了,理论上说20层可以做到的,56层就可以做到了,所以这个表现不像是欠拟合。理论上56层的前20层跟20层以后,后面36层,就直接输出就可以了,而实际上就是56蹭的没有训练好。




DeepLearning的问题,要么是在trainingset上performance性能不好,要么是在testset上性能不好。其处理方法不一样。

dropout用处:在testset上结果不好的时候,才apply dropout。如果问题是在trainingdata上不好,则用drought则没用????否则越用dropout,越差。




先讨论如何修正traindata上效果不好的方法:new activation和adaptive learning rate。

如下图,在trainingdata上效果不好时,则看网络结构是否不好,如换activation function。(下面应该勾选的是new activation)


如下,在1980年代,使用sigmoid比较好。但是deeper,不一定imply better。如在9层10层地方,参数过多了,但并实际不是overfitting。overfitting是指参数多的情况下,在trainingset上性能好,testset上性能不好。判断是否是overfitting,要比较trainingset和testset上的性能区别。而这里,如果在trainingset上性能就随着成熟的增加而减小,则不是overfitting问题。如下:


如下,上图,一个原因是vanishing gradient problem:当你把Network叠加的很深的时候,在靠近input的地方的那几层神经元的参数对最终的lossfunction的微分的影很小。

当你设定同样的learning rate的时候,靠近input的地方参数学习update非常慢,而output处很快。在靠近input地方,random时,output处的参数很快就converge了,此时效果很差。主要原因是用了sigmoid效果很差,可以根据bp的推导公式来看。


如下,找原因:尝试将前面或者后面的layer的参数做很小的变化,来判断cost function的值的变化

如在第一个layer中的某个参数加上微小的增量w,若w很大,则通过sigmoid函数时,这个output会很小,也就是改变了某个参数的值,对output影响会很小,但是影响是衰减的,sigmoid的策略是把-无穷到+无穷之间的值压缩到0-1之间,w的变化很大,单其output的变化会衰减,这样,没通过一层的sigmoid一次,其前面的变化传递到后面时,就会衰减一次。所以,Network越深,经过越多的sigmoid变换,前面的参数调整对后面output的影响就越小(衰减)。




解决办法,

第一种,retrainning。先learn好第一个layer,再learn第二个layer...

第二种,用relu方法。rectified linear unit。input参数小于0时,输出为0,否则,将原值输出。则,计算快(sigmoid里还有一层initial?)。2 某种生物上理由。3 等价于无穷多的sigmoid的叠加的结果。4 可以handle vanishing gradient 问题。


如下为基于relu的activation function的neutron Network。对于经过relu之后,out为0的神经元neutron,不会影响最终的值,其实这个neutron可以拿掉(如下下图)。

这样network就变成了很瘦长的linear Network,就不会出现递减的问题。

那么问题1来了:

用dl就是不想用linear,而是变成non linear的,比如用sigmoid(导致参数改变量递减,大的input变成小的output)。但是用了relu后,变成了linear,就不会有参数改变量递减的问题了。但实际上整个Network还是non linear,

当对input作小小的改变,不改变output的,就是linear function。但是对input做很大的改变,改变了neutron的upiteration,就变成了non linear。?????????


另一个问题,relu不可微分,region<0微分就是0,>0微分就是1。反正input不可能正好是0.

测试,将sigmoid,换成relu。看看神经网络运行的效果。

relu有种种的变种。比如input<0时,output没有变化,就没有影响了。可以在input<0时,设置斜率(微分值)为0.01或α(在gradient descent中学出来的)


后来,如下,又改善出来了Maxout,让Network,自动学习activation function(因此ReLU是Maxout中的特殊的一种),如下:

x1,x2通过不同的权重相乘再相加,得到5,7,-1,1,可以将得出的5,7,-1,1分组,在每一组里选出最大的值作为output结果(7,1)。这就像在layer上作Max?COding?而不是image上作MaxCoding??5,7->7又类似于Neuron,同理下去。


如何证明MaxOut可以做到Relu的activation function的效果,即模仿relu。如下,

基于relu,xw+1*b=z,再通过relu得到a。b为bias。从z的效果,转到a如左下角的图,经过relu,就可以得到类似效果。

基于maxout,让z1与z相同,z2位总是0,则选择一个大的时候(总选max),若z'大于0,则为z,否则为0.只要maxout设定正确的参数就可以。


maxout也可以做出不同的效果的activation。如利用wb,w'b',得到的两个z1,z2,再经过max,可以得到新的activation function。



在maxout中,group中有不同的个数,可以学习生成不同的效果的activation function


如何train maxout?

假设z11跟z41是比较大的值,姿势就是linear,没有被接到的Neuron,就可以删掉,就可以变成linear Network。所以,在train的时候,就train比较细长的最后剩下爱的那些neutron。不被train到的Neuron的weight就没用了



根据max,只保留/接出一部分:


最后变成细长的linear,train的对象。


一次input,train不到的Neuron的weight。不同的input会得到不同的z,每一次得到的linear的网络模型,基本会得到所有的weight。




在traindata上训练结果不好,第二种办法 adaptive learning rate:


比如,adagrad,方法,每个parameter都有不同的learning rate。用固定的learning rate n除以过去的所有gradient descent的平方值和,并开根号。

原理,如果考虑两个参数w1,w2。若图中w1在‘’横方向‘’(等值线浓密)上变化比较平坦,则就给他一个比较大的learning rate 而在竖方向(等值线稀疏),则给他一个比较小的learnin rate。可以让Network收敛的更快。



如下,在deeplearning上的error surface不一定是山丘形状,有可能是下面形状时,问题,就算是同一个方向上,w1改变的方向,在某一个区域,很平台,在另一个区域,很陡峭,则就需要一个动态变化的调整learning rate。如用RMSProp,在hiton的慕课中提出这个方法。


将固定的learning rate η除以σ,σ0就是第一次gradient的值g0。第二次,算出一个新的gradien g1,此时,新的σ1就是原来的σ0的平方乘以α,再加上(1-α)乘以g1的平方。最后开根方。α可以自己调整。

原来的adagrade,是固定的,这里添加了α的σ,和(1-α)的gradient,即倾向于新的gradient,还是旧的gradient。类似于先验与后验的区别:



做DeepLearning可能卡在很多个地方,如下,各种local minima问题???,在Network中可能有很多个参数,local minima出现的几率很低。有时local minima八成接近全局minima。



以下方法,可以处理local minima的问题,方法来源:

下滑球的惯性导致走出local minima。即将惯性的特性塞到gradient中。该方法叫做


一般的gradient,往梯度的反方向走。如下:

选择初始值,计算权重θ0处的gradient ▽L(θ0),结合learning rate,计算并更新得到的权重θ1。直到gradient趋近于0的时候,停止更新参数θ。


momentum

利用momentum的时候,每一次移动的方向,不仅仅考虑gradient,而是现在的gradient加上再前一个时间点移动的方向(类似于加速度?速度?)

用v记录在前一个时间点移动的方向。

初始化:初始点θ0,初始movement值为0.,先算出初始点θ0处的梯度。移动的方向:前一个时间点的movement的一定比例值,再加上negative 梯度,得到真正的移动方向。

               这使得移动比原先的gradient方法,有一定的改变,但不会完全转向,然后移动θ0到θ1. move to θ1= θ0 + v1

计算出θ1,再进行下一次移动。结合原先的gradient方法(红色箭头),加上上一次移动的惯性方向(绿色箭头)的λ倍(惯性影响大小),可以得到真实的带惯性方向。


另一种理解momentum的方法,移动的量vi就是过去所有算出来的gradient的累计的影响。将前面所有的v(t-1)  ,依次带入到v(t)。如下左边的:


直觉上理解momentum(理解为惯性),如果momentum比较强的话,有一定的可能性,借助惯性力量(momentum),跳出local minima


如下,实际,RMSProp方法+Momentum方法,就得到了Adam

先厨师m0,即momentum,v0就是adagrade的RMSProp中的σ(可动态变化的gradient的平方和之类的式子),算出新的gradient,基于mt,vt的变种(1-β),最后 update 用learning rate α, mt, vt,以及一个小的e参数来更新gradient。



下文讲,如果在trainning data上训练的结果好,即不会出现(50比20层效果好),在test data上效果不好的处理方法:有early stopping(典型)dropout(DeepLearning特色),regurization。


上文中的testset并不是真正的testset,是指已经有label的testdataset(可能是自己切出来的部分的dataset)。

随着training,如果learning rate调的好,则在trainingset上,total loss会慢慢变下。由于trainingset和testset上的数据的distribution不太一样,有可能导致当trainingset上的total loss减少的时候,在test set上回变大。所以,假如可以知道test set上的total loss 的变化,则在traing的时候应该停在test set上total loss最小的地方。epoch为训练的次数?但是实际上不知道teset及其error,所以,切除一个validation set。这样validation set的totalloss最小的时候,就找到early stpping 的epoch的值,停止训练,得到参数,



Regularityzation。重新定义需要minimize的loss function。注意θ2代表权重的平方和,θ1则代表绝对值和。加入regularization是为了让objective function更加平滑,防止过拟合,防止方差太大,而不是biases更加小。


对新的objective loss function作微分求gradient,则得到下面加上带λ的部分值的新的gradient1,之后再利用gradient1和学习率更新下一次权重w(t+1)(此时多了λw(t))。

其实在update参数之前,每次都是把参数w先乘以(1-nλ),n是learning rate,值要设置很小,正则化权重λ一般值设置的也很小,nλ倾向于0,比如0.01,相当于调整了上一次的w,使其w不断地接近于0。因为后面的一项的存在,会平衡参数不会使得w变为0。

用L2正则化方法,每次回让weight少一点,就叫做weight deacay,但不会为0



regularazition有帮助,但不会像其他的那么大的方法,如dropout效果。其目的就是不要离0太远,跟减少update次数,如early stoping效果一样。earlystoping避免参数离接近0的地方太远。

L1的时候不能微分,实际上只有在0的位置不能微,小于0为-1,大于0为+1,0为0即可。即用sgn(w)

ηλsign(wt)表示每一项w每次update参数时,表示每次都减去该项(正的,或者负的)。

L1与L2同样是让参数变小,但是做的东西略有不同。

L1每次都减掉一个固定的值。L2每次都是乘上一个固定的小于1的值。

对于L2,若W很大,则下降很快。对于L1,若w值很大,则缓慢下降速度很小。

则通过L2的traing后,若w值很小0.1,0.001,则其下降的速度很慢。L2每次保留一个接近的值。近似。得到的值,平均的都会很小。

则通过L1的traing后,若w值很大,可能learn出来得model中,仍然有很大的值。L1每次下降固定的value。定步长。得到结果差异会很大,有的很大,有的很小。

所以,想让最后差异很大,用L1,否则用L2


例子

1婴儿神经,6岁神经最多。14神经越来越少。neutron跟人脑神经一样,如果有些权重参数很小,一直没有update(不加入正则项1或L2来做update,只使用学习率和损失函数的的的权重衰减),则会接近为0,最后不见了



下一个将dropout:



DropOut原理:

在training的时候,每次update参数之前,对每一个Neuron(包括input_layer)做sampling,决定这个Neuron按一定几率p丢掉,跟它相连的weight也被丢掉,结果得到一个细长的Network。


每一次update参数之前,都做一次resampling,每一次update一个mini-batch之前,拿来traing的Network structure是不一样的。在training时,用dropout的时候,performance会变差。该方法,目的就是让training性能稍微差一点,而testing性能变好。



在testing的时候,注意

1 不做dropout,所有Neuron都用。假设training时的删除神经元的概率为p%,则在testing时,所有的weight都要乘以(1-p)%【一般toolkit会自动处理】



原理:

在training的时候,使用dropout,像是脚上绑了个重物,在testing时,丢掉重物。




另外一种说法:

一个Neuron的每一个Neuron是一个学生,连在一起,作为teamwork,工作时,有一些被删除,但是在最终真实考试时,没有没删除,都会努力。


另外一个解释:

为什么要testing的weight和training的weight不一样?保证两边的加权和基本上相同,然后再做激活函数。


dropout的实际理由:它是一种ensemble方法。

每次从大的trainingset中拿出一部分来,train很多个model,而且其Network的structure不一样。虽然每个model的variance很大,但是model很复杂的情况下,但是总体平均bias很小,不会overfitting。




每次拿一个mini-batch时,拿出了不同的Network。可能有2的n次方个Network,但是不同的network中的参数w是shared,也就是说,会按照bagging或者boosting的方法来求得最终的模型,一个Network可能只用一个batch来train,但一个weight可能用很多个batch来train,最后做平均(bagging)或者增量叠加。合在一起效率很高。

 

神奇的地方,只有在linear activation function的情况下,ensemble的,在testingdata中,做dropout,与不做dropout而是乘以1-p%,得到的结果大致近似。


下面最简单的例子:

linear变化,不考虑bias,可以确定output。注意:dropout的只会drop input和hidden的layer中的神经元。不会drop output中的。


不同的structure做dropout和乘以1-p,得到的结果是一致。

假设很多个layer,或者用飞linear的activation function,如sigmoid,则dropout结果不会等于乘以1-p

relu与linear相似,所以

dropout在用relu或maxout的时候,类似于用linaer的激活函数。









  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值