You are on page 1of 41

序言

机器学习的基本流程
基本概念

误差函数

最小二乘法
梯度下降
数据划分与评价

划分策略
小结
超参数
特征

特征搜索
信息熵
信息增益
特征权重
过拟合
小结
机器学习的分类

分类性能衡量
PR 曲线
常见应用

决策树
支持向量机

超平面
支持向量与间隔
核函数
贝叶斯分类

后验概率
贝叶斯公式
贝叶斯分类算法
聚类
原型聚类
密度聚类
层次聚类
强化学习

单步收益最大化
马尔科夫链
蒙特卡洛方法
神经网络

前馈神经网络
误差逆传播
图像识别的概念
卷积
基本流程
激活图与池化
全连接
小结
尾声

参考

本文由 我的分享 PPT 整理而来,由于图片的表达能力更强,因此强烈建议结合


PPT 进行阅读。

这是我根据自己短短两周的学习总结出来的文章,优点非常明显:我也是初学者,因此更能理解初学
者的困惑,更能站在初学者的角度解释问题。但缺点也很明显,并不保证内容 100% 的准确,欢迎交
流讨论。文章尽量不提公式,但出于表达的需要,难免会有一些。个人认为只要有简单的数学基础,
都能读懂。如果实在读不懂,也不会影响阅读文章。

序言

自从电脑诞生之日起,人类对人工智能的追求就没有停止过。电影里那种既有强大计算能力,又有人
类情感的人工智能一般被称为强人工智能,遗憾的是当下并没有能力实现强人工智能,也就是基于统
计学得出结论,只不过这个结论比较合理,看起来像人类的思考结果一样,这也被称为弱人工智能。

机器学习是一种实现人工智能的方法, 本文的目的就是帮助毫无机器学习基础的读者了解最基本的
名词和概念,掌握最基本的算法及其原理,以及最重要的——破除对机器学习的迷信,防止被忽悠。

机器学习的基本流程

机器学习是一类算法的统称,比如这两年很火的深度学习(深度神经网络),以及很早就出现的决策
树、贝叶斯分类等。这类算法普遍具有一个特征,即:仿照人类的学习过程。

再厉害的大神,一开始也是啥都不会的小白。经过做题,核对答案,改正错误,最后才能学会一个知
识点。而考试则是对知识点掌握程度的考察,在考场上,学生根据已经掌握的知识回答题目。如果平
时学得好,最后就能考满分。

机器学习的过程也是类似的,首先需要收集大量的数据给机器训练,这个过程对应人类做题学知识的
过程,训练以后得到的结果叫做“模型”,对应到人类世界就是学生掌握的知识。当接收到新的数据
时,这个数据会输入到模型中,从而预测出结果。

可以看到,从历史数据到训练出模型,以及利用模型预测新数据,这两件事是互相独立的。因此一种
很常见的做法是服务端训练模型,下发并存储在客户端,当有新的数据时直接应用。这样做的好处是
避免了上行数据的网络耗时,不过需要注意下模型在客户的占用的内存、增加的包大小,耗电量,以
及最重要的:“模型的安全性”,模型是精心学习后的知识,如果泄露出去,就像是所有人都能和学神一
样考试得满分。

在接下来的文章里,我会简单介绍模型的训练和应用的过程,作为读者的你也会理解为什么模型训练
可以放在服务端,而一台小小的手机就可以应用模型。

基本概念

我们先从一个老生常谈的例子开始,假设房子面积和价格的关系如下表所示:

面积(平米) 价格(万)

10 120

20 180

30 320

40 380

50 510
60 590

70 ???

80 800

那么 70 平的房子大约是多少钱呢?作为人类,我们很容易发现价格在面积的十倍上下浮动,所以最
合理的预测是 70 平的房子价格大约是 700。同理,100 平的价格大约是 1000W……

如果我们写一个 C 语言函数,输入参数 n 表示面积,输出 n * 10 表示价格,一个最简单的人工智


能程序就写完了。它满足我们之前的定义: 基于统计学得出符合人类逻辑的结论,上面的表格就是数
据, n * 10 是我们的模型,70 平是新的输入,700W 则是基于模型的预测结果。

这里先抛出几个问题供读者思考,问题虽然简单,但问题背后的逻辑却一点都不简单。

1. 凭什么就预测价格是 700W 呢,如果我就是喜欢抬杠,我偏说价格是 750W 你们服不服?


2. 为什么我们从直觉上就觉得房价和面积是线性的关系,为什么不去猜一个二次函数?
3. 怎么证明这个预测结果是合理的?

误差函数

假设我们有多条数据,第 条数据记为 ,其中 是输入数据,它可以是单个变量,比如上


面例子中的面积,也可以是由一组变量构成的向量。 则是对数据的标记,比如上面例子中的房
价。

我们的模型其实是一个函数 ,对于每一个输入 ,都会产出一个预测结果 。虽然我们希


望预测结果和真实的标记尽可能一致,也就是 ,但终究还是存在误差的,为了量化这个
误差,假设有如下函数:

它其实就是对真实值和预测值的平方和求平均数,我们称之为误差函数。误差函数不是随便写的,比
如直接对误差求和就不行,因为正负误差会互相抵消。我们暂时不考虑这个函数是怎么得出的,因为
它涉及到统计学的模型,不过常用的误差函数就那么多,可以枚举出来,并不是无穷无尽的,不同场
景下会选择不同的误差函数,主要看它能不能合理的评价误差。

我们假设房价和面积成正比,也就是说误差函数可以具体化为:
现在公式看上去比较复杂了,有很多变量,一会儿 、 ,一会儿 , ,但理解公式最重要的一点就
是搞清哪些是变量,哪些是已知量。比如上面式子中只有 和 是变量,其它字母都是已有的数据,
比如 m 的值是 7, 的值都列在表中。

现在误差已经被精确地量化了,我们只要找到一组 让上面的公式取得最小值就可以了。这种寻
找一条曲线去尽量靠近各个点的做法叫做 拟合。最简单的方式就是分别对 和 求导,导数为 0 的
地方会取得极值。但这种做法并不具备普适性,对于复杂的模型,我们可以考虑一些最小二乘法和梯
度下降法。

最小二乘法

我们假设有 组数据,每组数据都有 个维度,每个维度对应一个参数 ,以及一个常数 ,因此


预测结果可以表达为:

矩阵 的最后一列都是 1,这样的好处是和矩阵 相乘时参数 能起作用。上面式子的结果是一个


列的的矩阵,每一列都是一个预测值,套用一下之前的误差函数,要让误差最小,也就是要使得
这个式子取最小值:

对矩阵 求导可以得到导数为零的值为:

虽然公式很简单,但是矩阵求逆并不简单,它的复杂度是 ,比较难以接受。这是因为最小二
乘法本质上还是一种数学方法,利用公式得出的结论或许很优雅,但并不一定利于计算。

梯度下降

考虑一座山的高度是位置的函数,即 ,找到一组 使得 取最小值,实际上就是找


到山谷处的坐标。为了简化计算量,我们希望能尽快的找到这个位置,否则把所有的 可能的
取值都遍历一遍,肯定能找到最小值,但这种做法毫无意义。假设我们站在山顶上,尽快找到山谷实
际上就要求我们以最快的方式下山,我们都知道,选择最陡峭的路下山是最快的,如图所示:
陡峭是生活中对事物的形容,而数学中对应的概念则是梯度。梯度是函数最陡峭的方向,所以沿着负
梯度的方向下降就是最快的。因此只要设好步长,每次沿着负梯度方向前进这个步长,再重新计算梯
度、重新移动即可。经过一段时间的移动,就会走到山谷,如上图中黑色折线所示。

梯度下降的效果受到很多因素的影响,比如步长太小时下降速度太慢,补偿太大又会导致不够精确,
错过最小值。再比如出发点的选择对最终结果也会有影响,比如上图中如果从右侧最高峰开始下降,
极大概率会走到右侧淡蓝色的谷底。这是局部最小值,却不是全剧最小值。因此梯度下降在实际应用
中会根据问题的特点略作一些调整,但总体思路是不变的。

数据划分与评价

就像学生既要学习,也要考试一样,在实际机器学习的过程中,不仅需要通过学习大量数据来得出模
型,还需要一些数据来检验模型的好坏。我们把用于训练的那部分数据统称为训练集,用来验证的那
部分数据则称为测试集。

有些无良老师在自己的辅导班里泄漏考试题目,导致交钱上过辅导班的学生考试成绩好,没上辅导班
的学生成绩相对不好,正好成为老师威逼利诱他们上辅导班的理由。这种情况在机器学习中要避免发
生,因此一般来说,一条数据不能既用来训练模型,又用来检测模型,否则根据这个数据训练出来的
模型,必然在验证时取得比较好的成绩。

划分策略

一种常见的划分思路就是把原始数据按照一定的比例划分为训练集和测试集。比如一共有 100 条数
据,80条用于训练,20 条用于验证。注意训练集不能过大,否则测试集太小会导致结果不准确。就
像一个考卷一般都是 100 分一样,如果就一条选择题,偶然性就会非常高。但训练集也不能太小,否
则模型并不一定训练充分,就像一个学生不能只做十道题就去期末考试一样。这个比例一般选择在
75% - 80% 会比较合适。

另一种思路是把数据均匀的分成 份,每次都用 份训练,剩下的 1 份测试。这样做的好处是


在数据不够的情况下提高了利用率。

还有一种思路是把每条数据想象成一个球,每次都有放回的取出一条数据作为测试集,有多少条数据
就重复多少次。这样有的数据会被选中多次,也有的数据一次都不被选中,这也是一种比较公平、随
机的方法。

小结

至此,我们解答了第一个问题,为什么 700W 这个预测更合理,这是因为我们根据误差函数的定义,


找到了使误差函数取最小值的参数。基于这些参数得出了具体的模型,并将这个模型应用于新的数据
上,得出了合理的结论。而模型的好坏则是通过训练集来验证的,避免了自问自答的不准确性。

超参数

模型由模型中的参数决定,一旦参数都确定下来,模型也就确定了。而确定参数的过程就是学习的过
程,也是把误差函数最小化的过程。这个过程通常也有参数控制,比如梯度下降法中的步长和初始
值。对于不同的步长和初始值,得到的模型肯定是不一样的。所以像步长和初始值这样的参数,其实
是最终参数的参数,我们叫它超参数。

对于一个复杂的模型来说,参数的个数可以非常多。少的有成千上万,像一些大公司的核心产品,参
数上亿也不是什么稀奇的事。但超参数的个数一定是有限的,因为超参数往往意味着人工调整。

理解了超参数,就可以回答第二个问题,为什么模型是线性的。实际上,线性模型可以是基于常识得
出的,也可以是学习出来的。我们完全可以假设房价和面积是一个 次多项式的关系,这样就需要
多引入一些参数。只要数据足够,利用梯度下降总是可以学习出各个参数的值的。有极大的概率会发
现高次项的系数都是 0,只有一次项系数和常数项不为零,这样模型就退化成了线性的。

特征

如果某个变量会影响问题的结果,我们就把这个变量称为问题的一个特征。比如对于房价来说,面积
显然就是一个特征。对于彩票的开奖结果来说,日期肯定不是特征。

在解决一个现实中的机器学习问题时,肯定不像通过面积预测房价那么简单。很多时候第一步要做的
就是从纷繁复杂的因素中找到问题的特征。这涉及到两个步骤,一是要确定特征的提取方式,而是判
断某个因素到底有没有资格算得上特征。

在之前介绍梯度下降算法时,我们用函数的梯度来刻画陡峭程度,这种用数学公式来描述现实特性的
做法在机器学习中非常常见,也非常重要。比如本节就会介绍如何使用简单优雅的函数来判断一个因
素算不算特征,甚至是有多算特征。

特征搜索

提取特征时有几种常见的思路:

1. 前向搜索:指的是从诸多因素中提取特征
2. 后向搜索:指的是从诸多因素中排除特征
3. 双向搜索:混合了前两者策略,既提取大概率是特征的因素,也排除小概率是特征的因素

