Tips for training DNN

如何寻找training的问题

在这里插入图片描述(1)首先要检查的是,neural network在training set有没有得到好的结果(是否陷入局部最优),没有的话,回头看,是哪个步骤出了什么问题,你可以做什么样的修改,在training set得到好的结果。

(2)假如在training set得到了一个好的结果了,然后再把neural network放在你的testing data,testing set的performance才是我们关心的结果。
如果在testing data performance不好,才是overfitting(注:training set上结果就不好,不能说是overfitting的问题)。

小结:如果training set上的结果变现不好,那么就要去neural network在一些调整,如果在testing set表现的很好,就意味成功了。

(tips:很多人容易忽视查看在training set上结果,是因为在机器学习中例如是用SVM等模型,很容易使得training set得到一个很好的结果,但是在深度学习中并不是这样的。所以一定要记得查看training set 上的结果。不要看到所有不好的performance都是overfitting。)

在这里插入图片描述

例如:在testing data上看到一个56-layer和20-layer,显然20-layer的error较小,那么你就说是overfitting,那么这是错误的。首先你要检查你在training data上的结果。
在training data上56-layer的performance本来就比20-layer变现的要差很多,在做neural network时,有很多的问题使你的train不好,比如local mininmize等等,56-layer可能卡在一个local minimize上,得到一个不好的结果,这样看来,56-layer并不是overfitting,只是没有train的好。

如何改进神经网络

在这里插入图片描述

更改激活函数

在这里插入图片描述在2006年以前,如果将网络叠很多层,往往会得到上图的结果。上图,是手写数字识别的训练准确度的实验,使用的是sigmoid function。可以发现当层数越多,训练结果越差,特别是当网络层数到达9、10层时,训练集上准确度就下降很多。但是这个不是当层数多了以后就overfitting,因为这个是在training set上的结果。

梯度消失

在这里插入图片描述当网络比较深的时候会出现vanishing Gradient problem

比较靠近input 的几层Gradient值十分小,靠近output的几层Gradient会很大,当你设定相同的learning rate时,靠近input layer 的参数updata会很慢,靠近output layer的参数updata会很快。当前几层都还没有更动参数的时候(还是随机的时候),随后几层的参数就已经收敛了。

为什么靠近前几层的参数会特别小呢?
怎么样来算一个参数w对 total loss Z的偏微分,实际上就是对参数做一个小小的变化,对loss的影响,以此来判断这个参数gradient 的值有多大。
改变某个参数值(即可以给某个参数加上△w)会对其连接的下一神经元产生影响,但是这种影响是逐层衰减的,即每通过一次sogmoid function影响就会衰减一次(因为sogmoid function会将值压缩到0到1之间,将参数变化衰减),hidden layer很多的情况下,最后对loss 的影响非常小(对input 修改一个参数其实对output 是影响是非常小)。
理论上我们可以设计dynamic的learning rate来解决这个问题,确实这样可以有机会解决这个问题,但是直接改activation function会更好,直接从根本上解决这个问题。

ReLU(解决梯度消失)

修改activation function,ReLU input 大于0时,input 等于 output,input小于0时,output等于0
选择这样的activation function有以下的好处:

  • 比sigmoid function比较起来运算比较快的
  • 有一些生物上的原因
  • 无穷多的sigmoid function(不同的bias)叠加在一起的结果等同于ReLU的结果
  • 可以处理 vanishing gradient problem

如何解决梯度消失问题
ReLU activation function 作用于两个不同的range,一个range是当activation input大于0时,input等于output,另外一个是当activation function小于0是,output等于0。
对那些output等于0的neural来说,对network一点的影响都没有,可以把它从整个network拿掉。(下图所示) 剩下的input等于output是linear时,整个network就是a thinner linear network在这里插入图片描述

我们需要的不是linear network(就像我们之所以不使用逻辑回归,就是因为逻辑回归是线性的),所以我们才用deep learning ,就是不希望我们的function不是linear,我们需要它不是linear function,而是一个很复杂的function。对于ReLU activation function的神经网络,只是在小范围内是线性的,在总体上还是非线性的。

ReLU 变体

在这里插入图片描述

改进1 leaky ReLU ReLU在input小于0时,output为0,这时微分为0,你就没有办法updata你的参数,所有我们就希望在input小于0时,output有一点的值(input小于0时,output等于0.01乘以input),这被叫做leaky ReLU。
改进2 Parametric ReLU : Parametric ReLU在input小于0时,output等于αz为neural的一个参数,可以通过training data学习出来,甚至每个neural都可以有不同的α值。

Maxout
用Maxout来根据training data自动生成activation function。
Exponential linear Unit (ELU)
在这里插入图片描述

让network自动去学它的activation function,因为activation function是自动学出来的,所有ReLU就是一种特殊的Maxout case。
input是x1,x2,x1,x2乘以不同的weight得到5,7,-1,1。这些值本来是通过ReLU或者sigmoid function等得到其他的一些value。在Maxout里面,将这些value group起来(哪些value被group起来是事先决定的,如上图所示),在组里选出一个最大的值当做output(例如选出7和1,这是一个vector 而不是一个value),7和1再乘以不同的weight得到不同的value,然后group,再选出max value。

ReLU是Maxout中的一种特殊情况
在这里插入图片描述在这里插入图片描述上图是由于Maxout network中有两个pieces,如果Maxout network中有三个pieces,Maxout network会学习到不同的activation function如下图。
在这里插入图片描述怎么样去training,因为max函数无法微分。但是其实只要可以算出参数的变化,对loss的影响就可以用梯度下降来train网络。
在这里插入图片描述max operation用方框圈起来,当你知道在一组值里面哪一个比较大的时候,max operation其实在这边就是一个linear operation,只不过是在选取前一个group的element。把group中不是max value拿掉。

在这里插入图片描述没有被training到的element,那么它连接的w就不会被training到了,在做BP时,只会training在图上颜色深的实线,不会training不是max value的weight。这表面上看是一个问题,但实际上不是一个问题。

当你给到不同的input时,得到的z的值是不同的,max value是不一样的,因为我们有很多training data,而neural structure不断的变化,实际上每一个weight都会被training。

Adaptive Learning Rate

在deep learning 的问题上,Adagrad可能是不够的,这时就需要RMSProp

RMSProp

在这里插入图片描述

除了learning rate的问题以外,我们在做deep learning的时候,有可能会卡在local minimize,也有可能会卡在 saddle point,甚至会卡在plateau的地方。
其实在error surface上没有太多的local minimize,所以不用太担心。因为,你要是一个local minimize,你在一个dimension必须要是一个山谷的谷底,假设山谷的谷底出现的几率是P,因为我们的neural有非常多的参数(假设有1000个参数,每一个参数的dimension出现山谷的谷底就是各个P相乘),你的Neural越大,参数越大,出现的几率越低。所以local minimize在一个很大的neural其实没有你想象的那么多。

在这里插入图片描述

在真实的世界中,在如图所示的山坡中,把一个小球从左上角丢下,滚到plateau的地方,不会去停下来(因为有惯性),就到了山坡处,只要不是很陡,会因为惯性的作用去翻过这个山坡,就会走到比local minimize还要好的地方,所以我们要做的事情就是要把这个惯性加到GD里面(Mometum)。

加上momentum的梯度下降
在这里插入图片描述

选择一个初始值 θ 0 \theta0 θ0然后用v0去记录在前一个时间点移动的方向(因为是初始值,所以第一次的前一个时间点是0)接下来去计算在 θ \theta θ0上的gradient,移动的方向为v1。在第二个时间点,计算gradient θ \theta θ1,gradient告诉我们要走红色虚线的方向(梯度的反方向),由于惯性是绿色的方向(这个λ和learning rare一样是要调节的参数,λ会告诉你惯性的影响是多大),现在走了一个合成的方向。以此类推…
在这里插入图片描述 加上Momentum之后,每一次移动的方向是 negative gardient加上Momentum的方向(现在这个Momentum就是上一个时间点的Moveing)。
现在假设我们的参数是在这个位置(左上角),gradient建议我们往右走,现在移动到第二个黑色小球的位置,gradient建议往红色箭头的方向走,而Monentum也是会建议我们往右走(绿的箭头),所以真正的Movement是蓝色的箭头(两个方向合起来)。现在走到local minimize的地方,gradient等于0(gradient告诉你就停在这个地方),而Momentum告诉你是往右边的方向走,所以你的updata的参数会继续向右。如果local minimize不深的话,可以借Momentum跳出这个local minimize

Adam

在这里插入图片描述

training data效果好而testing data 效果不好

early stopping

在这里插入图片描述随着你的training,你的total loss会越来越小(learning rate没有设置好,total loss 变大也是有可能的),training data和testing data的distribute是不一样的,在training data上loss逐渐减小,而在testing data上loss逐渐增大。理想上,假如你知道testing set 上的loss变化,你应该停在不是training set最小的地方,而是testing set最小的地方(如图所示),可能training到这个地方就停下来。但是你不知道你的testing set(有label的testing set)上的error是什么。所以我们会用validation解决,validation set模拟 testing set,什么时候validation set最小,你的training 会停下来。

Regularization/weight decay

在这里插入图片描述重新去定义要去minimize的那个loss function。

在原来的loss function(minimize square error, cross entropy)的基础上加一个regularization term(L2-Norm),在做regularization时是不会加bias这一项的,加regularization的目的是为了让function更加的平滑(bias跟平滑这件事情是没有任何关系的)。

在这里插入图片描述在update参数的时候,其实是在update之前就已近把参数乘以一个小于1的值(1-ηλ是很小的值),这样每次都会让weight小一点。最后会慢慢变小趋近于0,但是会与后一项梯度的值达到平衡,使得最后的值不等于0。L2的Regularization 又叫做Weight Decay,就像人脑将没有用的神经元去除。
在这里插入图片描述
w是正的微分出来就是+1,w是负的微分出来就是-1,可以写为sgn(w)。
每一次更新时参数时,我们一定要去减一个ηλsgn(wt)值(w是正的,就是减去一个值;若w是负的,就是加上一个值,让参数变大)。

L2、L1都可以让参数变小,但是有所不同的,若w是一个很大的值,L2下降的很快,很快就会变得很小,在接近0时,下降的很慢,会保留一些接近01的值;L1的话,减去一个固定的值(比较小的值),所以下降的很慢。所以,通过L1-Norm training 出来的model,参数会有很大的值。

dropout

how to train

在这里插入图片描述

在train的时候,每一次update参数之前,对network里面的每个neural(包括input),做sampling(抽样)。 每个neural会有p%会被丢掉,跟着的weight也会被丢掉。
在这里插入图片描述在这里插入图片描述

在testing上注意两件事情:

  • 第一件事情就是在testing上不做dropout。
  • 在dropout的时候,假设dropout rate在training是p%,all weights都要乘以(1-p%)

假设training时dropout rate是p%,在testing rate时weights都要乘以(1-p)%。(假定dropout rate是50%,在training的时候计算出来的weights等于1,那么testing时的rate设为0.5

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值