CS231N-6&7-Training Neural Networks

Activation functions

RELU的优点很多:容易计算,生物合理,但会产生梯度消失的问题。因为负数的导数为0,导致权值无法更新。

关于梯度消失,gradient<1,请参考 vanishing gradient problem

关于梯度爆炸,gradient>1,请参考 gradient exploding problem 对偶现象。

炼丹的问题千千万。

这里写图片描述

Leaky RELU是为了改善梯度消失,增加了负数的梯度。ELU是另一种负数梯度的激活函数,robust to noise.

这里写图片描述
这里写图片描述
这里写图片描述

总结:

  • 推荐RELU,经验证明很好的activation functions。
  • 可以尝试leaky RELU/ELU/MAXout
  • 不要用sigmoid

这里写图片描述

Data Preprocessing

这里写图片描述

数据预处理方式有很多,CNN deep learning通常只采取zero mean,即减去均值X -= np.mean(X, axis = 0)。至于标准化X /= np.std(X, axis = 0),PCA, whitening等ML常用技巧,好像不需要。
zero-centered的本质原因是加快收敛。还是没懂zigzag啊呜呜~

这里写图片描述

Weight Initialization

权值初始化也是研究的热门领域,没有标准答案。但不能太大或太小。

  • w全0或者太小,梯度都差不多,我们不喜欢symmetry,更要命的是,梯度太小了(注意链式法则带着所有的w乘积),梯度消失。。。
  • w太大,梯度太大了,梯度爆炸。。。

要找一个大小合适的。推荐xavier初始化。参考Understanding the difficulty of training deep feedforward neural networks[J]. Journal of Machine Learning Research, 数学原理链接里有。保证两个空间通过映射也不改变方差。根据均匀分布性质,计算得到

这里写图片描述
nin和nout对应forward/backward的神经元。

这里写图片描述

Batch Normalization

目前十分流行的trick,单独作为一层,加在卷积层和RELU之间。相当于数据预处理归一化的拓展,拓展到每一卷积层之后。
具体步骤就是对每次训练的最小单位batch里同一维度作归一化。然后学习参数来调整乃至复原。

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

摘自quora
Batch normalization potentially helps in two ways: faster learning and higher overall accuracy. The improved method also allows you to use a higher learning rate, potentially providing another boost in speed.

Why does this work? Well, we know that normalization (shifting inputs to zero-mean and unit variance) is often used as a pre-processing step to make the data comparable across features. As the data flows through a deep network, the weights and parameters adjust those values, sometimes making the data too big or too small again - a problem the authors refer to as “internal covariate shift”. By normalizing the data in each mini-batch, this problem is largely avoided.

Basically, rather than just performing normalization once in the beginning, you’re doing it all over place.

Learning rate

学习率一直是最重要的超参数。

老师建议先训练20个样本到0error,然后训练大的batch,我估计一是看模型有没有问题,二是加快训练速度吧。

关于学习率的大小一定要合适,太大会引起loss爆炸,即NaN,太小会引起loss万年不变,合适的区间是1e-3到1e-5.

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

然后我们要知道,一直以来有两个超参数:lr学习率,reg正则项。这两者的搭配可以使用随机遍历,而非grid,因为最佳参数组合会很奇怪。

以及loss关于lr的图像,避免nan的high lr,也避免陷入plateau的伪lr,要真切往下凿的lr。

最后的总结很重要。

这里写图片描述
这里写图片描述
这里写图片描述

下一讲仍是关于训练技巧。

Optimization

优化是机器学习的核心函数,传统的优化SGD随机梯度下降,对于深度学习神经网络而言,产生一些问题。

  • 问题一:收敛缓慢。在下降快的维度震荡很大,在下降慢的温度振幅很小,如图。形成夸张的zigzag。这在二维这样,在神经网络如此高维的更是很容易发生。
    • 数学原理:矩阵的条件数condition number. 这个问题牵扯到梯度下降这一迭代优化方法的本质。这也是我很感兴趣的数学理论。我将花费大量笔墨讨论condition number与gradient descent关系。
    • 感谢带我了解condition number的疑似老板学生博客,系统阐释conditon number定义的wiki,最感谢临门一脚将condition number与gradient descent打通的知乎大神回答什么是ill-conditioning 对SGD有什么影响?

