继续是机器学习课程的笔记,本节内容主要是介绍大规模机器学习的内容。

大型数据集的学习

对于一个过拟合的模型,增加数据集的规模可以帮助避免过拟合,并获得一个更好的结果。

但是对于一个大规模的数据,比如有100万个数据量的训练集,其计算量是非常大的。以线性回归模型为例,每一次梯度下降迭代,我们都需要计算训练集的误差的平方和,对于训练集有上百万的数据量,如果学习算法需要有20次迭代,这就已经是一个非常大的计算代价。

因此,首先需要确定是否需要有这么大规模的训练集,也许只用1000个训练集就能获得比较好的结果,这一步可以通过绘制学习曲线来帮助判断,如下所示:

随机梯度下降法(Stochastic Gradient Descent)

如果一定需要一个大规模的训练集,我们可以尝试使用随机梯度下降法来代替批量梯度下降法。

批量梯度下降算法在每次迭代的时候需要计算整个训练集的和,其公式如下:

θj:=θj−α1m∑i=1m(hθ(x(i))−y(i))x(i)j

\theta_j := \theta_j-\alpha \frac{1}{m}\sum_{i=1}^m (h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}
如上公式可以知道,如果训练集的数量m非常大,那么计算量就非常大。

而在随机梯度下降法中,我们定义代价函数为一个单一训练实例的代价:

cost(θ,(x(i),y(i)))=12(hθ(x(i))−y(i))2Jtrain(θ)=1m∑i=1mcost(θ,(x(i),y(i)))

cost(\theta,(x^{(i)},y^{(i)}))=\frac{1}{2} (h_\theta(x^{(i)})-y^{(i)})^2 \\ J_{train}(\theta) = \frac{1}{m}\sum_{i=1}^mcost(\theta,(x^{(i)},y^{(i)}))

所以随机梯度下降算法是:

  1. 首先对训练集随机“洗牌”,即打乱顺序;
  2. 然后重复下列步骤:

Repeat(一般迭代1-10次整个训练集,根据训练集大小选择,训练集越大,迭代次数越小){
for i=1:m{
θj:=θj−α(hθ(x(i))−y(i))x(i)j\theta_j := \theta_j - \alpha(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}
(for j = 0:n)
}
}

随机梯度下降算法在每一次计算之后便更新参数θ\theta,而不需要首先将所有的训练集求和,在批量梯度下降算法还没有完成一次迭代时,随机梯度下降算法便已经走出了很远。但缺点是,不是每一步都是朝着“正确”的方向迈出的,因此算法虽然会逐步走向全局最小值的位置,但是可能无法站到那个最小值的那一点,而是在最小值点附近徘徊。如下图所示

微型批量梯度下降(Mini-Batch Gradient Descent)

接下来介绍第三种梯度下降算法--微型批量梯度下降算法,它是介于批量梯度下降算法和随机梯度下降算法之间的算法,每次迭代使用b个训练实例,更新一次参数$\theta$,其更新公式如下所示:

Repeat{
for i=1:m{
θj:=θj−α1b∑i+b−1k=i(hθ(x(k))−y(k))x(ikj\theta_j := \theta_j - \alpha \frac{1}{b} \sum_{k=i}^{i+b-1}(h_\theta(x^{(k)})-y^{(k)})x_j^{(ik}
(for j = 0:n)
i+=10;
}
}

也就是如果令b=10,m=1000,有:

Repeat{
for i=1,11,21,31,…,991{
θj:=θj−α110∑i+9k=i(hθ(x(k))−y(k))x(ikj\theta_j := \theta_j - \alpha \frac{1}{10} \sum_{k=i}^{i+9}(h_\theta(x^{(k)})-y^{(k)})x_j^{(ik}
(for j = 0:n)
}
}

通常会令b在2~100之间。这样做的好处是,我们可以用向量化的方式来循环b个训练实例,如果我们用的线性代数函数库比较好,能够支持平行处理,那么算法的总体表现将不受影响(与随机梯度下降算法相同)。有时甚至可以比随机梯度下降算法更快。

随机梯度下降收敛

接下来介绍随机梯度下降算法的调试,以及学习率α\alpha的选取。

在批量梯度下降中,我们可以令代价函数J为迭代次数的函数,绘制图表,根据图表来判断梯度下降是否收敛,但是,在大规模的训练集的情况下,这是不现实的,因为计算代价太大了。

在随机梯度下降算法中,我们在每一次更新θ\theta之前都计算一次代价,然后每X次迭代后,求出这X次对训练实例计算代价的平均值,然后绘制这些平均值与X次迭代的次数之间的函数图片。比如令X=1000,即每1000次迭代就计算一次代价的平均值,然后绘制图表。如下图所示:

当我们绘制这样的图表时,可能会得到一个颠婆不平但是不会明显减少的函数图象(如上图中左下图蓝线所示)。我们可以增加X,如令X=5000,来使得函数更平缓,也许便能看出下降的趋势(如上图中左下图的红线所示);但可能函数图表仍然是颠婆不平且不下降的(还是左下图的洋红色曲线,即上面那条),这可能就是模型本身存在一些错误。

而如果得到的曲线是如上图中右下图所示,不断地上升,那么可能需要选择一个较小的学习率α\alpha。

我们可以令学习率随着迭代次数的增加而减少,如下所示:

α=const1iterationNumber+const2

\alpha = \frac{const1}{iterationNumber + const2}

随着不断地靠近全局最小值,通过减小学习率,我们迫使算法收敛而非在最小值附加徘徊,如下图所示。

但是通常我们不需要这样做便能有非常好的效果了,对α\alpha进行调整所耗费的计算通常不值得,毕竟这种调整学习率方法需要确定常数const1和const2的值。

在线学习

接下来介绍一种新的大规模机器学习机制–在线学习机制。在线学习算法指的是对数据流而非离线的静态数据集的学习。许多在线网站都有持续不断的用户流,对于每一个用户,网站希望能在不将数据存储到数据库中便顺利地进行算法学习。

假设我们正在经营一家物流公司,每当一个用户询问从地点A至地点B的快递费用时,我们给用户一个报价,该用户可能选择接受(y=1)或者不接受(y=0)。

现在,我们希望构建一个模型,来预测用户接受报价使用我们的物流服务的可能性。因此报价是一个特征,其他特征为距离,起始地点,目标地点以及特定的用户数据。而模型的输出是p(y=1)。

在线学习的算法与随机梯度下降算法有些类似,我们对单一的实例进行学习,而非对一个提前定义的训练集进行循环。

Repeat forever (as long as the website is running){
对当前用户获取对应的(x,y)
θj:=θj−α(hθ(x)−y)xj\theta_j := \theta_j- \alpha(h_\theta(x) - y)x_j
(for j= 0:n)
}

一旦对一个数据的学习完成了,我们便可以丢弃该数据,不需要再存储它了。这种方式的好处是,我们的算法可以很好的适应用户的倾向性,算法可以针对用户的当前行为不断地更新模型以适应该用户。

其他在线学习的例子有如搜索,比如搜索拥有1080p像素相机的安卓手机等。

映射化简和数据并行

映射化简和数据并行对于大规模机器学习问题而言是非常重要的概念。

之前提到,如果我们用批量梯度下降算法来求解大规模数据集的最优解,我们需要对整个训练集进行循环,计算偏导数和代价,再求和,计算代价非常大。如果我们能够将我们的数据集分配给多态计算机,让每一台计算机处理数据集的一个子集,然后我们将计算的结果汇总再求和,这样的方法叫做映射简化。

具体而言,如果任何学习算法能够表达为,对训练集的函数的求和,那么便能将这个任务分配给多台计算机(或者同一台计算机的不同CPU),以达到加速处理的目的。

例如,我们有400个训练实例,我们可以将批量梯度下降的求和任务分配给4台计算机进行处理:

很多高级的线性代数函数库已经能够利用多核CPU的多核来平行地处理矩阵运算,这也是算法的向量化实现如此重要的缘故,这比使用循环更快。

小结

本节课内容介绍了如此使用大规模数据集来进行训练机器学习算法,介绍了两种新的梯度下降算法–随机梯度下降和微型批量梯度下降,以及新的大规模机器学习算法机制–在线学习机制,最后介绍了映射化简和数据并行,也就是使用多台计算机或者是同一台计算机的多个CPU分别计算训练集的一个子集,最后再将结果汇总求和的方法。

[机器学习笔记]Note15--大规模机器学习相关推荐

  1. 吴恩达机器学习笔记(九)——大规模机器学习

    大规模机器学习 1 大规模机器学习可行性 由之前机器学补充里的知识可知,有的时候并不是数据越多对算法越好,当方差偏小的时候,说明此时的拟合度会比较大,数据缺乏泛性,这个时候使用更大的数据集可能会对算法 ...

  2. 吴恩达机器学习笔记 —— 18 大规模机器学习

    http://www.cnblogs.com/xing901022/p/9417633.html 本章讲了梯度下降的几种方式:batch梯度下降.mini-batch梯度下降.随机梯度下降.也讲解了如 ...

  3. Machine Learning第十周笔记:大规模机器学习

    博客已经迁移到Marcovaldo's blog (http://marcovaldong.github.io/) 刚刚完成了Andrew Ng在Cousera上的Machine Learning的第 ...

  4. 【机器学习】课程笔记16_大规模机器学习(Large Scale Machine Learning)

    大规模机器学习 大型数据集的学习(Laerning with Large Datasets) 随机梯度下降(Stochastic Gradient Descent) 小批量梯度下降(Mini-Batc ...

  5. 机器学习笔记——数据挖掘与机器学习区别以及课程内容

    机器学习笔记 慕课|蒋良孝|中国地质大学 机器学习的定义 机器学习:利用经验改善计算机系统自身的性能 数据挖掘的定义 数据挖掘:识别出巨量数据中有效的.新颖的.潜在有用的.最终可理解的模式的非平凡的过 ...

  6. 入门机器学习(二十一)--大规模机器学习(Large Scale Machine Learning)

    大规模机器学习(Large Scale Machine Learning) 1. 大型数据集的学习(Learning With Large Datasets) 2. 随机梯度下降法(Stochasti ...

  7. 机器学习系列:大规模机器学习(Large Scale Machine Learning)

    目录 1.大型数据集的学习 2.随机梯度下降法 3.小批量梯度下降 4.随机梯度下降收敛 1.大型数据集的学习 如果我们有一个低方差的模型,增加数据集的规模可以帮助你获得更好的结果.我们应该怎样应对一 ...

  8. 机器学习笔记 一:机器学习思路

    学习目录 一.机器学习派别 二.学习书籍 三.学习视频 四.数学基础 五.学习思路 一.机器学习派别 频率派:统计机器学习 贝叶斯派:概率图模型 二.学习书籍 李航<统计学习方法>: 周志 ...

  9. 机器学习笔记八之机器学习系统设计

    本节目录: 1 如何选择并表达特征向量 2 误差分析 3 类偏斜的误差度量 4 查准率和查全率之间的权衡 5 机器学习的数据 1如何选择并表达特征向量 选择一个由 100 个最常出现在垃圾邮件中的词所 ...

最新文章

  1. 使用ECLIPSE制作可执行文件
  2. 2019年北航OO第四单元(UML任务)及学期总结
  3. 涵盖 14 大主题!最完整的 Python 学习实例集来了!
  4. 【渝粤教育】国家开放大学2018年秋季 2405T现代汉语(1) 参考试题
  5. 转:防止跨站攻击,安全过滤
  6. c语言数据交换的算法流程图,C语言冒泡排序算法浅析
  7. 【原】unity3D ios 退出保存数据
  8. 【Java】Java中ThreadLocal简介以及源码
  9. linux帆软内存设置,修改FineReport配置参数
  10. 解决H5的a标签的download属性下载service上的文件/图片出现跨域问题
  11. 横向堆积柱状图(peak distribution)
  12. SpringCloud系列——Eureka中Region和Zone概念介绍
  13. 家谱计算机,家谱先生(FamilyKeeper)
  14. php apache 假死,解决apache兼容性及慢或假死问题
  15. html+css设置背景图移动以及人物行走的动画效果
  16. 当心收入被支出吞噬(zt)
  17. Vue脚手架创建步骤
  18. 全面剖析E-mail收发失败的原因
  19. php 微信小程序获取手机号_实例讲解微信小程序获取手机号授权用户登录功能...
  20. 高并发和海量数据下的 9 个 Redis 经典案例剖析!

热门文章

  1. android自定义更新,Android 完美解决自定义preference与ActivityGroup UI更新的问题
  2. win7 删除Windows服务的方法
  3. Python SIP使用总结(WinLinux通用)
  4. 显示当前行号、文件名和函数名(二)
  5. React开发(183):ant design 中treeSelect控制选中
  6. 看完这篇不要告诉我不会封装ant design弹框组件了
  7. react学习(4)----两个全选中就是key值一样了
  8. [html] 如何去除标签<i>默认斜体?
  9. [vue] 你知道vue中key的原理吗?说说你对它的理解
  10. 歌谣--回顾2020 展望2021