首页 » python机器学习 » python机器学习全文在线阅读

《python机器学习》2.3.3 大规模机器学习与随机梯度下降

关灯直达底部

在上一节中,我们学习了如何使用整个训练数据集沿着梯度相反的方向进行优化,以最小化代价函数;这也是此方法有时称作批量梯度下降的原因。假定现在有一个包含几百万条数据的巨大数据集,对许多机器学习应用来说,这个量是非同寻常的。由于向全局最优点移动的每一步都需要使用整个数据集来进行评估,因此这种情况下使用批量梯度下降的计算成本非常高。

一个常用的替代批量梯度下降的优化算法是随机梯度下降(stochastic gradient descent),有时也称作迭代梯度下降(iterative gradient descent)或者在线梯度下降(on-line gradient descent)。与基于所有样本x(i)的累积误差更新权重的策略不同:

我们每次使用一个训练样本渐进地更新权重:

虽然随机梯度下降可看作对梯度下降的近似,但是由于权重更新更频繁,通常它能更快收敛。由于梯度的计算是基于单个训练样本来完成的,因此其误差曲面不及梯度下降的平滑,但这也使得随机梯度下降更容易跳出小范围的局部最优点。为了通过随机梯度下降得到更加准确的结果,让数据以随机的方式提供给算法是非常重要的,这也是我们每次迭代都要打乱训练集以防止进入循环的原因。

当实现随机梯度下降时,通常使用随着时间变化的自适应学习速率来替代固定学习速率η,例如:,其中c1和c2均为常数。

请注意,随机梯度下降不一定会得到全局最优解,但会趋近于它。借助于自适应学习速率,我们可以更进一步趋近于全局最优解。

随机梯度下降的另一个优势是我们可以将其用于在线学习。通过在线学习,当有新的数据输入时模型会被实时训练。这在我们面对海量数据时特别有效,例如针对Web中的用户信息。使用在线学习,系统可以及时地适应变化,同时如果考虑存储成本的话,也可以将训练数据在完成对模型的更新后丢弃。

小批次学习是介于梯度下降和随机梯度下降之间的一种技术。可以将小批次学习理解为在相对较小的训练数据子集上应用梯度下降——例如,一次使用50个样本。与梯度下降相比,由于权重的更新更加频繁,因此其收敛速度更快。此外,小批次学习使得我们可以用向量化操作来替代for循环,从而进一步提高学习算法的计算效率。

由于我们已经使用梯度下降实现了Adaline学习规则,因此只需在此基础上将学习算法中的权重更新改为通过随机梯度下降来实现即可。现在把fit方法改为使用单个训练样本来更新权重。此外,我们增加了一个partial_fit方法,对于在线学习,此方法不会重置权重。为了检验算法在训练后是否收敛,我们将每次迭代后计算出的代价值作为训练样本的平均消耗。此外,我们还增加了一个shuffle训练数据选项,每次迭代前重排训练数据避免在优化代价函数阶段陷入循环。通过random_state参数,我们可以指定随机数种子以保持多次训练的一致性。

分类器AdalineSGD中_shuffle方法的工作原理如下:通过numpy.random的permutation函数,我们生成一个包含0~100的不重复的随机序列。这些数字可以作为索引帮助打乱我们的特征矩阵和类标向量。

接下来,我们就可以通过fit方法训练AdalineSGD分类器,并应用plot_decision_regions方法绘制训练结果:

执行前面的示例代码,我们得到下图:

可以看到,代价函数的均值下降得很快,经过15次迭代后,最终的分类界面与使用梯度下降得到的Adaline分类界面类似。如果要改进模型,例如用于处理流数据的在线学习,可以对单个样本简单地调用parital_fit方法,如:ada.partial_fit(X_std[0,:],y[0])。