Skip to content
大纲

Machine Learning概述

什么是机器学习?

计算机程序从经验E中学习,解决某一任务T,进行某一性能P,通过P测定在T上的表现因经验E而提高。

例如:对于跳棋游戏,经验E就是程序与自己下几万次跳棋;任务T就是玩跳棋;性能度量P就是与新对手玩跳棋时赢的概率。

Supervised Learning监督学习

监督学习:给算法一个数据集,其中包含了正确答案,算法的目的是给出更多的正确答案。

Regression回归问题

image.png

上述是一个房价预测的例子,使用直线和二次函数曲线拟合数据。这实际上是一个回归问题——目的是为了预测连续的数值输出。

Classification分类问题

image.png

上述是预测肿瘤良性与否的例子,这里只给出了一个特征值,这实际上是一个分类问题——目的为了预测离散的数值输出。

image.png

上述是给出了多个特征值的例子,即病人年龄和肿瘤大小。某些机器学习算法的目的是为了解决无穷多个特征的数据集

Unsupervised Learning无监督学习

对于监督学习中的每一个样本,算法都被告知了什么是正确答案,但是对于无监督性学习,只给算法一个数据集,但是不给数据集的正确答案,由算法自行分类。

聚类算法

  • 谷歌新闻 谷歌新闻会收集成千上万条新闻,然后自动地分簇,有关同一主题的新闻集合在一起。
  • 大型计算机集群
  • 基因组学 给定一组不同个体,根据DNA检测特定基因的表达程度。
  • 市场细分 市场通过对用户进行分类确定目标用户。
  • 天文数据分析
  • 鸡尾酒会算法——分离交叉音源判断

image.png

Linear Regression with One Variable单变量线性回归

Model Respresentation模型描述

监督学习算法是如何工作的?

image.png

上述流程是监督学习算法的工作方式,我们需要将训练集的一些数值比如房屋大小喂给学习算法,然后输出一个函数,而这个函数用hh表示。hh表示hypothesis假设,是一个函数,输入是训练集一些数值比如房子大小,输出一个预估的房子价格,hh实际上时从输入到输出的映射。那我们应该如何表达hh

一种可能的表达方式为:hθ(x)=θ0+θ1xh_{\theta}(x)=\theta_{0}+\theta_{1}*x,因为只含有一个特征/输入变量,因此这样的问题叫作单变量线性回归问题

线性回归(Linear regression) 的假设函数h,其实就是构建了从x到y的映射:

hθ(x)=θ0+θ1xh_{\theta}(x)=\theta_{0}+\theta_{1}*x

Cost Function代价函数

在线性回归中我们举个预测房价的例子,现在我们有这么个训练集和假设函数:

image.png

其中mm代表着训练样本的数量,θi\theta_{i}代表模型参数。那么我们应该如何为我们的模型选择合适的两个参数θ0\theta_{0}θ1\theta_{1}呢?

image.png

上图是选择不同模型参数的例子。我们需要做的就是选择合适的θ0\theta_0θ1\theta_1来让假设函数hh表示的直线尽量地与下图这些数据点进行很好的拟合——使得hθ(x)h_{\theta}(x)尽可能接近训练集样本(x,y)(x,y)。这个事实上在Machine Learning中标准的定义就是在线性回归中要解决的最小化问题

即使Cost Function代价函数J(θ0,θ1)=12mi=1m(hθ(x)y)2J(\theta_0,\theta_1)=\frac{1}{2m}\sum_{i=1}^{m}(h_{\theta}(x)-y)^2最小,这个代价函数也被称为Squared Error Function平方误差函数或者有时叫Squared Error Cost Function平方误差代价函数

我们之所以要求出 误差的平方和,是因为误差平方代价函数,对于大多数问题,特别是回归问题,都是一个合理的选择,还有其他的代价函数也能很好地发挥作用,但是平方误差代价函数可能是解决回归问题最常用的手段。

image.png

几个直观的例子

让我们来简化一下上述的代价函数:

image.png

然后我们来取一下不同θ\theta的假设函数和代价函数的图像:

image.png

image.png

image.png

我们还可以利用等高线图或者等高图像来直观感受。

image.png

image.png

image.png

