机器学习的基本原理
本文是对李烨的机器学习的笔记,部分段落引用自原文
1. 机器是如何学习的
机器学习是指:让机器可以自主获得事物规律。
要让机器可以 “学习”,必须将生活中的数据(包括但不限于图像、文字、语音)数值化,将不同事物的变化和关联转化为运算。
机器学习可以成立的原因是:概念和数值、关系和运算可以相互映射
猫妈妈教小猫认老鼠
- 小猫:一个机器(Machine)
- 学习(Learning):小猫成为老鼠分类器的过程
- 猫妈妈给小猫看的照片:数据(Data)
- 猫妈妈让小猫注意的几点:分类器的特征(Feature)
- 学习的结果:成为了老鼠分类器 -> 模型(Model)
- 小猫的思考过程:算法(Algorithm)
有监督学习(Supervised Learning)
给小猫 “喂” 数据让它成为老鼠分类器就是典型的有监督学习,其中每一张照片都是一个数据样本(Sample),照片下面的勾(正确)和叉(错误)就是数据样本的标签(Label),给数据样本打上标签的过程就叫做标注(Labeling)。
通过标注数据进行学习的方法,就叫做有监督学习或直接叫监督学习。
无监督学习(Unsupervised Learning)
告诉机器一些特征(Features),例如:是否有角,是否长翅膀,让机器自己去 “聚类”, 这就是一次无监督的学习。
无监督学习没有给定事先标记过的训练示例,自动对输入的数据进行分类或分群。
根据类别未知(没有被标记)的训练样本解决模式识别中的各种问题,称之为无监督学习。
2. 机器学习三要素之数据、模型、算法
算法通过在数据上进行运算产生模型
![](https://img.haomeiwen.com/i1210478/2b76faad1430b7d2.jpg)
数据
原数据(Raw Data):
还未转换为机器可以识别的数据样本
向量空间模型(VSM, Vector Space Model):
负责将格式(文字、图片、音频、视频)转化为一个个向量。
例如一个二维向量 [a_1, a_2]
,其中 a_1
可以表示是否有角,a_2
可以表示是否有翅膀,那么可以得到下面的数据
X_1 = [1,0];
X_2 = [0,0];
X_3 = [0,0];
...
以上这几个向量称为:这份数据的特征向量(Feature Vector)。
也称为:无标注数据
有标注数据:
![](https://img.haomeiwen.com/i1210478/1885fac3d1999b67.jpg)
每一个标注样本既有无标注样本拥有的 X
,同时还比无标注样本多了一个 y
,例如:y=1
表示正确,y=0
表示错误
X_1 = [1,0], y = 1;
X_2 = [0,0], y = 0;
X_3 = [0,0], y = 0;
...
机器将以上数据(VSM)交给算法,通过运算获得模型
特征工程:
判断数据应该取哪些特征,就叫做特征工程
-
确定用哪些特征来表示数据
-
确定用什么方式表达这些特征
模型
模型是机器学习的结果,而这个学习的过程称为训练(Train)
一个训练好的模型可以被理解成一个函数:y=f(x)
这个 y
可能是一个数值(回归),也可能是一个标签(分类)
模型是怎么得到的?
模型是基于数据,经由训练得到的。
训练又是怎么回事?
比如一个线性模型:
y=f(x)=ax^2+bx+c
训练就是为了找到其中 a
、b
、c
的值
训练:根据已经被指定的 f(x)
的具体形式 —— 模型类型,结合训练数据,计算出其中各个参数的具体取值的过程。
算法
训练过程需要依据某种章法进行运算。这个章法,就是算法。
日常中主要应用的还是有监督学习模型。
有监督学习模型的目标:让训练数据的所有 x
经过 f(x)
计算后,获得的 y'
与它们原本对应的 y
的差别尽量小。
损失函数(Loss Function):
需要用一个函数来描述 y'
与 y
之间的差别,这个函数叫做损失函数(Loss Function):
L(y, y')=L(y, f(x))
代价函数(Cost Function):
损失函数针对一个训练数据,对于所有的训练数据,我们用代价函数来描述整体的损失。
J(Θ)
代价函数的自变量不再是 y
和 f(x)
,而是变成了 Θ (theta)
,Θ
表示 f(x)
中所有待定的参数(Θ
也可以是一个向量,每个维度表示一个具体的参数)!
目标函数:
因为代价函数表示的是整个模型付出的代价,所以代价要越小越好。因此我们就得到了一个学习目标,就是找到目标函数。
目标函数 = 最小化代价函数 = argmin J(Θ)
目标函数一定是一个凸函数,有局部最低点
优化算法:
为了让 J(Θ)
达到最小就要使用优化算法。
具体的优化算法有很多,比如:梯度下降法(Gradient Descent)、共轭梯度法(Conjugate Gradient)、牛顿法和拟牛顿法、模拟退火法(Simulated Annealing)等等。
其中最常用的是梯度下降法。
一般来说,算法是机器学习和深度学习中最具技术含量的部分。
算法工程师的职责:
研发新算法;针对现实问题构造目标函数,选取并优化算法求解;将他人研究的最新算法应用到自己的业务问题上。
通常数据比算法更重要:
要得到高质量的模型,算法很重要,但往往(尤其是在应用经典模型时)更重要的是数据。
有监督学习伴随着需要标注数据,而数据都是靠人工标注。其过程繁琐,且工作量颇大!但无法避免。
人工标注对最终生成模型的质量有直接影响。
3. 模型的获取和改进
获取模型的过程
数据 + 算法 => 模型
![](https://img.haomeiwen.com/i1210478/061e6f07bad61f48.jpg)
-
数据准备
- 数据预处理:收集数据、清洗数据、标注数据。
- 构建数据的向量空间模型。
- 将构建好的向量空间模型分为训练集、验证集和测试集。
-
训练
训练的核心是算法 -
测试
测试集数据 --输入--> 模型(预测结果)--> 将预测结果与原本的预期进行比较 -
衡量当前模型的质量
按照一定的规则计算模型质量的衡量指标(Precision、Recall、F1Score 等等),根据指标的数值来衡量当前模型的质量。
训练集、验证集和测试集
- 训练集(Train Set):用来做训练的数据的集合。
- 验证集(Validation Set):在训练的过程中,每个训练轮次结束后用来验证当前模型性能,为进一步优化模型提供参考的数据的集合。
- 测试集(Test Set):用来测试的数据的集合,用于检验最终得出的模型的性能。
每个集合都应当是独立的,和另外两个没有重叠。
其中数据量最大的是训练集。
整体数据量不大,模型又相对简单时,验证集和测试集也可以合二为一。
训练的过程
- 编写训练程序
- 选择模型类型;
- 选择优化算法;
- 根据模型类型和算法编写程序。
- 训练 -> 临时模型
- 在训练集上运行临时模型,获得训练集预测结果。
- 在验证集上运行临时模型,获得验证集预测结果。
- 综合参照第 3 步和第 4 步的预测结果,改进模型。
- 回到第 2 步,反复迭代,直到结果满意或者已经无法继续优化。
改进模型
在刚刚训练过程的第 5 步提到了改进模型,模型的优化可以从三个方面来进行:数据、算法和模型。
数据
首先,大量的高质量训练数据,是提高模型质量的最有效手段。但是往往数据是很有限的。
那么在有限的数据上怎样来尽量提高质量呢?
- 对数据进行归一化(Normalization,又译作正规化、标准化)等操作。
- 采用 Bootstrap 等采样方法处理有限的训练 / 测试数据,以达到更好的运算效果。
- 根据业务进行特征选取:从业务角度区分输入数据包含的特征,并理解这些特征对结果的贡献。
调参(算法)
我们训练模型的目的就是为了得到模型对应公式中的若干参数。这些参数是训练过程的输出,并不需要我们来调。
除了这些参数外,还有一类被称为超参数的参数,例如用梯度下降方法学习 LR 模型时的步长(Alpha),用 BFGS 方法学习 Linear-chain CRF 时的权重(w)等。
超参数是需要模型训练者自己来设置和调整的。
通过调参方法来减轻调参工作量,例如 Grid Search 等。
调参没有固定的规律可以遵循,往往有很多运气成分,但靠瞎猜基本不可能得出好的结果,还是要按一定的方法来做。
模型类型选择
现在有很多深度学习的模型逐步投入使用,不过一般情况下 DL(Deep Learning)模型(CNN、DNN、RNN、LSTM 等等)对训练数据的需求比统计学习模型高至少一个量级,数据量不够,DL 的效果可能更差。
而且 DL 模型的训练时间较长,可解释性极弱,一旦出现问题很难 Debug。
所以选模型不可迷信 Cutting-edge Technology(前沿技术)。选对的,别选贵的。
4. 模型的质量和评判指标
当我们训练出了一个模型以后,为了确定它的质量,我们可以用一些知道预期预测结果的数据来对其进行预测,把实际的预测结果和实际结果进行对比,以此来评判模型的优劣。
由此,我们需要一些评价指标来衡量实际预测结果和预期结果的相似程度。
分类模型评判指标: Precision、Recall 和 F1Score
对于分类而言,最简单也是最常见的验证指标:精准率(Precision)和召回率(Recall),为了综合这两个指标并得出量化结果,又发明了 F1Score。
![](https://img.haomeiwen.com/i1210478/8e3bdcf9c53a469e.jpg)
- 精准率:Precision=TP/(TP+FP),即在所有被预测为 Class_A 的测试数据中,预测正确的比率。
- 召回率:Recall=TP/(TP+FN),即在所有实际为 Class_A 的测试数据中,预测正确的比率。
- F1Score = 2*(Precision * Recall)/(Precision + Recall)
假设一个模型总共可以分 10 个类,那么对于每一个类都有一套独立的 P、R、F1Score 的值。衡量模型整体质量,要综合看所有 10 套指标,而不是只看一套。
这几个指标也可以用于 seq2seq 识别模型的评价。
任意的评价指标,都同时指向一个模型和一个数据集,两者缺一不可。
模型的偏差和过拟合
对训练集样本拟合程度的角度,可以分为两类:欠拟合(Underfitting)和过拟合 (Overfitting)。
如何严格定义欠拟合还是过拟合,还要涉及几个概念:bias、error 和 variance。
![](https://img.haomeiwen.com/i1210478/d9113de29ee3a538.jpg)
- 如果一个模型,在训练集上的预测结果就不佳,指标偏低,那一般是欠拟合的问题。
- 如果在训练集上指标很好,而在验证/测试集上指标偏低,则很可能是过拟合问题。
- 甚至有时候,在训练集和验证/测试集上效果都不错,一到真实环境却预测误差较大,这种情况也是过拟合。
无论哪种问题,增大训练数据量都可能会有所帮助
5. 最常用的优化算法 —— 梯度下降法
每一个机器学习的模型都有一个目标函数,机器学习的目的就是最小化目标函数。其实就是在其自变量取值范围内,找到使得因变量最小的那个自变量取值点。
凸函数
函数必须有最小值才可能是一个目标函数,像 y=x
就没有最小值。而凸函数保证了其有最小值。
![](https://img.haomeiwen.com/i1210478/874b4bd884d0cfa2.jpg)
![](https://img.haomeiwen.com/i1210478/00aa0eb88ed6c041.jpg)
直接应用任何优化算法之前,应该先确定它是凸函数。几个经典机器学习模型的目标函数都是凸函数,所以可以放心使用。
梯度下降法
学习的目标就是最小化目标函数的取值,而目标函数又是凸函数,那么学习的目标自然转化成了寻找某个凸函数的最小值。
假设我们的目标函数是一个一元凸函数,我们可以采用如下步骤来获得其最小值:
![](https://img.haomeiwen.com/i1210478/a5e1d2a1fc3142a7.jpg)
- 随机取一个自变量的值
x0
- 对应该自变量算出对应点的因变量值:
f(x0)
- 计算
f(x0)
处目标函数f(x)
的导数 - 从
f(x0)
开始,沿着该处目标函数导数的反方向,按一个指定的步长α
向前 “走一步”,走到的位置对应自变量取值为x1
。换言之:
|f(x_0)-f(x_1)|/α=f'(x_0)
也就是 f(x)
在 x0
处的斜率
- 继续重复 2 到 4,直至退出迭代(达到指定迭代次数,或
f(x)
近似收敛到最优解)。
直观的看起来,就像在 J(w)
曲线上任取一点,放上一个没有体积的 “小球”,然后让这个小球沿着该处曲线的切线方向 “跨步”,每一步的步长就是 α
,一直跨到最低点位置。
梯度下降的超参数
上面讲了梯度下降法,其中的 α
,又叫做步长,它决定了为了找到最小值点而尝试在目标函数上前进的步伐到底走多大。
步长是算法自己学习不出来的,它必须由外界指定。
这种算法不能学习,需要人为设定的参数,就叫做超参数。
这个 α
参数设置的大小如果不合适,很可能导致最终无法找到最小值点。
![](https://img.haomeiwen.com/i1210478/04910db89d514a10.jpg)
为了平衡大小步伐的优缺点,也可以在一开始的时候先大步走,当所到达点斜率逐渐下降,函数梯度下降的趋势越来越缓和以后,逐步调整,缩小步伐:
![](https://img.haomeiwen.com/i1210478/64a5aaf11d654cec.gif)
梯度下降的难点
如果目标函数有多个极小值点(多个向下的 “弯儿”),那么如果开始位置不妥,很可能导致最终是走到了一个局部极小值就无法前进了。比如下图的 Postion1 和 Position2。
![](https://img.haomeiwen.com/i1210478/214098ea37f24392.jpg)
这种情况是梯度下降算法的一大挑战。
如果目标函数不能确定只有一个极小值,而获得的模型结果又不令人满意时,就该考虑是否是在学习的过程中,优化算法进入了局部而非全局最小值。
这种情况下,可以尝试几个不同的起始点。甚至尝试一下大步长,说不定反而能够跨出局部最小值点所在的凸域。