Loading

「吴恩达机器学习」18.大规模机器学习

本章主要讲解如何将大规模数据集运用到机器学习算法。

Learning with large datasets

从上面这幅图我们可以知道,数据集的规模往往比算法更重要,也就是说采用大数据量训练普通算法,效果也会比只拥有少量数据的优秀算法更好。

而大数据应用在机器学习算法上面最常见的问题就是运算量的问题,比如对于下面的梯度下降算法来说,每次迭代参数都要对\(m\)项进行求和,\(m\)越大自然计算量也就越大。所有我们需要优化我们的算法以适应大规模数据。

当然,在采用大规模数据集之前,我们也需要通过绘制学习曲线来判断我们当前的算法是否真的需要更大的数据集。比如右图所示学习曲线,即使再增大数据集效果也不会很明显,所以我们可以通过增加特征值/神经网络的单元,把右图的学习曲线转化成左图的情况,这样增加数据量才有意义。

Stochastic gradient descent

本节课主要介绍了一种比批梯度下降算法(Batch gradient descent)更适合用在大规模数据集的优化算法——随机梯度下降(Stochastic gradient descent)

Linear regression with gradient descent

首先回顾一下之前在线性回归中介绍的梯度下降算法。

假设函数:\(h_{\theta}(x) = \sum_{j=0}^n \theta_jx_j\)

训练集代价:\(J_{train}(\theta) = \frac{1}{2m} \sum_{i=1}^m(h_{\theta}(x^{(i)}) - y^{(i)})^2\)

梯度下降算法为:

由于这里每次更新参数\(\theta_j\)都采用了所有的数据集,所以也称为批梯度下降,这里的“批”指的是每次更新参数都考虑了“一整批”的数据。

Stochastic gradient descent

批梯度下降算法最大的问题也在于每次迭代都需要计算所有数据,在数据集较大时计算量会非常大,为了解决这个问题,所以提出了随机梯度下降(Stochastic gradient descent)

在随机梯度下降中,

代价函数:\(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}^m cost(\theta, (x^{(i)}, y^{(i)}))\)

没看懂和之前的有啥区别。。。哪里写错了吗?有点懵了,看一下别的资料吧。

随机梯度下降算法步骤:

从上图可以看出,随机梯度下降算法在每次迭代时只比上一次更好,而没有考虑所有的数据,所以运算效率高了很多。因此,随机梯度下降无法跟批梯度下降一样,每次都朝着最优解前进,而是可能会走会很多“冤枉路”,但是总体而言,在面对大规模数据集的时候,随机梯度下降的优势是大于劣势的。

Mini-batch gradient descent

本节课主要介绍小批量梯度下降算法(Mini-batch gradient descent)

Batch gradient descent v.s Stochastic gradient descent v.s Mini-batch gradient descent

  • Batch gradient descent: 每次迭代使用所有样本;
  • Stochastic gradient descent: 每次迭代使用1个样本;
  • Mini-batch gradient descent: 每次迭代使用\(b\)个样本;

通常\(b\)是一个介于2-100之间的数值,E.g.\(b=10\),小批量梯度下降是一个介于批量梯度下降和随机梯度下降之间的算法,每次更新参数\(\theta\),计算\(b\)个样本。

如果采用向量化的计算方式,那么通常小批量梯度下降效果会好于随机梯度下降。

Stochastic gradient descent convergence

本节主要介绍随机梯度下降算法的调试,以及学习率\(\alpha\)的选取。

Checking for convergence

Batch gradient descent

在批梯度下降中,我们可以绘制\(J_{train}(\theta)\)关于迭代次数的函数图像,根据图表判断梯度下降是否收敛。但是,在大规模数据集中,这是不现实的。

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

Stochastic gradient descent

在随机梯度下降中,我们在每一次更新参数\(\theta\)之前都计算一次代价\(cost(\theta, (x^{(i)}, y^{(i)})) = \frac{1}{2}(h_\theta(x^{(i)}) - y^{(i)})^2\),每迭代1000次(举例),就计算这1000次的代价的均值,然后绘制代价均值与迭代次数之间的函数图像。

