加速神经网络的训练

  为什么要加速神经网络,数据量太大,学习效率太慢。越复杂的神经网络 , 越多的数据,需要在训练神经网络的过程上花费的时间也就越多。原因很简单,就是因为计算量太大了。可是往往有时候为了解决复杂的问题,复杂的结构和大数据又是不能避免的,所以需要寻找一些方法, 让神经网络训练变得快起来。为了便于理解,这里我们将使用只含有一个特征的线性回归来展开。此时线性回归的假设函数为:

  其中 i=1,2,...,mi=1,2,...,m 表示样本数。  
  对应的目标函数(代价函数)即为:

一、随机梯度下降法:Stochastic Gradient Descent (SGD)

  批量梯度下降法(Batch Gradient Descent,简称BGD)是梯度下降法最原始的形式,具体思路是在更新每一参数时都要使用所有的样本来进行更新,其数学形式如下:

  ①、对目标函数求偏导:

  其中i=1,2,...,m 表示样本数, j=0,1表示特征数,这里是有了偏置项为0。

  ②、每次迭代对参数进行更新:

  伪代码形式:

  优点:(1)一次迭代是对所有样本进行计算,此时利用矩阵进行操作,实现了并行。
     (2)由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。当目标函数为凸函数时,BGD一定能够得到全局最优。

  缺点:(1)当样本数目 mm 很大时,每迭代一步都需要对所有样本计算,训练过程会很慢。从迭代的次数上来看,BGD迭代的次数相对较少

  随机梯度下降法(SGD):随机梯度下降法不同于批量梯度下降,随机梯度下降是每次迭代使用一个样本来对参数进行更新。使得训练速度加快。

   ①、对一个样本的目标函数为:

  ②、对目标函数求偏导:

  ③、参数更新:

  伪代码形式:

  优点:(1)由于不是在全部训练数据上的损失函数,而是在每轮迭代中,随机优化某一条训练数据上的损失函数,这样每一轮参数的更新速度大大加快。
  缺点:(1)准确度下降。由于即使在目标函数为强凸函数的情况下,SGD仍旧无法做到线性收敛。
     (2)可能会收敛到局部最优,由于单个样本并不能代表全体样本的趋势。
     (3)不易于并行实现。

   为什么SGD收敛速度比BGD要快:

  假设有30W个样本,对于BGD而言,每次迭代需要计算30W个样本才能对参数进行一次更新,需要求得最小值可能需要多次迭代(假设这里是10);而对于SGD,每次更新参数只需要一个样本,因此若使用这30W个样本进行参数更新,则参数会被更新(迭代)30W次,而这期间,SGD就能保证能够收敛到一个合适的最小值上了。也就是说,在收敛时,BGD计算了 10×30W10×30W 次,而SGD只计算了 1×30W1×30W 次。

 

 二、Momentum 更新方法

  传统的参数 W 的更新是把原始的 W 累加上一个负的学习率(learning rate) 乘以校正值 (dx),这种方法可能会让学习过程曲折无比。公式如下:

W+=-learning rate * dx

  momentum的更新方法,公式如下:

m=b1*m-learning rate * dx

W+=m

三、AdaGrad 更新方法

v+=dx^2

W+=-learning rate * dx/(根号v)  

四、RMSProp 更新方法

v=b1*v+(1-b1)*dx^2

W+=-learning rate * dx/(根号v)

五、Adam 更新方法

m=b1*m-learning rate * dx

v=b1*v+(1-b1)*dx^2

W+=-learning rate *m/(根号v)

 

posted @ 2019-04-09 20:17  嗨_放飞梦想  阅读(1465)  评论(0编辑  收藏  举报