引言:机器学习与深度学习
本章来源:本文整理自《动手学深度学习》(zh.d2l.ai)第 1 章《引言》,原书作者 Aston Zhang、李沐、Zachary C. Lipton、Alexander J. Smola。
本章讲什么
深度学习是本书的主角。但要说清楚深度学习,得先从机器学习讲起。本章回答三个问题:
- 机器学习是什么?它和传统编程有什么不同?
- 一个机器学习问题由哪些关键组件构成?
- 机器学习有哪些不同类型的问题?
最后我们回顾深度学习的起源、发展和特点,为后面的章节铺路。
为什么需要机器学习
过去,计算机程序几乎都是软件开发人员从零编写的。开发者会想清楚所有可能遇到的情况,为每种情况设计好规则,这就是所谓的"业务逻辑"。比如一个网上商城,用户点击"加入购物车",程序就在数据库里加一条记录,把用户和商品关联起来。
但有些任务,即使是最优秀的程序员也无法写出明确的规则。比如:
- 根据卫星图像和历史天气信息预测明天的天气;
- 回答一个用自然语言提出的问题;
- 识别一张图像里的人,并在每个人周围画出轮廓;
- 向用户推荐他们可能喜欢的产品。
这些任务的难点在于:要么规律太复杂(比如像素和"猫"这种抽象概念之间的关系),要么规律会随时间变化(比如用户的喜好)。我们人类能轻松完成这些任务,却无法说清楚自己是怎么做到的,也就无法把它们写成规则。
机器学习(machine learning,ML) 就是这样一类技术:计算机通过经验——通常是观测数据——来学习,而不是靠人写死的规则。它积累的经验越多,性能就越好。深度学习(deep learning,DL)是机器学习的一个分支,是本书关注的焦点。
举一个贯穿全书的例子:识别"唤醒词"。我们想写个程序,让手机听到"Hey Siri"就响应。麦克风每秒采集约 44000 个音频样本,这些数值和"是否包含唤醒词"之间毫无直观联系,我们根本无法写出规则。但我们可以收集大量包含和不包含唤醒词的音频样本,把它们标记好交给机器学习算法,让算法自己找出规律。
机器学习的关键组件
几乎所有的机器学习问题都可以拆成四个关键组件。
数据
数据是机器学习的燃料。每个数据集由一个个样本(sample)组成,样本也叫数据点或数据实例。每个样本由一组特征(feature)描述,模型根据这些特征做预测。在监督学习中,要预测的那个特殊属性叫标签(label)或目标。
比如一张 200×200 的彩色照片,就是一个样本,它的特征是 200×200×3 = 120000 个数值(每个位置有红、绿、蓝三个通道的强度)。医疗数据里,年龄、生命体征、诊断结果就是特征,用来预测患者能否存活。
关于数据,有两个重要的提醒:
- 数据越多越好:更多的数据可以训练出更强大的模型,减少对预先假设的依赖。数据量从少到多,是现代深度学习成功的基础。
- 数据要正确:如果数据充满错误,或者特征无法预测目标,模型就会失效。"输入的是垃圾,输出的也是垃圾。"此外,数据如果不均衡(比如训练皮肤癌模型时从没见过某种肤色的人群),模型就会产生偏见。
模型
模型负责把数据转换成输出。比如一个"摄取照片并预测是否笑脸"的系统,或者"读取传感器读数并判断正常与否"的系统。
深度学习与经典方法的区别在于:它使用深度模型——由神经网络层层交织组成,包含层层数据转换。每一层都对数据做一次变换,越深的层处理越抽象的概念。这就是"深度"的含义。
目标函数
怎么判断模型好不好?我们需要一个度量,叫目标函数(objective function)。我们通常希望把目标函数优化到最低点,因此它也叫损失函数(loss function)。
常见的损失函数:
- 预测数值时,常用平方误差:预测值与实际值之差的平方;
- 分类问题时,常用错误率:预测与实际情况不符的样本比例。
数据集通常分成两部分:训练集用来拟合模型参数,测试集用来评估模型在没见过的新数据上的表现。一个模型在训练集上表现好、但在测试集上表现差,这叫过拟合(overfitting)。就像学生模拟考试考得很好,但真正考试不一定成功——测试性能可能和训练性能差很远。
优化算法
有了数据、模型和损失函数,最后还需要一个算法,去找出让损失函数最小的参数。深度学习中绝大多数优化算法都基于梯度下降(gradient descent):在每个步骤中,检查每个参数——如果稍微变动这个参数,训练损失会朝哪个方向移动——然后往减少损失的方向调整参数。如此反复,直到损失降到足够低。
各类机器学习问题
机器学习要解决的问题多种多样。我们按学习方式分类来看。
监督学习
监督学习(supervised learning)在"给定输入特征"的情况下预测标签。每个"特征-标签"对是一个样本。目标是训练一个模型,能把任意输入特征映射到标签。
比如预测患者心脏病是否发作:生命体征(心率、血压)是特征,"是否发作"是标签。监督学习之所以能工作,是因为训练时每个样本都有真实标签,模型据此学习"特征到标签"的映射。
监督学习的过程分三步:
- 从数据中取一个子集,为每个样本获取真实标签(有些已有标签,有些需要人工标注);
- 选择学习算法,把训练集变成"已完成学习的模型";
- 用模型预测没见过的样本。
根据输出类型,监督学习可以细分为以下几类:
回归(regression):预测的是数值。"有多少"类的问题基本都是回归。比如预测房价、预测电影评分、预测手术要几小时、预测降雨量。一个有趣的事实:如果你知道承包商收 50 美元上门费、每小时 100 美元,那你已经在不经意间理解并应用了线性回归——给定两个数据样本,你就能推算定价结构。
分类(classification):预测样本属于哪个类别,是"哪一个"的问题。比如手写数字识别(0-9 共 10 类)、猫狗二分类。模型通常为每个类别输出一个概率,比如"图像是猫的概率 0.9"。注意,概率最大不代表就应该用它做决定——如果蘑菇有毒的概率是 0.2,我们依然不会吃它,因为不值得冒死亡的风险。这提醒我们,有时需要用"预期风险"而不是单纯概率来做决策。
标记问题 / 多标签分类(multi-label classification):预测不相互排斥的多个类别。比如一张图里同时有猫、狗、驴,或者一篇技术博客同时打上"机器学习""云计算""AWS"等多个标签。
搜索与排序:不只是输出一个类别,而是对一组项目排序。网络搜索的目标是从海量结果中找出最相关的部分,排序本身很重要——返回"A、B、C、D、E"和"C、A、B、E、D"是不同的。PageRank 就是这种评分系统的早期代表。
推荐系统(recommender system):向特定用户做"个性化"推荐。比如给科幻迷和喜剧爱好者推荐不同的电影。系统为"用户-物品"匹配打分,然后推荐得分最高的物品。推荐系统也有隐患:数据只包含"审查后的反馈"(用户更倾向给感受强烈的东西打分,所以五星和一星很多,三星很少),而且可能形成反馈循环(推荐系统优先推销量大的商品,用户的购买习惯又反过来强化推荐)。
序列学习(sequence learning):输入或输出是变长序列。比如视频(由不同数量的帧组成)、机器翻译(输入输出都是文字序列)、语音识别(输入是音频,输出是文本)、文本转语音、病情监测(不能只看最近测量值,要结合全部病史)。序列学习中输入和输出的长度往往不对应:语音的音频帧比文本字数多得多;德语的动词放在句尾,翻译时顺序还可能颠倒。
无监督学习
如果数据里没有标签,就要靠无监督学习(unsupervised learning)。原书有个生动的比喻:监督学习像一个打工仔,老板站在身后准确地告诉他每种情况该做什么,他只需模仿老板;无监督学习则像是老板丢给你一大堆数据,让你自己去做数据科学研究,没有明确要求。
无监督学习能回答的问题:
- 聚类(clustering):没有标签时,能否给数据分类?比如把一堆照片分成风景、狗、婴儿、猫、山峰。
- 主成分分析(PCA):能否用少量参数准确捕捉数据的规律?比如人体形状可以用少量尺寸参数描述,方便裁缝做衣服。
- 因果关系与概率图模型:能否描述观察到的数据背后的根本原因?
- 生成对抗网络(GAN):能否合成新数据,甚至生成图像、音频这样复杂的非结构化数据?
与环境互动和强化学习
前面说的监督和无监督学习,都是先收集好大量数据,再启动模型,学习过程中不与环境交互,这叫离线学习。但很多场景下,我们希望智能体不仅能预测,还能与环境互动——而互动本身会改变环境,进而影响未来的观察。
强化学习(reinforcement learning,RL)就是明确考虑与环境交互的一类问题。智能体(agent)在时间序列上与环境互动:每个时刻,它接收环境的一个观察,选择一个动作,执行动作后从环境获得奖励,然后进入下一轮。目标是学到一个好的策略——从观察映射到动作的函数。
强化学习有几个难点:
- 学分分配(credit assignment):环境往往只在最后给奖励(比如下棋赢了奖励 1、输了奖励 -1),智能体要自己判断哪些行为导致了成功或失败。就像员工升职,升职反映的是过去一整年的行动,但要弄清楚到底哪些行为导致了晋升。
- 部分可观测:当前观察可能无法反映全部状态。比如清洁机器人被困在许多相同壁橱的房子里,要知道自己位置,得回忆进入前观察到的信息。
- 探索与利用:智能体是继续使用当前最好的策略(利用),还是尝试新的策略空间(探索,放弃短期回报换取知识)?
强化学习的特殊情形包括:环境完全可观测时叫马尔可夫决策过程;状态不依赖之前动作时叫上下文赌博机;没有状态、只有一组未知回报的动作时叫多臂赌博机。深度强化学习把深度学习用到强化学习上,诞生了击败人类的 AlphaGo、只用视觉输入就打败人类的深度 Q 网络等成果。
起源
机器学习的核心思想——用数据和神经网络编程——其实有很长的历史。
- 统计学的源头:几百年来,人类一直在用数据预测未来。高斯发明了最小均方算法,至今用于保险和医疗。中世纪数学家通过平均 16 名成年男性脚的长度来估算"一英尺",还把最长和最短脚的两个人剔除再平均——这是最早的修剪均值估计。
- 计算理论与信息论:图灵提出了著名的图灵测试——如果人类评估者难以通过文本互动区分机器和人类的回答,机器就可以被认为是"智能的"。香农奠定了信息论。
- 神经科学:赫布提出神经元通过积极强化学习,这是感知器学习算法的原型,也为今天深度学习的梯度下降算法奠定了基础。
神经网络的名字来自生物灵感。一百多年来,研究人员一直试图组装像相互连接的神经元那样的计算电路。其核心是今天大多数网络都有的两个原则:线性和非线性处理单元的交替(称为层),以及用链式法则(反向传播)一次性调整网络中的所有参数。
不过,神经网络在 1995 年左右进入低谷,因为训练太贵(计算能力弱)、数据集太小。在数据和算力稀缺的时代,核方法、决策树、图模型这些统计工具表现更好,而且有很强的理论依据。
深度学习的发展
大约 2010 年开始,之前"计算上不可行"的神经网络算法突然变得热门起来,原因有二:
- 大数据:互联网公司服务数亿用户,大规模数据集触手可及;
- 大算力:廉价传感器、廉价存储和廉价计算普及,尤其是 GPU 的普及。
数据、内存和算力的增长曲线可以看一张表:
| 年代 | 数据规模 | 内存 | 每秒浮点运算 |
|---|---|---|---|
| 1970 | 100(鸢尾花卉) | 1 KB | 100 K(Intel 8080) |
| 1990 | 10 K(光学字符识别) | 10 MB | 10 M(Intel 80486) |
| 2010 | 10 G(广告) | 1 GB | 1 T(Nvidia C2050) |
| 2020 | 1 T(社交网络) | 100 GB | 1 P(Nvidia DGX-2) |
内存的增长赶不上数据,而算力的增长超过了数据。这意味着统计模型需要更高效地利用内存(通常通过增加非线性),同时有更多算力去优化参数。于是机器学习的重心从线性模型和核方法,转向了深度神经网络。多层感知机、卷积神经网络、LSTM、Q 学习这些"老算法"在沉寂多年后被重新发现。
最近十年,几个关键思想推动了进步:
- Dropout:通过向网络注入随机噪声,减轻过拟合。
- 注意力机制:解决了一个困扰统计学一个多世纪的问题——如何不增加可学习参数就增加系统的记忆和复杂度。模型不需要记住整个序列,只需存储指向中间状态的"指针"。这让长序列的处理准确度大大提高。
- 生成对抗网络(GAN):用可微参数的任意算法代替传统采样器,让模型能合成逼真的图像等数据。
- 并行与分布式训练:单个 GPU 不够用时,用多 GPU 并行训练,把 ImageNet 上训练 ResNet-50 的时间从按天计算缩短到几分钟。
- 深度学习框架:TensorFlow、PyTorch 等框架让训练线性回归从"博士作业"变成了不到 10 行代码的简单任务。
深度学习的成功案例
人工智能在"交付结果"方面有悠久历史:邮件分拣系统用光学字符识别(MNIST 数据集的来源)、银行支票读取、信用评分、金融交易欺诈检测、搜索推荐排序……机器学习早已无处不在,只是常常藏在视线之外。
近些年,深度学习把一些"以前被认为难解"的问题推进到了人眼可见的程度:
- 智能助理:Siri、Alexa、谷歌助手能相当准确地回答口头问题,语音识别准确率在部分应用中达到人类水平。
- 图像识别:ImageNet 基准上,物体识别的 Top-5 错误率从 2010 年的 28% 降到 2017 年的 2.25%。鉴别鸟类、诊断皮肤癌都有惊人成果。
- 游戏:从 TD-Gammon 到深蓝击败卡斯帕罗夫,再到 AlphaGo 在围棋上达到人类水平——围棋的状态空间极大,深度学习加蒙特卡洛树搜索是关键。
- 自动驾驶:特斯拉、英伟达、Waymo 等实现了部分自主,深度学习主要用于其中的计算机视觉部分。
特点:深度学习到底特别在哪
深度学习是机器学习的子集,但它的具体成分很难一句话说清(原书比喻:就像确定披萨需要哪些配料,几乎每种成分都可以替换)。
关键的特点有四个:
1. 多级表示学习(representation learning)。深度学习是"深度"的——模型学习了许多"层"的转换,每一层提供一层表示。靠近输入的层表示低级细节(比如边缘、纹理),靠近输出的层表示更抽象的概念(比如"猫"或"人脸")。因为深度学习的目的就是寻找表示本身,所以它也叫"多级表示学习"。
2. 端到端训练(end-to-end training)。传统方法把特征工程和模型训练分成两步:科学家手工设计特征提取器(比如 Canny 边缘检测器、SIFT 特征),再喂给浅层模型。深度学习把整个系统联合起来一起调整,用自动调整的滤波器取代了人工特征工程,精度反而更高。它还消除了计算机视觉、语音识别、NLP 等领域之间的界限,提供了一套统一的工具。
3. 从参数模型转向非参数模型。数据稀缺时,要靠简化假设来获得有用模型;数据丰富时,可以用更贴合实际的非参数模型,精度更高,但可解释性常常变差。
4. 接受次优解、先试再说。深度学习处理的是非凸非线性优化问题,学界接受"在证明之前先尝试"的经验主义,这让实用算法快速进步。
最后,深度学习社区非常重视共享:跨越学术界和企业界共享工具,开源算法库、统计模型和训练好的网络。正是本着这种精神,原书免费提供,本书也在此基础上整理发布。
小结
- 机器学习研究计算机系统如何利用经验(数据)来提高特定任务的性能,是人工智能的一种实现手段。
- 一个机器学习问题由数据、模型、目标函数和优化算法四部分组成。
- 监督学习预测带标签的数据,可分为回归、分类、多标签分类、搜索排序、推荐系统、序列学习等;无监督学习处理没有标签的数据;强化学习让智能体与环境互动学习策略。
- 深度学习是多级表示学习:学习多层的转换,不仅取代浅层模型,还取代人工特征工程。
- 近年深度学习的进展,主要由大规模数据和 GPU 算力的突破触发。
关键术语
| 术语 | 一句话解释 |
|---|---|
| 机器学习(ML) | 让计算机从数据中学习,而不是靠人写规则 |
| 深度学习(DL) | 机器学习的一个分支,用多层神经网络做表示学习 |
| 样本 / 特征 / 标签 | 一个数据点 / 描述样本的属性 / 要预测的目标 |
| 损失函数 | 衡量模型好坏的函数,越小越好 |
| 过拟合 | 在训练集上表现好、在测试集上表现差 |
| 梯度下降 | 逐步往减少损失的方向调整参数的优化方法 |
| 监督学习 | 用带标签的数据学习输入到输出的映射 |
| 回归 | 预测连续数值,回答"有多少" |
| 分类 | 预测样本属于哪个类别,回答"哪一个" |
| 无监督学习 | 在没有标签的数据上学习,如聚类、PCA |
| 强化学习 | 智能体与环境互动、根据奖励学习策略 |
| 端到端训练 | 把整个系统联合起来一起调整,取代人工特征工程 |