我们不希望编个程序把这些点画出来,然后人工的方法来读出这些点的数值,这很明显不是一个好办法。我们会遇到更复杂、更高维度、更多参数的情况,而这些情况是很难画出图的,因此更无法将其可视化,因此我们真正需要的是编写程序来找出这些最小化代价函数的θ0\theta_0θ1\theta_1的值。有没有一种算法能够自动找出能使代价函数JJ最小化的θ0\theta_0θ1\theta_1的值呢?

Gradient Descent梯度下降

Gradient Descent梯度下降是一个用来求函数最小值的算法,我们将使用梯度下降算法来求出代价函数 J(θ0,θ1)J(\theta_0, \theta_1) 的最小值。梯度下降是很常用的算法,它不仅被用在线性回归上,还被广泛应用于机器学习的众多领域。

梯度下降背后的思想是:开始时我们随机选择一个参数的组合 (θ0,θ1,,θn)(\theta_0, \theta_1, \ldots, \theta_n) ,计算代价函数,然后我们寻找下一个能让代价函数值下降最多的参数组合。我们持续这么做直到到 到一个局部最小值,因为我们并没有尝试完所有的参数组合,所以不能确 定我们得到的局部最小值是否便是全局最小值,选择不同的初始参数组合,可能会找到不同的局部最小值。

image.png

想象一下你正站立在山的这一点上,站立在你想象的公园这座红色山上,在梯度下降算法中,我们要做的就是旋转 360 度,看看我们的周围,并问自己要在某个方向上,用小碎步尽快下山。这些小碎步需要朝什么方向?如果我们站在山坡上的这一点,你看一下周围,你会发现最佳的下山方向,你再看看周围,然后再一次想想,我应该从什么方向迈着小碎步下山?然后你按照自己的判断又迈出一步,重复上面的步骤,从这个新的点,你环顾四周,并决定从什么方向将会最快下山,然后又迈进了一小步,并依此类推,直到你接近局部最低点的位置。

起始点的不同会带来完全不同的局部最优解。

数学定义

image.png

其中的 α\alphalearning rate学习率。它用来控制梯度下降时我们迈出多大的步子,α\alpha 越大,我们梯度下降就越迅速。

还有一个细节,梯度下降中,当 j=0j=0j=1j=1 时,我们需要更新θ0\theta_0θ1\theta_1 ,因为此时的微分项αθjJ(θ0,θ1)\alpha\frac{\partial}{\partial\theta_j}J(\theta_0,\theta_1)将会改变。实现梯度下降算法的微妙之处是, 在这个表达式中,如果要更新这个等式,我们需要同时更新θ0\theta_0θ1\theta_1,我的意思是在这个等式中,我们要像上述方式同步更新,而非下述方式:

image.png

直观理解

image.png

上述是对导数项αθjJ(θ0,θ1)\alpha\frac{\partial}{\partial\theta_j}J(\theta_0,\theta_1)的直观解释。求导的目的,从几何上看,就是取上述图像上的点的切线,这条直线的斜率正好是这个三角形的高度除以水平长度。当其导数为正时,得到的θ\theta更小,从几何上看代价函数取值会更小;相反,当其导数为负时,得到的θ\theta更大,从几何上看代价函数取值也会更小。

那么学习率α\alpha取值大小会有什么样的影响?

image.png

如果α\alpha太小了,即学习速率太小,结果就是只能一点点地挪动,去努力接近最低点,这样就需要很多步才能到达最低点。

如果α\alpha太大,那么梯度下降法可能会越过最低点,甚至可能无法收敛,下一次迭代又移动了一大步,越过一次,又越过一次,一次次越过最低点,直到我们发现实际上离最低点越来越远。所以,如果𝑎太大,它会导致无法收敛,甚至发散。

那么,一个更值得思考的问题是,如果我们一开始就把θ\theta取值放在一个局部的最低点,下一步梯度下降将会发生什么?

image.png

假设我们将θ\theta初始化在局部最低点,它已经在一个局部的最优处或局部最低点。 结果是局部最优点的导数将等于零,因为它是那条切线的斜率。这意味着已经在局部最优点,它使得θ\theta不再改变,也就是新的θ\theta等于原来的θ\theta,因此,如果参数已经处于局部最低点,那么梯度下降法更新其实什么都没做,它不会改变参数的值。这也解释了为什么即使学习速率𝑎保持不变时,梯度下降也可以收敛到局部最低点。

