深度学习
什么是深度学习
发明家们一直梦想着创造会思考的机器。古希腊神话中有很多关于发明家和人造生命(artificial life)的故事,发明家比如皮格马利翁、代达罗斯、赫菲斯托斯,人造生命则比如加拉蒂亚、代达罗斯与塔洛斯、赫菲斯托斯与潘多拉等。

上图是名画《皮格马利翁与加拉蒂亚》。皮格马利翁是希腊神话中的塞浦路斯国王,据古罗马诗人奥维德《变形记》中记述,皮格马利翁是一名雕刻家,他根据自己心中理想的女性形象创作了一个象牙雕塑。他爱上了他的作品,并起名为加拉蒂亚。爱神阿弗洛狄忒同情他,便让雕塑获得了生命。

代达罗斯是伊卡洛斯的父亲,也是伊卡洛斯那对翅膀的发明人。他是一个著名的建筑师和工匠,除了伊卡洛斯的翅膀外,他还制造了囚禁米诺陶诺斯的迷宫。走迷宫、搜索、下棋、路径规划等“搜索”任务在人工智能的早期发展中是一个非常重要的部分。
Sutton曾说:“我们必须接受一个苦涩的教训,那就是试图通过人为构建我们的思维方式来解决复杂问题,在长期来看并不可行。”因此AI可以认为由两大内容组成:一是学习(利用数据来提取模式),二是搜索和优化(使用计算来提取推断)。

具有智慧的青铜巨人塔洛斯,在传说中所向无敌。在伊阿宋带领阿尔戈英雄们夺取金羊毛的的冒险中,拥有强力魔法的美狄亚设计击败了塔洛斯。
在中国古代的《列子》中,有一个偃师造人的故事。周穆王巡游的时候碰到了一个叫做偃师的人,制造了一个和真人一模一样的人造人。结果假人因为向周穆王的侍妾们挤眉弄眼,惹得周穆王大怒。偃师怕周穆王把自己杀掉,就把这个假人拆开来,结果里头都是些皮革、木头等人造物组成的。
当可编程计算机首次被构想出来的时候,人们就在思考这台机器是否能够变得智能,这种想法在1842年Lovelace的时代就已经存在了,比第一台现代意义上的计算机还早了100年。

Ada Lovelace是第一位主张计算机不只可以用来算数的人,也发表了第一段分析机用的算法,一般也被认为是史上第一位程序员。尽管对于Ada是否是真正的第一个程序员有不少争议,但大多数人都不否认她是第一个明确看出分析机未来可以处理数字以外的大千世界的人。对于被认为更早就写出程序的后世被尊称为电脑之父的巴贝奇而言,分析机就是一个用来算数的机器,但Ada却看到如果有一台可以操作数字的机器,那么只要数字可以表示其他事物,像是字母、音符等,这台机器就可以按照规则,以数字来操作符号。这种构思其实就是一种非常早期的对于机器能否变得更加智能的思考,因此在讨论人工智能的时候,我还是很想把Ada拿出来放在其中。
如今,人工智能(AI)已经是一个充满活力的领域,具有许多实际应用并活跃于研究前沿。我们使用智能软件来自动完成重复性劳动、理解语音或图像、进行医疗诊断以及支持基础科研。
在人工智能的早期,研究领域迅速解决了一些对人类来说在智力上具有挑战性,但对计算机而言相对简单的问题:这些问题可以用一系列数学公式化规则来描述。而人工智能的真正挑战在于解决那些对人来说很容易完成,但却难以正式描述的问题,比如识别语音中的词语或图像中的人脸。对人而言,这些问题是非常直觉化的,甚至不需要“动脑子”就能找到答案,但对计算机来说,却是一个长期都无法被很好解决的难题。
本书关注的就是这些直觉化的问题。本书探讨的解决方案是让计算机通过经验学习并理解世界,它通过一个概念层级来实现,每个概念通过与简单概念之间的关系来定义。我们无需人为地定义知识点,计算机可以通过经验获取知识。这种概念层级允许计算机通过组合简单概念来学习复杂概念,如果我们用图形来表示这些概念之间的构建关系,这个图将有很多层,换句话说就是“非常深”,因此我们称这种方法为深度学习(deep learning)。
在过去,计算机常被用来解决那些规则相对简单的理想化环境中的问题,比如国际象棋。对人来说,这在智力上非常具有挑战性,但是计算机却能很简单地处理。但是那些人类看起来非常简单的事情:找到自己的母亲、做饭、叠被子、从一个人的动作神态中感受他的情绪等,却是计算机很难甚至可以说无法做到的。在三十年前,计算机就能击败世界上最优秀的国际象棋选手,但到读者写这份笔记的2026年,在LLM已经可以很好地和人沟通、交流地今天,做饭、叠被子依然是机器人几乎无法完成的任务。现实世界不具备理想化的环境,从而让计算机难以进行形式化语言表达。甚至可以说,计算机发展到今天,即便已经如此令人惊叹,但其本质还是200年前Ada所畅想地那样:通过数字来进行操作。即便是如今令人震惊的ChatGPT,依然也没有脱离这个范畴。
人工智能的发展焦点在于智能,这是基于人类自身所总结出来的一种特质。可以说,人们所说的智能,就是人类自己所具备的这种思维方式和思考能力。人类天生具备的对现实世界要素进行处理的能力计算机并不具备,因此如果想让这些乱七八糟的现实世界的要素让计算机学会,计算机才有可能表现出智能行为。
在人工智能发展的早期,知识库(knowledge base)被用来把现实世界的知识以形式化语言的方式硬编码进系统中。计算机依然可以用逻辑推理规则对这些形式语言进行推理。然而,没有任何一个该类项目取得重大成功。其中最著名的莫过于1989年的Cyc项目,这是一个推理引擎和使用CycL语言表达的知识数据库。人类监督员手动录入所有的信息,这是一个相当笨重的过程。人们很难用足够的复杂的形式规则来准确描述现实世界,例如,Cyc无法理解“有个叫做Fred的人早晨在刮胡子”,因为其推理引擎中发现故事中存在矛盾:人类没有电子部件,但是Fred拿着电动剃须刀,所以它认定“FredWhileShaving”是一个含有电子部件的实体,因此它提出疑问“Fred在刮胡子时还是不是一个人?”。
基于硬编码知识的系统所面临的困难表明,AI系统需要具备自主学习知识的能力,也就是通过从原始数据中提取模式来获得知识。这种能力被称为机器学习(machine learning)。
机器学习的引入使得计算机能够处理涉及现实世界知识的问题,并作出看似主观的决策。在读者的强化学习笔记的第一章中,作者们提到在上世纪70、80年代,大量的研究试错学习的人后来都转向了机器学习(特别是监督学习)。
简单而常见的机器学习算法包括逻辑回归(logistic regression)和朴素贝叶斯(naive Bayes)等。他们可以用于识别垃圾邮件、建议是否应该剖腹产等。这类监督学习(supervised learning)算法的性能很大程度上取决于输入数据的表示方式(representation)。例如,逻辑回归用于建议剖腹产时,并不会直接分析病人,而是由医生告知系统一些关键信息,比如是否存在子宫疤痕,这时每个信息点都被称为一个特征(feature)。逻辑回归学习这些特征与结果之间的关系,但它并不能影响这些特征是如何定义的。如果给逻辑回归模型一份病人的MRI图像,而不是医生的格式化报告,它将无法做出有效预测,因为MRI图像中的单个像素和剖腹产的并发症几乎没有关系。
这种对表示方式的依赖是计算机科学和日常生活中的普遍现象。在计算机科学中,比如数据检索操作,如果数据结构良好并被智能地索引,可以大大提高搜索效率。人类在处理阿拉伯数字时可以轻松计算,但是在使用罗马数字时则会变得异常困难。因此,表示方式对机器学习算法性能的影响是显著的。

