大规模机器学习 Large scale machine learning
- 学习大数据集 learning with large datasets
- 随机梯度下降 Stochastic Gradient Descent
- Mini-Batch 梯度下降 Mini-Batch gradient descent
- 随机梯度下降收敛 stochastic gradient descent convergence
- 在线学习 online learning
- 减少映射与数据并行 Map-reduce and data parallelism
引入:大规模机器学习,即学习大规模数据的机器学习。某种意义上,现代算法拟合效果更好是因为数据量大,这就是为什么需要研究大规模机器学习。
学习大数据集 learning with large datasets
根据先前所学知识可知,提高学习算法效率的一个高效方法为:低偏差的学习算法与大数据相结合。因此解决问题的办法并不是算法的好坏,而是数据量的多少。
大数据学习也存在一些计算问题。巨大的数据规模将增加计算量,从而极大地提高计算成本。
所以,为什么不降低数据量呢?对于高偏差问题,降低数据量可能同样能达到相似的结果(右)。高方差问题则不能。
总之,在大规模的机器学习中,我们往往使用合理的计算方法或高效的计算方法,来处理庞大的数据集。如:随机梯度下降( Stochastic Gradient Descent)、减少映射(Map Reduce)。
随机梯度下降 Stochastic Gradient Descent
引入:大部分算法的计算思路是:提出代价函数,然后结合梯度下降等方法优化代价函数,从而得到模型的未知参数。这种方法对大规模数据就不适用了,因为计算量太大。针对这一问题,下面介绍普通梯度下降的改进——随机梯度下降 ( Stochastic Gradient Descent),它可以用于大部分机器学习算法中。
首先回顾使用梯度下降训练代价函数。
使用梯度下降算法,的变化路径如图右侧。每一步都需要计算,因此但数据量特大时计算量会相应增加。于是这种梯度学习又称批量梯度下降(Batch Gradient Descent),“批量”可以理解为需要考虑一批训练样本。
下面介绍一种随机梯度下降。与批量梯度下降不同的是,它不需要每次迭代时考虑全部的训练样本,而是每次迭代时只考虑一个训练样本。
随机梯度下降定义代价函数(函数)为单个训练样本的平方误差的一半,也就是衡量假设函数在单个训练样本上的表现。此时,总体代价函数等于假设函数在每一个训练样本上代价函数的平均值。
在迭代更新中,随机梯度下降首先随机打乱数据集。然后顺序遍历训练样本,使用单个训练样本的代价函数偏导(梯度项)代替总体偏导平均值,从而帮助更新。
其中,最开始的随机打乱训练样本顺序,有助于加速代价函数的收敛。更重要的是,每次迭代中,随机梯度下降的梯度项只考虑计算单个训练样本,并在这个过程中朝着全局最小值方向进行修改。
综上,得到随机梯度下降的训练步骤。总体来说,随机梯度下降的大多数时候会朝着全局最小值的方向变化。当然有时候,也会一直在全局最小值附近变化。
一般来说,第二步中的外层循环只需要重复次,当然这个取决于训练样本量的大小。
Mini-Batch 梯度下降 Mini-Batch gradient descent
引入:在上一部分中,我们讨论了随机梯度下降的原理、以及运行速度相对于批量梯度下降更快的原因。本部分,讨论另外一种梯度下降——Mini-Batch 梯度下降 (Mini-Batch gradient descent),它有时甚至比随机梯度下降更快。
与批量梯度下降、随机梯度下降不同,Mini-Batch 梯度下降每次迭代使用个训练样本。其中,是一个称为Mini-Batch大小的参数,取值一般在2-100之间(可以10)。
总之,Mini-Batch梯度下降的训练步骤如图。这也解释了为什么它比批量梯度下降更快。
那么与随机梯度下降相比又如何呢?为什么使用个训练样本呢?实际上,只有获得优秀的向量化方式时,Mini-Batch梯度下降才会优于随机梯度下降。也就是通过使用合适的向量化方式计算余下的样本,有时能够使用一个好的数据代数库实现个训练样本的并行梯度计算。
Mini-Batch梯度下降的缺点在于需要花时间确定参数的值。
随机梯度下降收敛 stochastic gradient descent convergence
引入: 之前学习过随机梯度下降算法,那么如何判断调试过程是否结束并且已经收敛到合适的位置了呢?此外,如何调整随机梯度下降中学习速率的值呢?
回顾批量梯度下降,它通过绘制代价函数随迭代次数变化的曲线判断算法是否在收敛。每次计算代价函数,需要遍历整个训练集。
对于随机梯度下降,它每次通过考虑一个训练样本,来改假设函数。因此对应的,它在每次迭代前,需要首先计算。并且,每进行1000次迭代,需要将这前1000个的平均值画出来,从而得到代价函数随迭代次数变化的曲线。通过观察该曲线,可以判断随机梯度下降是否在收敛。
下图展示随机梯度下降的函数变化曲线,每个数据点代表前1000个样本的平均值。
- 可以发现,曲线中包含非常多的噪声。此外,学习速率较小,可能使得函数变化曲线更加平稳(图左上的红线)。
- 增加1000到5000,可以发现曲线变得更加平滑(图右上红线)。
- 可能曲线形状如图左下蓝线。但增加求平均值的样本数到5000,可能发现曲线在下降。因为此时曲线中噪声过多,掩盖住了函数的实际变化趋势。也有可能求平均值的样本数到5000时,还是发现曲线非常平滑,这说明算法确实没有在收敛。这时需要调整学习速率或调整特征或其他。
- 可能曲线形状如图右下蓝线,代价函数呈现上升趋势。这说明需要减小学习速率。
总之,如果曲线噪声过大、上下波动过大,可以增加求均值的样本数量;如果代价函数在增加,可以减小学习速率。
最后,关于学习速率还有一点需要注意。
一般来说,学习速率在调试过程中是不变的。但是为了使得代价函数更好地逼近全局最小值,在调试中可以缓慢减小学习速率的值。但这会给算法增加工作量,并且不变的值已经能得到一个逼近全局最小值的结果了,因此实际中很少使用这种办法。
在线学习 online learning
引入:本部分将讨论一种新的大规模机器学习机制——在线学习机制( online learning setting)。在线学习可以满足连续一波数据或连续数据流的建模需求。
下面用航运服务的例子进行说明。
假如我们需要优化给运输包裹的售价。也就是已知用户特征、运输包裹的往返地、售价,我们希望学习特定价格下用户接受服务的概率,从而优化售价。
假设我们使用逻辑回归算法,此时算法的运算步骤如下图。此时,算法一次训练一个样本,然后丢弃它。有趣的是,该算法可以适应变化的用户偏好。但数据量足够大时,系统展示出来的策略将会符合最新用户表现出来的特征。
注意,该算法适用于大型网站(数据量充足),小型网站(数据量较少)则不适用。
下面展示一个很适合使用在线学习的例子——产品搜索。这类问题被称作:点击率预测学习问题(predicted click-through rate,predicted CTR)。此类问题的解决策略为:每次给用户展示最有可能被点击的10个产品,从而得到10组样本。然后使用在线学习更新参数,之后丢弃这十组数据。进行下轮循环。
减少映射与数据并行 Map-reduce and data parallelism
引入:批量梯度下降、随机梯度下降、Mini-batch 梯度下降、在线学习都是只能在单机上使用的算法。实际中由于数据规模过大,存在多机合作进行机器学习的需求。Map-reduce能解决这一问题。
假设我们使用批量梯度下降优化逻辑回归的代价函数,为了书写方便设置为400。因此有了第一行的更新公式。但是数据量m过大,影响总体运算速度,因此使用Map-Reduce 的思想进行处理。
下面讲述Map-Reduce 的思想。把数据集分为四份训练样本,然后分别发送给四台机器进行计算。此时,每台机器计算量为原本的1/4,因此运算速度提高到原来的四倍。得到计算结果后,将发送给中心服务器进行汇总整合,从而更新参数。这种做法最终能得到与批量梯度下降相同的结果,只不过它是通过四台机器协同工作实现的运算。
综上,得到Map-Reduce 思想的示意图如图。
由于网络延迟,这种思想的实际运算速率比原本的四倍少点点。但这已经很不错了。
使用Map-Reduce实现机器学习运算时,需要思考 学习算法是否可以表示成训练集的求和。实际上,很多算法能达到这一要求。
上文讨论了Map-Reduce 算法在多台电脑上并行运算。实际上,在单台机器上进行Map-Reduce 计算也是可行的,只要电脑拥有多个CPU、CPU拥有多个核心。后者的优势在于:不用担心网络延迟的问题。
部分线性代数库能自动利用多核实现并行运算,此时就不需要另外使用Map-Reduce算法。