Mini-batch SGD的步骤:

1.Sample a batch of data

2.Forward prop it through the graph,get loss

3.backprop to calculate the gradient

4. updata the parameters using the gradient

The initialization of weights is important. 如果 初始化过小, 经过激活后网络中权值的update就会

趋于0;如果过大,就可能出现梯度爆炸;尝试xavier initialization

main loop:

while True:
data_batch = dataset.sample_data_batch()
loss = network.forward(data_batch)
loss = network.backward()
x += -learning_rate * dx

不同的参数更新方案有不同的优化途径和优化速度,SGD方法是所有方法中最慢的。

The problems of SGD and why SGD is slow?

假设一个损失函数空间,损失函数的垂直方向非常陡峭,水平方向非常shallow

水平方向上的梯度非常小,垂直方向上梯度很大。

更新方式如上,补救的一种方式是动量更新:

x += -learning_rate * dx
#改为
v = mu*v - learning_rate * dx # v => integrate velocity
x += v

SGD根据梯度矫正W,而momentum不是通过计算到的梯度直接update。增加变量v,将其定义为速度,我们的增值速度变量V,而不是过去建立在的信用指数上,这就是整合的位置,mu是一个超参数。

可以理解为一个球滚动着接近中间这个笑脸,在这种情况下梯度可以视为一种动力,这种动力相当于加速度(dx),这里的mu倍(通常取0.5-0.99)的v,可以视作一个摩擦力,他每一次作用都有轻微的减速,直观的说如果公式的mu倍v不在,那么小球将会永远不会停下来,会在平面上滚动,不会有能力的损失,损失函数将会很难最小化。

因此动量更新是采取物理化解释,随着时间的推移逐渐放慢了速度,因为你最终确定了速度,特别是在比较浅的方向上,他们的方向一致,动量更新将会建立在这个方向上的速度矢量上,最终会加快这个比较浅的方向上的速度;但在陡峭的空间中,球开始做圆周运动,然后你的力的方向总是朝着中心前进的过程中,并利用阻尼和某种震荡到达中心,在陡峭的方向上削弱这些震荡,而在shallow的方向上激励此过程,这就是为什么结果比较收敛的原因,

如何初始化v?

通常初始化为0,因为在最开始的步骤中会构建它,得到式子。你会发现得到的梯度会以指数衰减,所以初始化为0.

特殊的动量更新 Nesterov Momentum update

原始的momentum update 是gradient step(l_r * dx) (指向损失函数减小方向)和 momentum step (v*mu)(某一确定方向上的动量)的向量和(实际step方向)

Nesterov Momentum update 是在得到momentum step方向和未知梯度方向上,来预测结果。它想让我们使用箭头端这一点的梯度来作为代替,我们要沿着这个方向进行,为什么不直接到达这一目标呢?并计算这一点的梯度,当然你得到的结果有些不同,因为你是在损失函数中的不同位置,得到了和之前细微不同的更新结果

优点:对于收敛率有更好的保证。

如上式所示,唯一的不同就是mu乘以Vt-1,这里计算梯度的时候选择一个和之前不同的位置,这个预测位置(look ahead position),效果很好。

Nesterov Momentum update的公式和代码实现:


扩大神经网络的规模,可以减小局部最小值得影响。

AdaGrad updata

 

添加一个附加变量来放缩梯度,cache由梯度的平方和构成,初始化cache为0

每个参数自适应调整的原因:参数的每一维,都有自己的学习率动态调整,垂直方向上由更大的梯度,这些梯度加到cache就会很大,减小步长。水平方向上梯度变小,则增大步长加快速度。相比垂直方向,在梯度较小的水平方向你可以有更大的学习率。

但是也有问题AdaGrad 更新步长会衰减到0,停止训练,但是我们需要网络不断的变化,保持更新的活力而不是停止。

RMSProp update

 cache = decay_rate * cache + (1-decay_rate) * dx**2
x +=-learning_rate*dx/(np.sqrt(cache)+ 1e-7)