需要注意的是,无论哪种策略都是贪心的,也就是说只能找到局部最优而不是全局最优。比如我们首
先提取特征 ,接下来发现 比 更像是特征。我们当然会选择 ,但也许 才是真正的
全局最优特征。但没有开启上帝视角的我们,在选择第二个特征时,是不可能知道这一点的。

信息熵

在判断一个因素是不是特征之前,我们需要掌握 信息熵 这个背景知识。我们都知道熵是用来表示混


乱程度的,信息熵表示的就是信息的混乱程度。对于某个集合,不同元素出现的次数各不一样,它的
信息熵定义如下:

这个公式的含义是计算每个元素出现的概率 ,和概率的倒数的对数,然后对所有的乘积求和。这
样解释依然不够直观,我们举个例子来看。

假设一袋球里面有 5 个红球,5 个黄球,那它们出现的概率都是 0.5,根据公式,这袋球的信息熵是


,刚好是 。

假设另一袋球也有十个,不过是 9 个红球和 1 个黄球。根据公式,这袋球的信息熵是


。我们知道 2 的四次方是 16,所以 ,以及
,所以 ,简单的计算就会发现这个式子的结果小于

可见九个红球一个黄球的信息熵更小。实际上,集合内元素分布得越平均,集合的信息熵就越大;元
素分布越单一,信息熵就越小,如果集合内元素完全相同,则信息熵为 0。
信息增益

当一个集合拆成若干个子集后,子集的信息熵的平均是可能是降低的。这就像我们收拾物品,都会分
门别类的摆放,摆放好以后房间就变得整齐了,这实际上就是利用划分子集来降低信息熵。

在某种划分方式下,集合的信息熵和子集的平均信息熵之间的差值被称为:这种划分方式下的信息增
益,也就是这种划分方式能把信息熵降低多少,用公式来表达就是:

这里的 表示集合 在划分方式 下的信息增益, 表示集合 中的元素个数,因此减号


右边的式子其实就是子集信息熵的加权平均数。

显然信息增益越大的划分方式越好,如果以某个因素为划分方式带来的信息增益最大,那么这个因素
最有可能是一个特征。

特征权重

我们都知道,如果同类的数据都具备某个特点,这类数据的特征权重就非常高。比如大房子都贵,小
房子都便宜,那么 面积 这个特征的权重就高。但晴天买彩票可能中奖,雨天买彩票也会中奖,因此
天气就是彩票中奖的一个权重非常小的特征,因为它无法有效的区分是否中奖。因此,如果不同类的
数据都具备某个特点,这类数据的特征权重就非常低。

我们假设 是第 组数据的第 个特征, 表示和 最近的某个同类数据。如果 和 的


第 个特征相同, 函数取 1,否则取 0。类似的, 表示和 最近的某个不同
类数据。基于上述定义,第 个特征的权重可以表达为

可以看到,如果同类数据的特征类似,减号前面的表达式值就大,特征权重就高。如果不同类数据的
特征都类似,减号后面的表达式值就大,特征权重就低。计算出特征权重后,可以划一个阈值,所有
高于阈值的特征都采纳,或者所有低于阈值的特征都抛弃,亦或者只采纳权重最高的前 个特征。

过拟合

如果之前预测房价时,我们用的数据不是面积,而是买房者的年龄,还能不能得出模型呢?从直觉上
讲,肯定不行,因为常识告诉我们房价和买房年龄没有关系,有年轻的富二代一掷千金买豪宅别墅,
也有辛苦了一辈子的无产阶级掏出毕生积蓄买一套蜗居。对应到图形上来说,如果横轴换成买房者年
龄,纵轴还是房价,数据所对应的点应该是均匀的分布在平面内的,不会成一条明显的直线。

但如果我们用机器学习的算法去学习,必然会得到答案,这是因为用大量的数据去拟合一条低维曲线
非常容易。虽然均匀分布的点无法用直线去拟合,但逐渐增加维度,一次的直线不行就用二次的抛物
线,抛物线不行就用三次、四次……函数,随着维度的增加,曲线会越来越曲折、不平滑,但对数据
的拟合效果是在增加的。如下图最右所示:

但这种拟合是没有意义的,因为尽管它对训练数据的拟合效果非常好,如果我们用
switch ... case 去写甚至能做到 100% 的准确率,但在测试集的表现是非常糟糕的,因为它完全没
有学习到影响房价的特征。这样的拟合被称为过拟合。

需要注意的是,过拟合不仅仅在选择了错误的特征时会出现,正确的特征如果不对学习过程做一些控
制和干预,也会过拟合。比如我们用白色的天鹅图片去训练模型,最终模型很可能认为天鹅都是白
的,导致不认识黑色的天鹅。总的来说,过拟合通常由于学习到与问题无关的噪音特征导致。

小结

为了解释开篇提到的三个问题,我们介绍了很多概念和公式。至此,这三个问题应该已经有比较明确
的概念了,如果下面的解释你觉得难以理解,恐怕得回去找到对应的章节再阅读一遍了,因为这些都
是最基本的概念。

1. 凭什么就预测价格是 700W 呢,如果我就是喜欢抬杠,我偏说价格是 750W 你们服不服?


首先,我们让误差函数最小化,得出了模型,并且利用模型计算出了 70 平这个新数据的预测结
果,而且这个模型的优劣可以用训练集数据来验证。这样得出的结论显然比随口报的数更准确,
更有说服力。

2. 为什么我们从直觉上就觉得房价和面积是线性的关系,为什么不去猜一个二次函数?
尽管是从直觉上猜测,但也可以假设不是线性的关系,只需要把模型的参数设计的复杂一些就可
以。最终都会学习出相似的结果。

3. 怎么证明这个预测结果是合理的?
我们从正反两方面解释了结果的合理性。首先通过信息增益和特征权重的概念证明了面积是房价
的特征,只要找到问题的特征就可以基于统计学去学习。其次,过拟合的例子解释了为什么对不
是特征的因素进行学习是没有意义的。

因此,如果这篇文章只能让你记住一句话,我希望是下面这句:

机器学习只能从数据中提取客观存在的规律,不能凭空创造规律。

这就是为什么机器学习可以预测房价,但不能用历史开奖结果去预测下一次中奖号码。

机器学习的分类

在通过面积预测房价这个例子中,我们把房价称为标记,它类似于学生做题时的参考答案。标记用来
和预测结果做比对,从而驱使我们优化模型。但并不是所有机器学习都需要标记,比如我给出一千篇
文章,需要对它们做分类。计算机可能会把他们分为体育类、财经类、时政类……,但这并不要求计
算机知道体育、财经的具体含义,它只需要知道某些文章是属于同一类的即可,至于这个类型是否具
备人类可理解的含义,这并不重要。

如果训练数据是有标记的,我们把对它的学习称为 有监督学习,反之则是 无监督学习。就像学生做


题需要比对参考答案一样,无监督学习 一般比 有监督学习更难一些。无监督学习主要涉及聚类算
法,在后面的章节中我会简单介绍一些。

还是在预测房价这个例子中,我们用连续的曲线去拟合离散的点,这种做法叫做回归。监督学习还有
一类常见的问题是分类问题,比如给一些西瓜的数据和标记,问一个青绿色、薄皮、敲击声音响的西
瓜是不是好瓜?

可见如果预测结果是连续的,这就是回归问题;如果预测结果是离散的,这就是分类问题,分类问题
和回归问题一般是可以互相转化的, 比如求某个西瓜是好瓜的比例,这就成了回归问题。

回归模型的好坏可以用误差函数来评价,分类问题也有类似的评价方式,比较常用的是查全率 和 查
准率 的概念。

分类性能衡量

我们简化一下问题的模型,假设某个数据需要预测真假。当然,它实际上一定是真的或者假的。这样
就会出现四种可能的情况:

1. 模型预测是真的,实际上也是真的,记为 A
2. 模型预测是假的,实际上确是真的,记为 B
3. 模型预测是真的,实际上确是假的,记为 C
4. 模型预测是假的,实际上也是假的,记为 D

在实际预测时,会出现两类问题。比如明明某个数据是真的,但被模型预测成了假的,这对应第 2 种
情况。为了衡量我们的模型查找有多全面,也就是所有真的结果中有多少被找出来了,可以定义查全
率 R(Recall):

还有时候,明明某个数据是假的,但被模型预测成了真的,这对应第 3 种情况。为了衡量我们的模型
正确率有多高,也就是找出来的结果中有多少是正确的,可以定义查准率 P(Percision):

PR 曲线

一般来说,查全率和查准率是互相矛盾的,对一者的提高往往意味着降低另外一者。这很好理解,俗
话说做得多错的多,啥都不做就肯定不会犯错。为了衡量某个模型的好坏,我们需要综合考虑查全率
和查准率,于是就有了 PR 图:
图中的 A、B、C 三条曲线分别对应了三种模型,一般来说如果某个模型(比如图中的 A)的 PR 曲线
完全包围了另一个模型(比如图中的 C)的 PR 曲线,我们就称这个模型(A)好于另一个模型
(C)。这是因为在查全率相同的情况下 A 的查准率高于 C,在查准率相同的情况下 A 的查全率也高
于 C。

但模型 A 和 B 就属于各有千秋,不是很容易比较了。这时候我们可以选择两种最简单的策略。一种
是计算曲线和 XY 轴围成的区域的面积(AUC:Area Under Curve),也就是对 PR 曲线求积分,谁的
积分大谁就更优。另一种策略是计算平衡点的坐标,平衡点是指 的点,也就是 这条直
线和 PR 曲线的交点,交点更靠外的模型被认为更优秀。

当然,在实际工作中,查全率和查准率的权重并不总是相同的。比如推荐系统,更看重查准率,也就
是说推荐得东西少了不要紧,但一定要是用户感兴趣的,否则体验就很差。但对于图像识别逃犯的系
统来说,查准率并不重要,因为可以人工排查,但漏过了犯罪分子就是不可接受的。所以我们还会基
于查全率和查准率,定义更复杂的公式来衡量模型的好坏。
常见应用

对机器学习名词和概念的介绍就到此为止了,为了避免纸上谈兵,也为了让读者对实际的机器学习过
程有更直接的感受,下面介绍一些常见的机器学习算法及其应用场景。

决策树

作为有着二十多年吃瓜经验的专业吃瓜群众,假设我们去买西瓜。可能上来就先敲一敲,声音响亮的
是好瓜的概率比较大, 然后再看颜色,最后看形状。这种挑选西瓜的过程可以用决策树来表示,根
节点是对敲击声音的判断,第二层判断颜色,第三层看形状,最后得到多个叶子节点,标记了瓜的好
坏。

但这种做法有两个小问题:

1. 凭什么先听敲击声音而不是看颜色或者形状?
2. 上述决策树很简单,但如果影响西瓜好坏的因素比较多,叶子节点的数量是以指数形式增加的。
而且我们上面的决策树其实是枚举了所有的可能性,只是一种 switch ... case ,貌似和机器学
习没啥关系。

第一个问题很好回答,从直觉上讲,敲击声能更好、更有效的判断西瓜的好坏。这种直觉用数学公式
来衡量就是上文提到过的信息增益,往往决策树越上层的分类,带来的信息增益越高。

随着决策树的向下延伸,信息增益减少意味着区分度不是很高,此时我们可以考虑用剪枝来简化树的
结构,减少复杂度,同时还能避免过拟合。剪枝策略分为两种,一种叫预剪枝,另一种则是后剪枝。

假设西瓜已经分为了敲击声响亮和沉闷两种类型,我们接着对敲击声响亮的西瓜根据颜色来分类。首
先可以假设敲击声响亮的西瓜都是好瓜,当然,这种假设肯定是不准确的,经过测试集的验证可以得
出一个准确率 。接下来我们根据颜色来把西瓜分为若干类并给每类假设一个结果,好瓜或者坏
瓜。这种假设当然也是不完全准确的,甚至可能比之前更不准确。我们用测试集再验证一次,得出概
率 ,如果细分后得出的准确率 并不高于不细分时的概率 ,就说明细分的意义不大,分支可
以被减掉。或者准确的说,没必要生成。这就是预剪枝。