书中给出了上图作为示例:假设我们想在散点图中通过画一条直线将两类数据分开,按照左图的笛卡尔坐标系,我们将无法完成该任务。但是如果把同样的数据转换为右图所示的极坐标系,那么画这条直线将变得非常轻松。可见机器学习算法的性能严重依赖于表示方式。
许多人工智能任务都可以通过设计合适的特征提取方法来解决,然后将这些特征输入一个简单的机器学习算法中。比如在语音识别中,一个有用的特征是说话人声道的大小估计值,它可以提供线索判断说话人是男性、女性还是儿童。然而,对于许多任务来说,我们很难甚至根本无从得知应该提取哪些特征。例如,我们想识别图片中汽车的程序,我们可能会去想把轮子作为一个特征,但轮子长得又千奇百怪,而且图片中可能会有阴影、反光、部分阻挡等。
为了解决特征提取的问题,我们可以使用机器学习来不仅发现从表示到输出的映射,而且还能自动发现表示本身。这种方法称为表征学习(representation learning)。这种方法通常比人工设计的表示能带来更好的性能,并且可以让AI系统在很少人工干预的情况下,快速适应新任务。
一个表征学习算法可以在几分钟内为一个简单任务发现良好的特征合集,或者在数小时到数月内解决复杂任务——这些复杂任务靠人工设计特征可能要耗费大量人力和时间。
一个典型的表征学习算法是自编码器(autoencoder)。自编码器由两部分组成:
- 编码器(encoder):将输入数据转换成另一种表示
- 解码器(decoder):将这种新的表示再转换回原始格式
自编码器的训练目标是尽可能保留输入信息,也就是编码后再解码,仍能还原出原始数据。同时,它也试图让新的表示具备某些良好的属性。不同类型的自编码器会追求不同的特性。我们在这些任务中的目标通常是分离出解释观测数据的“变化因素”(factors of variation)。这些因素是影响观测结果的独立变量。在本上下文中,“因素”一词仅表示独立的影响来源,这些来源通常不是通过数学乘法组合的。
这些因素不一定是我们直接观测到的数量,他们还可能是物理世界中不可见但影响可观察量的对象或力;抑或是人类大脑中构造出来的简化模型或抽象概念。比如说,在分析语音时,变化因素可能包括说话人的年龄、性别、口音和所说的词汇;汽车图片则包括位置、颜色、角度、光影等。
现实世界的人工智能任务之所以困难,很大一部分原因就在于此:这些变化因素会同时影响我们所能观测到的每一个数据点。比如,红色汽车在夜间图像中的像素可能接近黑色,汽车轮廓在不同角度中非常不同等。我们通常需要将这些变化因素解缠(disentangle),仅保留我们关心的部分而丢弃其他无关因素。
但是,在实际任务中,从原始数据中提取出这样的高级、抽象特征是非常困难的。当学习一个表示本身几乎和要解决的问题一样复杂时,表征学习看似并无帮助。这个时候,深度学习就能解决这个核心难题。
深度学习通过构建层级式的表示,把复杂概念用多个更加简单的表示层级来表达。深度学习让计算机能够将复杂概念逐步构建而成。

例如上图所示。上图展示了一个深度学习系统如何表示一个人的图像:它将人脸表示为简单形状组成的结构,比如边角和轮廓,而这些更小的元素又是由边缘等更基本的结构构成。计算机很难理解原始感官输入数据的含义,比如图中所示的图像对计算机来说就是一堆像素点,而从一个像素集合映射到对象身份的函数是非常复杂的。如果直接去学习或者评估这种映射,看起来几乎无法完成。深度学习通过将这个复杂的映射拆分成一系列嵌套的简单映射来解决这个困难。每一个映射由模型的一层表示:
- 输入首先被呈现在可见层(visible layer),这个名字是因为它包含的是我们可以观察到的变量。
- 然后,一系列的隐藏层(hidden layers)逐步提取图像中的抽象特征。
这些层之所以被称为隐藏层,是因为它们的值不会直接出现在数据中,而是模型需要自己确定哪些概念对解释观测数据有用。图中展示了每层所表示的特征类型:
- 第一个隐藏层通过对比邻近像素的亮度来识别边缘
- 在第一层的边缘基础上,第二个隐藏层能寻找角点和轮廓
- 在第二层的轮廓基础上,第三个隐藏层可以识别出整个物体的某些部分
- 最后,通过层层传递,模型就能找到图像中所包含的对象了。
这里看起来好像每一层都被“人为”地设定了一个目标,但其实这些特征是模型自己学到的。人类决定了用多少层、每层多少神经元、是否使用卷积层或池化层等,这些概念我们后续会学到,这里想要强调的就是人类只设计了学习的框架,并没有去定义要学习的特征。这里每一层的特征看起来虽然像设定的目标,但其实并不是的!
1980年代,神经科学家Hubel和Wiesel在研究视觉系统时发现人类的视觉系统在处理所看到的图像的过程中,通过了一系列的处理过程,包括边界检测、运动检测、立体深度检测、颜色检测等,最后在大脑中构建出具体的图像来。这个发型直接启发了深度学习中卷积神经网络“滤波器”的概念,后来LeCun等人用这一原理在手写数字识别(LeNet)中实现了图中所示的这一“神奇过程”,而这也成为深度学习研究的开端。
深度学习模型的一个经典例子式前馈式神经网络,也称为多层感知机(multilayer perceptron, MLP)。一个多层感知机就是一个数学函数,它将一组输入值映射为输出值。这个函数是由多个更简单的函数组合而成的,我们可以将每次应用不同的数学函数视为对输入的一种新的representation.
对深度学习的理解可以有两个不同的视角:
- 表征学习的视角:每一层都学习了输入的不同表示;网络越深,表示越复杂;后面的层可以引用前面的结果,形成更复杂的逻辑。
- 程序执行的视角:深度可以让计算机学习一个“多步骤的程序”,每一层就像计算机执行一个操作后的“内存状态”,更深的网络可以顺序执行更多指令。
衡量模型深度主要有两种方法:
- 第一种观点是基于该模型必须执行的顺序指令的数量,类似于计算流程图的最长路径
- 第二种观点则由深度概率模型(deep probabilistic models)所采用,将模型的深度视为不是计算图的深度,而是描述概念之间如何相互关联的图的深度。
在某些情况下,为了精细计算某个概念的表征,所需要的计算流程图的深度可能会远远超过概念本身层级的深度。例如,AI系统在识别人脸时,可能需要基于“是否有脸”的信息反复推理出另一只眼睛是否存在,从而产生更深的计算路径。由于人们选择的建模语言和图元素不同,对于模型“深度”的定义并没有统一标准。总体而言,深度学习可以理解为使用大量已学习函数或概念组合的模型构建方式,这使得它有别于传统机器学习。
下面的两张图说明了不同AI领域之间的关系及基本工作机制。