和AdaGrad区别在于不在每一维度计算平方和而是变成一个衰减函数,最后利用衰减率这个超参数(0.99),接着计算引入衰减率缓慢发生泄漏的平方和,仍然保持了在梯度较大或较小方向上,对于更新步长的补偿效应,也不会再发生停止更新情况。

AdaGrad 和RMSProp 相比停止得更早一些,在梯度大的地方减小更新速度是十分合理的;cache不再考虑很久以前的梯度值,它关于时间的表达式是最近几个梯度的函数,以衰减率为指数展开和的形式。  

Adam updata

结合momentu 速度的优势和 AdaGrad 的自适应学习率的优势

#Adam
t<-iteration numbers
m = beta1*m + (1-beta1)*dx
v = beta2*v + (1-beta2)*(dx**2)
m/= 1-beta1**t #correct bias
v/= 1-bata2**t
x += -learning_rate *m/(np.sqrt(v)+1e-7)

动量m,他是梯度的一阶矩,把它用指数和展开的形式表示。beta1 和beta2为超参数,beta1为0.9,beta2通常为0.995.

AdaGrad记录的是梯度的二阶矩,并按指数和形式表示,看起来像是带有动量的RMSprop算法,需要求动量参数,也要进行自适应的尺度变化。

Adam的理解:通过小批量的抽样处理,在forward获得很多随机值,you will get 这些带有噪声的梯度,所以相比于每一步都用各自梯度值运算,实际上利用了前面几个梯度的衰减和,这样有稳定的梯度方向,这就是动量的作用。

AdaGrad的理解:确保梯度大和梯度小的方向步长相关。

偏置矫正的理解:只在迭代次数很小的时候才会有作用,是针对m、v初始为0的补偿措施;所以刚开始你的数据可能不正确,在刚开始将m、v变大,后面不会影响m、n.

Learning Rate对update algorithem的影响

1.应该开始阶段使用高学习速率

2.之后以较低的学习速率到达损失更低的点

引入学习率的衰减,随着训练。

二阶优化方法,对于损失函数有一个更详细的近似分析:

它们不仅仅估计了超参数来确定哪个方向下降得快,还通过Hessian矩阵描述了平面的弯曲程度,所以你不仅需要梯度,还需要把Hessian矩阵算出来。

牛顿法

当目标有了像Hessian近似的碗,可以通过牛顿法达到目标,采用这个方法可以直接到这个近似方案的最低点。

二阶方法的优势?

更新中没有学习速率、没有超参数,因为如果你得到损失函数的梯度,还知道这个地方的曲率,所以对这个碗进行近似计算时,知道怎么走,就能够到达近似的最低值,不需要学习率。

1. 通过二阶特性可以更快的收敛

2.Hessian矩阵的求解,你有一亿个参数,则Hessian矩阵是一亿行和一亿列的方阵,然后你想要求解逆运算,不可能发生。