condition number

condition number条件数,衡量函数值相对误差与自变量相对误差之比。和导数密切相关。

  • 一元情况是: so condition number is
  • 对于矩阵,当我们解线性方程组时:

会发现 A1b 和A,b的变化相关,有的差别很大,有的却很小。衡量这种差别的,就是条件数:

故这是满秩矩阵的条件数表达式,用到了范数不等式,这是数分三柯西不等式的应用。很简洁的形式。

  • 那么对于普通的多元函数梯度下降,形象的表达是衡量函数梯度最大变化率与梯度最小变化率之比,就像课件中的zigzag图背景的等高线图,horizontal的梯度变化率远小于vertical。 比值越大,函数对误差越敏感(如矩阵的线性方程解),超过1,我们认为是ill-conditioned,小于1是well-conditioned。

更数学的解释,我们来看下梯度下降的本质。

这里写图片描述

这是多元函数的taylor expansion,注意到Hesse matrix。H的最大特征值为L。那么由特征值性质:
这里写图片描述

这里写图片描述

从知乎大神回答看出,为何沿着梯度下降,是根据二阶泰勒展开近似后,根据二元函数最小值而得出的。最大特征值/最小特征值决定了这个近似是否完美,从而收敛的速度快慢。而梯度变化率本身就是二阶偏导,故与Hesse的特征值是吻合的。这也是一阶方法的局限。

这里写图片描述

好,让我们看梯度下降的第二个问题

saddle point

  • 问题二:遇到local minima或者saddle point。即局部最小值和鞍点。高维函数这种情况很常见。注意鞍点是梯度为0,但两边的二阶导符号相反的点。
    • both of them : sgd get stuck.
    • 高维更常见的是saddle point,而local minima比较特殊要求很高很少见。这是学术界之前一直误判的地方!saddle point只需要hesse不定,即特征值有正有负,而local minima要求正定,特征值全正,显然在高维时概率较低。鞍点才是main point. 参见知乎
      这里写图片描述

问题三:这是有stochastic带来的。因为sgd是每次计算时选取随机的Mini batch,这样减少庞大的计算量,但近似的结果可能不真,有很大的noise。故收敛也会缓慢。
这里写图片描述

所以接下来介绍几个sgd的变种,这些优化方法能有效避免上述问题。
优化部分参考:https://zhuanlan.zhihu.com/p/22252270 http://blog.csdn.net/u014595019/article/details/52989301 http://ruder.io/optimizing-gradient-descent/index.html 这个讲的最清楚

SGD with momentum

首先是sgd with momentum,带动量的SGD。借用物理名词,但我感觉更多是惯性的意思。
这里写图片描述
这里写图片描述
这里写图片描述
每次前进的方向除了当前梯度下降方向,还要加上历史的加权梯度(越近的梯度权重越大)。这样能有效避免在当前梯度很小时停滞不前,即避免local minima&saddle point;还能对于ill-conditioned的神经网络,椭圆形的等高线图,能避免zigzag,将历史的相反方向叠加,能合成出更合理的方向(见图)。

  • 历史梯度与现梯度方向一致,则加速
  • 历史梯度与现梯度方向相反,则抑制zigzag,从而加速
  • 现梯度接近0,历史梯度帮助你跳出Local minima/saddle points

更深的数学原理还要继续学习。

AdaGrad&RMSProp

第二个介绍AdaGrad&RMSProp.

如果说momentum让我们领略了历史梯度加的力量,那么AdaGrad则是将历史梯度除的力量。

我们一直以为的套路是,学习率乘以梯度,每个分量的学习率是一致的,这样梯度大小就决定了前进步伐。如果每个分量的学习率,将除以该分量历史梯度平方和的开方,那么其步伐将被标准化一些:

  • 梯度大的分量,步伐变小
  • 梯度小的分量,步伐变大

有效避免zigzag现象。

但缺点是:

  • 对步伐影响太大,统一了也不太好
  • 中后期历史梯度平方和很大,使得步伐趋于0,提前收敛…

