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

  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,那接下来要做什么呢?
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第1张图片
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不够好
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第2张图片
当只有一种方法提出的时候,它往往只针对两个问题中的其中一个处理而已,比如deep learning中有一个方法叫dropout,它往往只能改善testing的结果,而training的结果并不会变好

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

2.Good Results on Training Data?

如何在Training data上得到更好的performance?主要分为两个模块,New activation function和Adaptive Learning Rate
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第3张图片

2.1 New activation function

activation function

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

下图是MNIST手写数字识别的结果,当layer越来越多的情况下,accuracy一开始持平,后来就掉下去,甚至在第9,10层的时候,结果就崩溃了。但是这并不能被认为是因为参数太多而导致overfitting,实际上这张图只是training set的情况,testing的结果甚至不知道,又怎么知道overfitting呢
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第4张图片
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上得到的结果肯定比较差

《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第5张图片
为什么会有这种现象?
设某一个参数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
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第6张图片
因此即便Δw值很大,但没经过一个sigmoid function就会被缩小一次,所以network越深,Δw被衰减的次数就越多,直到最后,它对output的影响就比较小,相应的input对loss的影响就比较小,于是靠近input的那些wight对loss的gradient ∂l/∂w远小于靠仅output 的gradient
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第7张图片

ReLU

introduction
怎么解决上述的问题呢?现在比较常用的activation function叫做Rectified Linear Unit(整流线性单元函数,又称修正线性单元),该函数形状如下图所示,z为input,a为output,如果input>0则output = input,如果input<0则output = 0
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第8张图片
选择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是没有任何作用的,因此可以拿掉

《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第9张图片
拿掉所有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
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第10张图片
既然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一样。
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第11张图片
在实际操作上,几个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为下图左下角绿线
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第12张图片
如果我们使用的是上图右上角所示的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],为右下角绿线
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第13张图片
从上面例子可以看出MaxOut是一个可学习的Learnable Activation Function,具体形状可以根据training data去generate出来

property

MaxOut可以实现任何的分段线性激活函数,其中这个activation function被分为极端,取决于把多少个element z放到一个group中,如下图所示
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第14张图片

How to train Maxout

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

假设在下面的Maxout network中,红框圈起来的部分为每个neuron的output
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第15张图片
其实Max operation就是linear的,只是它仅连接在前面这个group里的某一个element上,如果我们将那些没有被Max连接到的element统统拿掉,就会得到一个比较细长的linear network

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

因此,在具体时间上,完全可以线根据data把max函数转化为某个具体的函数,在对这个转化后的thiner linear network进行微分
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第16张图片
而虽然指挥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
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第17张图片
RMSProp

learning rate

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

但是在下图中,即使在同一方向上,loss function也可能一会平坦一会陡峭,因此要随时根据gradient的大小快速调整learning rate
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第18张图片
面对这种情况,Adagrad可能是不够的,因此要用更dynamic的方法–RMSProp

How to do RMSProp

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

Momentum

optimization - local minima

除了learning rate的问题以外,local minimum也是一个问题。
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第20张图片
其实不太需要担心这样的问题,因为一旦出现local minima,它就必须出现在每一个dimension都像上图那样低谷的形状,假设出现的几率为p,那当network越复杂,参数越多,这样事情发生的几率就越小。

where is Momentum from

假设有一个球从左上角滚下来,它回滚到plateau的地方或local minima的地方,但是由于惯性它还会继续向前走一段,因此球很有可能翻过该低谷,走到比local minima还要好的地方
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第21张图片
因此要做的就是,把惯性塞到gradient descent中

How to do Momentum

当我们在gradient descent中加入Momentum的时候,每一次update的方向,不再只考虑gradient的方向,还要考虑上一次update的方向,因此要用一个变量v去记录前一个时间点update的方向
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第22张图片
在上图中λ表示惯性对前进方向的影响有多大

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

换一句话说,Momentum每一个时间点运动的步伐,包括大小,方向,就是过去所有gradient的加权和,比如第一个时间点运动的步伐v1是θ0处的gradient加权,第二个时间点移动的步伐v2是θ0和θ1的加权和。由于λ的值小于1,意味着越之前的gradient,它的权重便越小
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第23张图片
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第24张图片
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
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第25张图片
最后做update,将Momentum建议你的方向mt乘上learning rate α,在除掉RMSProp normalize后建议的learning rate分母,然后得到update的方向
在这里插入图片描述
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第26张图片

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去做这件事
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第27张图片

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参数集里的每一个参数都取平方后求和,即:
在这里插入图片描述
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第28张图片
通常在做regularization时,新加的term是不会考虑bias项的,因为我们的目的时让function更加平滑,而bias跟平滑程度并没有什么关系

而前面乘的1/2主要是因为平方后求微分会多出来一个2,所以要与之相抵消
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第29张图片
与之前推导出来的式子作比较,会发现参数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值

《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第30张图片
SGN的意思就是,如果w是正,sgn=+1,就会变成减去一个posittive的值让参数变小,反之则变大,综值就是让它们的绝对值减小至接近0

L1 VS L2
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第31张图片
L1和L2,虽然同样是让参数的绝对值变小,但是做的是略微不同的

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

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

Weight Decay

刚出生的时候·,婴儿的神经比较稀疏,6岁的时候,就会有许多神经,但是到14岁时,神经间的连接又减少了,因此weight decay则是相同意思
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第32张图片

3.3 Dropout

Training

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

即每次update之前都通过抽样只保留network中的一部分neuron来做训练
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第33张图片
而当training的时候使用dropout,得到的performance其实是会变差的,因为某些neuron在training的时候就会莫名消失

但是Dropout真正要做的事情,就是让你在training set上的结果变差,但是在testing set上的结果变好
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第34张图片
Testing:

再做dropout的时候要注意两件事情
·testing的时候不做dropout,所有的neuron都要被用到
·假设在training的时候,dropout rate是p%,从training data中被learn出来的所有weight都要乘上(1-p%)才能被当作testing的weight使用
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第35张图片
why Dropout?

《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第36张图片
为什么training和testing使用的weight是不一样的?

因为在testing的时候是没有dropout的,所以如果testing使用的是和training同一组weight,那左侧得到的output z和右侧得到的output z’,它们的值其实是会相差两倍的,这样会造成testing和training的结果不match
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第37张图片
那就需要将右侧testing中所有的weight乘上0.5,然后做normalization,这样z就会等于z‘。

Dropout is a kind of ensuemble

ensemble就是假设又很大的training set,而每次只从training set里面sample一部分data出来,如下图所示
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第38张图片
之前有讲个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
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第39张图片
为什么dropout是一个终极的ensemble方法呢?

在training network时,每次拿一个minibatch出来就做一次update,而根据dropout的特性,每次update之前都要对所有的neuron进行sample,因此每一个minibatc所训练的network是不同的,也可以训练更多的network
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第40张图片
实际操作ensemble的做法

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

而dropout神奇的地方在于,它并没有把这些network分开考虑,而是用一个一个完整的network,并将weight乘上(1-p%),并将testing data丢进这个完整的network,得到的结果跟ensemble的结果相差无几
《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第41张图片

《机器学习》学习笔记(七)-- 深度学习的技巧和优化方法_第42张图片
从上图可以看出,在简单的case里面,用不同的network structure做ensemble的事情,并且得到的output其实是一样的

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

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

你可能感兴趣的:(机器学习,机器学习)