(Review cs231n) Optimized Methods的更多相关文章

  1. (Review cs231n) CNN in Practice

    Make the most of your data Data augmentation 加载图像后,对图像做一些变化,这些变换不改变图像的标签. 通过各种变换人为的增大数据集,可以避免过拟合提高模型 ...

  2. (Review cs231n) Object Detection

    目标:我们有几个类别,然后我们要在这张图中找到这些类的所有实例 解决思路:是否可以按照回归的思路进行求解呢? 但是受限制于确定的种类输出问题. 方法:分类和回归是解决问题的两个套路,我们现在对于目标的 ...

  3. (Review cs231n) Spatial Localization and Detection(classification and localization)

     重在图像的定位和检测的内容. 一张图片中只有一种给定类别标签的对象,定位则是图像中有对象框:再这些类中,每一个训练目标都有一个类和许多的图像内部对应类的位置选框. 猜想的仅是类标签,不如说它们是位置 ...

  4. (Review cs231n) ConvNet

    概念 神经网络的深度和数据据体的深度(图像的通道数channels)要主要区分. 输入 1.得到一些数据,作为网络的输入. 2.在CNN中有filter,the size of filter is s ...

  5. (Review cs231n) Training of Neural Network2

    FFDNet---matlab 调用并批处理 format compact; global sigmas; % input noise level or input noise level map a ...

  6. (Review cs231n) BN and Activation Function

    CNN网络的迁移学习(transfer learning) 1.在ImageNet上进行网络的预训练 2.将最上方的层,即分类器移除,然后将整个神经网络看成是固定特征提取器来训练,将这个特征提取器置于 ...

  7. (Review cs231n) The Gradient Calculation of Neural Network

    前言:牵扯到较多的数学问题 原始的评分函数: 两层神经网络,经过一个激活函数: 如图所示,中间隐藏层的个数的各数为超参数: 和SVM,一个单独的线性分类器需要处理不同朝向的汽车,但是它并不能处理不同颜 ...

  8. (Review cs231n) Gradient Vectorized

    注意: 1.每次更新,都要进行一次完整的forward和backward,想要进行更新,需要梯度,所以你需要前馈样本,马上反向求导,得到梯度,然后根据求得的梯度进行权值微调,完成权值更新. 2.前馈得 ...

  9. (Review cs231n) Gradient Calculation and Backward

    ---恢复内容开始--- 昨日之补充web. 求解下图的梯度的流动,反向更新参数的过程,表示为 输入与损失梯度的关系,借助链式法则,当前输入与损失之间的梯度关系为局部梯度乘以后一层的梯度. ---恢复 ...

随机推荐

  1. Android多种格式的异步解压/压缩解决方案

    前言 最近由于项目需要,需要我谅解一下关于在移动平台的解压功能,在移动平台解压,我个人感觉是没有太大必要的,毕竟手机的性能有限.但是,不口否认,移动端的解压功能又是必备的,因为如果对于一些资源管理器类 ...

  2. iOS 使用xib定义一个View,修改frame无效问题解决

    遇到过好多次使用自定义view,修改frame无效问题, 之前都是放弃xib,直接手写,发现手写简单的还行,复杂的UI就坑逼了.所以还是需要用到可视化编辑的xib. 整理一下,自己备忘也供iOS开发的 ...

  3. [EMSE'17] A Correlation Study between Automated Program Repair and Test-Suite Metrics

    Basic Information Authors: Jooyong Yi, Shin Hwei Tan, Sergey Mechtaev, Marcel Böhme, Abhik Roychoudh ...

  4. nginx出现 “414 request-uri too large”

    nginx出现 “414 request-uri too large” 在请求查询的时候使用了Get方法,由于拼接的url过长,导致nginx出现了“414 request-uri too large ...

  5. tomcat架构分析和源码解读

    最近在看<深入分析java web技术内幕>,书中讲解了一部分tomcat的相关知识,我也去查看了一些源码,看了大神们写的代码,我才知道自己就像在做加减乘除一样,这是不行的.还有好多包和类 ...

  6. 把项目挂载到composer上

    1.打开composer的安装包列表网站,点击submit 2.把刚才初始化了composer的项目push到github上(至于怎么push,最简单就是用git了) 3.然后把github的网址复制 ...

  7. vue2.0 源码解读(二)

    小伞最近比较忙,阅读源码的速度越来越慢了 最近和朋友交流的时候,发现他们对于源码的目录结构都不是很清楚 红色圈子内是我们需要关心的地方 compiler  模板编译部分 core 核心实现部分 ent ...

  8. Python学习之旅(二十)

    Python基础知识(19):面向对象高级编程(Ⅱ) 定制类 形如“__xx__”的变量或函数在Python中是有特殊用途的 1.__str__ 让打印出来的结果更好看 __str__:面向用户:__ ...

  9. DWZ富客户端框架+DWZ简介及其使用+DWZ讨论组

    DWZ富客户端框架+DWZ简介及其使用+DWZ讨论组 地址: DWZ富客户端框架:http://jui.org/#_blank DWZ简介及其使用:http://blog.sina.com.cn/s/ ...

  10. 洛谷P3808 【模板】AC自动机(简单版)

    题目背景 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交. 管理员提示:本题数据内有重复的单词,且重复单词应该计算多次, ...