大规模机器学习(Large Scale Machine Learning)
本博客是针对Andrew Ng在Coursera上的machine learning课程的学习笔记。
在大数据集上进行学习(Learning with Large Data Sets)
由于机器学习系统的性能表现往往要求其算法是low biased(在训练集上的训练误差小),并且在尽可能大的数据集上做训练。
It's not who has the best algorithm that wins. It's who has the most data.
比如对于一般线性回归或者logistic回归,有如图的参数迭代更新的公式,假设我们如果有一百万个训练样本(m=100,000,000),则每一次更新参数都需要做一百万次的加和,那么计算量就很大。另外,对于high bias的算法学习曲线(如下图的靠右图),此时增加样本数量也不太可能减少误差,可能合适地增加输入特征才是更有效的。而如左边的情况high variance,用更大的数据集是更有效的。
随机梯度下降(Stochastic Gradient Descent)
由于之前讲的梯度下降(又称Batch Gradient Descent)在样本量大时计算量非常大,更新速度会很慢,为了避免这个问题,我们可以采用随机梯度下降。
具体做法是:我们不再在对参数进行更新时遍历加总所有样本的误差值,而是每次迭代更新从中只随机选取一个样本进行误差计算,(本质是先将数据集打乱,再逐一进行参数学习,但还是要对所有的样本进行一次遍历),因此保证了参数是在快速地向全局最优解靠近的(但可能由于样本选取的随机性,导致梯度下降的方向并不是那么稳定地向全函数最小值处行进,相当于是牺牲稳度换取速度)。
因此相对于batch GD,stochastic GD可以在很多时候实现更高效地学习。因为stochastic GD每次迭代更新参数,都只需要用到一个样本,而遍历整个样本的轮数可能进行1-10次后就能获得非常好的假设了,而batch GD是每一次更新一个参数都需要遍历整个数据集,那么每次迭代都要用到m个样本。
小堆梯度下降(Mini-Batch Gradient Descent)
小堆梯度下降有时候可以比随机梯度下降速度更快!
小堆梯度下降其实就是将随机梯度下降中只用一个样本进行每轮迭代的做法,变成了用b个样本进行每轮迭代(此之谓mini-batch,因为每轮迭代用到的样本数量在1-m之间)。
而什么时候小堆GD效率会比随机GD高呢?那就是我们有比较好的vectorization的计算实现时。
保证随机GD的收敛与学习速率的选择
如何知道我们的GD算法在像收敛的方向运行?
- 在Batch GD中,我们是画损失函数和GD迭代次数的图像。
- 在Stochastic GD中,我们可以在固定的迭代次数后,画成本函数的在这些迭代上的平均值
下图中蓝色线代表较大的学习速率$\alpha$,红色代表较小的学习速率(每次迭代参数更新的幅度更小)。四幅图代表了stochastic GD的图像可能出现的情况。
上面两幅图的区别是画图的采样点的频率不同,左上方的图是画每迭代1000次的成本函数,右上方的图每迭代5000次的平均成本函数图像。由于分母变大,分子相对变化较小,因此迭代次数高的函数图像更平稳。
下面两幅图也是可能出现的情况。左下方的图蓝色的线是由于学习速率过大,不稳定,应该调小学习速率。而右下方的图则是曲线上扬,说明学习速率太大,算法发散了,也需要调小学习速率。
可以让学习速率随着迭代次数增加而减少,以保证逐渐稳定地收敛到最优解。
在线学习(Online Learning)
在很多机器学习运行的系统中,很多学习数据是不断在产生的,如何可以让系统随着数据的涌入保持学习,而不是只能获得一次性用固定数据训练的模型,以获得更优的性能,就是在线学习所要解决的问题。
给定以下一个快递服务网站的情形:
如图所示,在线学习系统在每次有新的数据产生(一个用户访问了网站,并给出是否使用快递服务的决策)时,系统都会对参数进行一次更新。
另一个例子:电商网站的产品搜索。
Map Reduce 和 数据并行化
有时候,数据集太大,如果只在一台主机上运行,可能很久才能获得结果,于是我们希望可能用尽量少的时间获得好的结果。
首先来看map-reduce的做法:将数据集按照我们手头拥有的计算资源的数量,即我们可以用来运行机器学习算法的主机的数量平均分配。然后,每个主机利用分配给它那部分的样本运行算法,去计算损失函数的偏导数值,并获得一个属于该主机的结果$temp^{(i)}_j$。最后,将所有主机的结果结合在一起,用来对参数做更新。
而很多机器学习算法本质就是对训练集上进行和加总的一些计算。
而其实不是只有多台主机才能实现并行化,在一台多核的主机上也可以进行,做法和多主机的情况是类似的。而且在这种情况下,有一个好处是,不需要担心因为网络延迟导致的数据传输缓慢等问题,而这是多主机并行化可能会面对的问题。
大规模机器学习(Large Scale Machine Learning)的更多相关文章
- [C12] 大规模机器学习(Large Scale Machine Learning)
大规模机器学习(Large Scale Machine Learning) 大型数据集的学习(Learning With Large Datasets) 如果你回顾一下最近5年或10年的机器学习历史. ...
- Coursera在线学习---第十节.大规模机器学习(Large Scale Machine Learning)
一.如何学习大规模数据集? 在训练样本集很大的情况下,我们可以先取一小部分样本学习模型,比如m=1000,然后画出对应的学习曲线.如果根据学习曲线发现模型属于高偏差,则应在现有样本上继续调整模型,具体 ...
- 斯坦福第十七课:大规模机器学习(Large Scale Machine Learning)
17.1 大型数据集的学习 17.2 随机梯度下降法 17.3 微型批量梯度下降 17.4 随机梯度下降收敛 17.5 在线学习 17.6 映射化简和数据并行 17.1 大型数据集的学习
- Ng第十七课:大规模机器学习(Large Scale Machine Learning)
17.1 大型数据集的学习 17.2 随机梯度下降法 17.3 微型批量梯度下降 17.4 随机梯度下降收敛 17.5 在线学习 17.6 映射化简和数据并行 17.1 大型数据集的学习 ...
- 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 17—Large Scale Machine Learning 大规模机器学习
Lecture17 Large Scale Machine Learning大规模机器学习 17.1 大型数据集的学习 Learning With Large Datasets 如果有一个低方差的模型 ...
- Lessons learned developing a practical large scale machine learning system
原文:http://googleresearch.blogspot.jp/2010/04/lessons-learned-developing-practical.html Lessons learn ...
- (原创)Stanford Machine Learning (by Andrew NG) --- (week 10) Large Scale Machine Learning & Application Example
本栏目来源于Andrew NG老师讲解的Machine Learning课程,主要介绍大规模机器学习以及其应用.包括随机梯度下降法.维批量梯度下降法.梯度下降法的收敛.在线学习.map reduce以 ...
- 吴恩达机器学习笔记60-大规模机器学习(Large Scale Machine Learning)
一.随机梯度下降算法 之前了解的梯度下降是指批量梯度下降:如果我们一定需要一个大规模的训练集,我们可以尝试使用随机梯度下降法(SGD)来代替批量梯度下降法. 在随机梯度下降法中,我们定义代价函数为一个 ...
- 吴恩达机器学习笔记(十一) —— Large Scale Machine Learning
主要内容: 一.Batch gradient descent 二.Stochastic gradient descent 三.Mini-batch gradient descent 四.Online ...
随机推荐
- meterpreter会话渗透利用常用的32个命令归纳小结
仅作渗透测试技术实验之用,请勿针对任何未授权网络和设备. 1.background命令 返回,把meterpreter后台挂起 2.session命令 session 命令可以查看已经成功获取的会话 ...
- 图解Python网络编程
返回目录 本篇索引 (1)基本原理 (2)socket模块 (3)select模块 (4)asyncore模块 (5)asynchat模块 (6)socketserver模块 (1)基本原理 本篇指的 ...
- python安装pip (windows64)
1.前提条件是先安装了easy_install(easy_install安装教程http://www.cnblogs.com/IT-Crowd/articles/6528469.html) 2.在ea ...
- npm发布包的那些事
npm发包的那些事 最近一直在研习关于node的知识,发布包虽然是最基础的一点,但由于一些地方的不注意很容易发生错误,我整理了我可能出现过的一些发布包的过程中的一些error,现在分享给大家: 正确的 ...
- python学习记录_中断正在执行的代码,执行剪切板中的代码,键盘快捷键,魔术命令,输入和输出变量,记录输入和输出变量_
2018-03-28 00:56:39 中断正在执行的代码 无论是%run执行的脚本还是长时间运行的命令ctrl + cIn [1]: KeyboardInterrupt 执行剪切板中的代码 ctrl ...
- python3编写程序,实现打印100以内的素数。
代码如下: for x in range(2, 100): for y in range(2, x): if x % y == 0: break else: print(x, end="\t ...
- python学习-练习题4巩固
一个数加100后是一个整数的平方,加268后也是一个数的平方,求这个数 分析:这个数加100之后开方是整数,说明int(math.sqrt(a+100))转为整数应该没有小数部分 so:b*b = i ...
- [python]回答百度知道上的问题2000-2999之间的回文日
因为百度知道的编辑器没有提供代码功能,将回复写入. 题目如下: 求2000到2999的所有回文日,例如20200202 用Python怎么做 回文年好求,回文日的话,年月日这咋存啊 思路一:遍历每一天 ...
- jupyter 安装问题 building 'zmq.libzmq' extension error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools
1.用pip install jupyter 安装到一半就报错 错误提示: building 'zmq.libzmq' extension error: Microsoft Visual C++ 14 ...
- 吐血干货,直播首屏耗时400ms以下的优化实践
导读: 直播行业的竞争越来越激烈,进过18年这波洗牌后,已经度过了蛮荒暴力期,剩下的都是在不断追求体验.最近在帮做直播优化首开,通过多种方案并行,把首开降到500ms以下,希望能对大家有借鉴. 背景: ...