总而言之,深度学习是人工智能的一种方法,属于机器学习的一个分支。深度学习使得计算机能够通过数据和经验持续改进。作者认为,在复杂的现实世界中构建可用的AI系统,机器学习是目前唯一可行的路径。深度学习的独特之处在于它能将世界表示为一个嵌套的概念层级结构:每个复杂概念都建立在更简单概念的基础上,更抽象的表示由较少抽象的表示逐步推导得出。
深度学习已经在多个领域被证明是有用的,包括计算机视觉、语音和音频处理、自然语言处理、机器人学、生物化学、电子游戏、搜索引擎、在线广告以及金融。
深度学习的三次浪潮
深度学习虽然看起来像是个新鲜事物,但其实最早可以追溯到1940年代。这个领域经历了多次改名,并且在流行起来之前的多年间并不受欢迎。本节将对深度学习的一些基本背景和发展脉络进行整理总结。整体来说,深度学习经历了三次发展浪潮:
- 第一次浪潮:1940年代到1960年代的控制论(cybernetics) 时期,当时生物学系理论实现了最早的感知器模型,该模型支持单个神经元的训练
- 第二次浪潮:1980年代到1990年代的联结主义(connectionism) 时期,其特点是利用反向传播来训练具有一层或两层隐藏层的神经网络
- 2006年开始的深度学习复兴时期,并且直到2016年才开始在书籍形式中逐渐出现
第一次浪潮:控制论
我们今天所熟知的一些最早期的算法,本意是构造生物学系的计算模型(computational models of biological learning),比如对大脑中学习过程的建模。因此,深度学习曾被称为人工神经网络(artificial neural networks, ANNs)。在这一时期,一种比较流行的观点是,大脑本身就是一个很好的例子,足以证明只能行为的可行性,那么只要能通过逆向工程找到大脑中的计算原理,那么就构成了条通往智能的直接路径。同时,另一些观点认为即便不应用于工程或实际应用,了解大脑本身及人类智能的原理本身就是机器有趣并且有价值的。
神经科学家们发现扑入动物很可能通过一个单一的算法来解决大多数大脑所要处理的任务,其中研究的比较深入的就是视觉信号和大脑中负责视觉处理的区域的关系。神经科学家们在这个方向上进行了很多研究,并且总是能有一些“巧合”出现,让人们惊奇地发现一些算法和大脑内部神经运作惊人地相似。
现代的深度学习已经超越了这种神经科学视角对机器学习模型的定义,它指向了一个更广义的学习原理:多层次组合(multiple levels of composition)。这种组合方式可以应用于各种机器学习框架,而不一定需要从神经科学中获得启发。
现代深度学习的最早前身是从神经科学的角度出发的简单线性模型。这些模型被设计为使用一组n个输入x1, ..., xn并将它们与一个输出y相关联。这些模型希望学习一组权重w1, ..., wn, 并计算他们的输出f(x, w)=x1w1 + ... + xnwn。
1943年提出的McCulloch-Pitts 神经元是一个非常早期的脑功能模型,该线性模型通过检验函数\(f(x, w)\)的正负来识别两种不同类型的输入。显然,该模型的权重需要正确设置后才能使得输出结果符合期望。这些权重可以由操作人员设定。
在1950年代,感知机(perceptron)是第一个能根据每个类别的输入样本来学习权重的模型。同时期的自适应线性单元(adaptive linear element, ADALINE)则简单地返回函数\(f(x)\)本身的值来预测一个实数,并且它还可以学习从数据预测这些数。这个简单的算法大大影响了机器学习的现代景象。用于调节ADALINE权重的训练算法是被称为随机梯度下降(stochastic gradient descent)的一种特例。稍加改进后的随机梯度下降算法仍然是当今深度学习的主要训练算法。
基于感知机和ADALINE中使用使用的函数\(f(x,y)\)为线性模型(linear model)。线性模型有许多局限性,比如它们无法学习异或函数(XOR function),即\(f([0,1],w)=1, f([1,0],w)=1, f([1,1],w)=0, f([0,0],w)=0\):你无法找到一条直线能把这四个点区分开:

对该缺陷的批评引发了第一次浪潮的衰退。如今,神经科学被视为深度学习研究的重要灵感来源,但不再被视为主要指导,因为我们对大脑的信息依然知之甚少。我们如今对大脑最简单的部分都还没有理解,更不要说同时监测数千个相连的神经元的活动了。了解大脑在算法层面上如何工作的方向如今更多地被称为计算神经科学(computational neuroscience)。深度学习领域终究还是计算机科学领域的范畴,主要关注如何构建计算机系统来解决需要智能才能解决的任务。深度学习融合了线性代数、概率论、信息论、数值优化等,很多深度学习研究员完全不关心神经科学。
神经科学对深度学习最大的贡献之一,就是启发了通过计算单元之间相互作用而变得更智能的思想。1980年代,新认知机(Neocognitron)受哺乳动物视觉系统结构的启发,引入了一个处理图片的强大模型架构,并在后来成为了现代卷积网络的基础。
目前大多数神经网络是基于一个称为整流线性单元(rectified linear unit)的神经单元模型。该模型和真实的神经元计算函数并不同,但却能显著提升机器学习性能。
第二次浪潮:联结主义
第二次浪潮伴随着联结主义(connectionism)或并行分布处理(parallel distributed processing)潮流而出现。联结主义是在认知科学(cognitive science)的背景下出现的。认知科学是理解思维的跨学科途径,即它融合多个不同的分析层次。
在1980年代初,大多数认知科学家研究符号推理模型,但符号推理模型很难解释大脑如何使用神经元来实现推理功能。联结主义者于是开始研究真正基于神经系统实现的认知模型,其中很多复苏的想法可以追溯到心理学家Donald Hebb在1940年代的工作。
联结主义的中心思想是,当网络将大量简单的计算单元连接在一起时便可以实现智能行为。这种见解同样适用于生物神经系统中的神经元,因为它和计算模型中隐藏单元起着类似的作用。
联结主义的第一个重要概念是分布式表示(distributed representation)。该概念由Hinton等人提出,其思想是:系统的每一个输入都应该由多个特征表示,并且每一个特征都应该参与到多个可能输入的表示。例如,如果我们想识别红色、绿色、蓝色的汽车、卡车和鸟类,那么我们将有两种直观的方法来表示这些输入:
- 第一种方法是3x3=9种可能的组合,即使用9个神经元。每个神经元学习一个特定的类别,如红色汽车、红色卡车、红色鸟。
- 第二种是使用分布式表示,即用三个神经元表示颜色,三个神经元表示汽车、卡车和鸟类。如此一来,便只需要6个神经元了。同时,红色神经元还能从汽车、卡车、鸟类的图片中学习红色。
联结主义的另一个重要成就是反向传播算法(back-propagatioon algorithm)。该算法虽然曾一度黯然失色,但后来又重出江湖称为重要的主导方法之一。
1990年代,研究人员在使用神经网络进行序列建模方面取得了重要进展。Hochreiter和Schmidhuber引入长短期记忆(long short-term memory, LSTM)网络来解决这些难题。如今,LSTM在许多序列建模任务中广泛应用。
第二次浪潮一直持续到1990年代中期。当时很多基于神经网络与AI技术的创业公司开始寻求投资,他们野心勃勃但却有点不切实际。当AI研究还不能实现这些不合理的期望时,投资者感到失望。同时,机器学习的其他领域,如核方法(Kernel machines)和图模型(graphical models)在很多重要任务上实现了很好的效果。上述的两个因素共同导致了神经网络第二次浪潮的衰退。
虽然第二次浪潮离开了大众的视线,但在第二次浪潮退去、第三次浪潮兴起前,神经网络继续在一些人物上获得了令人印象深刻的表现。加拿大高级研究所(CIFAR)通过其神经计算和自适应感知(NCAP)研究计划帮助维持神经网络研究。该计划联合了分别由Geoffrey Hinton、Yoshua Bengio和Yann LeCun领导的多伦多大学、蒙特利尔大学和纽约大学的机器学习研究小组。这个多学科的CIFAR NCAP研究计划还囊括了神经科学家、人类和计算机视觉专家。
在那个时候,人们普遍认为深度网络(deep networks)是难以训练的。现在我们回头看,是因为当时的计算成本太高,没有可用的硬件来进行足够的实验。如今我们已经知道,1980年代就存在的算法就能工作得非常好了。
第三次浪潮:深度网络
第三次浪潮始于2006年的突破。Hinton表明名为深度信念网络(deep belief network)的神经网络可以使用一种称为贪婪逐层与训练(greedy layer-wise pre-training)的策略来有效地训练。其他CIFAR附属研究小组很快表明,同样的策略可以被用来训练许多其它类型的深度网络,并能系统地帮助提高在测试样例上地泛化能力。
神经网络研究的这一次浪潮普及了“深度学习”这一术语的使用,强调研究者现在有能力训练以前不可能训练的比较深的神经网络,并着力于深度的理论重要性上。此时,深度神经网络已经优于与之竞争的其他机器学习技术以及手工设计功能的AI系统。
在本书出版的时候,也即2017年,深度网络的第三次发展浪潮仍在继续。我们后面也看到了,Transformer架构的提出和ChatGPT引领的大语言模型,彻底重塑了人们查阅资料的方式,并在2025年仍飞速发展中。
与日俱增的数据量
很多人会问:为什么人工神经网络的第一个实验在1950年代就完成了,为什么最近才被认为是关键技术呢?深度网络长期被视为一种专家才能使用的艺术而不是技术。直到最近,随着训练数据的增加,所需要的技巧正在减少。目前在复杂任务达到人类水平的学习算法,与1980年代努力解决玩具问题的学习算法几乎是一样的。其进步的关键点就在于这些算法得以成功训练所需的资源。
由于我们的活动越来越多发生在计算机上,我们做什么也越来越多地被记录。由于我们的计算机越来越多地联网在一起,这些记录变得更容易集中管理,并更容易将他们整理成适于机器学习应用的数据集。因为统计估计的主要负担(观察少量数据以在新数据上泛化)已经减轻,因而机器学习在大数据时代变得更加容易。

