《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法

  1. Recipe of Deep Learning
  2. Good Results on Training data?
  3. Good Results on Testing Data?

1.Recipe of Deep Learning

three step of deep learning
我们已经知道了deep learning的三个步骤:
· define the function set(network structure)
· goodness of function(loss function - cross entropy)
· pick the best function(gradient descent - optimization)

做完这些事情后,会得到一个更好的neural network,那接下来要做什么呢?
在这里插入图片描述
Good Results on Training Data?

首先要做的是提高model在training set上的正确率。

虽然deep learning的model中有许多参数,但是并不容易overfitting(即在training set上表现很好,但是在testing set上performance却不好),只有像dicision tree这类方法。

因此deep learning并不像dicision tree那样,一训练就有很好的正确率,因此可以做一些修改,让它在training set得到比较高的正确率

Good Results on Testing Data

接下来要做的则是,提高model在testing data上的正确率

假设现在已经在training set上得到好的performance,那接下来就把model apply到testing set上。

而有时候加入了新的technique,想解决overfitting的时候,其实反而会让training set结果变坏,所以在做完修改后,要重新检查新的model在training set上的结果,如果这个结果变坏的话,就要对network的过程做一些调整,如果结果都变好了,就可以真正应用了

Conclusion

在deep learning里面,有两个问题:
·在training set上的performance不够好
·在testing set上的performance不够好
在这里插入图片描述
当只有一种方法提出的时候,它往往只针对两个问题中的其中一个处理而已,比如deep learning中有一个方法叫dropout,它往往只能改善testing的结果,而training的结果并不会变好

所以在选择方法的时候,需要先清除要解决哪个方面的问题

2.Good Results on Training Data?

如何在Training data上得到更好的performance?主要分为两个模块,New activation function和Adaptive Learning Rate
在这里插入图片描述

2.1 New activation function

activation function

在training结果不好的情况下,很可能是network架构设计的不好,举例来说,可能用的activation function是对training比较不利,那可以换新的activation function。获得比较好的结果。

下图是MNIST手写数字识别的结果,当layer越来越多的情况下,accuracy一开始持平,后来就掉下去,甚至在第9,10层的时候,结果就崩溃了。但是这并不能被认为是因为参数太多而导致overfitting,实际上这张图只是training set的情况,testing的结果甚至不知道,又怎么知道overfitting呢
在这里插入图片描述
Vanishing Gradient Problem

上图产生的原因并不是overfitting,而是Vanishing Gradient(梯度消失)

当把network叠的很深时,在靠近input的地方,这些参数的gradient时比较小的,而在靠近output的地方则比较大。

因此当learning rate一定的情况下,在靠近input的地方,参数的update是很慢的,而靠近output的地方,参数的update是比较快的

所以在靠近input的地方,参数几乎还是random的时候,putput就已经根据这些随机值找到一个local minima,然后就收敛了

而在这时候,参数的loss下降速度变得很慢,并会把程序停掉,由于这个收敛是几乎基于随即参数的,所以model的参数并没有被充分训练,那在training data上得到的结果肯定比较差

在这里插入图片描述
为什么会有这种现象?
设某一个参数w对total cost l的偏微分,即gradient ∂l/∂w,它的意思是,当把这个参数做小小的变化时,它对cost的影响有多大;把第一个layer里的某一个参数w加上Δw,看看network的output和target之间的loss有什么影响

Δw通过sigmoid function后,得到的output会变小,改变某一个参数的weight,会对某个neuron的output值产生影响,但这个影响会随着层数的递增而衰减,sigmoid function的形状如下所示,它会把无穷大的值限制到0-1建,把较大的input压缩成较小的output

因此即便Δw值很大,但没经过一个sigmoid function就会被缩小一次,所以network越深,Δw被衰减的次数就越多,直到最后,它对output的影响就比较小,相应的input对loss的影响就比较小,于是靠近input的那些wight对loss的gradient ∂l/∂w远小于靠仅output 的gradient
在这里插入图片描述

ReLU

introduction
怎么解决上述的问题呢?现在比较常用的activation function叫做Rectified Linear Unit(整流线性单元函数,又称修正线性单元),该函数形状如下图所示,z为input,a为output,如果input>0则output = input,如果input<0则output = 0
在这里插入图片描述
选择ReLU的理由如下:
· 跟sigmoid function比起来,ReLU的运算快许多
· 无穷多bias不同的sigmoid function叠加的结果会变成ReLU
· ReLU可以处理Vanishing gradient问题

handle Vanishing gradient problem

下图是ReLU的neural network,以ReLU作为activation function的neuron,它的output要么等于0,要么等于input

