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


一、随机梯度下降法: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)