我们还可以先根据已有数据生成决策树,然后自底部向顶部遍历,对比每一颗子树减掉前后的概率。
如果概率能提高,就进行剪枝。这就是后剪枝。

如果剪枝前后的概率一致,预剪枝更倾向于剪枝,而后剪枝更倾向于保留。所以预剪枝一般比较快,
剪枝结果比较简单,但容易欠拟合,缺少分支条件。而后剪枝则恰好相反,速度慢,结果比较复杂全
面,容易过拟合。

支持向量机

考虑下图中用正负号标记的两组数据,如果要选择一条直线把他们划分开

显然虚线范围内的任何一条线都满足要求。但这两条虚线并不是最好的划分方式,因为他们的泛化能
力很弱,或者说鲁棒性不够好,也许来了一个新的数据就不能正确划分了。

为了描述划分方式的泛化能力,我们计算样本到直线的距离,并想办法让距离最大。因为距离越大,
意味着容错能力越强,正确处理新数据的几率也就越高。最好的划分方式如下图所示:
超平面

我们把这条直线称为二维数据的超平面。对于二维的数据来说,它的超平面是一维的直线。三维空间
里的超平面则是二维的平面,拓展到 维空间,它的超平面是一个 维的空间,把原来 维的
空间刚好分成两部分。

支持向量与间隔

上图中虽然两类数据各有很多个,但是绝大多数远离直线的数据并不会对直线的选择产生任何影响。
只有少数几个靠近直线的数据才会起作用,比如图中标红的点,我们把它叫做 支持向量

支持向量到超平面的距离被称为间隔,或者严格来说,叫硬间隔,硬间隔一个很大的问题是对噪声特
别敏感。试想一下,假设我们新增一条数据,位置靠近白色实线,此时重新计算超平面,位置一定会
发生较大幅度的变化。
但实际上,偶尔一两条数据位置比较奇怪的数据可以被当做噪声忽略掉,不需要影响到最终的结果。
如果我们允许一定比例的数据落在间隔以内,这样的间隔就被称为 软间隔。

核函数

超平面希望能够把数据所在的空间一分为二,但有时候是做不到的。比如异或,它的数据分布就无法
用一条直线来分割。此时我们可以考虑找一种映射关系,把低维不可分的数据转换为高维可分的数
据,如下图所示:

这种转化方式被称为 核函数(严格意义上的核函数并不是映射关系,而是经过处理和计算后的某个
表达式,但这并不重要)。

贝叶斯分类

如果说决策树和支持向量机还比较抽象,那么希望读者能认真理解贝叶斯分类算法,因为它既通俗易
懂,也容易实现。

后验概率

很多教程上都会提到后验概率这个名词,和它相对的就是先验概率。先验概率非常好理解,比如我扔
出一个色子,六点朝上的概率就是 ,有时候天气预报说明天下雨的概率是 ,这些都是先验概
率。

先验概率指的是根据经验或者已有的数据观察出的概率,而后验概率则是指当某件事发生后,求可能
影响结果的某个因素的发生概率。比如袋子里有 3 个红球和 2 个白球,每次摸出一个球并且不放回。
已知第二次摸到的是红球,请问第一次也是红球的概率。这就是后验概率。

我们首先感性的认识一下后验概率的意义,也就是为什么第二次拿出求的颜色会影响第一次拿出红球
的概率呢?实际上,第一次取出的球有 5 种可能,每一种情况下第二次取球又有 4 种可能,所以样本
容量是 20。如果只考虑第一次取出红球的概率,那么第二次取出的颜色不重要,也就是说第一次取
出的各种可能,权重是相同的,因此取出红球的概率是 。但如果限制了第二次取出的是红球,样本
空间的大小就不是 20 了,简单的计算一下发现满足要求的样本一共有 12 个,其中六个样本第一次
取出的是红球,因此概率变成了 。

好吧,我知道你已经晕了,这很正常。举这个例子是为了说明:后验概率既不好理解,也不好计算,
这就更加体现出贝叶斯公式的价值了。

贝叶斯公式

我们知道 表示在事件 B 发生的前提下,事件 A 发生的概率,以及 表示事件 A 和 B


同时发生的概率,所以以下公式是显然的:

把中间的 去掉,然后两边同时除以 ,下面这个式子也是显然的:

这就是著名的 贝叶斯公式了,公式很简单,但我们注意到 和 互为先后验概率。因


此贝叶斯公式告诉我们,只要知道 和 ,计算后验概率就可以轻松的转化成计算先验概
率。

考虑一个实际问题:假设一种癌症,得了这个癌症的人被检测出为阳性的几率为 ,未得这种癌
症的人被检测出阴性的几率为 ,而人群中得这种癌症的几率为 ,一个人被检测出阳性,问
这个人得癌症的几率为多少?

要计算阳性得癌率,可以通过它的先验概率,也就是得癌阳性率计算出,这个数据已经有了,是
,此外我们还需要知道人群中的得癌率和阳性率。前者也是已知的,阳性率可以通过得癌阳性率
和未得癌阳性率累加得出:

阳性 癌 癌
癌 阳性
阳性

也就说即使检查结果是阳性,也只有不到 的概率真的是癌症,大可不必担心。
贝叶斯分类算法

还是从简单的问题开始说,假设街上迎面走来一个黑人(无歧视,仅为举例),请问你觉得他是亚洲
人、欧洲人还是非洲人呢?我想正常人都会觉得他是非洲人,因为他是非洲人的概率大。

用贝叶斯公式可以很简单的计算他是非洲人的几率,因为 非洲 黑人 这个后验概率不好算,但
黑人 非洲 这个先验概率是可以统计出结果的。因此我们得到公式:

某洲 黑人 某洲
某洲 黑人
黑人

从之前的题目中我们知道,分母的计算有时候比较麻烦。但贝叶斯分类并不要求计算分母,因为我们
只要找到概率最大的那个洲即可,大家的分母都是一致的,所以只要比较分子即可。在上述公式中,
分子的两个概率都是可以通过统计学计算的,因此不存在任何难度。