当output = input时,activation function就是linear的;而output=0的neuron对整个network是没有任何作用的,因此可以拿掉

在这里插入图片描述
拿掉所有output为0的neuron后,整个network就变成了一个瘦长的linear network,linear的好处是,output=input,不会像sigmoid function一样使input产生的影响逐层递减

ReLU-variant

其实relu还是存在一定问题的,比如input《0时,output=0,此时微分值也为0,则无法去update参数,所以当input<0时,微分后还能有一点点值,比如令a=0.01z,这个东西叫做leaky ReLU
在这里插入图片描述
既然a可以等于0.01z,那这个z可不可以是其他值呢,而这就是Parametric ReLU,也就是令a=α·z,其中α并不是固定的值,而是network的一个参数。

Maxout

introduction

Maxout的想法是,让network自动去学习它的activation function,那Maxout network就可以自动学出ReLU,也可以学出其他方法,一切有training data决定

首先先将不同weight的input分为几组,如下图所示,然后在分好组后,在组内选取最大值作为output

整个过程就好像在一个layer上做Max Pooling一样。
在这里插入图片描述
在实际操作上,几个element被分为一个group这件事是由自己决定的,它就是network structure里一个需要被调的参数

Maxout -> ReLU

接下来讨论Maxout事如何模仿出ReLU这样的activation function的。

下图左上角是一个ReLU的neuron,它的input x乘上neuron的weight w,再加上bias b,然后通过RELU得到output a
·neuron的input为z=wx+b,为下图左下角紫色线
·neuron的output为下图左下角绿线
在这里插入图片描述
如果我们使用的是上图右上角所示的Maxout network,假设z1的参数w和b与ReLU的参数一致,而z2的参数w和b全部设为0,然后做Max Pooling,选取z1,z2较大值作为a

· neuron的input为【z1 z2】
· z1 = wx + b,为上图右下角紫线
· z2 = 0,为红线
· neuron的output为max【z1 z2】,为上图右下角绿线

此时ReLU和Maxout所得到的output是一模一样的,它们是相同的activation function

Maxout -> More than ReLU

除了ReLU,Maxout还可以实现更多不同的activation function