举个例子解释一下。

image.png

我想找到它的最小值,首先初始化我的梯度下降算法,在那个红点初始化,如果我更新一步梯度下降,也许它会带我到这个点,因为这个点的导数是相当陡的。现在,在这个绿色的点,如果我再更新一步,你会发现我的导数,也即斜率,是没那么陡的。随着我接近最低点,我的导数越来越接近零,所以,梯度下降一步后,新的导数会变小一点点。然后我想再梯度下降一步,在这个绿点,我自然会用一个稍微跟刚才在那个品红点时比,再小一点的一步,到了新的红色点,更接近全局最低点了,因此这点的导数会比在绿点时更小。所以,我再进行一步梯度下降时,我的导数项是更小的,θ\theta更新的幅度就会更小。所以随着梯 度下降法的运行,你移动的幅度会自动变得越来越小,直到最终移动幅度非常小,你会发现,已经收敛到局部极小值。

回顾一下,在梯度下降法中,当我们接近局部最低点时,梯度下降法会自动采取更小的幅度,这是因为当我们接近局部最低点时,很显然在局部最低时导数等于零,所以当我们接 近局部最低时,导数值会自动变得越来越小,所以梯度下降将自动采取较小的幅度,这就是梯度下降的做法。所以实际上没有必要再另外减小α\alpha

这就是梯度下降算法,我们可以用它来最小化任何代价函数JJ,不只是线性回归中的代价函数。

Gradient Descent For Linear Regression梯度下降的线性回归

这是梯度下降算法和线性回归算法的比较图:

image.png

我们如果想把梯队下降算法应用在线性回归算法当中,即最小化平方差代价函数,关键在于求出代价函数的导数,即:

αθjJ(θ0,θ1)=θj12mi=1m(hθ(x(i))y(i))2\alpha\frac{\partial}{\partial\theta_j}J(\theta_0,\theta_1) = \frac{\partial}{\partial\theta_j} \frac{1}{2m}\sum_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})^2

化简一下,得到:

αθjJ(θ0,θ1)=θj12mi=1m(θ0+θ1x(i)y(i))2\alpha\frac{\partial}{\partial\theta_j}J(\theta_0,\theta_1) = \frac{\partial}{\partial\theta_j} \frac{1}{2m}\sum_{i=1}^{m}(\theta_0+\theta_1x^{(i)}-y^{(i)})^2

j=0j=0j=1j=1时的两种特殊情况:

αθ0J(θ0,θ1)=1mi=1m(hθ(x(i))y(i))2j=0αθ0J(θ0,θ1)=1mi=1m((hθ(x(i))y(i))2x(i))j=1\begin{aligned} \alpha\frac{\partial}{\partial\theta_0}J(\theta_0,\theta_1) = \frac{1}{m}\sum_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})^2 \qquad j=0 \\ \alpha\frac{\partial}{\partial\theta_0}J(\theta_0,\theta_1) = \frac{1}{m}\sum_{i=1}^{m}((h_{\theta}(x^{(i)})-y^{(i)})^2\cdot x^{(i)}) \qquad j=1 \end{aligned}

image.png

然后我们的线性回归算法可以改写成:

image.png

之前我们提到,使用梯度下降时,会遇到一个问题——容易陷入局部最优:

image.png

但是线性回归的代价函数一般还是这样一个Convex Function凸函数:

注意:国内外对凹凸函数的翻译不同,我们不用去细究,国外以convexVconcaveCAVE形状象形,而国内以象形。

image.png

这样的函数没有局部最优解,只有一个全局最优,当计算这种代价函数的梯度下降时,只要是使用线性回归,它总是会收敛到全局最优,而没有其他的局部最优解。

我们刚刚学习的算法有时也被称为Batch Gradient Descent批量梯度下降Batch指的是梯度下降的每一步我们都用的是所有的训练样本。我们在计算微分求导时,我们需要进行求和运算,而在每一个单独的梯度下降中,我们都需要这个微分项。

批量梯度下降法这个名字说明了我们需要考虑所有这一"批"训练样本,而事实上,有时也有其他类型的梯度下降法,不是这种"批量"型的,不考虑整个的训练集,而是每次只关注训练集中的一些小的子集。

贡献者

凌晨三点的修狗