这里的肤色是一个特征,而且是一维的特征。在实际问题中,特征可能是多维的,比如垃圾邮件的识
别,关键词如果只选一个,很容易误判。因此我们通常选择出现频率最高的 个词语来判断邮件是
否是垃圾邮件,我们用 来表示这些词语

垃圾邮件 垃圾邮件
垃圾邮件

显然 垃圾邮件 和 都非常容易计算, 垃圾邮件 也只要


展开就可以:

垃圾邮件 垃圾邮件 垃圾邮件 垃圾邮件

至此,我们完成了看似高大上的垃圾邮件识别,用贝叶斯分类去识别垃圾邮件,简单到不可思议。

聚类

聚类算法是一种非监督学习,我们只需要根据 物以类聚 的思想,把数据正确的分类即可。

原型聚类

原型聚类主要是通过刻画数据的相似程度来分类,刻画相似程度的方式有很多种,这里只介绍最简单
的 k-平均算法。

假设有 n 个点需要进行分类,分成 类,这里为了演示,假设 ,策略是:


1. 首先随机找 个点作为初始锚点
2. 到某个锚点最近的所有点构成一个集合,共 个集合
3. 这 个集合各自的平均点作为新的锚点
4. 重复步骤 2、3,直到集合内的元素不再变化为止

用几张图片来演示上述过程,下图中列出了一些数据,红色的点是在第一轮中被随机选中作为锚点的
数据:

对于任何一个点,计算它到锚点的距离,并且选择距离最短的锚点,把它划到那一类中。划分方式如
下图所示:
在这三块区域内,我们计算所有点的平均横坐标和平均纵坐标,作为新的锚点。如下图所示,锚点的
位置发生了变动:
再重新计算到锚点的距离并分类,如图所示:

然后再更新锚点,重新分类,第三轮分类后的效果如图示:
后面还有第四次、第五次,过程就不赘述了。最终我们发现第五次的分类结果和第四次一致,说明可
以停止了,最终机器给出的分类方案如下图,如果由人类自己来画,可能不一定能得出这样的结论。
密度聚类

但并不是所有时候我们都要根据特征来分类。比如我们是空军指挥官,想把炸弹投到人口最密集的地
方,此时应该根据数据分布的密集度来分类,找到最密集、次密集的区域。密度聚类的效果如图所
示:

层次聚类

层次聚类的思想和归并算法很类似,一开始我们认为所有数据自成一类。然后计算两两之间的距离,
把距离最近的两个集合合并。在计算集合距离时,可以计算元素到元素的最近距离,最远距离和平均
距离。不同的距离计算方式会对应不同的应用场景。

聚类的过程如下图所示:
层次聚类的特点是,我们可以很轻松的把样本分成任意多类而不用重新计算。比如我想把上述样本分
成三类,只要找到第二高的横线(大概在图中 0.4 到 0.5 之间)。这个横线左右两棵子树,以及它右
侧的兄弟树,一共三棵树就构成了 3 类的划分。其他的划分方式如下图所示:
强化学习

假设现在有一个应届生在求职,他该选择大公司还是创业公司呢。在大公司,可能因为架构臃肿而损
失效率,丧失斗志,但也因此收获了稳定。在创业公司,上市以后期权变现是很大一笔收入,但公司
也随时有可能倒闭。作为创业者该如何选择呢,恐怕只有去了以后才知道。

这就是强化学习,它和监督学习有些类似,因为数据是有标记的。但不同点在于,强化学习问题中,
数据的标记是延迟的,一个人的职业选择到底是好是坏,恐怕要在三五年,甚至十年、二十年以后才
会有定论。也就是说数据的标记是延迟给出的。
单步收益最大化

我们先考虑最简单的情况。古人云:“今朝有酒今朝醉,明日愁来明日愁”。想要职业生涯收益最大化
很难计算, 但计算第一年的收益还是比较容易的,也就是我们只考虑当下的第一步,并让这一步的
收益最大化。

当然,对于个人来说,花有重开日,人无再少年,我们不可能反复重试自己的职业生涯。假设这么做
是可以的,或者干脆假设我们是学校的就业指导部门,每年都会迎来几百名应届生。一种朴素的思路
是先统计大公司的平均收益,,再统计创业公司的平均收益,然后鼓励学生选择收益较高的那一种。

我们把计算平均收益的过程叫做探索,把比较平均收益后选择收益较高的行为称作利用。因此,上述
思路实际上就是先探索,再利用的过程。很明显,探索和利用是互相矛盾的。探索是为了得出结论,
但它的收益不一定高。利用 是直接使用探索时得到的结论并且将收益最大化,但它依赖先前的探
索。

一种简单的算法叫 p-贪心 算法,即每次以 的概率探索, 的概率利用。随着探索次数的增


加,结论越来越完善,重心会逐渐向利用方向便宜,也就是说 是一个随时间的增加而减少的变量。

马尔科夫链

如果一系列状态中构成的链条中,某一个状态只取决于前 n 个状态(比如前一个),和再之前的状态
无关,这样的状态链就被称为马尔科夫链。比如下图就是一个马尔科夫链:
因为技术的成长是线性的,成为大牛有必经之路,不可能从一白状态一夜就顿悟。状态的转移之间有
一些比较关键的变量,比如动态(action),概率(possibility)和奖励(reward)。我们可以看到:

1. 在小白阶段,通过学习,有 0.69 的概率能成为初级工程师,假设奖励是 10


2. 如果学习不得法,技术不会有任何进步,奖励自然就是零,这个概率是 0.3
3. 如果学习过于投入,可能影响身体健康,导致猝死,这个奖励是负的,而且绝对值非常大,同时
猝死状态无法转移回别的状态。
4. 如果选择打篮球,不存在技术成长的可能性,奖励为 0
5. 打篮球对身体有好处,因此猝死的概率会非常低。

马尔科夫链中有可见的状态,比如上图中的技术水平。但隐藏在可见状态的背后,还有一些不可见的
操作会影响可见的状态,比如一个人是选择打篮球还是学习。我们称之为隐马尔科夫链。很多时候马
尔科夫链用于根据可见状态的改变来计算不可见动作的发生概率。

