梯度下降的改进,增加了一个随机值,此外还有小批量随机梯度下降,它可以解决几乎所有的深度学习问题。

每次迭代时使用一个样本来对参数进行更新。

简介

随机梯度下降(Stochastic Gradient Descent,SGD)在每一次更新参数时都使用一个样本来进行更新,m等于1,更新很多次,有时候也被称为在线梯度下降。当样本数据很大时,可能到迭代完成,也只不过遍历了样本中的一小部分。因此其速度较快,但最终的结果是在全局最优解的附近。对比上面的批量梯度下降,迭代一次需要用到十几万训练样本,一次迭代不可能最优,如果迭代10次的话就需要遍历训练样本10次,这种跟新方式计算复杂度太高。

​ SGD伴随的一个问题是噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向。即使SGD在技术上是指每次使用1个数据来计算梯度,还是会有人使用SGD来指代小批量数据梯度下降。

​ 优点:

  • 训练速度快
  • 适合大样本;
  • 提高了泛化误差

​ 缺点:

  • 准确度下降,并不是全局最优。
  • 噪声更多。
  • 迭代次数多,不易于并行实现。

​ 其代码段简单在训练样本下的增加了一个循环,计算出对于每个样本下的梯度,每次epoch都shuffle了训练集。

# 随机梯度下降
for i in range(nb_epochs):
 np.random.shuffle(data) # 打乱数据
 for example in data:
        params_grad = evaluate_gradient(loss_function, example,params)
        params = params - learning_rate * params_grad