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 lecture8 Deep Learning Networks 听课笔记

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

  9. cs231n spring 2017 lecture8 Deep Learning Networks

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

随机推荐

  1. MySQL--索引和外键

    来自:http://www.jb51.net/article/32149.htm 1.添加PRIMARY KEY(主键索引)  ALTER TABLE `table_name` ADD PRIMARY ...

  2. Fib数列问题(项数很大)

    用fib(n)表示斐波那契数列的第n项,现在要求你求fib(n) mod m.fib(1)= 1, fib(2)= 1. 输入格式 输入2个整数n(1≤n≤1018), m(2≤m≤10000000) ...

  3. gcc和g++的区别解析

    1.误区:gcc只能编译C源代码,g++只能编译C++源代码 解析:其实gcc和g++都可以编译c/c++源代码,只是细节不同,后缀名为.c的源文件,gcc将其当作C程序,而g++则当作c++程序来处 ...

  4. IT架构的本质--阅读笔记01

    万物都有其本质,也只有了解了事物的本质之后,才不至于出现在事物稍作改变时就难以应对的情况,作为软件工程专业的学生,我们应该对IT架构的本质有一定的了解.“老僧三十年前未参禅时,见山是山,见水是水.及至 ...

  5. Heavy Light Decomposition

    Note 1.DFS1 mark all the depth mark fathers mark the heavy/light children mark the size of each subt ...

  6. 频率类组件-认证规图分析-JWT认证-drf-jwt插件

    频率类源码 # 1)APIView的dispath方法中的 self.initial(request, *args, **kwargs) 点进去 # 2)self.check_throttles(re ...

  7. python中os模块的常用方法

    1.os模块:os模块在python中包含普遍的操作系统功能,下面列出了一些在os模块中比较有用的部分. os.sep可以取代操作系统特定的路径分隔符.windows下为 “\\” os.name字符 ...

  8. Methyl-SeqDNA的甲基化图谱|DNase I-Seq|ChIP-Seq|3C-Seq|

    生物医学大数据 Methyl-SeqDNA的甲基化图谱 DNase I-Seq全基因组染色质DNA的开放程度.非基因编码区的调控元件的分布 DNase I高敏感位点:基因处于转录活性状态时,其染色质结 ...

  9. object detection模型转换成TensorFlow Lite,在Android应用

    环境 tensorflow = 1.12.0 bazel = 0.18.1 ubuntu = 16.04 python = 3.6.2 安装 bazel (0.18.1) 如果tensorflow是1 ...

  10. quartz定时任务(数据库需要的表)

    Quartz将Job保存在数据库中所需表的说明 QRTZ_CALENDARS 以 Blob 类型存储 Quartz 的 Calendar 信息 QRTZ_CRON_TRIGGERS 存储 Cron T ...