大规模机器学习
学习大数据
假设我们有一个高偏差模型,那么大规模的数据的确能够帮助你拟合更好的模型。但是大规模的数据可能导致算法运行的效率低下。
所以在收集大量数据之前,应该考虑用小样本数据是否也能获得较好的拟合效果。
随机梯度下降法
如果我们确定需要使用到大量数据,也可以使用随机梯度法(Stochastic gradient descent)来代替之前提到过的批量梯度下降法(batch gradient descent)。
由图中可知,随机梯度法的代价函数为一个单一训练实例的代价,注意这里取的是一个样本,计算代价:
$cost\left( \theta, \left( {x}^{(i)} , {y}^{(i)} \right) \right) = \frac{1}{2}\left( {h}_{\theta}\left({x}^{(i)}\right)-{y}^{ {(i)} } \right)^{2}$
随机梯度下降的具体步骤:
第一步:随机打乱数据
第二步:Repeat (usually anywhere between1-10){
for $i = 1:m${
$\theta:={\theta}_{j}-\alpha\left( {h}_{\theta}\left({x}^{(i)}\right)-{y}^{(i)} \right){ {x}_{j} }^{(i)}$
(for $j=0:n$)
}
}注意这一步中,对比批量梯度下降法的每次迭代都需要计算所有样本,随机梯度下降法不需要每次迭代(求$\theta$)时都对所有数据累加求平方和,这大大地减少了计算量。
在大样本情况下,随机梯度下降法加大了迭代过程的效率,但同样,它的下降过程不再沿着“正确的方向”,如下图。最终可能无法得到精确的最小值点,而是在最小值值点附近,但对于模型的预测准确度不会有太大的影响。
小批量梯度下降
在每次迭代时,使用b个样本累加求和,具体来说:
Repeat {
for $i = 1:m${
$\theta:={\theta}_{j}-\alpha\frac{1}{b}\sum_\limits{k=i}^{i+b-1}\left( {h}_{\theta}\left({x}^{(k)}\right)-{y}^{(k)} \right){ {x}_{j} }^{(k)}$
(for $j=0:n$)
$ i +=10 $
}
}
通常b的取值在2-100之间。
随机梯度下降收敛
随机梯度下降法还有一个好处就是方便观察优化过程中的收敛情况。
可以看到,批量梯度下降法需要计算完所有的样本才能画出图像,这在大样本的情况下是非常低效的。而随机梯度下降法,只需要每次更新$\theta$之前,计算出代价值。再画出前1000次迭代情况即可。
前两张图是正确的迭代过程,通常而言,选择样本数量越多,观测到的曲线就越平缓。
就最后两张图而言,我们可以得出一个结论,如果你得到的曲线没有体现出收敛的趋势(图三),那么可以尝试增加样本,如果还是没有(粉红色线)。那么可能就是特征、算法方面的问题了。
如果曲线有递增趋势,也就是发散。那么可以尝试使用小一点的学习速率。
关于学习速率,我们通常是选取固定值。但其实也可以使用变量:$\alpha = \frac{const1}{iterationNumber + const2}$,这可以迫使我们的算法收敛而不是在最小值周围徘徊。但是一般不需要为了学习速率浪费计算资源,我们也可以得到很好的效果。
在线学习
如果你有一个连续的用户流引起的数据流,那么就可以设计一个在线学习机制,来根据数据流学习用户的偏好。
其实这和之前的随机梯度下降主要区别在于,我们的数据是流动的,算法也在不断的学习而不是只用静态的数据集。
Repeat forever (as long as the website is running) {
Get $\left(x,y\right)$ corresponding to the current user
$\theta:={\theta}_{j}-\alpha\left( {h}_{\theta}\left({x}\right)-{y} \right){ {x}_{j} }$
(for $j=0:n$)
}
一旦(x,y)训练完成,我们就可以抛弃它,因为数据是动态的,还会有新的数据源源不断的输入。
减少映射与数据并行
之前我们提到,如果用批量梯度下降法来训练大规模数据是非常耗费时间的,但如果我们能将数据分为多个子集,分给不同的计算机运行,最后再将结果汇总求和,这样的方法就叫做减少映射。
例如我们有400个例子,需要使用批量梯度下降法,我们可以把数据分配给4台计算机处理: