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. 事务处理操作(COMMIT,ROLLBACK)。复制表。更新操作UPDATE实际工作中一般都会有WHERE子句,否则更新全表会影响系统性能引发死机。

    更新操作时两个会话(session)同时操作同一条记录时如果没有事务处理操作(COMMIT,ROLLBACK)则会导致死锁. 复制表:此方法Oracle特有

  2. 【CSS3】盒模型

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  3. windows环境下mysql主从配置

    mysql主从配置. 相关理论知识可以百度一下,这里就不多说了,直接说如何配置. 一.环境介绍及说明 主库所在的操作系统:win7 主库的版本:mysql-5.6.24-winx64.zip 主库的i ...

  4. 代码生成利器:IDEA 强大的 Live Templates(转)

    代码生成利器:IDEA 强大的 Live Templates - 文章 - 伯乐在线http://blog.jobbole.com/110607/ 前言 Java 开发过程经常需要编写有固定格式的代码 ...

  5. iOS设置拍照retake和use按钮为中文简体

    iOS设置拍照retake和use按钮为中文简体,设置有两种方式一个是代码直接控制,第二就是xcode配置本机国际化为“china”(简体中文). 本文重点要说的是第二种,这样配置有两个好处,一是操作 ...

  6. [置顶] xamarin android Fragment实现底部导航栏

    前段时间写了篇关于Fragment的文章,介绍了基础的概念,用静态和动态的方式加载Fragment  Xamarin Android Fragment的两种加载方式.下面的这个例子介绍xamarin ...

  7. ArcGIS API for JavaScript 4.2学习笔记[26] 缓冲区分析【基于geometryEngine工具类】

    要说GIS空间分析最经典的例子,就是缓冲区分析了. 本例使用geometryEngine来绘制缓冲区环.因为官方给的例子有3D和2D场景,所以就会显得比较复杂. 当鼠标在视图上点击时,就会生成一个缓冲 ...

  8. ArcGIS 网络分析[8.2] 资料2 使用IDatasetContainer2接口的CreateDataset方法创建网络数据集

    上节提及如何使用IDatasetContainer2接口访问到网络数据集,上例可以封装为一个方法. 这节就使用IDatasetContainer2接口(Geodatabase类库)的CreateDat ...

  9. 公牛与状压dp

    T1 疾病管理 裸得不能再裸的状压dp 不过数据范围骗人 考试时k==0的点没过 我也很无奈呀qwq #include<iostream> #include<cstdio> # ...

  10. bzoj 1855: [Scoi2010]股票交易

    Description 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股票的走势,第i天的股票买入价 ...