大规模机器学习(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 ...
随机推荐
- CS229 Lesson 5 生成学习算法
课程视频地址:http://open.163.com/special/opencourse/machinelearning.html 课程主页:http://cs229.stanford.edu/ 更 ...
- Emacs key bindings for vim users
Emacs key bindings for vim users | Scarletsky 盒子 盒子 博客 分类 标签 关于 RSS 搜索 文章目录 简介 Emacs 是一个文本编辑器,号称是伪装成 ...
- 菜篮子成血战场!生鲜O2O为何厮杀如此惨烈
衣食住行作为与大众生活直接挂钩的刚需,已经被诸多互联网企业全面渗入,并在彻底颠覆大众原有的生活形态.但其中作为最底层.最基本的"菜篮子"--生鲜市场,似乎仍然没有被互联网元素完全& ...
- CentOS7 安装python 3.5 及 pip安装
1.CentOS7 安装Python 的依赖包 # yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-d ...
- 从输入URL到页面展示
当我们输入 URL 并按回车后,浏览器会对 URL 进行检查,首先判断URL格式,比如是ftp http ed2k等等,我们这里假设这个URL是http://hellocassie.cn,那么浏览器会 ...
- Python爬虫抓取微博评论
第一步:引入库 import time import base64 import rsa import binascii import requests import re from PIL impo ...
- 东南大学RM装甲板识别算法详解
rm中,装甲板的识别在比赛中可谓是最基础的算法.而在各个开源框架中,该算法也可以说最为成熟.出于学习目的,之后将对比多个高校或网络代码(),尝试学习各个rm装甲板识别算法的优点和流程. 这次先是东南大 ...
- hadoop HDFS扩容
1.纵向扩容(添加硬盘) 1.1 添加硬盘 确定完成添加,运行 lsblk 查看硬盘使用情况 1.2 硬盘分区 fdisk /dev/sdb #对新硬盘sdb进行分区 m 帮助 n 添加一个分区 p ...
- 在Linux上查询物理机信息-不用去拆机器了
目录 一.查看系统信息(包含机器型号) 1.1 查看机型和品牌 二.查看CPU 信息 2.1 查看CPU 型号 2.2 查看CPU的物理数量 2.3 查看 CPU核心数量(非逻辑CPU) 2.4 查看 ...
- 有关于python内置函数exec和eval一些见解笔记
eval是将函数内的字符串以计算式的方式进行计算并给与外部一个值. 例: a=eval('1+1') print(a) >>>>2 但是如果出现在函数内部字符串中进行赋值会抛出 ...