'); })();

浅谈深度学习基础(上)

编辑时间: 2017-12-26 22:43:24    关键字:

 

  Adagrad就是针对这一问题提出的,自适应地为各个参数分配不同学习率的算法。其公式如下:

Adagrad

Adagrad

  学习速率η不再恒定不变,而是根据上式持续更新,下面的分母会随着迭代次数的增加累加gi,gi是第i次更新所得到偏导数。

  也即,对于所有的参数来讲,学习速率都是越来越小的。而且,偏导越小,学习速率减小的就越慢。

  第一条很好理解,第二条要简单解释一下,如果偏导很小,说明本来的更新速率就很小,如果再将学习速率这个参数以一个较快的速度减小,那这个维度下的总参数更新速率就会变的过慢。

  当然Adagrad也不是唯一的算法,拥有类似功能的还有RMSprop、Adadelta、AdaSecant、Adam等,而且一般而言Adam是目前的最优选择。

Momentum

  我们考虑这样一个问题,如果单纯的只靠梯度来作为权重更新的唯一依据,会出现什么样的问题,如下图所示:

浅谈深度学习基础

 

  当梯度非常小,也即曲面在对应维度上非常平缓时,权重的更新会变得相当慢;在鞍点,也即偏导数为0的点,该维度权重会停止更新;而且也很容易停留在局部最小值而达不到全局最小值。

  Momentum是冲量的意思,不过我们可以简单的把它理解为惯性,把梯度下降看做一个小球沿曲线滑落的过程,这样即便在梯度为零的点,也能以一个较快的速度进行梯度下降,甚至还有可能帮助损失函数突破局部最小值的限制,到达全局最小值。

  前面所提到的表现优秀的Adam算法,就相当于RMSProp (高级版Adagrad) + Momentum。

如何优化在测试集上的表现

  模型由于采用了过于复杂的参数,从而在训练集上拥有良好表现,而在测试集上表现很差,这样的现象叫做过拟合。这一部分就是要讲如何解决过拟合的问题。

增大训练集

  首先来讲最简单的一个方法,增大训练集,通过使用更大的训练集来增强模型对于各种样本的适应性。

  增大训练集也有两种方法,一个自然是去找到更多的训练样本,而另一个,是去创造更多的训练样本。比如在图像识别中,我们可以通过对已有图像训练样本的角度进行调整来创造一个新的训练样本,我们也可以通过在训练样本中加上一些噪声来创造新的训练样本等。

 

提早停止(Early Stopping)

Early Stopping

Early Stopping

  模型在测试集上的误差往往首先会随着测试集误差的减小而减小,但到了后期,模型就会倾向于通过过拟合来进一步降低自身在训练集上的误差,而这样的优化实际上是升高了模型在测试集上的误差的。所以我们可以通过提前停止训练来一定程度上避免过拟合。

正则化

  正则化的目的是为了防止过拟合,但是正则化为什么可以防止过拟合?

  正则化是在我们通常的损失函数后面加一个正则项,这个正则项实际上是一个对参数大小的惩罚项,那为什么正则项可以限制参数不能过大?

  因为正则项里面通常包含参数,而我们的优化目的又是尽可能的缩小损失函数函数值,所以在优化的过程中,我们就会让参数尽可能的小。那为什么参数小了就可以防止过拟合?我读的资料里面写的都是参数越大,模型越复杂,越容易过拟合,那为什么参数大了模型就越复杂?

  我们可以想一下,模型函数求导后的式子中是会保留有参数的,如果参数越大,也就意味着模型的导数越大,也就意味着模型曲线越不平滑,也就越容易通过各种扭曲去拟合噪声样本点,也即越容易发生过拟合。

  L0,L1,L2正则项是机器学习中常用的正则项:

  L0:指非零参数的个数。前面讲过正则项的目的是为了惩罚参数过大,在这里也就是希望零参数越多越好,非零参数越少越好;优化损失函数正好是限制了正则项过大,也即限制了非零参数的个数过多。但使用L0正则项有个问题,就是难以优化,所以一般不用。

  L1:

采用L1正则项

采用L1正则项

  L2:

采用L2正则项

采用L2正则项

  对于使用了L1、L2正则项的损失函数来说,往极小值处优化自身函数值实际上就限制了正则项不能过大,也就限制了w不能过大,也即防止了过拟合。

  L1会趋向于产生少量的特征,而其他的特征都是0,也即实现稀疏,只保留少量特征。而L2会选择更多的特征,这些特征都会接近于0。L2正则项也叫权重衰减,是最常用的正则项,而且带L2的回归,就是我们上篇文章所提到过的岭回归,上篇文章说『岭回归就是在原来最小二乘法式子求逆之前先加上一个阶数与样本数相同的对角矩阵,也即加上一个正则项,使矩阵为奇异的风险大降低,损失了无偏性,来换取高的数值稳定性』,里面的这个正则项,就可以理解为L2正则项。

Dropout

  Dropout也是防止过拟合的一种方法。基本原理很简单,就是训练时,每次更新参数之前,随机去掉网络中p%的神经元,也即更改了网络结构,让整个网络变得更简单。如果与前面的梯度下降结合起来,那就是每次使用训练集的一个新的mini-batch之前,都随机丢掉网络中p%的神经元,用剩下的神经元进行训练,进行参数更新。

  然后到使用测试集的时候,使用完整的网络,但所有权重统一乘以(1-p)%。因为训练时只用部分神经元就生成了较为合适的输出z,如果使用了全部的神经元而权重仍然使用训练时的权重,那结果可能就会变成z的n倍。

  而且因为前面讲了是随机去掉网络中p%的神经元的,所以可能若干次训练的神经网络是会共享部分神经元的,当然也可能不共享,如果p较大的话。

  如果非要讲原理的话,我借用我在其他资料里面看到的,当一群人组队做事情的时候,如果每个人都想着,我的队友会干活的,那什么事情都完成不了;如果每个人都认为,我的队友不行,还是得靠我自己,那么事情会做的好的多:>

Network Structure

  有些神经网络的结构天然就是能防止过拟合的,比如CNN,池化过程避免了过拟合。

关键词阅读:
延伸阅读
推荐热图

合作推荐

热图推荐

更多

频道推荐
  • 技术
  • |
  • 管理
  • |
  • 考试
2010-2016 可思数据版权所有 ICP备案:京ICP备14056871号