深度学习03:Tips for Deep Learning


深度学习理论系列:
深度学习01
深度学习02:CNN

1 做deep learning的流程

  • define the function set(network structure)
  • goodness of function(loss function – cross entropy)
  • pick the best function(gradient descent – optimization)
    在这里插入图片描述
      做完这些事情以后,你会得到一个neural network,然后要做的事情是提高model在training set上的正确率。如果训练集效果不好,那模型存在欠拟合。训练集效果较好后,检测在测试集上的表现,假如结果不好,模型存在过拟合。当针对测试集进行一些调整以克服overfitting后需要把这个模型放入训练集中,看看表现是否变坏。因此在deep learning里面,有两个问题:欠拟合和过拟合。
      针对欠拟合:新的激活函数、adaptive learning rate
      针对过拟合:early stopping、regulation、dropout
    在这里插入图片描述

2 欠拟合对策

2.1 New activation function

2.1.1 Gradient Problem(梯度消失)

  在全连接网络中,如果我们选择的激活函数是sigmod,那么越deep,就越容易发生梯度消失的情况。我们随机选择了几个初始的参数值,然后没怎么训练模型就停止了。数学推导如下:
在这里插入图片描述
从sigmoid图像中可知,如果out8接近于1,那1-out8接近于0,out8(1-out8)很小,更何况这个很小的数还要和 O7 * (1-O7) ,O6 * (1-O6) 。。。。O1 * (1-O1) 这些小数相乘,那就更小了。所以也许靠近输出层的那几层梯度下降也许比较ok,但是靠近输入层的梯度下降肯定没这么快。

2.1.2 ReLU

  解决梯度消失的办法就是ReLU,该函数形状如下图所示,z为input,a为output,如果input>0则output = input,如果input<0则output = 0。output=0的neuron对整个network是没有任何作用的,因此可以把它们从network中拿掉。output=input的好处是不会像sigmoid function一样使input产生的影响逐层递减。
在这里插入图片描述
  Leaky ReLU:当input<0的时候,微分后还能有一点点的值,比如令a = 0.01z,这个东西就叫做Leaky ReLU
在这里插入图片描述

2.1.3 Maxout

  假设现在有input x 1 x_{1} x1 , x 2 x_{2} x2 ,它们乘上几组不同的weight分别得到5,7,-1,1,这些值本来是不同neuron的input,它们要通过activation function变为neuron的output;但在Maxout network里,我们事先决定好将某几个“neuron”的input分为一个group,比如5,7分为一个group,然后在这个group里选取一个最大值7作为output
在这里插入图片描述
Maxout -> RELU
  下图左上角是一个ReLU的neuron,它的input x会乘上neuron的weight w,再加上bias b,然后通过activation function-ReLU,得到output a。neuron的input为z = w x + b,为下图左下角蓝线,neuron的output为a = z ( z > 0 ) ; a = 0 ( z < 0 ),为下图左下角绿线。
  如果我们使用的是上图右上角所示的Maxout network,假设z 1的参数w和b与ReLU的参数一致,而z2 的参数w和b全部设为0,然后做Max Pooling,选取z 1 , z 2 较大值作为a。neuron的input为[ z1 z2]。z1 = wx + b,为下图右下角蓝线,z2=0,为上图右下角红线
neuron的output为max[z1 z2]为下图右下角绿线
在这里插入图片描述
Maxout -> More than ReLU
在这里插入图片描述
Maxout不同的形状
  Maxout可以实现任何piecewise linear convex activation function(分段线性凸激活函数),其中这个activation function被分为多少段,取决于你把多少个element z放到一个group里,下图分别是2个element一组和3个element一组的activation function的不同形状
在这里插入图片描述
如何训练maxout
其实Max operation就是linear的operation,只是它仅接在前面这个group里的某一个element上,因此我们可以把那些并没有被Max连接到的element通通拿掉,从而得到一个比较细长的linear network
在这里插入图片描述

2.2 Adaptive learning rate

2.2.1 Adagrad

若某个方向比较平缓则用大的learning rate,如果比较陡峭则用小的learning rate。
在这里插入图片描述

2.2.2 Momentum

  常用mini-batch SGD训练算法,然而虽然这种算法能够带来很好的训练速度,但是在到达最优点的时候并不能够总是真正到达最优点,而是在最优点附近徘徊。另一个缺点就是这种算法需要我们挑选一个合适的学习率,当我们采用小的学习率的时候,会导致网络在训练的时候收敛太慢;当我们采用大的学习率的时候,会导致在训练过程中优化的幅度跳过函数的范围,也就是可能跳过最优点。我们所希望的仅仅是网络在优化的时候网络的损失函数有一个很好的收敛速度同时又不至于摆动幅度太大

指数加权平均数

  假定我们有一堆数据 θ 0 \theta_{0} θ0, θ 1 \theta_{1} θ1,…, θ n \theta_{n} θn,那么,我们根据这些数据来拟合一条曲线,所得的值 v t v_{t} vt就是如下的公式:
