2020李宏毅机器学习笔记-Tips for Training DNN

Tips for Training DNN

 

本节课目的和内容:

 

本文的主要思路:针对training set和testing set上的performance分别提出针对性的解决方法

 

1、在training set上准确率不高:

 

new activation function:ReLU、Maxout

 

adaptive learning rate:Adagrad、RMSProp、Momentum、Adam

2、在testing set上准确率不高:Early Stopping、Regularization or Dropout

 

Recipe of Deep Learning

 

做完 Step 1:define  Step2:goodness Step3:pick,之后我们应该干些啥呢?

Good Results on Training Data?

你要做的第一件事是,提高model在training set上的正确率

因为你在training的时候,deep learning并不是像k nearest neighbor这种方法一样,一训练就可以得到非常好的正确率,

它有可能在training set上根本没有办法给你一个好的正确率,所以,这个时候你要回头去检查在前面的step里面要做什么样的修改,

好让你在training set上可以得到比较高的正确率。

Good Results on Testing Data?

接下来你要做的事是,提高model在testing set上的正确率

假设现在你已经在training set上得到好的performance了,那接下来就把model apply到testing set上,我们最后真正关心的,

是testing set上的performance,假如得到的结果不好,这个情况下发生的才是Overfitting,也就是在training set上得到好的结果,却在testing set上得到不好的结果。

那你要回过头去做一些事情,试着解决overfitting,但有时候你加了新的technique,想要overcome overfitting这个problem的时候,其实反而会让training set上的结果变坏;

所以你在做完这一步的修改以后,要先回头去检查新的model在training set上的结果,如果这个结果变坏的话,你就要从头对network training的process做一些调整,

那如果你同时在training set还有testing set上都得到好结果的话,你就成功了,最后就可以把你的系统真正用在application上面了。

Do not always blame overfitting

不要看到所有不好的performance就归责于overfitting。

对neural network来说,在training set上得到的结果很可能会像左边training error的图,也就是说,20层的network本来就要比56层的network表现得更好,

所以testing set得到的结果并不能说明56层的case就是发生了overfitting,而是在training的时候就没有train好。

有人认为这个问题叫做underfitting,但我的理解上,underfitting的本意应该是指这个model的complexity不足,这个model的参数不够多,

所以它的能力不足以解出这个问题;但这个56层的network,它的参数是比20层的network要来得多的,所以它明明有能力比20层的network要做的更好,

却没有得到理想的结果,这种情况不应该被称为underfitting,其实就只是没有train好而已。

结论:

当你在deep learning的文献上看到某种方法的时候,永远要想一下,这个方法是要解决什么样的问题,因为在deep learning里面,有两个问题:

1.在training set上的performance不够好

2.在testing set上的performance不够好

 

下面我们分别从Training data和Testing data两个问题出发,来讲述一些针对性优化的方法

Good Results on Training Data?

如何在Training data上得到更好的performance,分为两个模块,New activation function和Adaptive Learning Rate

New activation function

activation function

如果你今天的training结果不好,很有可能是因为你的network架构设计得不好。举例来说,可能你用的activation function是对training比较不利的,

那你就尝试着换一些新的activation function,也许可以带来比较好的结果。

在1980年代,比较常用的activation function是sigmoid function,如果现在我们使用sigmoid function,你会发现deeper不一定imply better,

下图是在MNIST手写数字识别上的结果,当layer越来越多的时候,accuracy一开始持平,后来就掉下去了,在layer是9层、10层的时候,整个结果就崩溃了;

但注意!9层、10层的情况并不能被认为是因为参数太多而导致overfitting,实际上这张图就只是training set的结果,你都不知道testing的情况,又哪来的overfitting之说呢?

Vanishing Gradient Problem

上面这个问题的原因不是overfitting,而是Vanishing Gradient(梯度消失),解释如下:

意思是:当你把Network叠加的很深的时候,在靠近input的地方的那几层神经元的参数对最终的lossfunction的微分的影很小,

而在比较靠近output的地方,它对loss的微分值会是比较大的。

因此当你设定同样learning rate的时候,靠近input的地方,它参数的update是很慢的;而靠近output的地方,它参数的update是比较快的。

为什么会有这个现象发生呢?如果你自己把Backpropagation的式子写出来的话,就可以很轻易地发现用sigmoid function会导致这件事情的发生;

但是,我们今天不看Backpropagation的式子,其实从直觉上来想你也可以了解这件事情发生的原因

某一个参数w对total cost l 的偏微分∂l/∂w,即gradient ,它直觉的意思是说,当我今天把这个参数做小小的变化的时候,它对这个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的那些weight对loss的gradient ∂l/∂w 远小于靠近output的gradient。

那怎么解决这个问题呢?

改一下activation function可能就可以handle这个问题了!!!

ReLU

现在比较常用的activation function叫做Rectified Linear Unit(整流线性单元函数,又称修正线性单元),它的缩写是ReLU,该函数形状如下图所示,

z为input,a为output,如果input>0则output = input,如果input<0则output = 0。

handle Vanishing gradient problem

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

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

拿掉所有output为0的neuron后如下图所示,此时整个network就变成了一个瘦长的linear network,linear的好处是,

output=input,不会像sigmoid function一样使input产生的影响逐层递减。

有一个问题:

这里就会有一个问题,我们之所以使用deep learning,就是因为想要一个non-linear、比较复杂的function,

而使用ReLU不就会让它变成一个linear function吗?这样得到的function不是会变得很弱吗?

回答:

其实,使用ReLU之后的network整体来说还是non-linear的,如果你对input做小小的改变,不改变neuron的operation region的话,

那network就是一个linear function;但是,如果你对input做比较大的改变,导致neuron的operation region被改变的话,

比如从output=0转变到了output=input,network整体上就变成了non-linear function。

还有一个问题:

我们对loss function做gradient descent,要求neural network是可以做微分的,

但ReLU是一个分段函数,它是不能微分的(至少在z=0这个点是不可微的),那该怎么办呢?

回答:

在实际操作上,当region的范围处于z>0时,微分值gradient就是1;

当region的范围处于z<0时,微分值gradient就是0;当z为0时,就不要管它,相当于把它从network里面拿掉。

 

ReLU-variant

其实ReLU还存在一定的问题,比如当input<0的时候,output=0,此时微分值gradient也为0,你就没有办法去update参数了,

所以我们应该让input<0的时候,微分后还能有一点点的值,比如令a = 0.01z,这个东西就叫做Leaky ReLU

 

既然a可以等于0.01z,那这个z的系数可不可以是0.07、0.08之类呢?所以就有人提出了Parametric ReLU.

也就是令a=αz,其中α并不是固定的值,而是network的一个参数,它可以通过training data学出来,甚至每个neuron都可以有不同的α值。

这个时候又有人想,为什么一定要是ReLU这样子呢,activation function可不可以有别的样子呢?所以后来有了一个更进阶的想法,叫做Maxout network

 

Maxout

Maxout的想法是,让network自动去学习它的activation function,那Maxout network就可以自动学出ReLU,

也可以学出其他的activation function,这一切都是由training data来决定的

假设现在有input  x1,x2,它们乘上几组不同的weight分别得到5,7,-1,1,这些值本来是不同neuron的input,它们要通过activation function变为neuron的output;

但在Maxout network里,我们事先决定好将某几个“neuron”的input分为一个group,比如5,7分为一个group,然后在这个group里选取一个最大值7作为output。

这个过程就好像在一个layer上做Max Pooling一样,它和原来的network不同之处在于,它把原来几个“neuron”的input按一定规则组成了一个group,

然后并没有使它们通过activation function,而是选取其中的最大值当做这几个“neuron”的output。

在实际操作上,几个element被分为一个group这件事情是由你自己决定的,它就是network structure里一个需要被调的参数,不一定要跟上图一样两个分为一组。

 

MaxOut可以做到Relu的activation function的效果

下图左上角是一个ReLU的neuron,它的input x会乘上neuron的weight w,再加上bias b,然后通过activation function-ReLU,得到output a

  

如果我们使用的是上图右上角所示的Maxout network,假设z1的参数w和b与ReLU的参数一致,

而z2的参数w和b全部设为0,然后做Max Pooling,选取z1,z2较大值作为a。

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

 

Maxout  More than ReLU

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

z2的w和b不再是0了,w’ b’,可以得到新的activation function。如上图

这个时候你得到的activation function的形状(绿线形状),是由network的参数w,b,w1,b1决定的,

因此它是一个Learnable Activation Function,具体的形状可以根据training data去generate出来。

 

如何Train Maxout?

接下来我们要面对的是,怎么去train一个Maxout network,如何解决Max不能微分的问题:

其实Max operation就是linear的operation,只是它仅接在前面这个group里的某一个element上,

因此我们可以把那些并没有被Max连接到的element通通拿掉,从而得到一个比较细长的linear network。

实际上我们真正训练的并不是一个含有max函数的network,而是一个化简后如下图所示的linear network;当我们还没有真正开始训练模型的时候,

此时这个network含有max函数无法微分,但是只要真的丢进去了一笔data,network就会马上根据这笔data确定具体的形状,此时max函数的问题已经被实际数据给解决了,

所以我们完全可以根据这笔training data使用Backpropagation的方法去训练被network留下来的参数。

 

新的问题:

这个时候你也许会有一个问题,如果按照上面的做法,那岂不是只会train留在network里面的那些参数,

剩下的参数该怎么办?那些被拿掉的直线(weight)岂不是永远也train不到了吗?

其实这也只是个理论上的问题,在实际操作上,每个linear network的structure都是由input的那一笔data来决定的,

当input不同data的时候,得到的network structure是不同的,留在network里面的参数也是不同的,由于我们有很多很多笔training data,

所以network的structure在训练中不断地变换,实际上最后每一个weight参数都会被train到。

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值