在强化学习中,如果模型中存在明确的马尔科夫链,我们就不再需要最大化单步收益,问题将转化成
动态规划。可惜绝大多数时候马尔科夫链并不存在,比如下围棋。

蒙特卡洛方法

当客观模型并不存在的时候,我们可以通过观察的方式来拟合概率。举个例子,假设我不知道扔色子
正面朝上的概率是 ,但这不重要,只要我扔一万次色子,发现有 5000 次正面朝上,依然可以推
测说正面朝上的概率是 。

举个实际的例子,我们想要计算圆周率 π,可以假设圆的直径为 2,再用一个边长为 2 的正方形把圆


刚好包住。这样圆和正方形的面积比为 。我们知道如果在正方形里随机选择一个点,落在圆形里的
概率也是这个面积比。

所以,简单的粗暴的方式就是模拟尽量多的点,假设它落在圆形里的概率是 ,那么 π 的近似值就是


我们把这一类方法叫做蒙特卡洛方法。注意,蒙特卡洛不是某种特定的方法,而是一类方法的统称。
这类方法的特点是用大量的观察去模拟真实的概率,精髓在于观察,或者准确的说如何观察。比如上
面估算 π 的例子中,重点在于采样的方式,必须是在正方形内平均采样,如果沿着对角线采样,计
算结果就不准了。

考虑一个更复杂些的例子,假设我们要计算一个积分:

如果 的积分很难算,但满足 ,上面的式子就变成了

我们只要在区间 内按照概率密度函数 对 取样,然后计算平均数就可以了。然后采样以


后的关键很简单,关键就在于如何采样:

在强化学习中,我们也可以借鉴蒙特卡洛方法的思想,找到合理的采样方式,通过观察总结出模型的
概率。

神经网络

最后我们来聊一聊最近很火的神经网络,它模拟了人类神经元的概念。在神经网络中,一个神经元的
结构如下图所示:
一个神经元接受 这 n 个输入,每个输入的权重依次为 ,它的阈值是 ,
因此输出是:

激活函数会对输出结果做一个映射,最简单的就是如果 ,映射为 1,否则映射为 0。不过这


样的激活函数不连续、不光滑,数学特性不太好,所以经常使用 Sigmoid 函数:

因此,这个神经元最终的输出实际上是:

前馈神经网络

单个神经网络能够线性的处理输入值,但无法进行类似异或这样的计算。通常我们会构造多层的神经
网络,每层神经元与下一层完全连接,并且没有同层或者跨层的连接。具备这样结构的网络也被称为
前馈神经网络。如下图所示:
下表则是 的取值和 的关系:

|x1|x2|y|
|--|--|--|
|1|1|0|
|1|0|1|
|0|1|1|
|0|0|0|

感兴趣的读者可以自行验证。

借助前馈神经网络,我们能够实现非线性的计算。否则无论神经网络有多深,都只能处理线性变换,
这样的神经网络并不具备太大的意义。

误差逆传播

一个实际的神经网络可能是比较复杂的,除了输入层和输出层,中间还有很多隐藏的计算层,我们称
之为隐层。在最初的回归问题中,我们通常会定义误差函数,并且调整参数让误差最小化。神经网络
也是类似的, 误差函数非常容易定义,假设输入第 组数据 ,我们知道统计输出层中 有
多个分量,只要计算每个分量的差值的平方,再求和即可:
上面的公式中, 表示第 组输入的误差, 表示 的第 个分量的计算值, 表示第 个分
量的真实值。

和回归问题不同的是,神经网络的参数是有多组的,每一层都有自己的权重和阈值,因此每次调整都
需要这些层同时调整,我们把这种从输出层开始调整参数,逐渐向后影响到输入层参数的调参过程,
称为误差逆传播。

图像识别的概念

神经元、前馈神经网络和误差逆传播的概念比较枯燥,但它们是阅读更深层次文章所必须具备的基础
知识。接下来,我会介绍一些比较轻松愉快的话题,也是本文最后一个知识点,利用卷积神经网络
(CNN)来处理图像识别问题。

在了解处理过程之前,我们首先要明确两个基本思想:

1. 图像识别并不关心某个东西客观上是什么,它只关心在人类的认知中,这个东西像什么。也就是
同一个客观存在的物体可以有多种表现形式,比如动物眼中的世界和人类不一样,但如果某个识
别算法,只能识别苍蝇视角中的物体,无论它准确率都高,都不会有人认可。
2. 即使是同一张画面,在不同的人看来,也会有不同的结果。很多视觉错觉图正是依赖这个原理,
因此最终学习出的算法还会和数据的标记有关。

好了,这两个思想其实也没有多重要,不理解也没关系。我们先假设有一张宠物的照片需要人类识
别,人是如何看出来图片里的动物是不是猫呢。

从直觉上讲, 我们会看猫头,猫身体,猫尾巴等等特征。而猫头又可以细分成眼睛、鼻子、嘴巴等
等。总的来说,图像识别的核心是特征的识别,这可以使用卷积操作来完成。

卷积

最初,卷积是数学上的概念,比如扔出两个色子,和为 4 的概率是:

这个函数的特点是,当函数 的自变量 不断增大时,另一个函数 的自变量 是在减


少的。而且两者之和固定为 。再举个连续函数的例子,丧心病狂的蓄水池管理员小明,一边将池子
里的脏水倒出,一边倒入干净的水,假设倒水速度是 ,净水的保留率是 ,一段时间内倒入
的净水量其实是:
我们知道点 都分布在 这条直线上,在求和的过程中,就好像点从直线的两端
向中间卷起来。再加上这是求乘积的运算,所以被叫做卷积。

卷积的数学意义是对函数做加权求和,但在物理上,尤其是图像识别中,它可以起到滤波器的作用。
所谓的滤波器,其实是一种专门的探测器,只对特定的特征有很明显的反应,对别的特征则毫无反
应,可以把它想象成金属探测器或者扫雷的机器。

