跳转至

机器学习基础

要得到性能表现更好的模型,我们需要给学习算法更多的机会。

机器学习的两种最主要类型是监督学习和无监督学习。当然课程后面还会涉及一些推荐算法和强化学习的内容。

监督学习

监督学习是机器学习中一个最基本的概念,其基本思路是给定训练数据集,通过训练数据集来学习,并得到一个模型,这个模型可以用于预测未知数据。

\[X -> Y\]

识别、翻译、检测……

训练时,需要有输入和对应的正确输出,我们就是要得到一个模型拟合数据集。

主要包括回归和分类两种任务。主要区别在于分类算法输出的可能性有限,输出分类可能是数字,也可能是具体的类别,比如猫和狗。分类任务学习算法会找到某些边界从而进行划分。

无监督学习

没有标准答案,没有任何标签Y,我们不是要输出正确的结果,而是要找到数据集的规律,一些有趣的结构。例如聚类算法,将可能的聚类结果进行分类,还有例如异常检测、降维、关联规则等等。

线性回归模型

线性回归模型,也叫简单线性回归模型,是最简单的一种模型,也叫单变量线性回归模型,属于监督学习。目标是将数据拟合到一条直线上。

基本概念

  • 用于训练模型的数据称为训练集。
  • \(x\)\(y\)为训练数据集的输入特征和输出目标。
  • \((x, y)\)为训练数据集的一组数据点。
  • 训练数据集的样本数量为\(m\)
  • 找到一个函数\(f(x)\),这个\(f\)其实就是模型,\(f(x)\)的输入是训练数据集的输入特征,输出是训练数据集的输出目标。

如何表示?使用什么数学公式表示?

\(f_{w,b}(x) = wx + b\),线性模型,\(w\)\(b\)是模型参数。

Cost Function

成本函数,不同的\(w\)\(b\),都会得到不同的\(f(x)\)\(f(x)\)\(y\)之间的差距,这个差距就是成本。

评价好坏的标准?Cost Function!

一般使用平方误差代价函数。

线性回归的价值就是使得\(J(w,b)\)尽可能小。手动找出显然不现实,编写高效算法代码,用于自动寻找最小化的\(J\)\(w\)\(b\),最佳拟合线。

梯度下降算法,通过计算\(J(w,b)\)\(w\)\(b\)的导数,从而找到最小化的\(J\)\(w\)\(b\)

梯度下降算法

想象站在一个高度为\(h\)的山上,要下降到山底,如何快速到达山底?

  • 环视一圈,找到一个最高效的方向,迈出我们最速下降的一小步。
  • 站在新的点上,重复上述过程
  • 一步步迈出,最终到达一个局部最小的谷底

由于初始时可以选择不同的参数,即起点可以不一样,重复梯度下降的过程,最终可能到达一个不同的局部最小值。

如何实现梯度下降算法

\(w\)\(b\)的更新公式:

  • \(w = w - \alpha * \frac{\partial J}{\partial w}\)
  • \(b = b - \alpha * \frac{\partial J}{\partial b}\)

其中\(\alpha\)为学习率,控制下坡时步子的大小,\(\alpha\)越小,越慢,小步下坡,\(\alpha\)越大,越快,大步下坡。选择一个合适的\(\alpha\)很重要。

导数项可以看作是采取小步的方向,与学习率结合,可以共同决定下坡步伐的大小。

重复梯度下降算法,直到找到一个局部最小值。

细节?需要同时对于\(w\)\(b\)进行更新。

正确做法:

  • \(tmp\_w = w - \alpha * \frac{\partial J}{\partial w}\)
  • \(tmp\_b = b - \alpha * \frac{\partial J}{\partial b}\)
  • \(w = tmp\_w\)
  • \(b = tmp\_b\)

错误做法:

  • \(tmp\_w = w - \alpha * \frac{\partial J}{\partial w}\)
  • \(w = tmp\_w\)
  • \(tmp\_b = b - \alpha * \frac{\partial J}{\partial b}\)
  • \(b = tmp\_b\)

代入计算的都应该是旧值,而不是新值!

梯度下降算法的意义

简化一下,将\(b\)暂时忽略,只考虑\(w\)的更新公式:

\(J = J(w)\)

\(w = w - \alpha * \frac{\partial J}{\partial w}\)

也就变成一个单变量的优化问题,求一个最小值。一元函数求导,沿着切线方向不断走。在最小值右侧时,导数大于0,在最小值左侧时,导数小于0,由于\(\alpha\)始终大于0,所以都是沿着梯度下降的方向走,最终会找到一个局部最小值。

导数项背后的直觉!

学习率

学习率过小时,算法收敛速度慢,过大时,算法收敛速度快,但是可能无法找到全局最小值,导致远离最小值,甚至发散。

处于局部最小值时,由于导数为0,无法继续下降,算法结束。这对于存在多个局部最小值的情况,可能无法找到全局最小值

一般来说,越接近极小值,导数越接近0,梯度下降会自动采取更小的步长,即使学习率始终不变,最终找到一个局部最小值。

示例

线性回归模型,使用平方差误差代价函数,使用梯度下降算法,求解模型参数。我们最终要拟合到一条直线。

建立线性回归模型:

\(f_{w,b}(x) = wx + b\)

误差函数:

\(J(w,b) = \frac{1}{2m} \sum_{i=1}^{m} (f_{w,b}(x^{(i)}) - y^{(i)})^2\)

由于求偏导时可以抵消掉\(2\),所以为了使得式子更简洁,除掉一个\(2\)

梯度下降算法:

\(w = w - \alpha * \frac{\partial J}{\partial w}\)

\(b = b - \alpha * \frac{\partial J}{\partial b}\)

可以求得导数为:

\(\frac{\partial J}{\partial w} = \frac{1}{m} \sum_{i=1}^{m} (f_{w,b}(x^{(i)}) - y^{(i)}) * x^{(i)}\)

\(\frac{\partial J}{\partial b} = \frac{1}{m} \sum_{i=1}^{m} (f_{w,b}(x^{(i)}) - y^{(i)})\)

虽然局部最小值可能不是全局最小值,但事实可以证明,线性回归的平方误差代价函数,是凸函数,因此,全局最小值一定存在。

更准确来说,我们现在使用的是 "Batch Gradient Descent",批量梯度下降算法,每次迭代时,都使用所有数据点计算梯度,然后更新参数。

如今我们了解了单变量、单特征的线性回归,那么如何推广到多特征、非线性模型呢?