怎样教一台计算机区分猫和狗?
导读:机器学习是一个快速发展的研究领域,主要关注设计和分析能让计算机学习的算法。作为一门新兴学科,尽管有待发掘的知识比已经掌握的知识要多得多,但当前的机器学习方法已经被用于教计算机执行各种各样有用的任务。这包括:
- 图像中目标的自动检测(驾驶员辅助和自动驾驶汽车的关键组成部分)
- 语音识别(提升语音命令技术)
- 医学领域中的知识发现(用于增进我们对复杂疾病的理解)
- 预测分析(用于销售和经济预测)
为了能让读者从整体上了解机器学习的原理,我们首先讨论一个微型机器学习问题:教计算机如何区分猫和狗的照片。通过该例子,我们采用非形式化的方式描述解决机器学习问题的一般过程。
作者:杰瑞米·瓦特,雷萨·博哈尼,阿格洛斯·K.卡萨格罗斯
如需转载请联系大数据(ID:hzdashuju)
01 教计算机区分猫和狗
在教孩子区分“猫”和“狗”时,几乎所有父母都不会告诉孩子某种形式的科学定义(例如,狗属于哺乳动物这个大类中犬科的一员,而猫属于相同大类中猫科的一员),反倒是会给孩子看一些猫和狗的图片,同时告诉他们哪些是猫哪些是狗,直到他们完全掌握这两个概念为止。
我们怎么知道孩子何时学会区分猫和狗了呢?直觉上,应该是当他们遇到新的猫和狗(或图片)并能够逐一正确辨识的时候。像人类一样,计算机也可以采用类似的方式学习如何执行这类任务。在机器学习领域,这种以教计算机区分不同类别事物为目标的任务被称为分类。
1. 收集数据
像人类一样,计算机也必须经过从实例中学习的训练来识别两种动物的不同之处,这些实例称为数据的训练集。图1-1展示了这样的训练集,其中包含不同的猫和狗的图片。直观而言,更大和更多样化的训练集可使计算机(或人)更好地完成学习任务,这是因为更广泛的例子可以赋予学习者更多的经验。
![](https://ask.qcloudimg.com/http-save/yehe-2802732/l7l5vlmlrj.jpeg?imageView2/2/w/1620)
▲图1-1 包含六只猫(左图)和六条狗(右图)的训练集,这个数据集用来训练区分猫和狗图片的机器学习模型
2. 设计特征
考虑一下你自己是如何区分猫和狗的图片的。为了将二者分开,你会关注什么?你可能会用颜色、大小、耳朵或鼻子的形状,以及(或者)这些特征的组合来区分它们。
换句话说,你不会只是简单地将图片当成许多小像素块的集合,而是会从这些图中找出细节或者特征来确定你看到的是什么。对于计算机而言也是如此。为了成功地训练计算机完成此项任务(或者任何更一般的机器学习任务),我们需要给它提供设计合理的特征,或者更理想情况下,让它自己找到这样的特征。
因为设计高质量的特征非常依赖于应用,所以这通常不是一个简单的任务。比如,像 “腿的数量”这样的特征对于区分猫和狗是没有用的(因为它们都有4条腿!),但是这一特征对于辨别猫和蛇非常有用。
此外,从训练集中提取特征也非常具有挑战性。例如,如果一些训练图像非常模糊,或者是从看不到动物的头的角度拍摄出来的,那么我们设计的特征或许就无法正确地提取出来。
为了简化我们讨论的问题,假设可以很容易地从训练集的图片中提取以下两个特征:
- 鼻子的大小,相对于头的大小(从小到大);
- 耳朵的形状(从圆到尖)。
从图1-1所示的训练图片中可以看出,所有的猫都有小鼻子和尖耳朵,2而所有的狗都有大鼻子和圆耳朵。值得注意的是,每一幅图片中当前选择的特征都可以只由两个数字表示:一个数字表示相对的鼻子大小,另外一个数字表示耳朵尖或圆的程度。
因此,训练集中的图片都可以在二维特征空间中表示出来,其中“鼻子大小”特征和“耳朵形状”特征分别由图1-2中的水平坐标和垂直坐标表示。因为我们设计的特征能很好地区分训练集中的猫和狗,所以猫图片的特征表示都集中在空间的一部分,而狗图片的特征表示则聚集在另一部分。
![](https://ask.qcloudimg.com/http-save/yehe-2802732/7per01hv76.jpeg?imageView2/2/w/1620)
▲图1-2 训练集的特征空间表示,其中水平和垂直坐标分别表示“鼻子大小”特征和“耳朵形状”特征,训练集中的猫和狗分别处于特征空间的不同位置,这说明特征选得很合适
3. 训练模型
现在我们有了训练数据集合适的特征表示,那么教计算机区分猫和狗的最后一步就可归为一个简单的几何问题:让计算机在我们精心设计的特征空间中找到能够区分猫和狗的一条直线或者一个线性模型[1]。
直线(在二维空间中)有斜率和截距两个参数,这意味着要为这两个参数找到正确的值。直线的参数必须根据训练数据(的特征表示)来确定。确定参数的过程依赖于一组名为数值优化的工具,此过程被称作模型的训练。
图1-3展示了一个已训练好的线性模型,它将特征空间分成猫和狗两个区域。一旦确定了这条线,计算机会将出现在它之上的特征表示(左上区域)判断为猫,将出现在它之下的特征表示(右下区域)判断为狗。
![](https://ask.qcloudimg.com/http-save/yehe-2802732/vrd5sx9n5y.jpeg?imageView2/2/w/1620)
▲图1-3 一个已训练好的线性模型完美地将训练集中的两类动物区分开来:如果将来任何新图片的特征表示落入这条线之上(左上区域),该图片就会被归类为猫;如果落入这条线之下(右下区域),该图片就会被归类为狗
4. 测试模型
为了测试我们的学习器性能,我们给计算机提供一些以前没有见过的猫和狗的图片(一般称为数据的测试集),然后看看它对每幅图片中动物的识别能力。基于当前问题,我们在图1-4中展示了由三幅新的猫和狗的图片组成的测试集。
![](https://ask.qcloudimg.com/http-save/yehe-2802732/7em22lwfnk.jpeg?imageView2/2/w/1620)
▲图1-4 猫和狗图片的测试集,注意,其中的一条狗,也就是右上方的波士顿,有小鼻子和尖耳朵,根据我们选择的特征表示,计算机会认为这是一只猫
为了测试,需要从新图片中提取我们设计的特征(鼻子大小和耳朵形状),并简单检查一下它们落入特征空间中直线的哪一侧。在这个例子中,如图1-5所示,测试集中所有猫的图片以及两张狗的图片都被正确识别出来了。
![](https://ask.qcloudimg.com/http-save/yehe-2802732/i6nppese38.jpeg?imageView2/2/w/1620)
▲图1-5 用我们已训练好的线性模型来识别测试图片(的特征表示),注意,由于波士顿像训练集中的猫一样拥有尖耳朵和小鼻子,因此它被误分类成一只猫
这只狗(波士顿)的误分类完全是因为我们选择的特征,而这些特征是根据图1-1中的训练集设计的。这只狗的特征是小鼻子和尖耳朵,恰好和训练集中的猫相匹配,所以被误分类。
因此,虽然刚开始鼻子大小和耳朵形状的组合确实能区分猫和狗,但是由于训练集太小且不够多样化,我们发现基于训练集选择出来的特征是不能完全有效的。
为了提升学习器性能,我们必须从头开始。
- 首先,应该收集更多的数据,组成一个庞大且多样的训练集。
- 其次,需要考虑设计更具有辨识性的特征(比如,眼睛的颜色、尾巴的形状等)来进一步帮助我们区分猫和狗。
- 最后,还要用设计的特征训练一个新的模型,并用同样的方式来测试,看它与原来的模型相比是否有所改进。
02 经典机器学习问题的流程
现在我们简要回顾一下前面描述的过程,通过该过程,我们建立了一个训练模型,用于完成区分猫和狗的微型任务。同样的过程基本上可用于完成所有的机器学习任务,因此很值得我们花一些时间来回顾解决典型机器学习问题所采取的步骤。
为了突出这些步骤的重要性,我们在下面将其列举出来。
我们把这些步骤称为解决机器学习问题的一般流程,图1-6简洁地概括了该流程。
![](https://ask.qcloudimg.com/http-save/yehe-2802732/ov52dlhpv2.jpeg?imageView2/2/w/1620)
▲图1-6 猫和狗分类问题的学习流程,相同的一般化流程基本上可用于所有的机器学习问题
- 定义问题:我们想教计算机做什么任务?
- 收集数据:为训练集和测试集收集数据。数据越大、越多样越好。
- 设计特征:什么样的特征最能描述数据?
- 训练模型:用数值优化技术在训练集上调整恰当模型的参数。
- 测试模型:评估训练模型在测试数据上的性能。如果评估结果不佳,则重新考虑所使用的特征,并尽可能收集更多的数据。