上图展示了基准数据集的大小如何随着时间的推移而增加。一个粗略的经验法则认为,监督深度学习算法在每类给定约5000个标注样本情况下一般将达到可以接受的性能,当至少有1000万个标注样本的数据集用于训练时,它将达到或超过人类表现。此外,在更小的数据集上获得成功是一个重要的研究领域,为此我们应特别侧重于如何通过无监督或半监督学习充分利用大量的未标注样本。

上图是MNIST数据集的输入样例,Hinton将其描述为“机器学习的果蝇”,寓意机器学习研究人员可以在受控的实验室条件下研究他们的算法。
与日俱增的模型规模
1980年代,神经网络只能取得较小的成功,而现在神经网络非常成功的另一个重要原因就是我们现在拥有的计算资源可以运行更大的模型。联结主义的主要见解之一就是:当许多神经元一起工作时会变得聪明。

上图所示的序号代表如下模型:
- Adaptive linear element ( Widrow and Hoff, 1960 )
- Neocognitron ( Fukushima, 1980 )
- GPU-accelerated convolutional network ( Chellapilla et al. , 2006 )
- Deep Boltzmann machine ( Salakhutdinov and Hinton, 2009a )
- Unsupervised convolutional network ( Jarrett et al. , 2009 )
- GPU-accelerated multilayer perceptron ( Ciresan et al. , 2010 )
- Distributed autoencoder ( Le et al. , 2012 )
- Multi-GPU convolutional network ( Krizhevsky et al. , 2012 )
- COTS HPC unsupervised convolutional network ( Coates et al. , 2013 )
- GoogLeNet ( Szegedy et al. , 2014a )
截至本书所写的2017年,机器学习模型中的神经元连接数量已经和哺乳动物的大脑在同一数量级上,神经元连接数量在1000左右(这里的神经元连接数量指的是connections per neuron,即平均每个神经元连接多少个其他神经元)。自从隐藏单元引入以来,人工神经网络的规模大约每2.4年扩大一倍。这种趋势看起来将持续数十年,除非有能力迅速扩展新技术,否则至少要到21世纪50年代,人工神经网络才能具备人脑相同数量级的神经元。生物神经元表示的功能可能比目前的人工神经元所表示的更复杂,因此生物神经网络可能比图中描绘的甚至要更大。

上图中的序号对应如下:
- Perceptron (Rosenblatt, 1958, 1962)
- Adaptive linear element (Widrow and Hoff, 1960)
- Neocognitron (Fukushima, 1980)
- Early back-propagation network (Rumelhart et al., 1986b)
- Recurrent neural network for speech recognition (Robinson and Fallside, 1991)
- Multilayer perceptron for speech recognition (Bengio et al., 1991)
- Mean field sigmoid belief network (Saul et al., 1996)
- LeNet-5 (LeCun et al., 1998b)
- Echo state network (Jaeger and Haas, 2004)
- Deep belief network (Hinton et al., 2006)
- GPU-accelerated convolutional network (Chellapilla et al., 2006)
- Deep Boltzmann machine (Salakhutdinov and Hinton, 2009a)
- GPU-accelerated deep belief network (Raina et al., 2009)
- Unsupervised convolutional network (Jarrett et al., 2009)
- GPU-accelerated multilayer perceptron (Ciresan et al., 2010)
- OMP-1 network (Coates and Ng, 2011)
- Distributed autoencoder (Le et al., 2012)
- Multi-GPU convolutional network (Krizhevsky et al., 2012)
- COTS HPC unsupervised convolutional network (Coates et al., 2013)
- GoogLeNet (Szegedy et al., 2014a)
上述的数据展示和讨论都是基于计算系统角度来看的。但实际上,截至上图事件的网络,其实际上的神经系统甚至不如青蛙。因此,神经元比一个水蛭还少的早期神经网络不能解决复杂的人工智能问题是很正常的。
与日俱增的精度、复杂度和对现实世界的冲击
自1980年代依赖,深度学习提供的精确识别和预测能力一直在提高。2012年,深度学习在ImageNet大型视觉识别挑战中迅速崛起,将最高水准的前5错误率从26.1%降到15.3%。此后,深度卷积网络连续地赢得这些比赛,截至2017年,前5错误率已降低到3.6%,如下图所示:

在深度网络的规模和精读有所提高的同时,他们可以解决的任务也日益复杂。这种复杂性日益增加的趋势已将其推向逻辑结论,即神经图灵机(neural Turing machines)的引入,它能学习读取存储单元和向存储单元写入任意内容。这样的神经网络可以从期望行为的样本中学习简单的程序。例如,从杂乱和排好序的样本中学习对一系列数进行排序。这种自我编程技术正处于起步阶段,但原则上未来可以适用于几乎所有的任务。
深度学习的另一个最大的成就是其在强化学习(reinforcement learning)领域的扩展。在强化学习中,一个自主的智能体必须在没有人类操作者指导的情况下,通过试错来学习执行任务。DeepMind表明,基于深度学习的强化学习系统能够学会玩Atari视频游戏,并在多种任务中可与人类匹敌。深度学习也显著改善了机器人强化学习(reinforcement learning for robotics)的性能。
许多深度学习应用都是高利润的。同时,深度学习的进步也严重依赖于软件基础架构的进展,并支持重要的研究项目或商业产品。
深度学习也为其他科学做出了贡献,比如生物制药等。作者期待深度学习未来能够出现在越来越多的科学领域中。
总之,深度学习是机器学习的一种方法。在过去几十年的发展中,它大量借鉴了我们关于人脑、统计学和应用数学的知识。近年来,得益于更强大的计算机、更大的数据集和能够训练更深网络的技术,深度学习的普及性和实用性都有了极大的发展。未来几年充满了进一步提高深度学习并将它带到新领域的挑战和机遇。
深度神经网络
深度神经网络(Deep Neural Network, DNN)是一个广义的伞状术语(Broad Term),一般来说,任何满足以下两个条件的人工神经网络都可以被称为DNN:
- 由多个相互连接的节点(人工神经元)组成
- 有多个隐藏层,故而有“深度”
常见的深度神经网络包括:(按照时间顺序)
- MLP/DFF,深度前馈网络,第一个最为重要的神经网络模型
- RNN,循环神经网络,早期的序列建模尝试
- CNN,卷积神经网络,图像识别领域的巨大突破
- LSTM,长短时记忆网络,成熟的序列建模(RNN升级版)
- GAN,生成对抗网络,开启了AI生成的时代
- Transformer,用自注意力机制开启了大模型时代
- MoE,混合专家模型(仍然以Transformer为核心)
- Diffusion Models,生成领域的最新重要突破
一般我们说的深度学习,都是指深度神经网络。
神经网络结构
绝大多数深度神经网络都是由下列这样的结构组成的:

对于大部分神经网络,我们的目标就是通过不断调整网络内部的所有参数\(\Theta\),来让衡量其表现有多差的损失函数\(J(\Theta)\)的值变得最小。这里的参数就是上图中层和层之间的参数,代表神经网络传递过程中的传递机制。最终我们得到的结果,就是一个代表着概率可能的结论,比如“80%是老虎,15%是猫,5%是其他”。
当然,神经网络发展到今天,针对不同的目标和任务发展出了不同的架构,但是其本质核心思想和上面所说的并无太大差别。
为了让损失函数值最小,我们可以想象把损失函数画出来。当然实际的神经网络模型不可能只有两个变量,但是我们拿单变量及双变量来类比说明。
对于单变量的凸函数和非凸函数,其画面如下:

对于双变量的凸函数和非凸函数,其画面如下:

可以看到,凸函数就是有一个唯一的最低点的图像,这个最低点被称为全局最优解。而非凸函数除了那个最低的点,还有很多其他的像是小山谷一样的地方,这些地方叫做局部最优解。
几乎所有的深度神经网络的损失函数都是非凸的。因此训练深度神经网络模型,一般的意思就是说,找到这个深度神经网络模型损失函数的最低点(或者近似最低点)。
既然我们的目标是让损失函数最小化,那么我们就需要知道损失函数长什么样子。上面我们已经看到,神经网络就是由许多层组成的一个传递结构,在每一层到下一层的传递过程中,层间都会有一个对应的关系,也就是函数。我们将所有层间函数复合起来,就形成了我们的神经网络模型本身。我们使用损失函数来衡量模型的表现。因此在这里,有几个比较重要的概念总结如下:
- 输入x:也就是我们输入到神经网络中的向量,一般有很多维
- \(\Theta\):神经网络中所有可学习的参数,包括权重w和偏置b
- 神经网络模型:\(f(x;\Theta)\),即根据输入得到最终的输出
- y:真实标签
我们把上面的概念组合在一起,便得到了损失函数(Loss Function):
损失函数代表了模型在一道题目上的表现,比如你输入了一个图像向量,得到了一个结果;该结果表明图像(模型的预测)是个猩猩,但其实图像(真实标签)是个狒狒,这里在预测上的偏差就是损失(Loss)。之后类似的概念我们都用损失这个专业术语来说,以免出现歧义。
举例来说,我们设定狒狒是[0,0,1,0],猩猩是[0,1,0,0],然后我们把一张100x100像素的灰度图输入到模型里,这个输入x就是10000维的向量。经过神经网络各层参数的运算后,最终输出了一个包含4个数字的预测f(x;θ):[0.05,0.1,0.8,0.05]。这个结果表明,该神经网络认为该输入图片是狒狒的可能性是80%,猩猩的可能性是10%。然后我们发现这张图片其实是猩猩,我们把[0,1,0,0]和[0.05,0.1,0.8,0.05]对比计算一下,就得到了损失。
既然我们知道如何得到一张图片的损失,那我们就能知道如何得到10000张图片的损失。我们不断把图片输入到模型中,计算损失,根据损失情况再调整参数,最终使得模型对这10000张图片的损失降到尽可能低,我们就完成了一次神经网络训练。
为了方便衡量这个最终的损失数值,我们需要把每一张图片的损失统合整理到一个整体性的框架中,这个整体框架就是成本函数(Cost Function):
上面是一个成本函数的示例,其用了Stochastic Averaging来求所有损失的平均值,然后得到整体成本。在后面,我们用成本来形容整个神经网络模型在训练集中的整体损失表现。
现在我们再来仔细看一下神经网络模型\(f(x;\Theta)\)。
在神经网络模型中,输入数据后,经过层层计算和连接,最终输出结果。举例来说,每一层的若干个node,都会得到上一层的输入,这些输入经过权重W和偏置b来计算,可以得到一个数值,每一个node都可以得到这样一个数值,我们把这个过程叫做线性变换(linear transformation):
此刻得到的z是一个中间值,也叫做激活前的值(pre-activation)。
神经网络中结点的数量、连接方式、参数的存在等是模型本身的结构决定的,权重和偏置的具体数值通过训练学习来得到。当每一个结点接收到上述线性变换的结果z后,就对z本身进行一次非线性加工,然后输出一个最终的信号值,这个过程就是激活(Activation):
g就是激活函数。ReLU就是一种激活函数,你可以想象电视台要播出节目,制作组制作好片子后发给了电视台,电视台拿到这个成片(中间产品)后又审查了一下,发现这个片子充满暴力,可能会有负面影响,于是就不准播出,这个审查过程就是激活,不准播出就是激活函数的结果。
路径是神经网络结构决定的,然后这个值继续会经过权重w和偏置b的计算传递到下一层。在一次次训练中,权重w和偏置b不断被修正,以获得一个更好的神经网络模型。当最终我们把神经网络训练地能够得到一个几乎最低的成本函数时,此时带有权重和偏置信息的神经网络就是我们训练好的模型。
以上就是整个神经网络训练的大概思路,假设一个神经网络有三个隐藏层,那么其复合函数就是:
有时候我们会省略偏置b,而把神经网络写作:
其中每一层定义为:
万能近似定理
Linear model并不关注feature之间的关系,但以图像识别为例,像素和像素之间的关系并不是相互独立的,而是相互影响的。又比如今天的大语言模型,输入的内容中的每一个token和其他token之间的关系都会影响输出结果。
理论上,我们可以手动设计一个非常复杂的函数,我们称之为embedding(\(\phi(x)\))。由于手动设计这样的函数非常困难,因此我们设计了人工神经元:
- Input:该人工神经元接收多个输入信号(\(x_1,x_2,...,x_n\)),类似于生物神经元的树突
- Weights:对每个输入信号,我们都乘以一个对应的权重(\(w_1,w_2,...,w_n\)),权重代表了这个输入信号的重要性
- Sum:我们把所有加权后的输入信号加在一起,得到一个总的网络输入(Network Input Net)
- Activation Function:激活函数,这个综合的Net会被送入一个激活函数,该函数的作用是引入非线性,并决定神经元是否应该被激活以及激活的程度
- Output:激活函数输出的就是这个神经元的最终输出
我们把多个神经元并列放置,就形成了一个layer,来自input的所有特征会连接到这一层的每一个神经元上,每个神经元独立地进行“加权求和->非线性激活”的计算,最终输出一个结果。整个过程可以看做是一次并行的矩阵运算(输入向量X权重矩阵)加上一次非线性变换。
将多个这样的layer层串联起来,就构成了深度神经网络(Deep Neural Network, DNN)。前一层的输出,会变成后一层的输入。从数学上看,这就是一个层层嵌套的函数。
在这个过程中,如果没有非线性激活函数(Nonlinearities),整个DNN最终将会退化为一个简单的线性函数。因为多次连续的线性变换,其结果等价于一次线性变换。因此非线性激活函数是DNN可以建地很深,实现每一层来学习前一层无法表达的、更复杂的特征的重要原因。
现代的DNN拥有数百万甚至数十亿的参数(权重w),由于DNN是复合函数,因此我们利用微积分中的链式法则(chain rule) 来求导。这个工作流程是:
- 前向传播:从输入x开始,逐层计算,直到得到最终的输出和损失值L
- 反向传播:从最终的损失L开始,反向逐层计算梯度
在实际应用中,我们不需要手动实现反向传播。现代深度学习框架如PyTorch,TensorFlow,Keras等,都内置了自动微分功能,可以自动为我们构建计算图并执行反向传播。
我们费这么大劲训练DNN,它到底有什么理论上的优势?
万能近似定理 (Universal Approximation Theorem) (非正式地)指出,只要一个神经网络的宽度或深度足够,它就可以以任意小的误差 ε 去近似任何一个连续函数 f(x):
- 它可以是一个“ 浅而宽 ”的网络(一层,但有大量神经元)。
- 它可以是一个“ 深而窄 ”的网络(多层,每层神经元不多)。
实践证明,深层网络通常比浅层网络在学习复杂模式时更有效率。不过要注意,这个定理只保证了DNN有足够的表达能力(expressive power) 去“表示”任意函数,它不保证我们一定能通过训练(如SGD)找到正确的权重来学到这个函数。学习(训练)过程本身是另一个巨大的挑战。
梯度消失
梯度消失(Vanishing Gradients) 发生在反向传播过程中,其发生的根本原因就在于反向传播的链式法则。由于一个神经网络的梯度计算本质上是一长串导数的连乘,因此假设一个有L层的网络,损失函数L对第一层权重W1的梯度粗略地可以表示为:
当连乘的这些项大部分都小于1时,他们的乘积会随着层数的增加而呈指数级速度衰减,最终趋近于零。造成这种现象的主要原因包括:
- 饱和的激活函数:如Sigmoid函数的导数最大值仅为0.25,Tanh函数的导数最大值也仅为1
- 不恰当的权重初始化:如果权重被初始化为非常小的值,那么连乘中也会导致梯度衰减
现代深度学习一般用以下方法解决梯度消失问题:
- 使用非饱和激活函数,如ReLU;当输入>0时,ReLU的导数恒为1,因此梯度可以顺畅传播而不衰减
- Residual Connections 残差连接:ResNet的核心,通过创建捷径,让梯度可以直接跳过多层网络,无衰减地向前传播
- Batch Normalization 批归一化:将每层网络的输入重新调整到均值为0、方差为1的分布,使其落入激活函数的“非饱和区”,从而稳定梯度传播
- 更好的权重初始化:使用Xavier或He初始化方法,让权重从一开始就处在一个合适的大小,使得各层输出的方差保持稳定
梯度爆炸
与梯度消失相反,当连乘的这些项大部分都大于1的时候,他们的乘积会随着层数的增加而呈现指数级增长,最终变得非常巨大。梯度爆炸(Exploding Gradients) 会导致训练过程非常不稳定,损失值(Loss)剧烈震荡;在极端情况下,梯度值会超出计算机的表示范围,导致数值溢出,出现NaN,从而直接中断训练过程。
现代深度学习最常见的处理方法:
- Gradient Clipping 梯度裁剪:最直接有效的方案,设定一个梯度的上限阈值,如果在反向传播中计算出的梯度范围数超过了这个阈值,就手动将其缩放到阈值大小。这相当于给大喇叭增加了一个音量限制器。
- 更好的权重初始化
- Batch Normalization 批归一化
常见的DNN架构
具体的每个结构我们将在对应的章节中详细介绍,这里先留一个整体性的印象。
MLP
深度前馈网络(Deep Feedforward Network),也叫做前馈神经网络(Feedforward Neural Network)或多层感知机(Multilayer Perceptron, MLP),是典型的深度学习模型。这一部分的主要知识点在Ian经典教材的第六章,有时间可以详细阅读以下。因为现在赶进度,所以只做一些重点说明。
CNN
卷积神经网络(Convolutional Neural Networks) 的名字来源于数学中的卷积(convolution)操作:卷积作用于两个函数f和g,并生成一个新的函数。在CNN中,f通常是filter(滤波器)或者说kernel(卷积核),g是图像(image)。通过对他们进行卷积,即可生成一个新的图像,称为特征图(feature map)。
CNN相比于传统全连接网络,有着独特的优势,这种有事来源于被称为归纳偏置(inductive biases) 的两个关键设计原则:
- Locality 局部性:假设图像中临近的区域之间有更强的关联性;在实现中神经元只与输入图像的一个小局部区域相连接,而不是连接到所有像素。这有助于网络学习局部的模式(如边缘、角落等)并保持空间结构
- Translation Invariance 平移不变性:假设图像中某个特征(比如一只眼睛)无论出现在哪个位置,它都具有相同的意义;在实现中可以在整个图像上使用相同的滤波器(权重共享)来检测同一个特征,这意味着网络不需要在每个位置上重新学习识别同一个物体。