v t = β v t − 1 + ( 1 − β ) θ t v_{t}=\beta v_{t-1}+(1-\beta)\theta_{t} vt=βvt1+(1β)θt,在计算时可视 v t v_{t} vt大概是 1 1 − β \frac{1}{1-\beta} 1β1的每日温度,如果是0.9,可视为十天的平均值。

Momentum
  Momentum基本的想法就是计算梯度的指数加权平均数,并利用该梯度更新你的权重。
v d w = β v d w + ( 1 − β ) d W v_{dw}=βv_{dw}+(1−β)dW vdw=βvdw+(1β)dW (1) 式中第一项表示惯性的方向,第二项表示梯度方向,两个合力就是接下来要走的负方向。
v d b = β v d b + ( 1 − β ) d b v_{db}=βv_{db}+(1−β)db vdb=βvdb+(1β)db (2)
W = W − α v d w W=W−αv_{dw} W=Wαvdw (3)
b = b − α v d b b=b−αv_{db} b=bαvdb (4)
(1)和(2)分别是损失函数在前t−1轮迭代过程中累积的梯度梯度动量,一般 β β β =0.9,即平均了前十次迭代的梯度。

2.2.2 RMSProp

RMSProp算法对权重 W 和偏置 b 的梯度使用了微分平方加权平均数。
其中,假设在第 tt 轮迭代过程中,各个公式如下所示:
s d w = β s d w + ( 1 − β ) d W 2 s_{dw}=βs_{dw}+(1−β)dW^2 sdw=βsdw+(1β)dW2
s d b = β s d b + ( 1 − β ) d b 2 s_{db}=βs_{db}+(1−β)db^2 sdb=βsdb+(1β)db2
W = W − α s d w + ε d W W=W−\frac{α}{\sqrt{s_{dw}}+ε}dW W=Wsdw +εαdW
b = b − α s d b + ε d b b=b−\frac{α}{\sqrt{s_{db}}+ε}db b=bsdb +εαdb
  在上面的公式中 s d w s_{dw} sdw s d b s_{db} sdb分别是损失函数在前 t−1轮迭代过程中累积的梯度梯度动量, β是梯度累积的一个指数。所不同的是,RMSProp算法对梯度计算了 微分平方加权平均数。这种做法有利于消除了摆动幅度大的方向,用来修正摆动幅度,使得各个维度的摆动幅度都较小。另一方面也使得网络函数收敛更快。(比如当 dW 或者 db中有一个值比较大的时候,那么我们在更新权重或者偏置的时候除以它之前累积的梯度的平方根,这样就可以使得更新幅度变小)。为了防止分母为零,使用了一个很小的数值 ϵ 来进行平滑,一般取值为 1 0 − 8 10^{−8} 108

2.2.3 Adam

  momentum是优化梯度的方向,RMSProp是为了动态调整学习率,Adam优化算法基本上就是将Momentum和RMSprop结合在一起。具体过程如下:
在这里插入图片描述

3 过拟合对策

3.1 early stopping

  假设你今天的learning rate调的比较好,那随着训练的进行,total loss通常会越来越小,但是Training set和Testing set的情况并不是完全一样的,很有可能当你在Training set上的loss逐渐减小的时候,在Testing set上的loss反而上升了

  所以,理想上假如你知道testing data上的loss变化情况,你会在testing set的loss最小的时候停下来,而不是在training set的loss最小的时候停下来;但testing set实际上是未知的东西,所以我们需要用validation set来替代它去做这件事情
在这里插入图片描述

3.2 Regularization

L1正则和L2正则

3.3 Dropout

  在training的时候,每次update参数之前,我们对每一个neuron(也包括input layer的“neuron”)做sampling(抽样) ,每个neuron都有p%的几率会被丢掉,如果某个neuron被丢掉的话,跟它相连的weight也都要被丢掉
  就是每次update参数之前都通过抽样只保留network中的一部分neuron来做训练
在这里插入图片描述
  每次update参数之前都要做一遍sampling,所以每次update参数的时候,拿来training的network structure都是不一样的。Maxout是每一笔data对应的network structure不同,而Dropout是每一次update的network structure都是不同的(每一个minibatch对应着一次update,而一个minibatch里含有很多笔data)
  当你在training的时候使用dropout,得到的performance其实是会变差的,因为某些neuron在training的时候莫名其妙就会消失不见,但这并不是问题,因为:Dropout真正要做的事情,就是要让你在training set上的结果变差,但是在testing set上的结果是变好的
所以如果你今天遇到的问题是在training set上得到的performance不够好,你再加dropout,就只会越做越差。
testing:
在使用dropout方法做testing的时候要注意两件事情:

  • testing的时候不做dropout,所有的neuron都要被用到
  • 假设在training的时候,dropout rate是p%,从training data中被learn出来的所有weight都要乘上(1-p%)才能被当做testing的weight使用
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值