机器学习(machine learning,ML)是强大的可以从经验中学习的技术。 通常采用观测数据或与环境交互的形式,机器学习算法会积累更多的经验,其性能也会逐步提高。 相反,对比电子商务平台等,一直执行相同的业务逻辑,无论积累多少经验,都不会自动提高(直到开发人员认识到并更新软件)。 在这本书中,将带你开启机器学习之旅,并特别关注深度学习(deep learning)的基础知识。 这是一套强大的技术,它可以推动计算机视觉、自然语言处理、医疗保健和基因组学等不同领域的创新。
假设你正和本书的作者们一起,驱车去咖啡店。 亚历山大拿起一部iPhone,对它说道“Hey Siri”–手机的语音识别系统主动唤醒了。 接着,李沐对Siri说道“去星巴克咖啡店”–语音识别系统自动触发语音转文字功能,并启动地图应用程序来满足我们的请求。 地图应用程序在启动后确定了若干条路线:每条路线都显示了预计的通行时间…… 由此可见,机器学习渗透在生活中的方方面面,在短短几秒钟的时间里,我们与智能手机的日常互动就可以涉及几种机器学习模型。
现在,请你从基本原则出发,编写一个程序来响应一个“唤醒词“(比如“Alexa”、“小爱同学”和“Hey Siri”)。 试着用一台计算机和一个代码编辑器自己编写代码,如 图1.1.1 中所示。 问题看似很难解决:麦克风每秒钟将收集大约44000个样本,每个样本都是声波振幅的测量值。 如何编写程序,令其输入原始音频片段,输出({\text{是}, \text{否}})(表示该片段是否包含唤醒词)的可靠预测呢? 如果你毫无头绪,别担心,我们也不知道如何从头开始编写这个程序。这就是我们需要机器学习的原因。
通过机器学习算法,我们不需要设计一个“明确地”识别唤醒词的系统。 相反,我们定义一个灵活的程序算法,其输出由许多参数(parameter)决定。 然后我们使用数据集来确定当下的“最佳参数集”,这些参数通过某种性能度量来获取完成任务的最佳性能。
那么到底什么是参数呢? 你可以把参数看作是旋钮,我们可以转动旋钮来调整程序的行为。 任一调整参数的程序后,我们称为模型(model)。 通过操作参数而生成的所有不同程序(输入-输出映射)的集合称为“模型族”。 使用数据集来选择参数的元程序被称为学习算法(learning algorithm)。
在我们开始用机器学习算法解决问题之前,我们必须精确地定义问题,确定输入和输出的性质,并选择合适的模型族。 在本例中,我们的模型接收一段音频作为输入(input),然后模型生成({\text{是}, \text{否}})中的输出(output)。 如果一切顺利,经过一番训练,模型对于“片段是否包含唤醒词“的预测通常是正确的。
现在我们的模型每次听到“Alexa”这个词时都会发出“是”的声音。 由于这里的唤醒词是任意选择的自然语言,因此我们可能需要一个足够丰富的模型族,使模型多元化,。 比如,模型族的另一个模型只在听到“Hey Siri”这个词时发出“是”。 理想情况下,同一个模型族应该适合于“Alexa”识别和“Hey Siri”识别,因为它们似乎是相似的任务。 相反,如果我们想处理完全不同的输入或输出,比如从图像映射到字幕,或从英语映射到中文,我们可能需要一个完全不同的模型族。
正如你可能猜到的,如果我们只是随机设置模型参数,所以这个模型不太可能识别出“Alexa”、“Hey Siri”或任何其他单词。 在机器学习中,学习(learning)是一个模型的训练过程。 通过这个过程,我们可以发现正确的参数集,从而从使模型强制执行所需的行为。 换句话说,我们用数据训练(train)我们的模型。 如 图1.1.2所示,训练过程通常包含如下步骤:
通过用数据
总而言之,我们没有编写唤醒词识别器,而是编写了一个“学习”程序。 如果我们用一个巨大的带标签的数据集,它很可能可以“学习”识别唤醒词。 你可以将这种”通过用数据集来确定程序行为”的方法看作是“用数据编程”(programming with data)。 比如,我们可以通过向机器学习系统提供许多猫和狗的图片来设计一个“猫图检测器”。 通过这种方式,检测器最终可以学会:如果输入是猫的图片就输出一个非常大的正数,如果输入是狗的图片就会得出一个非常大的负数。 如果检测器不确定,它会输出接近于零的数…… 这个例子仅仅是机器学习常见应用的冰山一角。 而深度学习是机器学习的一个主要分支,我们稍后将对其进行更详细的解析。
1.我们可以学习的数据(data)。
2.如何转换数据的模型(model)。
深度学习与经典方法的区别主要在于:前者关注的功能强大的模型,这些模型由神经网络错综复杂的交织在一起,包含层层数据转换,因此被称为深度学习(deep learning)。
3.一个目标函数(objective function),用来量化模型的有效性。
在机器学习中,我们需要定义模型的优劣程度的度量,这个度量在大多数情况是“可优化”的,希望优化到最低点或者最高点。我们称之为目标函数(objective function),有时被称为损失函数(loss function, 或cost function)。
通常,损失函数是根据模型参数定义的,并取决于数据集。 在一个数据集上,我们通过最小化总损失来学习模型参数的最佳值。
4.调整模型参数以优化目标函数的算法。
需要一种算法,它能够搜索出最佳参数,以最小化损失函数。 深度学习中,大多流行的优化算法通常基于一种基本方法–梯度下降(gradient descent)
监督学习(supervised learning)擅长在“给定输入特征”的情况下预测标签。 每个“特征-标签”对都称为一个样本(example)。 有时,即使标签是未知的,样本也可以指代输入特征。 我们的目标是生成一个模型,能够将任何输入特征映射到标签,即预测。
解决:
数据中不含有“目标”的机器学习问题为无监督学习(unsupervised learning),无监督学习可以回答什么样的问题呢?
聚类(clustering)问题:没有标签的情况下,我们是否能给数据分类呢?比如,给定一组照片,我们能把它们分成风景照片、狗、婴儿、猫和山峰的照片吗?同样,给定一组用户的网页浏览记录,我们能否将具有相似行为的用户聚类吗?
主成分分析(principal component analysis)问题:我们能否找到少量的参数来准确地捕捉数据的线性相关属性?比如,一个球的运动轨迹可以用球的速度、直径和质量来描述。再比如,裁缝们已经开发出了一小部分参数,这些参数相当准确地描述了人体的形状,以适应衣服的需要。另一个例子:在欧几里得空间中是否存在一种(任意结构的)对象的表示,使其符号属性能够很好地匹配?这可以用来描述实体及其关系,例如“罗马” (-) “意大利” (+) “法国” (=) “巴黎”。
因果关系(causality)和概率图模型(probabilistic graphical models)问题:我们能否描述观察到的许多数据的根因?例如,如果我们有关于房价、污染、犯罪、地理位置、教育和工资的人口统计数据,我们能否简单地根据经验数据发现它们之间的关系?
生成对抗性网络(generative adversarial networks):为我们提供一种合成数据的方法,甚至像图像和音频这样复杂的结构化数据。潜在的统计机制是检查真实和虚假数据是否相同的测试,它是无监督学习的另一个重要而令人兴奋的领域。
到目前为止,不管是监督学习还是无监督学习,我们都会预先获取大量数据,然后启动模型,不再与环境交互。 这里所有学习都是在算法与环境断开后进行的,被称为离线学习(offline learning)。离线学习有它的魅力,我们可以孤立地进行模式识别,而不必分心于其他问题。 但缺点是,解决的问题相当有限。
考虑“与真实环境互动”将打开一整套新的建模问题。以下只是几个例子:
环境还记得我们以前做过什么吗?
环境是否有助于我们建模?例如,用户将文本读入语音识别器。
环境是否想要打败模型?例如,一个对抗性的设置,如垃圾邮件过滤或玩游戏?
环境是否重要?
环境是否变化?例如,未来的数据是否总是与过去相似,还是随着时间的推移会发生变化?是自然变化还是响应我们的自动化工具而发生变化?
最后一个问题提出了当训练和测试数据不同时数据分布偏移(distribution shift)的问题。 接下来,我们将简要描述强化学习问题,这是一类明确考虑与环境交互的问题。
如果你对使用机器学习开发与环境交互并采取行动感兴趣,那么你最终可能会专注于强化学习(reinforcement learning)。 这可能包括应用到机器人、对话系统,甚至开发视频游戏的人工智能(AI)。 深度强化学习(deep reinforcement learning)将深度学习应用于强化学习的问题,是非常热门的研究领域。 突破性的深度Q网络(Q-network)在雅达利游戏中仅使用视觉输入就击败了人类, 以及 AlphaGo 程序在棋盘游戏围棋中击败了世界冠军,是两个突出强化学习的例子。
在强化学习问题中,agent 在一系列的时间步骤上与环境交互。 在每个特定时间点,agent 从环境接收一些观察(observation),并且必须选择一个动作(action),然后通过某种机制(有时称为执行器)将其传输回环境,最后 agent 从环境中获得 奖励(reward)。 此后新一轮循环开始,agent 接收后续观察,并选择后续操作,依此类推。 强化学习的过程在 图1.3.7 中进行了说明。 请注意,强化学习的目标是产生一个好的策略(policy)。 强化学习 agent 的选择的”动作“受策略控制,即一个从环境观察映射到行动的功能。
强化学习框架的通用性十分强大。 例如,我们可以将任何监督学习问题转化为强化学习问题。 假设我们有一个分类问题,我们可以创建一个强化学习agent,每个分类对应一个“动作”。 然后,我们可以创建一个环境,该环境给予agent的奖励。 这个奖励与原始监督学习问题的损失函数是一致的。
当然,强化学习还可以解决许多监督学习无法解决的问题。 例如,在监督学习中,我们总是希望输入与正确的标签相关联。 但在强化学习中,我们并不假设环境告诉agent每个观测的最优动作。 一般来说,agent只是得到一些奖励。 此外,环境甚至可能不会告诉我们是哪些行为导致了奖励。
以强化学习在国际象棋的应用为例。 唯一真正的奖励信号出现在游戏结束时:当agent获胜时,agent可以得到奖励1;当agent失败时,agent将得到奖励-1。 因此,强化学习者必须处理学分分配(credit assignment)问题:决定哪些行为是值得奖励的,哪些行为是需要惩罚的。 就像一个员工升职一样,这次升职很可能反映了前一年的大量的行动。 要想在未来获得更多的晋升,就需要弄清楚这一过程中哪些行为导致了晋升。
强化学习可能还必须处理部分可观测性问题。 也就是说,当前的观察结果可能无法阐述有关当前状态的所有信息。 比方说,一个清洁机器人发现自己被困在一个许多相同的壁橱的房子里。 推断机器人的精确位置(从而推断其状态),需要在进入壁橱之前考虑它之前的观察结果。
最后,在任何时间点上,强化学习agent可能知道一个好的策略,但可能有许多更好的策略从未尝试过的。 强化学习agent必须不断地做出选择:是应该利用当前最好的策略,还是探索新的策略空间(放弃一些短期回报来换取知识)。
一般的强化学习问题是一个非常普遍的问题。 agent的动作会影响后续的观察,而奖励只与所选的动作相对应。 环境可以是完整观察到的,也可以是部分观察到的,解释所有这些复杂性可能会对研究人员要求太高。 此外,并不是每个实际问题都表现出所有这些复杂性。 因此,学者们研究了一些特殊情况下的强化学习问题。
当环境可被完全观察到时,我们将强化学习问题称为马尔可夫决策过程(markov decision process)。 当状态不依赖于之前的操作时,我们称该问题为上下文赌博机(contextual bandit problem)。 当没有状态,只有一组最初未知回报的可用动作时,这个问题就是经典的多臂赌博机(multi-armed bandit problem)。
神经网络(neural networks)得名的原因是生物灵感。 一个多世纪以来(追溯到1873年亚历山大·贝恩和1890年詹姆斯·谢林顿的模型),研究人员一直试图组装类似于相互作用的神经元网络的计算电路。 随着时间的推移,对生物学的解释变得不再肤浅,但这个名字仍然存在。 其核心是当今大多数网络中都可以找到的几个关键原则:
线性和非线性处理单元的交替,通常称为层(layers)。
使用链式规则(也称为反向传播(backpropagation))一次性调整网络中的全部参数。
在最初的快速发展之后,神经网络的研究从1995年左右一直开始停滞不前,直到到2005年才稍有起色。 这主要是因为两个原因。 首先,训练网络(在计算上)非常昂贵。在 上个世纪末,随机存取存储器(RAM)非常强大,而计算能力却很弱。 其次,数据集相对较小。
大约2010年开始,那些在计算上看起来不可行的神经网络算法变得热门起来,实际上是以下两点导致的。 其一,随着互联网的公司的出现,为数亿在线用户提供服务,大规模数据集变得触手可及。 另外,廉价又高质量的传感器、廉价的数据存储(克里德定律)以及廉价计算(摩尔定律)的普及,特别是GPU的普及,使大规模算力唾手可得。
最近十年,在统计模型、应用和算法方面的进展就像寒武纪大爆发。 事实上,最先进的技术不仅仅是应用于几十年前的算法的可用资源的结果。 下面列举了帮助研究人员在过去十年中取得巨大进步的想法(虽然只是触及了的皮毛)。
新的容量控制方法,如dropout [Srivastava et al., 2014],有助于减轻过拟合的危险。这是通过在整个神经网络中应用噪声注入 [Bishop, 1995] 来实现的,出于训练目的,用随机变量来代替权重。
注意力机制解决了困扰统计学一个多世纪的问题:如何在不增加可学习参数的情况下增加系统的记忆和复杂性。研究人员通过使用只能被视为可学习的指针结构 [Bahdanau et al., 2014] 找到了一个优雅的解决方案。不需要记住整个文本序列(例如用于固定维度表示中的机器翻译),所有需要存储的都是指向翻译过程的中间状态的指针。这大大提高了长序列的准确性,因为模型在开始生成新序列之前不再需要记住整个序列。
多阶段设计。例如,存储器网络 [Sukhbaatar et al., 2015] 和神经编程器-解释器 [Reed & DeFreitas, 2015]。它们允许统计建模者描述用于推理的迭代方法。这些工具允许重复修改深度神经网络的内部状态,从而执行推理链中的后续步骤,类似于处理器如何修改用于计算的存储器。
另一个关键的发展是生成对抗网络 [Goodfellow et al., 2014] 的发明。传统模型中,密度估计和生成模型的统计方法侧重于找到合适的概率分布和(通常是近似的)抽样算法。因此,这些算法在很大程度上受到统计模型固有灵活性的限制。生成式对抗性网络的关键创新是用具有可微参数的任意算法代替采样器。然后对这些数据进行调整,使得鉴别器(实际上是对两个样本的测试)不能区分假数据和真实数据。通过使用任意算法生成数据的能力,它为各种技术打开了密度估计的大门。驰骋的斑马 [Zhu et al., 2017] 和假名人脸 [Karras et al., 2017] 的例子都证明了这一进展。即使是业余的涂鸦者也可以根据描述场景布局的草图生成照片级真实图像( [Park et al., 2019] )。
在许多情况下,单个GPU不足以处理可用于训练的大量数据。在过去的十年中,构建并行和分布式训练算法的能力有了显着提高。设计可伸缩算法的关键挑战之一是深度学习优化的主力——随机梯度下降,它依赖于相对较小的小批量数据来处理。同时,小批量限制了GPU的效率。因此,在1024个GPU上进行训练,例如每批32个图像的小批量大小相当于总计约32000个图像的小批量。最近的工作,首先是由 [Li, 2017] 完成的,随后是 [You et al., 2017] 和 [Jia et al., 2018] ,将观察大小提高到64000个,将ResNet-50模型在Imagenet数据集上的训练时间减少到不到7分钟。作为比较——最初的训练时间是按天为单位的。
并行计算的能力也对强化学习的进步做出了相当关键的贡献。这导致了计算机在围棋、雅达里游戏、星际争霸和物理模拟(例如,使用MuJoCo)中实现超人性能的重大进步。有关如何在AlphaGo中实现这一点的说明,请参见如 [Silver et al., 2016] 。简而言之,如果有大量的(状态、动作、奖励)三元组可用,即只要有可能尝试很多东西来了解它们之间的关系,强化学习就会发挥最好的作用。仿真提供了这样一条途径。
深度学习框架在传播思想方面发挥了至关重要的作用。允许轻松建模的第一代框架包括Caffe、Torch和Theano。许多开创性的论文都是用这些工具写的。到目前为止,它们已经被TensorFlow(通常通过其高级API Keras使用)、CNTK、Caffe 2和Apache MXNet所取代。第三代工具,即用于深度学习的命令式工具,可以说是由Chainer率先推出的,它使用类似于Python NumPy的语法来描述模型。这个想法被PyTorch、MXNet的Gluon API和Jax都采纳了。
直到最近,人工智能才成为人们关注的焦点,主要是因为解决了以前被认为难以解决的问题,这些问题与消费者直接相关。许多这样的进步都归功于深度学习。
智能助理,如苹果的Siri、亚马逊的Alexa和谷歌助手,都能够相当准确地回答口头问题。这包括一些琐碎的工作,比如打开电灯开关(对残疾人来说是个福音)到预约理发师和提供电话支持对话。这可能是人工智能正在影响我们生活的最明显的迹象。
数字助理的一个关键因素是准确识别语音的能力。逐渐地,这样的系统的精确度已经增加到在某些应用中达到人类平等的程度 [Xiong et al., 2018]。
物体识别同样也取得了长足的进步。估计图片中的物体在2010年是一项相当具有挑战性的任务。在ImageNet基准上,来自NEC实验室和伊利诺伊大学香槟分校的研究人员获得了28%的Top-5错误率 [Lin et al., 2010] 。到2017年,这一错误率降低到2.25% [Hu et al., 2018] 。同样,在鉴别鸟类或诊断皮肤癌方面也取得了惊人的成果。
游戏曾经是人类智慧的堡垒。从TD-Gammon开始,一个使用时差强化学习的五子棋游戏程序,算法和计算的进展导致了广泛应用的算法。与五子棋不同的是,国际象棋有一个复杂得多的状态空间和一组动作。深蓝公司利用大规模并行性、专用硬件和高效搜索游戏树 [Campbell et al., 2002] 击败了加里·卡斯帕罗夫(Garry Kasparov)。围棋由于其巨大的状态空间,难度更大。AlphaGo在2015年达到了人类平等,使用深度学习和蒙特卡洛树抽样 [Silver et al., 2016] 相结合。扑克中的挑战是状态空间很大,而且没有完全观察到(我们不知道对手的牌)。在扑克游戏中,库图斯使用有效的结构化策略超过了人类的表现 [Brown & Sandholm, 2017] 。这说明了游戏中令人印象深刻的进步,以及先进的算法在其中发挥了关键作用的事实。
人工智能进步的另一个迹象是自动驾驶汽车和卡车的出现。虽然完全自主还没有完全触手可及,但在这个方向上已经取得了很好的进展,特斯拉(Tesla)、NVIDIA和Waymo等公司的产品至少实现了部分自主。让完全自主如此具有挑战性的是,正确的驾驶需要感知、推理和将规则纳入系统的能力。目前,深度学习主要应用于这些问题的计算机视觉方面。其余部分则由工程师进行大量调整。
人工智能的奇点问题:
首先,人工智能系统是以一种特定的、面向目标的方式设计、训练和部署的。 虽然他们的行为可能会给人一种通用智能的错觉,但设计的基础是规则、启发式和统计模型的结合。 其次,目前还不存在能够自我改进、自我推理、能够在试图解决一般任务的同时,修改、扩展和改进自己的架构的“人工通用智能”工具。
事实证明,这些多层模型能够以以前的工具所不能的方式处理低级的感知数据。 毋庸置疑,深度学习方法中最显著的共同点是使用端到端训练。 也就是说,与其基于单独调整的组件组装系统,不如构建系统,然后联合调整它们的性能。 例如,在计算机视觉中,科学家们习惯于将特征工程的过程与建立机器学习模型的过程分开。 Canny边缘检测器 [Canny, 1987] 和SIFT特征提取器 [Lowe, 2004] 作为将图像映射到特征向量的算法,在过去的十年里占据了至高无上的地位。 在过去的日子里,将机器学习应用于这些问题的关键部分是提出人工设计的特征工程方法,将数据转换为某种适合于浅层模型的形式。 然而,与一个算法自动执行的数百万个选择相比,人类通过特征工程所能完成的事情很少。 当深度学习开始时,这些特征抽取器被自动调整的滤波器所取代,产生了更高的精确度。
因此,深度学习的一个关键优势是它不仅取代了传统学习管道末端的浅层模型,而且还取代了劳动密集型的特征工程过程。 此外,通过取代大部分特定领域的预处理,深度学习消除了以前分隔计算机视觉、语音识别、自然语言处理、医学信息学和其他应用领域的许多界限,为解决各种问题提供了一套统一的工具。
除了端到端的训练,我们正在经历从参数统计描述到完全非参数模型的转变。 当数据稀缺时,人们需要依靠简化对现实的假设来获得有用的模型。 当数据丰富时,可以用更准确地拟合实际情况的非参数模型来代替。 在某种程度上,这反映了物理学在上个世纪中叶随着计算机的出现所经历的进步。 现在人们可以求助于相关偏微分方程的数值模拟,而不是用手来求解电子行为的参数近似。这导致了更精确的模型,尽管常常以牺牲可解释性为代价。
与以前工作的另一个不同之处是接受次优解,处理非凸非线性优化问题,并且愿意在证明之前尝试。 这种在处理统计问题上新发现的经验主义,加上人才的迅速涌入,导致了实用算法的快速进步。 尽管在许多情况下,这是以修改和重新发明存在了数十年的工具为代价的。
最后,深度学习社区引以为豪的是,他们跨越学术界和企业界共享工具,发布了许多优秀的算法库、统计模型和经过训练的开源神经网络。