CNN通过不同的滤波器filter来捕捉图像中的空间依赖关系。CNN通过池化(Pooling)或者说下采样(Downsampling)来降低特征图维度。下图是一个经典的CNN模型——LeNet(1998)的结构和每一层的作用示意图:

CNN采用了机器学习中两个非常重要的特性:
- Equivariant 等变性:\(f(g(x))=g(f(x))\)
- Invariance 不变性:\(f(g(x))=f(x)\)

这两个特性本身不是CNN专属的,但是CNN非常好的利用了这两个特性:
- 卷积层是等变的
- 池化层引入不变性
- 整个CNN网络的目标是不变的
此外,依据上述特性,我们可以通过数据增强(Data Augmentation)来提升模型的泛化能力。其原理就是我们在训练时对原始数据进行各种变换,比如裁剪、旋转、翻转、调整颜色等,人为地创造出更多的训练样本,这样做等于是在告诉模型:这些看起来不一样的图片,其实都代表同一种东西。通过学习这些变换后的数据,模型能够学会对这些变换保持不变性,从而提高泛化能力。

RNN
循环神经网络包括RNN、LSTM、GRU等。
循环神经网络(Recurrent Neural Networks, RNN)是处理时间序列(Time Series)的经典模型。RNN的核心思想是:
- 采用顺序处理的方式:并不是一次性看完全部数据,而是一个时间步一个时间步地读取
- 关键在于隐藏状态(Hidden State, \(h_t\)),他会结合上一个时间步的记忆(\(h_{t-1}\))和当前时间步的输入(\(x_t\))来更新自己,形成新的记忆\(h_t\)。这个过程用公式表达就是:
- 最终的输出\(y_t\)由当前时间步的记忆\(h_t\)决定:

上图所示链式结构非常直观地展示了RNN的工作流程,其中:
- 最下面一行的蓝色圆圈是输入层,代表在不同时间点输入的数据,这构成了一个输入序列
- 中间一行的橙色圆圈是隐藏层,这是RNN的核心,每一个橙色圆圈都是一个时间步的隐藏状态,可以被看做是RNN到那个时间点为止的记忆,它包含了之前所有输入信息的摘要
- 在第t个时间步的隐藏状态\(h_t\)是由上一个时间步的隐藏状态\(h_{t-1}\)和当前时间步的输入\(x_t\)共同计算得出的,这个记忆会一直向后传递,影响后续所有时间步的计算
- 最上面一层是输出层(青色圆圈),代表在每个时间点的输出,第t个时间步的输出是由当前时间步的隐藏状态\(h_t\)
- 向上的蓝色箭头:就是将当前时间步的输入\(x_t\)传递到隐藏层
- 水平的绿色箭头:这就是循环(Recurrent)的核心所在,代表了记忆的传递
- 向上的粉色箭头:从隐藏层的记忆中生成输出
- 反向传播的红色箭头:时间反向传播(Backpropagation Through Time, BPTT)
RNN的核心问题和致命弱点是难以学习长距离的依赖关系。在模型训练的时候,梯度需要沿着这个长长的链条反向传播(红色箭头)。当序列很长时,梯度在传播过程中会不断地连乘,从而可能导致梯度消失、梯度爆炸、计算和内存开销过大等问题。
长短期记忆网络(Long Short-Term Memory, LSTM) 是一种非常重要的RNN变体,专门用来解决标准RNN的长期依赖问题。

