机器学习基础
要得到性能表现更好的模型,我们需要给学习算法更多的机会。
机器学习的两种最主要类型是监督学习和无监督学习。当然课程后面还会涉及一些推荐算法和强化学习的内容。
监督学习
监督学习是机器学习中一个最基本的概念,其基本思路是给定训练数据集,通过训练数据集来学习,并得到一个模型,这个模型可以用于预测未知数据。
识别、翻译、检测……
训练时,需要有输入和对应的正确输出,我们就是要得到一个模型拟合数据集。
主要包括回归和分类两种任务。主要区别在于分类算法输出的可能性有限,输出分类可能是数字,也可能是具体的类别,比如猫和狗。分类任务学习算法会找到某些边界从而进行划分。
无监督学习
没有标准答案,没有任何标签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",批量梯度下降算法,每次迭代时,都使用所有数据点计算梯度,然后更新参数。
如今我们了解了单变量、单特征的线性回归,那么如何推广到多特征、非线性模型呢?