下图就是一个滤波器的典型例子,我们先用数字把图像表示出来,黑色的地方数值大,白色的地方都
是 0:

然后用这个矩阵把图像扫一遍:
很有意思的事情发生了,我们看到在小鼠的后背那块区域,也就是和滤波器形状类似的地方,矩阵得
到了很高的值:

但在其他地方,得到的值则是 0:

所以,我们把上述用来进行卷积的矩阵叫做卷积核,有了卷积核以后,我们就可以量化的描述特征
像不像,有多像 的问题了,剩下的问题就是如何设计卷积核(也就是滤波器)。

基本流程

早些年,图像识别一直得不到较好的突破,主要是因为图像的特征是人类专家手动设计的,因此工作
量大,效果不一定好,而且不具备大规模使用的可能。

但机器学习似乎天然的适合图像处理,还记得开篇就提到过的机器学习的特征么,再复习一遍:
机器学习只能从数据中提取客观存在的规律,不能凭空创造规律。

也就是说只要图像是存在特征的,比如猫头,肯定有自己的特征。这个特征人类可能说不清道不明,
但让机器来学就比较简单粗暴了。它根本不关心这个特征有没有什么物理含义,反正只要具备统计学
规律就可以了。

图像识别一般有以下几个步骤:

1. 用某个卷积核对图像做一次卷积,得到激活图
2. 对激活图做池化,降低参数
3. 重复步骤 1、2
4. 参数足够少时,用全连接得出结论

激活图与池化

假设图像的大小是 ,我们用一个 的卷积核对它做卷积,可以理解为用一个筛子把原来


的图像扫一遍,筛子每停留在一个位置,都会把卷积核应用在那个位置上 大小的像素上,得到
计算后的结果。当卷积核把图像全部扫一遍后,把所有的计算后结果组合起来,会得到一张全新的矩
阵,这个矩阵被称为激活图。

根据上文的解释,我们知道激活图中的值在特定的位置很大,其他位置很小。激活图中值大的地方表
示这里满足特征。因此,一张激活图,其实就是一个卷积核的特征分布图,描述了原始图片在什么位
置满足卷积核的特征。

如果我们只有激活图,图像的大小就不会明显减少,计算复杂度也就无法降低。所以池化的作用是帮
助我们降低参数,其实池化非常简单,假设有一个 的矩阵,我们找到其中最大的值,并用这个
值代替原来的矩阵,一下子就把参数数量降低到原来的 。这种池化方式叫做最大池化,类似的
还有最小池化、平均池化,也非常容易理解。

池化虽然简单,但效果却非常理想,下图描述了图片在池化前后的变化,可以看到基本不会丢失特
征:
全连接

一般来说,一张图片不会只有一个卷积核。因为一个卷积核意味着一个特征,我们可以同时学习多个
特征(猫头、猫身体、猫尾巴)。所以,对于一个 像素的图片来说,它经过多个卷积核的
处理后,可能得到了 5 个 的激活图(池化以后)。然后每个激活图又有多个卷积核,不断循
环下去……。可以看到图像的大小退化得很快,激活图的数量会不断增加,最终可能会生成几百个
的激活图。当然,此时的激活图已经不具备图像的价值了。它可以理解为用来标记图像是否具
备某个特征,这个特征是机器学出来的,人类可能无法直接理解。

最终我们需要一个全连接层,把这些特征映射到输出空间里。举个例子,我们要识别数字,原始图片
经过卷积和池化,像素不断减少,最终退化为 ,但激活图的数量不断增加,最终假设有 100
个。那么这 100 个特征各自具有一个权重,共同决定了图像是不是数字1,数字 2……。

这个例子中,输出空间就是从 0 到 9 的十个数字。不同的数字,利用特征的方式各不一样,其实就是
给各个特征设置的权重不同,可以用一个 100 行的权重矩阵表示。每给定一个 100 列的向量,我们
把它和数字 1 的权重矩阵相乘,就会得到图片表示数字 1 的概率。类似的,可以得到图片是数字 2、
3…… 9、0的概率,然后我们选择概率最大的那一个数字就可以了。当然,每个数字的权重

完全的流程如下图所示,全连接指的是从 hidden4 到 output 的过程:


小结

总结一下图像识别的过程。它的核心是利用卷积核提取特征,这个卷积核是机器学习的,前期可以随
便设一个值,当然误差肯定很大。我们可以用误差逆传播的算法来调整卷积核。这个特征不一定可以
被人类理解,但它恰好是机器适合做的事:从大量数据中提取客观存在的规律。

由于卷积、池化的过程会重复很多遍,不同层的卷积核各不一样,总的来说越靠近原始图像,卷积核
识别的特征就越抽象,比如一开始我们识别猫头、猫尾巴。越接近底层数据,卷积核识别的特征就越
具体,比如识别点、像素、直线等。

下面几张图列出了卷积核的反激活效果(也就是什么样的图片具备这个卷积核所描述的特征),注
意,这个流程是从底层到顶层的,和上图的处理流程刚好相反。

第一层:只能识别直线
第二层:能够识别弯曲复杂的线
第三层:能够识别线条的组合

第四层:能够识别简单的物体
还有一些更复杂的图片,出于篇幅的考虑就不放出了,希望这几张反激活图能帮助读者理解特征核是
如何从抽象到具体,从复杂到简单的。
尾声

作为对全文的总结,只想强调三点:

1. 还是那句话,机器学习只解决具有规律的,原本可以解决的问题
2. 机器学习的本质是用函数量化人们口口相传的经验,用算法计算出结论,并且用数学公式证明这
么做的合理性
3. 机器学习的核心是找到合适的性能评价指标,借助计算机强大的计算能力,计算出合适的参数,
使计算结果和真实数据的误差最小化。

参考

1. 周志华:《机器学习》
2. 机器学习入门:线性回归及梯度下降
3. Gradient Descent 梯度下降法
4. ML重要概念:梯度(Gradient)与梯度下降法(Gradient Descent)
5. 卷积神经网络工作原理直观的解释?
6. 算法杂货铺——分类算法之朴素贝叶斯分类(Naive Bayesian classification)

You might also like