相比于RNN仅依赖于一个隐藏状态作为记忆,LSTM设计了一个能记录更多内容的记忆机制:
- 创建一个名为细胞状态(Cell State)的通道,是LSTM的长期记忆核心,专门用来存储长期信息。这个通道像一个传送带,信息可以很容易地在上面流动而不会发生剧变,从而解决了梯度消失问题。
- 创建了三个可学习的gate来充当管理员,他们可以动态地、有选择的选择:
- Forget Gate:忘记哪些旧的记忆?决定从细胞状态中丢弃多少旧信息,1代表完全保留,0代表完全丢弃。
- Input Gate:存入哪些记忆?决定让多少新信息写入细胞状态,一个Sigmoid层决定哪些值需要更新,一个tanh层创建一个候选的新记忆向量:两者结合共同
- Output Gate:输出哪些记忆?
通过这种精巧的设置,LSTM能够主动管理信息流,既能保留重要的长期记忆,又能处理当前的短期输入,因此得名“长短期记忆网络”。信息在细胞状态上传递,只通过门的控制进行微调。
Generative Models
Generative Models,生成式模型,包括:
- GAN是对抗生成的代表,通过博弈生成数据
- Diffursion Models从噪声中还原生成数据
- VAE是概率生成的代表,从学习到的潜在空间中生成数据
等等。
这里要注意,虽然ChatGPT这样的大语言模型(LLM)现在也被用于机器人学(比如给机器人下达“去厨房给我拿个苹果”这样的高级指令),但具体执行动作的底层轨迹生成 ,更适合用Diffusion等模型来完成。因此,从机器人学的应用角度出发,介绍VAE、GAN和Diffusion是更直接、更对口的。而ChatGPT相关的内容参见Transformer一节。

上图展示了当今最流行的三种生成式模型范式以及不可能三角:
- Quality 质量:生成样本的逼真程度
- Speed 速度:生成样本的速度
- Coverage 覆盖率:模型能否生成各种不同类型的样本,覆盖真实数据的全部模式
不可能三角中的高多样性(覆盖率)指的是模型生成样本的丰富程度和覆盖面,比如你让他画狗,他能画出各种不同品种、不同姿势、不同背景的狗;快速采样的意思是从模型中提取或生成一个新样本的速度。其中:
- VAE倾向于快速采样和多样性(高覆盖率),但生成的样本质量通常较低
- GAN倾向于生成高质量图像和快速采样,但是有时候会牺牲多样性(模式崩溃)
- Diffusion Models倾向于高质量和高多样性,但代价是采样速度非常慢。
Transformer
Transformer是一个旨在完全取代LSTM的全新架构,其核心思想和RNN完全不同。RNN像人阅读一样,一个词一个词地处理,信息通过隐藏状态(记忆)在时间步之间依次传递。这种结构天然地包含了序列的顺序信息,但是缺点也非常显著:不能并行计算,必须算完第99个词才能算第100个词,因而在处理长序列时非常慢。同时,RNN在长距离上问题明显,LSTM缓解了这个问题,但信息从第一个词传递到第一百个词,依然要经过99步,路径太长,信息仍然可能丢失。
Transformer完全抛弃了RNN的思路,改为采用自注意力机制(Self-Attention):它一次性地看到整个句子,然后计算句子中的每个词对于其他所有词的重要性或关联度。其处理机制是并行的,因为所有词的重要性都是同时计算的,因而极大地利用了现代GPU的并行计算能力;同时句子中任意两个词之间的距离都是1,因此模型可以直接建立第一个词和第一百个词之间的联系,而无需信息逐步传递。
Transformer中一些非常重要的核心概念:
- Positional Encoding 位置编码:由于Transformer一次性看到所有的词,因而它本身无法分辨“狗咬人”和“人咬狗”的区别,于是Transformer使用一个独特的数字向量来让每个词获得一个位置编码向量来记录该词语在整个序列中的位置。
- Encoder 编码器:接收并完整阅读输入信息,然后将信息压缩为一组富含信息的数字向量(称为上下文向量或记忆)。编码让语言脱离了词语本身,让语言转换为一种代表着概念的向量。将人话转换为数字向量的过程就是编码(Encoding)。
- Decoder 解码器:接收来自Encoder的概念向量,然后根据这个概念向量所代表的抽象含义,一个词一个词地生成目标输出。将数字向量转换为具体的人类语言的过程就是解码(Decoding)。
这里注意,位置编码是Transformer独创的一个概念,而Encoder和Decoder则在更早的Seq2Seq架构(Sequence-to-Sequence)中提出。Transformer的革命性就在于用一种全新的方式来实现Encoder和Decoder。在RNN中,Encoder和Decoder分别由一个RNN和另一个RNN组成;LSTM中也是如此。
在深度学习中,Embedding是一个过程,这个过程将离散的、非数值的类别数据(如单词、用户ID、电影名称)转换成连续的、稠密的、低维的数字向量,其结果(也就是那个转换后生成的数字向量本身),也叫一个embedding或embedding vector。
举例来说,如果词典里有5万个词,你可以创建一个5万维的向量,对于猫这个词(假设是第500个词),就在第500个位置设为1,其他全是0。然而,这个方法向量维度太高,非常稀疏。所有词向量之间都是互相独立的(正交的),无法体现词与词之间的关系。比如,"猫" 和 "小猫" 的关系,与 "猫" 和 "汽车" 的关系,在数学上看起来完全一样。
我们采用更好的Embedding方法:我们不用一个5万维的向量,而是用一个比如300维的 稠密向量 (dense vector)来表示 "猫":
"猫"->[0.12, -0.45, 0.98, ..., 0.67](一个300维的浮点数向量)
这个向量不是随机的,它是通过在大量数据上 训练神经网络学习到的 。网络会调整向量中的数值,使得 意思相近的词,它们的向量在多维空间中的位置也相近 。一个经典的例子就是:embedding("国王") - embedding("男人") + embedding("女人") 在向量空间中会非常接近 embedding("女王")。embedding("小猫") 和 embedding("猫") 的向量会很接近。
总结来说,Embedding 就是一个 可学习的查找表 (learnable lookup table) 。输入一个词(或ID),它会输出一个能代表其语义信息的低维稠密向量,作为神经网络后续层真正的输入。
在Transformer中,Embedding被应用到了极致,并且增加了一个关键的补充:位置编码。我们来看一下Transformer在机器翻译任务重的具体完成步骤,来看一下Transformer是如何一步步将一句英文翻译为法文的:
阶段一:编码器(Encoder)
阶段一第一步:理解输入句子
- Tokenization: 将句子分割成最小的单元(token)。假设我们现在输入一句话,比如“The cat sat”,首先我们把这句话分为几个token:"The", "cat", "sat"。
- Token Embedding: 每个token都会通过一个可学习的embedding层(lookup table)来转换为一个固定维度的数字向量。例如,如果数字向量的维度是 512,那么这句话就变成了 3 个 512 维的向量。
- Positional Encoding: 在将词向量输入模型主体之前,每个词向量加上一个位置编码向量。因而最终输入=Token Embedding + Positional Encoding,这样模型接收到的每个向量就同时包含了词的语义信息(来自token embedding)和词的位置信息(来自positional encoding)。
阶段一第二步:编码层(Encoder Layer Processing)
这些准备好的向量会被送入一个由 N 层(原论文中 N=6)相同的编码器层堆叠而成的结构。我们来看其中一层是如何工作的:
- Multi-Head Self-Attention: 多头自注意力机制,让句子中的每个词都能“看到”句子中的所有其他词,从而理解上下文。对于 "cat" 这个词,自注意力机制会计算出 "The" 和 "sat" 对理解 "cat" 的重要性得分。然后,它会根据这些得分,将所有词的向量信息进行加权求和,生成一个全新的、包含了整个句子上下文信息的 "cat" 向量。这个过程对所有词同时并行进行。“多头” 指的是这个过程会并行地做多次(比如8次),每次关注点不同(比如一个头关注语法关系,另一个头关注语义关系),最后将所有头的结果拼接起来,获得更丰富的信息。
- Add & Norm: 残差连接与层归一化:将自注意力层的输入直接加到它的输出上(这被称为残差连接),然后进行层归一化。这是一种帮助网络更深、训练更稳定的技巧。
- Feed-Forward Network: 前馈神经网络,将上一步的输出向量,独立地通过一个简单的全连接神经网络。这可以增加模型的非线性能力,进一步处理信息。
- 再次Add & Norm.
这一整套流程(4-7步)构成了一个 完整的编码器层 。这6层编码器会依次处理这些向量,每一层都会让向量的表示更加丰富和抽象。编码阶段结束时,我们得到了一组最终的向量(每个输入词一个),它们是解码器可以随时查阅的、对原始句子的“深刻理解”。
阶段二: 解码器 (Decoder) - "生成"输出句子
解码器的目标是利用编码器提供的“理解”,一个词一个词地生成法文翻译。这是一个自回归(auto-regressive) 的过程。
首先解码器接收一个特殊的起始字符(start-of-sequence)作为第一个输入,告诉它开始生成,解码器启动。解码器同样由N=6 个解码器层堆叠而成。我们来看其中一层如何生成第一个法文词:
- 和编码器一样,起始字符也要经过词嵌入和位置编码。
- Masked Multi-Head Self-Attention:带掩码的多头自注意力,目的是让解码器在生成当前词时,只能“看到”它已经生成的那些词。其过程与编码器的自注意力类似,但带有一个“掩码 (mask)”。因为现在只生成了第一个词,所以它只能看到起始符
<s>。这个掩码确保了模型不会“作弊”去偷看未来的答案。 - Cross-Attention:这是连接编码器和解码器的桥梁,目的是让解码器回顾编码器对原始英文句子的理解。这一层的输入来自上一步(带掩码的自注意力),但它的计算过程会去查询 编码器最终输出的那组向量 。它会问:“基于我现在要生成一个法文词的需求,英文句子里的哪个词最重要?”。它可能会发现 "The" 和 "cat" 在此刻最重要。
- 前馈网络及归一化:与编码器中的步骤完全相同(残差连接、层归一化、前馈网络...)。
Output Embedding: 在Decoder的最后,模型会生成一个最终的向量。为了将这个向量变回一个具体的词,需要再经过一个线性层和一个Softmax层,这个线性层本质上也是一个embedding层(通常与输入层的 Token Embedding 共享权重),它将高维的语义表示投影回词汇表空间,从而预测出下一个最可能的词。
以我们正在讨论的翻译任务为例具体来说明:经过N=6 层解码器层的处理后,我们得到一个最终的输出向量。这个向量会经过一个 线性层 (Linear Layer) ,将其维度放大到整个法文词典的大小(比如3万个词)。然后通过 Softmax 函数 ,将这些数值转换成每个词的生成概率。我们选择概率最高的那个词,比如 "Le" ,作为第一个输出。
"Le" 现在被当作解码器在 下一个时间步的新输入 。然后解码器重复之前的整个流程,直到生成一个特殊的终止符 </s> (end-of-sequence) 为止:
- 准备新一轮的输入,此时输入序列变成了
<s>和"Le"。这两个词会分别经过词嵌入和位置编码,形成一个新的输入序列向量。 - 再次通过解码器层:这个新的序列向量被送入N=6层的解码器中。在 Masked Multi-Head Self-Attention 步骤中,模型会处理
<s>和"Le"。当计算"Le"的注意力时,掩码机制确保它只能关注到自己和前面的<s>,而不能偷看未来。在 Cross-Attention 步骤中,解码器会再次审视编码器对 "The cat sat" 的理解。但这一次,它的问题变成了:“我已经说了'Le',现在应该生成什么词?” 此时,注意力机制可能会高度聚焦于编码器输出中与 "cat" 对应的那个向量。 - 后续的前馈网络等步骤与之前完全一致。
- 生成第二个词 :经过所有解码器层后,最终的输出向量通过线性层和Softmax函数,预测出下一个最可能的词,这一次很可能是 "chat" 。
- 循环往复 : 现在, "chat" 又被追加到输入序列的末尾。在第三轮中,解码器的输入是
<s>,"Le","chat"。它将重复上述所有步骤,并利用交叉注意力去关注英文句子中的 "sat",最终生成 "s'assit" 。
这个自回归(Auto-Regressive) 的过程会一直持续下去,每一步都将上一步的输出作为下一步的输入,直到模型预测出概率最高的词是特殊的 终止符 </s> 。当这个符号被生成时,解码过程停止,翻译任务完成。
最终,通过这个逐词生成、循环往复的过程,模型便将 "The cat sat" 完整地翻译成了 "Le chat s'assit"。
Transformer 是一种极其通用的架构,其影响力已远远超出了它最初的自然语言处理(NLP)领域。当前最著名的一些大语言模型,如 GPTs (Generative Pre-trained Transformers)、PaLM、LLaMA 等。这些模型无一例外都是基于 Transformer 架构构建的。
同时,Transformer也被应用于计算机视觉领域:Vision Transformer (ViT)。ViT 将一张图片分割成一个个小图块(patches),然后将这些图块“展平”成一个序列。之后,ViT 就可以像处理一句话里的单词一样,用标准的 Transformer Encoder 来处理这些图块序列,从而实现图像识别等任务。这完全颠覆了此前由卷积神经网络(CNN)统治的计算机视觉领域。
在强化学习领域,Decision Transformer通过序列建模来解决强化学习:它将强化学习中的轨迹(即一系列的“状态-动作-奖励”组合)看作是一个长序列。然后,它训练一个 Transformer 模型来预测在这个序列的下一步应该采取什么“动作”。这把一个复杂的决策问题,转化成了一个 Transformer 极其擅长的序列预测问题。
Transformer的成功并非偶然,它高度scalable:由于其并行化的设计(没有RNN的顺序依赖),我们可以通过增加模型大小、数据量和计算资源,来持续地、显著地提升其性能。当前的大语言模型竞赛,本质上就是 Transformer 架构可扩展性的直接体现。
Transformer与传统模型的对比:
- vs. CNN : CNN 的“视野”受限于卷积核大小,难以捕捉全局和远距离的依赖关系。
- vs. RNN/LSTM : RNN/LSTM 必须按顺序处理数据,训练速度慢,且受梯度消失影响,学习长距离依赖仍然困难。
- vs. MLP (全连接网络) : 参数量过大,无法处理可变长度的输入(比如长短不一的句子)。
在Sutton的著名文章《The Bitter Lesson》中,Sutton直言AI 领域最惨痛的教训是,那些试图模仿人类知识、构建复杂精巧规则的方法,长远来看总是输给那些简单、通用、并能充分利用巨大计算能力的方法。成功的两大通用方法是搜索 (Search) 和 学习 (Learning) 。Transformer 正是“学习”这条路线的完美典范。它的设计简单通用,使其能够最大限度地利用当今海量的数据和算力,通过“暴力”学习来获得惊人的智能。
值得注意的是,虽然我们都知道ChatGPT等现代大语言生成式模型的核心架构就是Transformer,但是Transformer本身是一种架构(architecture),而不是一种模型类型。准确来说,ChatGPT属于和VAE, GAN, Diffusion(接下来的小节中会讲到)不同的另一大类生成模型——自回归模型(Autoregressive Models)。
Transformer既可以用于生成式模型,也可以用于判别式模型:
- GPT,仅解码器。GPT的唯一任务就是预测序列中的下一个词,所以是一个纯粹的生成式模型。典型应用:聊天机器人、文章写作、代码生成。
- BERT,仅编码器。BERT的目标是深度理解文本,因而核心任务用于理解和分类数据,典型应用包括情感分析、文本分类、问答系统等。