改进就是RMSProp. 与momentum类似,采用加权历史梯度平方和,decay_rate=0.9,这样就能防止提前收敛。效果会比AdaGrad好很多。
这里写图片描述
这里写图片描述
从收敛图中看出,momentum是快速步伐大,绕圈子收敛,SGD缓慢不前,adagrad提前收敛,rmsprop目标明确,表现最佳。

Adam

Adam是AdaGrad和Momentum的孩子。

继承父母的基因,是一种综合,中和。即有momentum的动量的加,也有RMSProp的除。

注意多了unbias处理,为了防止初始化为0时更新步伐太大。
这里写图片描述

这位桀骜的博士推荐Adam,甚至告诉我们他的参数,说对很多模型都适用。然后轻蔑的一笑。

我觉得很虚。网上说实际上朴素的SGD很多时候够了,Adam这种花招不一定准确率高。而这才是炼丹的魅力。

越发不想炼丹了,这种凭借拍脑袋做实验调参调模型的把戏,如果说本硕还能做做体验的话,博士就真的太无聊了,可是理论又太难,呜会好的。

其实上述方法不仅是梯度下降的变种,更确切的是学习率在每个维度上的订制或者说调整适应,即 Per-parameter adaptive learning rate methods

Learning rate decay

这里写图片描述
这里写图片描述

SGD需要decay,因为不太收敛,而其他Adam并不一定。

建议最开始固定lr,想看模型如何,再决定是否decay。

另外decay是按epoch的,即迭代一定次数再decay,故会出现跳跃式下降。

Second-Order Optimization 二阶优化之Newton method

  • 一阶优化:近似保留到梯度,用直线平面拟合,计算量小,但拟合不精确且迭代次数多。典型应用:梯度下降(包括上述所有SGD变种)
  • 二阶优化:近似保留到梯度的梯度(Hessian),用曲线曲面拟合,计算量大,但拟合精确且迭代次数少。典型应用:牛顿法。

但因为深度学习的输入太大,Hessian转置是 O(N3) 的,存储也是 O(N2) ,故通常不采用,ML估计会用。现实还是用一阶优化梯度下降。

这里写图片描述
这里写图片描述
这里写图片描述

red: Newton; green: GD

关于二阶优化的推导,见数学回答. 关于二阶优化的通俗几何解释,见通俗回答. Newton’s Method wiki.
关于二阶优化为何无法在深度学习上应用的回答,摘录部分:

  1. 最主要原因还是计算量太大。如果一个优化问题是n 维的,那么单轮梯度下降的复杂度是O(n) ,Quasi-Newton是O(n^2) (当然limited-memory BFGS可以更少,但总之比梯度下降还是会高不少),而Newton method是O(n^3) 。在神经网络中,n 会是神经网络中参数的个数,所以n 通常是个不小的数字(起码也得10^4 这个量级吧),此时n^3n 之间的差距将非常巨大,虽然牛顿法迭代次数远少于梯度法,但也无法弥补单轮复杂度上的巨大劣势。实际上,正是因为大规模数据的普及,最近若干年优化算法的研究中心也是从二阶算法回归到了一阶算法。虽然也有不少学者试图在大规模数据上降低二阶方法的复杂度,但目前相关理论和算法都还很不够完善(作为做优化的人来说,个人觉得这是一个大有可为的方向)。
  2. 机器学习问题不需要高精度解。当优化误差已经远低于统计误差时,继续优化带来的实际收益非常小,把后一项优化误差从10^{-6} 降到10^{-15} 可能花费大量时间,但因为前一项是一个常数,对整个泛化误差的影响很有可能微乎其微,这是机器学习问题与优化的一些其他application很不一样的地方。而Newton等二阶算法的一个主要优势就是在高精度时的优化速度(比如在strongly-convex条件下,Quasi-Newton和Newton是超线性收敛的,意味着离最优点越近收敛越快),但机器学习问题对精度要求很低,优势展现不出来。
  3. 稳定性。题主要明白的一点事,越简单的东西往往越robust,对于优化算法也是这样。梯度下降等一阶算法只要步长不选太大基本都不会出问题,但二阶方法遍地是坑,数值稳定性啊等等。

作者:Martin Tan链接:https://www.zhihu.com/question/53218358/answer/148782568来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

