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. Maven-设置默认Java编译版本

    有两种方式,一种针对项目,一种针对全局 针对项目,需要在pom.xml中添加如下配置: <build> <plugins> <plugin> <groupId ...

  2. Scala学习笔记(七):Rational、隐式转换、偏函数、闭包、重复参数及柯里化

    class Rational(n: Int, d: Int) { require(d != 0) private val g: Int = gcd(n, d) val number: Int = n ...

  3. 使用Apache下poi创建和读取excel文件

    一:使用apache下poi创建excel文档 @Test /* * 使用Apache poi创建excel文件 */ public void testCreateExcel() { // 1:创建一 ...

  4. deep learning 以及deep learning 常用模型和方法

    首先为什么会有Deep learning,我们得到一个结论就是Deep learning需要多层来获得更抽象的特征表达. 1.Deep learning与Neural Network 深度学习是机器学 ...

  5. ubuntu中安装blogPost

    1.实验环境 Ubuntu16.04x86 2.安装blogPost步骤 2.1 安装方式比较简单,打开ubuntu软件中心 2.2 搜索DB Browser for SQLite,点击安装即可 上图 ...

  6. [Codeforces Round #507][Codeforces 1039C/1040E. Network Safety]

    题目链接:1039C - Network Safety/1040E - Network Safety 题目大意:不得不说这场比赛的题面真的是又臭又长...... 有n个点,m条边,每个点有对应的权值c ...

  7. 补充:MySQL整理

    1.连接Mysql 格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYSQL.首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root ...

  8. js运用6

    ---恢复内容开始--- 1.   逻辑运算   ||      &&       ! || 遇到第一个为true的数字就终止并返回,如果完全没有就返回最后一个值 && ...

  9. 使用正则表达式进行某网页中的email邮箱抽取

    import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; impo ...

  10. day19 十九、ATM+购物车

    项目:ATM+购物车 作业需求:模拟实现一个ATM + 购物商城程序1.额度 15000或自定义 2.实现购物商城,买东西加入 购物车,调用信用卡接口结账 3.可以提现,手续费5% 4.每月22号出账 ...