比如z2的参数w和b不是0,而是w’,b’,此时
·neuron的input为[z1,z2]
`z1 = wx+b,为右下角紫线
·z2=w’x+b,为右下角红线
·neuron的output为max[z1,z2],为右下角绿线
在这里插入图片描述
从上面例子可以看出MaxOut是一个可学习的Learnable Activation Function,具体形状可以根据training data去generate出来

property

MaxOut可以实现任何的分段线性激活函数,其中这个activation function被分为极端,取决于把多少个element z放到一个group中,如下图所示
在这里插入图片描述

How to train Maxout

接下来要解决的是Max不能微分的问题

假设在下面的Maxout network中,红框圈起来的部分为每个neuron的output
在这里插入图片描述
其实Max operation就是linear的,只是它仅连接在前面这个group里的某一个element上,如果我们将那些没有被Max连接到的element统统拿掉,就会得到一个比较细长的linear network

虽然network因为含有max函数无法微分,但是只要丢进去一笔data,network就会根据这笔data确定具体的形状,max函数问题就会被实际数据所解决,而我们完全可以根据这笔training data使用Backpropagation的方法去训练被network留下来的参数

因此,在具体时间上,完全可以线根据data把max函数转化为某个具体的函数,在对这个转化后的thiner linear network进行微分
在这里插入图片描述
而虽然指挥train留在network里面的参数,但是当input不同data的时候,得到的network structure是不同的,留在network里面的参数也是不同的,由于有很多笔training data,所以network的structure在训练中不断变换,实际上最后每一个weight参数都会被train到

而CNN的Max Pooling有关max函数的微分问题可以采用Maxout一样的方案即可解决

2.2 Adaptive learning rate

Review - Adagrad

Adagrad的精神是,假设考虑两个参数w1,w2,如果在w1这个方向上,平常的gradient都比较小,那它是比较平坦的,于是就给他比较大的learning;与之相反,在w2这个方向,平常gradient都比较大,也就是比较陡峭,于是给它比较小的learning rate
在这里插入图片描述
RMSProp

learning rate

loss function 可以是任何形状,对convex loss function来说,每个方向上它会一直保持平坦或陡峭的状态,因此只需要针对平坦的情况设置较大的learning rate,反之亦然即可

但是在下图中,即使在同一方向上,loss function也可能一会平坦一会陡峭,因此要随时根据gradient的大小快速调整learning rate
在这里插入图片描述
面对这种情况,Adagrad可能是不够的,因此要用更dynamic的方法–RMSProp

How to do RMSProp

我们的learning rate依旧设置为一个固定的值η,除掉一个变化的值σ,这个σ等于上一个σ和当前梯度g的加权均根,即
在这里插入图片描述
上式中α值是可以自由调整的,和Adagrad不同在于,Adagrad的分母是对过程中所有的gradient取平方和开根号,也就是说Adagrad考虑的是整个过程平均的gradient信息;而RMSProp是利用一个α来调整对不同gradient的使用程度,比如把α调小一点,就是更倾向于相信新的gradient,而比较无视旧的gradient。
在这里插入图片描述
因此可以给已经看到的gradient比较大的weight,给过去看到的gradient比较小的weight,去调整对gradient信息的使用程度。

Momentum

optimization - local minima

除了learning rate的问题以外,local minimum也是一个问题。
在这里插入图片描述
其实不太需要担心这样的问题,因为一旦出现local minima,它就必须出现在每一个dimension都像上图那样低谷的形状,假设出现的几率为p,那当network越复杂,参数越多,这样事情发生的几率就越小。

where is Momentum from

假设有一个球从左上角滚下来,它回滚到plateau的地方或local minima的地方,但是由于惯性它还会继续向前走一段,因此球很有可能翻过该低谷,走到比local minima还要好的地方
在这里插入图片描述
因此要做的就是,把惯性塞到gradient descent中

How to do Momentum

当我们在gradient descent中加入Momentum的时候,每一次update的方向,不再只考虑gradient的方向,还要考虑上一次update的方向,因此要用一个变量v去记录前一个时间点update的方向
在这里插入图片描述
在上图中λ表示惯性对前进方向的影响有多大

红线为gradient要移动的反方向,绿线则是上一次惯性想要走的方向,蓝线则是实际前进的方向

换一句话说,Momentum每一个时间点运动的步伐,包括大小,方向,就是过去所有gradient的加权和,比如第一个时间点运动的步伐v1是θ0处的gradient加权,第二个时间点移动的步伐v2是θ0和θ1的加权和。由于λ的值小于1,意味着越之前的gradient,它的权重便越小
在这里插入图片描述
在这里插入图片描述
Adam

其实RMSProp加上momentum,就可以得到adam
Adam的algorithm如下:
· 先初始化m0 = 0,m0就是momentum中,前一个时间点的movement
在初始化v0 = 0,v0就是RMSPROP里计算gradient的root mean
最后初始化t=0,t表示时间点

·先计算出gradient gt
在这里插入图片描述
·再根据过去要走的方向mt-1和gradient gt,算出现在要走的方向
在这里插入图片描述
然后根据前一个时间点的vt-1和gradient gt的哦i你官方,算一下放在分母的vt–RMSPRop
在这里插入图片描述
·接下来做一个原来RMSProp和Momentum里没有的东西,就是bias correction,它使mt和vt都除上一个值,这个值本来比较小,后来会越来越接近1
在这里插入图片描述
最后做update,将Momentum建议你的方向mt乘上learning rate α,在除掉RMSProp normalize后建议的learning rate分母,然后得到update的方向
在这里插入图片描述
在这里插入图片描述

3. Good Results on Testing Data?

那么如何在Testing data上得到更好的performance?分为3个模块,Early Stopping,Regularization和Dropout

在这里插入图片描述

3.1Early Stopping

假设learning rate调的比较好,那随着训练的进行,total loss通常会越来越小,但是Training set和Testing set的情况并不是完全一样的,和有可能是恰恰相反

所以,如果已经知道了testing data上的loss变化情况,你会在testing set的loss最小的时候停下来,而不是在training data的loss最小出停下;但是testing是未知的东西,因此需要用validation set去做这件事
在这里插入图片描述

3.2 Regularization

regularization就是在原来的loss function上额外加几个term,比如要minimize的loss function原先应该是square error或cross entropy,那在做Regularization时,就在后面加一个Regularization的term

L2 regularization

regularzation term可以是参数的L2 NORM(L2正规化),就是把model参数集里的每一个参数都取平方后求和,即:
在这里插入图片描述
在这里插入图片描述
通常在做regularization时,新加的term是不会考虑bias项的,因为我们的目的时让function更加平滑,而bias跟平滑程度并没有什么关系

而前面乘的1/2主要是因为平方后求微分会多出来一个2,所以要与之相抵消
在这里插入图片描述
与之前推导出来的式子作比较,会发现参数wi在每次update之前,都会乘上(1-ηλ),而这两个值都是很小的值,因此总体会是一个接近于1的值,如0.99;也就是会随着update次数的增加,参数wi会越来越接近于0

但是由于通过微分得到的η·∂λ/∂wi这一项会和前面的(1-ηλ)·wi这一项取得平衡,所以不会出现最后所有参数都变为0的情况。

这种做法就叫做Weight Decay(权重衰减)

L1 regularization

除了L2的方法,还可以使用L1 regularization,把平方项换成每一个参数的绝对值,即:
在这里插入图片描述
而对于绝对值不能为微分的问题,其实可以将绝对值是一个v字型的函数,在v左边的微分是-1,右边则是1,在0不能为分的地方,就直接给于0值

在这里插入图片描述
SGN的意思就是,如果w是正,sgn=+1,就会变成减去一个posittive的值让参数变小,反之则变大,综值就是让它们的绝对值减小至接近0

L1 VS L2
在这里插入图片描述
L1和L2,虽然同样是让参数的绝对值变小,但是做的是略微不同的

·L1是每次update减掉一个固定的值
·L2则是乘上一个小于1的固定值

因此,当参数w的绝对值比较大时,L2会让w下降的更快,而L1每次update只让w减去一个固定值;而当w的绝对值比较小的时候,则恰恰相反

Weight Decay

刚出生的时候·,婴儿的神经比较稀疏,6岁的时候,就会有许多神经,但是到14岁时,神经间的连接又减少了,因此weight decay则是相同意思
在这里插入图片描述

3.3 Dropout

Training

在training的时候,每次update参数前,对每一个neuron做抽样,每个neuron都有p%的几率被丢掉,如果某个neuron被丢掉的话,跟它相连的weight都要被丢掉

即每次update之前都通过抽样只保留network中的一部分neuron来做训练
在这里插入图片描述
而当training的时候使用dropout,得到的performance其实是会变差的,因为某些neuron在training的时候就会莫名消失

但是Dropout真正要做的事情,就是让你在training set上的结果变差,但是在testing set上的结果变好
在这里插入图片描述
Testing:

再做dropout的时候要注意两件事情
·testing的时候不做dropout,所有的neuron都要被用到
·假设在training的时候,dropout rate是p%,从training data中被learn出来的所有weight都要乘上(1-p%)才能被当作testing的weight使用
在这里插入图片描述
why Dropout?

在这里插入图片描述
为什么training和testing使用的weight是不一样的?

因为在testing的时候是没有dropout的,所以如果testing使用的是和training同一组weight,那左侧得到的output z和右侧得到的output z’,它们的值其实是会相差两倍的,这样会造成testing和training的结果不match
在这里插入图片描述
那就需要将右侧testing中所有的weight乘上0.5,然后做normalization,这样z就会等于z‘。

Dropout is a kind of ensuemble

ensemble就是假设又很大的training set,而每次只从training set里面sample一部分data出来,如下图所示
在这里插入图片描述
之前有讲个bias和variance的trade off情况,一种是因为bias大而导致不准确(参数太少);一种是因为variance大而导致不准确(参数过多)

假设有一个很复杂的model,它往往bias比较准,但是variance很大,而如果有很多个笨重复杂的model,虽然它们的variance都很大,但是最后平均起来,结果往往就比较准

所以ensemble做的事情,就是从原来的training data里面sample出很多subset,然后train很多个model,每个model的structure甚至可能都不一样,在testing的时候,丢一笔testing data进来,使他通过所有的model,得到许多结果并最后平均起来当作最后的output

当model很复杂时,往往非常奏效,但是如果model太简单的话,就容易overfitting
在这里插入图片描述
为什么dropout是一个终极的ensemble方法呢?

在training network时,每次拿一个minibatch出来就做一次update,而根据dropout的特性,每次update之前都要对所有的neuron进行sample,因此每一个minibatc所训练的network是不同的,也可以训练更多的network
在这里插入图片描述
实际操作ensemble的做法

在testing的时候,把train好的一大把network拿出来,然后将testing data丢到network中去,并将每个network反馈的结果平均起来,的到最后的output,但是这样的运算量非常大

而dropout神奇的地方在于,它并没有把这些network分开考虑,而是用一个一个完整的network,并将weight乘上(1-p%),并将testing data丢进这个完整的network,得到的结果跟ensemble的结果相差无几
在这里插入图片描述

在这里插入图片描述
从上图可以看出,在简单的case里面,用不同的network structure做ensemble的事情,并且得到的output其实是一样的

但是要注意的是,只有是linear的network,才会得到这样的等价关系,如果是非linear,则不会有这样的等价关系;但是即便是这样,dropout神奇的事,最后的结果还是会work

如果network很接近linear的话。dropout得到的performance会比较好,而ReLU和Maxout的的network相对来说比较接近于linear,所以通常会把含有ReLU或Maxout的network于Dropout配合使用

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值