当然,科研远不止牛顿法。为了减少计算量,有Quasi-Newton method近似牛顿法,估计Hessian矩阵,以及进一步限制矩阵存储量的L-BFGS(limited memory).

近似牛顿法根据历史迭代估计Hessian及其逆,复杂度下降到 O(N2) . 不过仍只适用小规模低维凸数据。但深度学习三大特点:

神经网络优化问题有三个特点:大数据(样本多),高维问题(参数极多),非凸

样本多:故采用stochastic mini-batch来近似整个数据集,但会引入噪声

高维:Hessian矩阵太大,无法存储,计算其逆就算是近似牛顿也太慢

非凸:牛顿法可能发散

作者:过拟合链接:https://www.zhihu.com/question/46441403/answer/117594441来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

这里写图片描述
这里写图片描述
这里写图片描述

Generalization

泛化是机器学习、深度学习永恒的话题。源于泛化误差generalization error,或者说人人皆知的training error与test error的gap,解决方法也是人人皆知的regularization正则化,根据bias-variance trade-off,reduce variance就是reduce overfitting。Ensemble也是其中很多技术的思想。

在深度学习中,泛化有很多具体实现的技术。这里介绍了著名标配的batch normalization,大名鼎鼎的dropout,及其变种dropconnect,data augmentation,还有若干小众技术。

Model Ensembles

模型集成是机器学习常见方法,多个模型(超参不同或者随机)求平均,但深度学习计算量太大,不太适用。

还有test parameter trick,就是历史平均参数,因为我们知道最后在最低点来回震荡,取哪个值都不最好,平均值接近最佳值。

这里写图片描述

这里写图片描述

Dropout

作者把dropout归为regularization正则化的方法,作用是减少过拟合,因为很多feature是给多了。操作很简单,随机让一些神经元(半数)为0,不参与后续计算。注意这里python矩阵化的处理。

可经过分析,我觉得dropout更像是一群随机但共享参数的神经网络的平均,类似essemble。目的就是减少过拟合,加快计算。

注意由于随机p概率变为0,所以train的期望(平均)是乘以p的,但test时候不采用dropout,仍是不变。这样就要调整,可以让test结果乘以p,不过test我们追求的是实时,故将train的结果除以p,train反正是预先的用GPU。这就是Inverted dropout。

dropout建议放在全连接层,卷积层也不错。是很常用的方法,Hinton的贡献之一,至于理论依据,是不是拍脑袋…
这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述
这里写图片描述

DropConnect

dropout割掉输出值,dropconnect割掉权值。其实我之前也想到了233.
这里写图片描述

Data Augmentation

早在第一次上手CNN时,就采用数据增强技术,即改变图片但保持label。retain robust. 具体技术很多,这里从略,博士也一笔带过。

这里写图片描述

最后的建议是BN必须用,dropout建议用,其他可选。

Transfer learning

这完全是另一个主题了。迁移学习,也是时下尚在开垦的领域,源于机器学习。

两个对象source和target,不一样。我们要从source transfer到target。举两个应用场景:

  • target缺数据,source数据充沛(含Label),target想借数据,可是两者有shift(gap),如一个白天图片,一个黑夜图片。需要adaption/mapping,如将亮度调高技术。这就解决了缺数据的难题。这是作业的要求,找一个相似的大数据集,train model,然后transfer到自己的小数据集。
  • 训练target from scratch太耗时,而source的model已经pre-trained,训练好了。何不借source的model呢,虽然参数不太恰当,但大体是一致的,尤其是神经网络,低层都是微观特征(generic),大家都差不多,所以就从source的高层训练(specific),(gap越大训练层数越多),这就改成了target的model。这就是众多Net拿到新的数据集的处理方式。这是课件的例子。

这里写图片描述
这里写图片描述
这里写图片描述

摘自知乎回答什么是迁移学习 (Transfer Learning)?这个领域历史发展前景如何?

学术界很看好transfer learning,课件上写it’s the norm, not an exception. 现在都是pre-trained model套上去。

总结:Optimization和Generalization关注机器学习的两大方面:优化关注如何最小化training error,泛化关注如何减小training和test error的gap。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值