机器学习笔记|第十周

大规模机器学习

学习大数据

假设我们有一个高偏差模型,那么大规模的数据的确能够帮助你拟合更好的模型。但是大规模的数据可能导致算法运行的效率低下。

所以在收集大量数据之前,应该考虑用小样本数据是否也能获得较好的拟合效果。

随机梯度下降法

如果我们确定需要使用到大量数据,也可以使用随机梯度法(Stochastic gradient descent)来代替之前提到过的批量梯度下降法(batch gradient descent)。

EDS5LV.png

由图中可知,随机梯度法的代价函数为一个单一训练实例的代价,注意这里取的是一个样本,计算代价:

​ $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$)时都对所有数据累加求平方和,这大大地减少了计算量。

在大样本情况下,随机梯度下降法加大了迭代过程的效率,但同样,它的下降过程不再沿着“正确的方向”,如下图。最终可能无法得到精确的最小值点,而是在最小值值点附近,但对于模型的预测准确度不会有太大的影响。

EDpjhQ.png

小批量梯度下降

EDCuGQ.png

在每次迭代时,使用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之间。

随机梯度下降收敛

随机梯度下降法还有一个好处就是方便观察优化过程中的收敛情况。

EDPz1H.png

可以看到,批量梯度下降法需要计算完所有的样本才能画出图像,这在大样本的情况下是非常低效的。而随机梯度下降法,只需要每次更新$\theta$之前,计算出代价值。再画出前1000次迭代情况即可。

EDiLKs.png

前两张图是正确的迭代过程,通常而言,选择样本数量越多,观测到的曲线就越平缓。

就最后两张图而言,我们可以得出一个结论,如果你得到的曲线没有体现出收敛的趋势(图三),那么可以尝试增加样本,如果还是没有(粉红色线)。那么可能就是特征、算法方面的问题了。

如果曲线有递增趋势,也就是发散。那么可以尝试使用小一点的学习速率。

关于学习速率,我们通常是选取固定值。但其实也可以使用变量:$\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台计算机处理:

EDllhd.md.png

-------------End-------------
梦想总是要有的,万一有人有钱呢?