1. 优化:

1.1 随机梯度下降法(Stochasitc Gradient Decent, SGD)的问题:

  1)对于condition number(Hessian矩阵最大和最小的奇异值的比值)很大的loss function,一个方向梯度变化明显,另一个方向梯度变化很缓慢,SGD在优化过程中会震荡着下降,导致优化很慢。深度学习的网络会有上百万甚至更多的参数需要优化,在这个上百万维的空间里,更容易出现各个维度梯度变化差别很大的问题。

  2)陷落在局部最小点或者鞍点(saddle point)。鞍点一个方向梯度下降,另一个方向梯度上升。对于上百万参数的深度学习,鞍点是更不愿意看到的,因为总是有一些参数的梯度是上升,另一些是下降,或者说鞍点是很常见的。而局部最小点还相对可以接受,因为它至少保证了在各个维度上,都没办法在小范围内使得结果更好。

  3)由于计算所有样本的梯度再取平均太费时了,所以一般是计算一个batch的梯度,但这导致了我们得到的梯度只是真正想要的梯度的夹杂了噪音的小样本估计,这使得梯度下降的轨迹扭来扭曲,优化过程变慢。

1.2.SGD的改进:

  SGD+Momentum:SGD是直接用梯度更新参数 xt+1 = x- α▽f(xt),而Momentum的方法是用梯度构造速度 vt+1 = ρvt + ▽f(xt),然后用速度来更新参数 xt+1 = x- αvt+1。ρ可以看成是摩擦力的影响,一般取0.9、0.99等。上一次的速度在摩擦力的影响下衰减了一部分,然后再和当前速度加权求和。这可以解决SGD的三个问题,对于局部最小点和鞍点,即使梯度降为0,依然有上一次的速度可以让优化继续往前迭代。

  Nesterov Momentum:xt+1 = x+ vt+1 + ρ(vt+1 - vt)。直观地解释是,增加了一项调整速度。

  AdaGrad:对优化得到的梯度在不同维度的平方求和,更新的时候除以这一项。直观地解释是梯度大的维度除以大的数,梯度小的维度除以小的数,所以解决了condition number大的问题。在深度学习中用的不多。

  RMSProp:对AdaGrad的改进,在平方求和时增加了decay项。

  Adam:综合了Momentum和AdaGrad/RMSProp两类方法。这是最好的,可以作为深度学习的默认优化方法。

  这几种方法都需要learning rate作为超参数。Learning rate最好是越来越小的,有不同的decay的方式。Learning rate的decay也是超参数,最开始调教神经网络的时候,不用管decay,learning rate测试差不多了,再加入decay。

  

1.3 二阶优化方法:

  之前的优化方法都是一阶的,二阶的方法比如高斯牛顿法,有个很大的好处是不需要设定learning rate(有时候也会设定一个学习率)。对于深度学习的不利因素是,Hessian的逆矩阵求解太费时。改进的方法是Quasi-Newton methods(BGFS最流行)、L-BFGS(Limited memory BFGS),主要改进的点都是求解Hessian的逆。L-BFGS对full batch表现的很不错,对于深度学习的mini-batch表现不太好,如何把L-BFGS用到深度学习是个研究方向。

  

  总结:Adam是很好的默认选择,如果可以full batch则尝试L-BFGS。

2 让模型更好地泛化

2.1. Model ensembles:选择各种不同的模型,各自训练出一个结果,然后取所有模型的平均值。这种方法可以提高2%左右的准确度。

  也有新的paper(Huang et al, "Snapshot ensembles: train 1, get M for free". ICLR 2017)提出只用一个模型,但是记录下优化中途的结果,也能得到很好的结果。

  Polyak averaging。不常用。

2.2. 正则化:相比于Model ensembles,正则化针对单一模型。增加正则化项。

  在测试阶段增加随机成分,而在测试阶段去掉随机成分。

  Dropout:在前向计算时,随机的把一些神经元输出设为0。一般比例是50%。一般这种操作是在全连接层,有时也会用在卷积层。直观的解释是,这相当于用同一个模型的不同子集,所以模拟出了类似好多模型的效果。测试阶段,需要乘以dropout的比例。也有Inverted dropout的改进,把比例项放进训练过程,测试阶段不需要额外的乘法。

  Batch Normalization:选子集操作。

  Data Augmentation:根据已有的数据生成新的数据,比如把图片颠倒、随机的截取缩放图片、调整对比度亮度等。和新想法就是:如何改变数据而不改变数据的标签。

  DropConnect:dropout是扔掉神经元的输出,这里是扔掉权重。

  Fractional Max Pooling:随机选择对图像哪个部分做池化。

  Stachastic Depth:随机的跳过一些层。很疯狂的想法。。。

3. 迁移学习:如果数据集不大(比如少于100万),那么可以找一个有类似数据的很大的数据集,训练一个CNN,然后把结果用在自己的数据集上。现在很多算法都是先用ImageNet训练处的结果然后再做后续的操作。

  

cs231n spring 2017 lecture7 Training Neural Networks II 听课笔记的更多相关文章

  1. cs231n spring 2017 lecture7 Training Neural Networks II

    1. 优化: 1.1 随机梯度下降法(Stochasitc Gradient Decent, SGD)的问题: 1)对于condition number(Hessian矩阵最大和最小的奇异值的比值)很 ...

  2. cs231n spring 2017 lecture6 Training Neural Networks I 听课笔记

    1. 激活函数: 1)Sigmoid,σ(x)=1/(1+e-x).把输出压缩在(0,1)之间.几个问题:(a)x比较大或者比较小(比如10,-10),sigmoid的曲线很平缓,导数为0,在用链式法 ...

  3. cs231n spring 2017 lecture6 Training Neural Networks I

    1. 激活函数: 1)Sigmoid,σ(x)=1/(1+e-x).把输出压缩在(0,1)之间.几个问题:(a)x比较大或者比较小(比如10,-10),sigmoid的曲线很平缓,导数为0,在用链式法 ...

  4. cs231n spring 2017 lecture10 Recurrent Neural Networks 听课笔记

    (没太听明白,下次重新听一遍) 1. Recurrent Neural Networks

  5. cs231n spring 2017 lecture10 Recurrent Neural Networks

    (没太听明白,下次重新听一遍) 1. Recurrent Neural Networks

  6. cs231n spring 2017 lecture5 Convolutional Neural Networks听课笔记

    1. 之前课程里,一个32*32*3的图像被展成3072*1的向量,左乘大小为10*3072的权重矩阵W,可以得到一个10*1的得分,分别对应10类标签. 在Convolution Layer里,图像 ...

  7. cs231n spring 2017 lecture5 Convolutional Neural Networks

    1. 之前课程里,一个32*32*3的图像被展成3072*1的向量,左乘大小为10*3072的权重矩阵W,可以得到一个10*1的得分,分别对应10类标签. 在Convolution Layer里,图像 ...

  8. cs231n spring 2017 lecture3 Loss Functions and Optimization 听课笔记

    1. Loss function是用来量化评估当前预测的好坏,loss function越小表明预测越好. 几种典型的loss function: 1)Multiclass SVM loss:一般的S ...

  9. cs231n spring 2017 lecture8 Deep Learning Networks 听课笔记

    1. CPU vs. GPU: CPU核心少(几个),更擅长串行任务.GPU有很多核心(几千个),每一个核都弱,有自己的内存(几个G),很适合并行任务.GPU最典型的应用是矩阵运算. GPU编程:1) ...

随机推荐

  1. OpenCASCADE 公众号

    OpenCASCADE 公众号 eryar@163.com 今天也注册了一个微信公众号,以后会在微信公众号中发表OpenCASCADE学习文章,Blog会与微信公众号同步.下面是微信公众号二维码,欢迎 ...

  2. MySQL时间操作的系统函数用法

    我要查询获得当天凌晨30分的datetime值的方式:select ADDDATE(CURDATE(), INTERVAL TIME_TO_SEC(TIMEDIFF("00:30:00&qu ...

  3. 453. Minimum Moves to Equal Array Elements

    Given anon-emptyinteger array of sizen, find the minimum number of moves required to make all array ...

  4. [置顶] xamarin android自定义spinner

    以前弄的一个下拉框时自带的spinner,感觉好丑,实际效果实在满足不了基本的UI界面要求,还是自己动手丰衣足食,看了网上关于android中自定义spinner的文章,感觉实现原理还是比较简单,所以 ...

  5. python基础知识——字符串详解

    大多数人学习的第一门编程语言是C/C++,个人觉得C/C++也许是小白入门的最合适的语言,但是必须承认C/C++确实有的地方难以理解,初学者如果没有正确理解,就可能会在使用指针等变量时候变得越来越困惑 ...

  6. 第三节 - centos 内核启动、救援模式、 ls 、目录结构

    Linux 第三节一.CentOS 启动: 1.内核引导: 1.win/linux 通电,2.BISO自检(CPU,内存,硬盘等 | U盘.光驱.网卡.硬盘启动 通过MBR知道内核内存硬件驱动位置并加 ...

  7. (转载)Android出现“Read-only file system”解决办法

    下面介绍一篇Android出现“Read-only file system”解决办法 有碰到这类问题的朋友可参考参考.   Android-出现Read-only file system的解决方法 输 ...

  8. K:java中序列化的两种方式—Serializable或Externalizable

    在java中,对一个对象进行序列化操作,其有如下两种方式: 第一种: 通过实现java.io.Serializable接口,该接口是一个标志接口,其没有任何抽象方法需要进行重写,实现了Serializ ...

  9. Sql 的 RAISERROR用法

    http://www.yesky.com/imagesnew/software/tsql/ts_ra-rz_5ooi.htm RAISERROR 返回用户定义的错误信息并设系统标志,记录发生错误.通过 ...

  10. PHP进阶,使用交互模式进行快速测试实验?

    额,那啥,PHP很强,大家都知道哈.不过呢,在搞PHP里的人中,自然也要分高下的.当然了,我更喜欢用好玩来形容了. 什么叫做快速开发?我觉得,快就得快到随手写几个字,就能让代码跑起来!那么,PHP能做 ...