机器学习第十八章——大规模机器学习

一. 大数据集梯度下降

如果我们有一个低方差的模型,增加数据集的规模可以帮助你获得更好的结果。我们应该怎样应对一个有100万条记录的训练集?

以线性回归模型为例,每一次梯度下降迭代,我们都需要计算训练集的误差的平方和,如果我们的学习算法需要有20次迭代,这便已经是非常大的计算代价。

首先应该做的事是去检查一个这么大规模的训练集是否真的必要,也许我们只用1000个训练集也能获得较好的效果,我们可以绘制学习曲线来帮助判断。


二. 先进的算法

1. 批量梯度下降法(Batch gradient descent)

拥有了大数据,就意味着,我们的算法模型中得面临一个很大的 m 值。回顾到我们的批量梯度下降法:

重复直到收敛:

$$\theta_j=\theta_j-\alpha \frac{1}{m} \sum_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})x^{(i)}_j,\;\;\;\;for\;\;j=0,\cdots,n$$

可以看到,每更新一个参数 $\theta_j$ ,我们都不得不遍历一遍样本集,在 m 很大时,该算法就显得比较低效。但是,批量梯度下降法能找到全局最优解:

每一步都需要计算所有样本,计算量很多,虽然每一步都是再往最优值的方向前进。

 

2. 随机梯度下降法(Stochastic gradient descent)

针对大数据集,又引入了随机梯度下降法,该算法的执行过程为:

先随机排列样本。

然后重复直到收敛:

$$ \begin{align*} for\;\;\;i&=1,\cdots,m:\\ \theta_j&=\theta_j-\alpha(h_\theta(x^{(i)})-y^{(i)})x^{(i)}_j,\;\;\;\;for\;\;j=0,\cdots,n\\ \end{align*} $$

相较于批量梯度下降法,随机梯度下降法每次更新 $\theta_j$ 只会用当前遍历的样本。虽然外层循环仍需要遍历所有样本,但是,往往我们能在样本尚未遍历完时就已经收敛,因此,面临大数据集时,随机梯度下降法性能卓越。

迂回,徘徊地向最小值前进,但是每一个样本走一步,计算量较小。

 

上图反映了随机梯度下降法找寻最优解的过程,相较于批量梯度下降法,随机梯度下降法的曲线就显得不是那么平滑,而是很曲折了,其也倾向于找到局部最优解而不是全局最优解。因此,我们通常需要绘制调试曲线来监控随机梯度的工作过程是否正确。例如,假定误差定义为 $cost(\theta,(x^{(i)},y^{(i)}))=\frac{1}{2}(h_\theta(x^{(i)})-y^{(i)})^2$,则每完成 1000 次迭代,即遍历了 1000 个样本,我们求取平均误差并进行绘制,得到误差随迭代次数的变化曲线:

另外,遇到下面的曲线也不用担心,其并不意味着我们的学习率出了问题,有可能是我们的平均间隔取的太小0

如果,我们每进行 5000 次迭代才进行绘制,那么曲线将更加平滑:

如果我们面临明显上升态势的曲线,就要考虑降低学习率 $\alpha$ 了:

 

学习率 $\alpha$ 还可以随着迭代次数进行优化

$$\alpha=\frac{constant1}{iterationNumber+constant2}$$

随着迭代次数的增多,我们的下降步调就会放缓,避免出现抖动:

随机梯度下降法工作前,需要先随机化乱序数据集,是的遍历样本的过程更加分散。

3. Mini 批量梯度下降法(Mini-batch gradient descent)

Mini 批量梯度下降法是批量梯度下降法和随机梯度下降法的折中,通过参数 b 指明了每次迭代时,用于更新 $\theta$ 的样本数。假定 b=10,m=1000 ,Mini 批量梯度下降法的工作过程如下:

重复直到收敛:

$$ \begin{align*} for\;\;\;i&=1,11,21,\cdots,991:\\ \theta_j&=\theta_j-\alpha \frac{1}{10}\sum_{k=i}^{i+9}(h_\theta(x^{(i)})-y^{(i)})x^{(i)}_j,\;\;\;\;for\;\;j=0,\cdots,n\\ \end{align*} $$

 

三个总结:

批量梯度下降:每一步都使用所有的m个样本

随机梯度下降:每一步仅使用一个样本

小批量梯度下降:每一步使用自己设定的b个样本


4. 在线学习

用户登录了某提供货运服务的网站,输入了货运的发件地址和收件地址,该网站给出了货运报价,用户决定是购买该服务( y=1 )或者是放弃购买该服务( y=0 )。

特征向量 x 包括了收发地址,报价信息,我们想要学习 $p(y=1|x;\theta)$ 来最优化报价:

重复直到收敛:

获得关于该用户的样本 (x,y),使用该样本更新 $\theta$

$$\theta_j=\theta_j-\alpha(h_\theta(x)-y)x_j,\;\;\;for\;\;j=0,\cdots,n$$

这就是在线学习(Online learning),与前面章节提到的机器学习过程不同,在线学习并不需要一个固定的样本集进行学习,而是不断接收样本,不断通过接收到的样本进行学习。因此,在线学习的前提是:我们面临着流动的数据。

5. MapReduce

前面,我们提到了 Mini 批量梯度下降法,假定 b=400,m=400,000,000 ,我们对 $\theta$ 的优化就为:

$$\theta_j=\theta_j-\alpha \frac{1}{400} \sum i=1^{400}(h_\theta(x^i)-y^{(i)})x^{(i)}_j$$

假定我们有 4 个机器(Machine),我们首先通过 Map (映射) 过程来并行计算式中的求和项,每个机器被分配到 100 个样本进行计算:

$$ \begin{align*} temp^{(1)}_j&=\sum_{i=1}^{100}(h_\theta(x^{(i)}-y^{(i)})x^{(i)}_j\\ temp^{(2)}_j&=\sum_{i=101}^{200}(h_\theta(x^{(i)}-y^{(i)})x^{(i)}_j\\ temp^{(3)}_j&=\sum_{i=201}^{300}(h_\theta(x^{(i)}-y^{(i)})x^{(i)}_j\\ temp^{(4)}_j&=\sum_{i=301}^{400}(h_\theta(x^{(i)}-y^{(i)})x^{(i)}_j\\ \end{align*} $$

最后,通过 Reduce(规约)操作进行求和:

$$\theta_j=\theta_j-\alpha \frac{1}{400}(temp_j^{(1)}+temp_j^{(2)}+temp_j^{(3)}+temp_j^{(4)})$$

我们可以使用多台机器进行 MapReduce,此时,Map 任务被分配到多个机器完成:

也可以使用单机多核心进行 MapReduce,此时,Map 任务被分配到多个 CPU 核心完成:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值