zoukankan      html  css  js  c++  java
  • 机器学习笔记07(Tips of Deep Learning)

    Tips  of Deep Learning —— Deep learning 优化

    1、Training 优化

         1)Recipe of Deep Learning 

         2)Training 优化方法 

               1)换激活函数(Sigmoid、ReLU、Maxout、Tanh、Softmax)

               2)优化器——优化gd和自适应调学习率(SGD、Adagrad、RMSProp、Momentum、Adam)

    2、Testing(过拟合)优化:

        1)Early Stopping

     2)Regularization 正则化

     3)dropout

    1、Training 优化

        1)Recipe of Deep Learning 

             如果运行模型的时候结果不好,首先看训练结果好不好,而不是一味认为是过拟合。

             当 training data 表现良好,但是 testing data 表现很糟糕的时候才是overfitting。

                         

                       

           如上,在testing data 中表现不好,不能说是 overfitting ,因为可能training data 中表现本来就不好。

         2)training 优化方法 

      1)换激活函数(Sigmoid、ReLU、Maxout、Tanh、Softmax)

      2)优化器——优化gd和自适应调学习率(SGD、Adagrad、RMSProp、Momentum、Adam)

               1)换激活函数(Sigmoid、ReLU、Maxout、Tanh、Softmax)

                          激活函数可能会带来什么样的问题?以sigmoid为例说:会出现梯度消失

                 1、什么是梯度消失 

    • 有梯度时,参数才会往梯度最小的地方改变;没有梯度了,参数就停止更新了。
    • 前面层的学习速率明显低于后面层(后向传播),这就是梯度消失。

                

                 2、为什么会有梯度消失 

               较大变化范围的input ,只会得到较小范围变化的output ,经多层此过程,会使得变化率越来越小。

                     

             直观解释

                                       

                  3、怎样解决梯度消失 —— 换激活函数 

             梯度消失是因为sigmoid引起的,要解决当然要换一个激活函数。

               

          1、换ReLU

        input<0时,输出为0,input>0,输出为原值

           

        ReLU还可以令神经网络更加thinner

               

      ReLU只是在微小范围内线性的,整体是非线性的(因为只要输入有比较大的变化时,ReLU都会不同) 

        ReLU变形:

            

     2、Maxout(ReLU增强)——能自动学习激活函数(随着参数更新,激活函数一直改变)

       一、首先看看Maxout的结构(多了一个max):

                  

      二、然后,maxout是如何自动调整激活函数呢(也就是随着参数更新,激活函数一直改变)

            

      w,b不同时,激活函数就不同(右边)。当w`和b`为0时,激活函数就会变成ReLU(左边),当输入有3个element时,激活函数就会有3段

                   

        三、那么 maxout 是如何 train data 呢

       max选择了哪一个较大参数的路,就用该激活函数那段来求偏导

                   

               2)优化器——优化gd和自适应调学习率(SGD、Adagrad、RMSProp、Momentum、Adam)

                         

                 利用梯度下降的方法update数据,其决定因素主要是 梯度值 和 学习率eta 两个因素

                       

                方法1、Adagrad 

                learning rate小了,训练速度会很慢,learning rate大了,训练就得不到好结果,那么应该要自适应调节才行。

                        

        一、如何自适应

        前面说到,利用梯度下降的方法update数据,其决定因素主要是 梯度值 和 学习率eta 两个因素

        那么我们的目标是:学习率eta从大——>小,梯度从大——>小变化,训练正常的话梯度是由大到小变化的,那么如何让eta也从大到小变化呢(除以一个梯度的均方根)

                         

                        

                            

        这样,随着梯度累计越来越多,eta就会越来越小,实现了eta由大到小的变化。但是为什么要除以一个梯度的均方根呢,这样做有什么道理的吗?

       二、为什么要除以一个梯度的平方和开根号

             我们用一个简单的例子说明,假如要从以下二维函数的一点到达最低点,那么最佳的step应该是跟一次导数(梯度)有关的:

                         

        但是单单考虑一次导数是不够的,要是在三维函数里面就不行了:(比如要判断出a、c哪个离最低点近,该给一个大一点还是小一点的eta比较合适)

                      

        这时候要引入二次导数:

                 

        绿色曲线的曲率大一点,所以二次导数更大,所以虽然c的一次导数比较大,但是由于二次导数也大,综合影响c点离最低点比较近,给一个小一点的eta就可以了

           

        综上,用梯度的平方和开根号近似于二次导数(因为曲线越宽,曲率越小,很多梯度的平方和就越小,因此二次微分就越小),就得到了Adagrad公式了

        

                方法2、SGD(updata数据会更快) 

                   

                 方法3、Feature Scaling

                 方法4、RMSProp 

             在上面Adagrad中,学习率是跟损失函数对w的二次微分有关。那么对于图中蓝绿相交的一点来说,因为w1所在的曲率相对于w2要小,所以w1的学习率会比w2大。现在单考虑w1(只看横向),那么二次微分是固定的(碗状),也就是说w1是根据固定的规则去自动调整eta的。但是现实中同一方向的二次微分是不固定的,因此对于同一方向W1,需要不同的规则去调eta.

      对于一个参数来说,Adagrad是用固定的规则去调eta,RMSProp是用变化的规则去调eta

                     

             在原来分母这一项中,在过去梯度平方和前面加上权值a,现有的梯度平方加上1-a。

          使用指数衰减滑动平均以丢弃遥远过去的历史(在参数空间更为平缓的方向,会取得更大的进步(因为平缓,所以历史梯度平方和较小,对应学习下降的幅度较小),并且能够使得陡峭的方向变得平缓,从而加快训练速度)

                     

                  方法5、Momentum (动量)
                     此方法是用来解决local min 问题的。

                    就是将这一次的移动距离,需要考虑上一次的移动距离和方向(需要乘上一个系数)。

                        

                    实现

                        

                   方法6、Adam(RMSProp+Momentum)

                        


    2、Testing 优化

            training 没问题了,再检查 testing 是否有比较好的结果,一共有三种方法。

                 

             1、Early Stopping  

           testing data 并不是真正的未知数据,而是在training 中未使用的 data ,也就是Validation data,用这些数据来确定在testing data中表现如何的最优点。

                    

              2、Regularization

      一、首先理解什么是范数,L1(范数为1)和L2(范数为2)是什么?

        范数:向量在不同空间中“长度”的计算公式

        L1:绝对值之和

        L2:平方和

           二、L2 正则化

                    1)怎么做?

                       

              因为η、λ、n都是正的,所以 1−ηλ 小于1,它的效果是减小w,这也就是权重衰减(weight decay)的由来。当然考虑到后面的导数项,w最终的值可能增大也可能减小。

                 2)解释 

                  模型过于复杂会导致过拟合。那么越小的w(可以想象成0理解),表示网络复杂度低,越简单的网络结构,就越不会过拟合(参考第一节regression)。

                  比如模型   y=W1*X1+W2*X22    中把w2=0代入,模型就会简化,就不会引起过拟合。

                     

                3)理解 

            什么是有用参数,什么是没用参数?如2)中,怎么就把x1删去,不把x2删去呢?

            我们姑且假设w2是有用参数,w1是无用参数,由公式知参数更新值跟权值、梯度值两个因素有关,实际上,无论是x1还是x2,权值都会衰减,每update一次参数,权值w就会衰减一次,但如果是下图的情况,损失函数Loss的减少跟w1没关系的,所以对其偏导为0,那么w1的参数更新只跟权值有关了,随着更新次数叠加,权值就会逐渐衰减接近0;对于有用参数w2,虽然它权值衰减,但是它其作用的是后面的偏导值,所以它还是不会变成0的。

                                       

            三、L1 正则化

                L1是在Loss函数加上绝对值之和,求偏导后比原始的更新规则多出了η * λ * sgn(w)/n这一项。

               当w为正时,更新后的w变小。当w为负时,更新后的w变大——因此它的效果就是让w往0靠,使网络中的权重尽可能为0,也就相当于减小了网络复杂度,防止过拟合。

                         

               3、Dropout 

               dropout也是为了简化神经网络结构的目的,但L1、L2正则化是通过修改代价函数来实现的,而Dropout则是通过修改神经网络本身来实现的

          一、dropout是如何实现的

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

            

       在testing的时候,注意:1 、不做dropout,2、如果training时的删除神经元的概率为p%,则在testing时,所有的weight都要乘以(1-p)%

               

              二、dropout的原理(为什么这样做可行)

        回顾正则化原理:通过修改代价函数最终也是为了实现简化模型的,dropout就更加直接!

                     

        实际上,dropout是利用ensemble思想,把一个复杂神经网络的训练转化为,训练很多个简单的神经网络,然后再把多个简单神经网络训练出来的参数做平均

         

         testing的时候也一样操作:

                 

        最后,testing中dropout的过程就可以用权值*(1-p)%来代替

  • 相关阅读:
    Wix 安装部署教程(七) 获取管理员权限
    【异常处理_iis】无法启动IIS Expressiisexpress.exe
    记一次Url重写_发布之后iis 404
    $.ajax 跨域请求 Web Api
    转手项目二三事
    【吉光片羽】之 Web API
    Failed to execute goal org.mortbay.jetty:maven-jetty-plugin
    eclipse解决editor does not contain a main type的方法
    linux 网卡eth0检测时没有IP地址,怎么回事??
    div+css 和 xhtml+css是一回事么?
  • 原文地址:https://www.cnblogs.com/Haozi-D17/p/13197478.html
Copyright © 2011-2022 走看看