当我们绘制这样的图表时,可能会得到一个噪声很多的曲线(如下图蓝线),此时如果我们减小学习率\(\alpha\),那么也许就会得到一个下降较为缓慢,但是最终代价更小的曲线(如下图红线)。

如果我们增大计算均值的代价个数,比如把1000个变成5000个,那么我们可能会得到一条更加平滑的曲线(如下图红线)。

假如我们得到的是看不出下降趋势的曲线(如下图蓝线),那么我们可以试着增大计算均值的代价个数,比如把1000个变成5000个,那么我们可能会得到一条更为平滑的,能够看到缓慢下降趋势的曲线(如下图红线),那么至少说明我们的算法是逐渐收敛的;但是,我们也有可能得到一条更为平滑的,但是依然不能够看到任何下降趋势的曲线(如下图品红线),那么说明我们的算法可能是存在问题的。

如果我们得到一个不断上升的曲线(如下图蓝线),那么我们可能需要选择一个较小的学习率\(\alpha\)

学习率\(\alpha\)通常保持恒定,那么随机梯度下降可能会得到一个不断在最小值附近徘徊的结果。

如果我们想使得结果更加逼近最小值,那么我们可以采用一个随着迭代次数增加而不断减小的学习率,比如\(\alpha = \frac{const1}{iterationNumbner + const2}\)。那么我们可能就能得到一个在离最小值更近的地方不断徘徊的结果。

Online learning

本节介绍另外一种大规模的机器学习机制——在线学习机制

Online learning

以一个运输服务网站为例,讲解什么是在线学习机制。

假如用户访问一个运输服务网站,指定出发点和目的地之后,网站会给出一个价格,而用户有时候会选择使用该网站的运输服务(\(y=1\)),有时候则不会使用(\(y=0\))。

出发地/目的地等为我们的特征值\(x\),我们希望通过构建一个模型,来预测用户接受报价使用我们物流服务的可能性\(p(y=1|x;\theta)\),以此来优化我们的报价。

在线学习和随机梯度下降算法有些类似,我们对单一的样例进行学习,而非对一批数据集进行学习。

Repeat forever (as long as the website is running){
Get \((x,y)\) corresponding to the current user
\(\theta \colon= \theta_j - \alpha(h_\theta(x) - y)x_j\) (for \(j = 0:n\))
}

在线学习的好处在于,模型能够随着用户倾向的改变而自动作出改变。

Other online learning example

Product search (learning to search)

用户在购物商城搜索“Android phone 1080p camera”,库存中可能会有100款手机,但是我们只会返回10款。

\(x\) = features of phone, how many words in user query match name of phone, how many words in query match description of phone, etc.

\(y=1\) if user clicks on link. \(y=0\) otherwise.

我们希望预测\(p(y=1|x;\theta)\),具体到这个问题上,我们预测的是点击率(CTR, Click-Through-Rate)。通过预测点击的概率,我们就能够展示用户最有可能点击的10款手机。

Other examples: Choosing special offers to show user; customized selection of news articles; product recommendation; …

Map-reduce and data parallelism

映射化简和数据并行是大规模机器学习中非常重要的概念。

假如我们有400组数据数据(\(m=400\)),同时有4台机器,那么Map-reduce的思想就是把数据集4等分,每一份100组数据,分别给不同的机器计算一个临时结果,然后最终再合并到一台中心服务器上面进行汇总,这样求出来的结果是一样的,但是计算速度大概提升了4倍。

Map-reduce的思想总结如下:

多台机器

多核机器

任何学习算法,只要能够表达成对数据集的函数的求和,那么就可以划分数据集,分配给不同机器/核心分别完成,以达到加速处理的目的。

posted @ 2021-12-28 22:30  活用数据  阅读(97)  评论(0编辑  收藏  举报