一谈到机器学习,我们可能会思考,什么是机器学习,到底学习什么?
一、机器学习学什么?
我们先来看一张图,如图1所示,这张图来自Andrew Ng机器学习课程第二章,什么意思?我总结一下:
1) 机器学习目的:建立输入(x)到输出(y)之间的映射关系(h);
2) 模型建立:模型建立过程中,我们需要根据经验,对要建立模型做一些假设(Hypothesis),比如说,这里假设输入(房屋面积)和输出(房屋价格)之间是满足线性关系的,这样模型的类型就确定了;
3) 机器学习学的内容:学习内容,其实就是学习我假定模型的参数,例如,这里我们假定是线性的,那么相当于就是假定了一个线性方程,我们学习的过程,其实就是得到确切的模型参数,学习的本质是学习模型的参数。
图1 机器学习流程示意图(摘自参考资料[1])
二、如何学?
在说如何学之前,我们先聊一下我们是如何去判别一件事情完成的好坏程度。我们在衡量一件事情完成好坏之前,自身会有一个期望结果(预期值),而这件事情有一个实际结果(真实值),这样,我们就可以通过这种实际值与预期值之间的偏差,就可以很好的来判断这件事情的好坏。
2.1 损失函数
在机器学习中,同样也是类似的,机器学习中有一个专门的名词:loss(cost),描述loss(cost)使用loss function(损失函数)或error function(误差函数)。
这里,我们看一下一个具体模型的loss计算过程,如图2所示。
图2 Loss 直观解释(摘自参考资料[1])
期望值与预测值之间的偏差就对应于蓝色线段,预测总的偏差等于所有蓝色线段长度之和,所以,Loss function可以定义如下:
衡量整个样本集中的损失,我们采用cost function(代价函数):
2.2 学习目标
如果当前模型能够完美的拟合所有样本点,这个时候有: , 对应的,如图3所示。
图3 模型完美拟合样本(摘自参考资料[1])
因此,如果我们能够最小化损失函数,让足够小,那么这个时候参数对应模型就能较好的拟合样本集,我们就能得到一个我们希望得到的模型,因此,如何学习问题其实就等价于如何来最小化损失函数,学习的目标就是最小化损失函数:
对于求解的问题,我们可以考虑直接求偏导,然后令之为0,就可以得到解:
实际求解过程中,求矩阵的逆比较难求,因此采用考虑另外一种思路:梯度下降法。
2.3 梯度下降法
我们先看一下损失函数长什么样,损失函数的图像如图4所示。我们需要找寻全局最小值,直接求解可能太过于困难,因此我们考虑将问题进行分解,每一次优化一点,让模型变得更好一点,通过一次次迭代,最终得到一个最优的模型参数。梯度下降法就是按照这个思路设计的,每一次对参数的调整,都会使得损失函数变小,这样多次调整之后,我们就能使得足够小,最终得到理想的模型参数。
图4 损失函数图像(摘自参考资料[1])
那么,具体怎么做?首先回忆一下我们本科学习过的泰勒级数展开式,我们先看一下一阶的泰勒展式:
类似的,对于一个向量有:
这个式子说明了什么问题?我们先将这个式子做一下移项变形,有:
这样就明显了,如果我们沿着方向做一个改变,会引起大小变化,我们再分析一下:
我们希望损失函数尽可能的变小,因此要求尽可能的大,而当时,取得最大值,这个时候同向,这也是为什么梯度下降法要沿着梯度方向来做的原因。
我们可以再进一步,将问题进行简化,假设当前模型为:,损失函数的图像如图5所示。
图5 梯度下降法示意图(摘自参考资料[1])
梯度下降的过程为:
其中,为学习率,在经过一次次迭代之后,偏导数会变得越来越小,直至接近于0,这个时候,乘以这个偏导数任然接近于0,算法就自然收敛了。
三、梯度下降法做线性回归
偏导数求解:
注意,对应于一般的参数方程对应于我们常见的,,这里将所有的参数表示成一个向量只是为了方便表示,其实本质上并没有什么区别,只是表示方法的不同而已。
四、代码实现
~~~~未完待续~~~~~~
参考资料:
[1] Andrew Ng 的 机器学习课程