跳到主要内容

必要的地基 — 一台机器怎么从数据里学

这一章讲三件事: 一台机器「从数据里学」到底是在学什么; 一个最小的计算零件长什么样,把它堆深了会碰到哪三种病; 以及治这三种病的那一整套工具,每一样是从哪次具体的失败里挣出来的。

它在全书链条里的位置:第 01 章说「这一轮的第一件事是统一底座」, 而底座是用这一章的零件搭起来的。第 03 章那套结构里的每个部件, 在这里都能找到它的来历。

顶层全景:这一章的五个零件

一张图 / 一句话

├─ ① 换成一串数 ── §3 表示

├─ ② 一堆小单元各自加权求和 ── §4 §5 §6 网络本体
│ (卷积、循环是它的两种特化 §7 §8)

├─ ③ 看结果离答案差多远 ── §14 评分表

├─ ④ 反推每个数该往哪挪 ── §1 §9 §10 走路的方式

└─ ⑤ 挪的时候别把自己弄崩 ── §11 §12 站稳与别背题
然后回到 ②,重复几万亿次

图说: 这五步就是「训练」的全部。后面十六章讲的一切, 无论是几千亿参数的大机器还是会动手的智能体,底下转的都还是这五步。

1. 三十年低谷:为什么 1986 年就有的东西要等到 2012

讲这套东西,绕不开一个略带残酷的事实。

反向传播(把「答得离正确答案有多远」这个差距从最后一层一路倒推回去、 自动算出每个数该往哪挪的一套做法)早在 1986 年就发表在《自然》上了。 理论上从此「有多深就能训多深」;离它真正引爆,却还要再等二十多年1

它算出来的那个「该往哪挪、挪多少」有个名字叫梯度: 把某个数往上调一丁点,差距会变大多少。梯度为正就说明该往小调,反之亦然。

这二十多年里现实很不客气:哪怕只是三四层的网络,训起来也常常什么都学不到, 或者数值直接发散。算力和数据的瓶颈雪上加霜——处理器只有几兆赫,标好答案的数据少得可怜。

90 年代到 2000 年前后,另外几条更传统的统计路线快速崛起。 它们理论漂亮、效果稳定、需要的数据和机器都更友好。 学术会议上这类网络的论文越来越少,甚至传出「投稿带 neural network 字样会扣分」的说法2

但有三个人没走开。辛顿留在多伦多,靠加拿大高等研究院从 1987 年起的一笔不大的经费, 继续做「计算与感知」;杨立昆在贝尔实验室继续推那种专门看图像的网络, 1998 年他做出的那套系统已经被用在银行支票的手写数字识别上; 本吉奥在蒙特利尔做语言建模和词的分布式表达3。 三人常常通信、互评文章、互推学生——在低谷年代,这个紧密的小圈子是研究还能活下去的关键。

转折在 2006 年前后。他们用一层一层的无监督方式给深网络的初始数值「打底」, 让七八层的网络第一次能稳定训练;这条间接路线后来基本被更直接的做法取代, 但它重新证明了「多层表达可以在实践中训出来」4

然后 2012 年,所有积累汇到一起。更深的那种专看图像的网络、一种新的弯折函数、 随机让一部分计算零件休息、把图片翻转裁剪造出更多样本、拿游戏显卡来训练—— 这些东西被塞进同一个系统去参加一场图像识别比赛, 把前五名内答对率的错误从第二名的约 26.2% 一举降到 15.3%, 差距大到组委会一开始怀疑出了 bug5

这段历史不是花絮。 这一章后面要讲的每一样工具, 没有一件是坐在白板前凭空设计出来的:那个弯折函数是为了治信号衰减, 初始化方案是为了让数值不在层间走样,随机休息是从银行柜员换岗里想出来的防背题招数, 那条跨层的近路是为了把网络捅到上百层硬挤出来的6每一件都对着一次具体的训练失败。

2. 「从数据里学」到底在学什么

先把这件事说到最朴素。

给一台机器一些输入和一些希望它给出的答案,让它不断修改内部那些数字, 使自己的输出越来越接近那些答案。这就是全部7

真正重要的是它背后那种方法论的调转。传统程序是先由人把规则明确写出来,再让机器执行; 这条路反过来,人只给数据,让机器自己从中吸收规律。判断一封邮件是不是垃圾邮件, 你可以手工写一大堆规则,但规则总会漏掉新情况,也很难覆盖复杂组合。

学的方式不止一种,书里分了三类。最直观的是监督学习 (输入和标准答案都给,让机器学从输入到答案的对应关系), 图像分类、情感判断、垃圾邮件识别都属于这一类。

另一类是无监督学习(不给答案,让机器自己从数据本身里找结构), 比如把相似的东西聚成一堆。

它有一个很重要的变种叫自监督(答案不由人给,而是从数据自己身上挖出来—— 比如遮住一段文字的后半截,让它猜被遮的部分)。今天的大模型几乎都建立在这条思路上。

再往后是强化学习(不给答案,只在事后给一个「这次做得好不好」的分数, 让它自己试出该怎么做)。它在智能体和一部分「练完之后再调教」的场景里会再次出现, 第 06 章和第 13 章各讲一次。

不管哪种方式,都离不开两个基本问题:第一,这台机器得有足够的表达力, 装得下我们希望它学到的规律;第二,它不能只是把训练用的数据死记硬背, 而要学到能用在新样本上的模式。前者关乎结构,后者关乎第 13 节要讲的那件事(别让它只会背题)。

所以从一开始就别把它想成一个会读规则手册的程序。它不读手册, 它读的是那一封封被人标好答案的邮件,从里面把「什么算垃圾」一点点压出来。 压缩,而不是背诵,才是它变强的方式。

3. 为什么必须先把世界换成好学的形状

那么它到底在压缩什么?答案是表示——先把世界换成一种适合学习的内部表达。

这件事之所以重要,是因为原始数据往往并不是最适合直接做判断的形式。 以图像为例:一张猫的照片和另一张猫的照片,在像素层面可能完全不同——角度不同、 光线不同、背景不同、大小不同。如果只能直接比较原始像素,机器会发现 「同一类东西之间差异很大,不同类东西之间有时又局部很像」,学起来极其困难8

好的表示要做的,是把不重要的差异压下去,把真正决定成败的结构凸显出来。 于是猫狗之分不再依赖每个像素是否一致,而更多依赖耳朵、轮廓、纹理这些更稳定的中层线索; 对一句话的理解也不再停留在字面,而会逐步形成关于谁在做什么、这句话在讲什么的内部表达。

深层网络之所以有效,很大程度上就在于它能把这件事做成分层的: 靠近输入的层更擅长学局部和低级的东西(边缘、短距离的搭配), 更深的层则逐步把这些整合成更抽象、更全局的概念9。 对视觉来说是从纹理到部件再到对象,对文字来说是从词到句子结构再到意思。

这和早期「人手工设计线索 + 一个简单模型」的做法有本质区别: 那时人要先想好该看哪些线索,再把它们交给模型去分类; 现在把「学线索」和「做任务」合在了一起,机器在整个训练过程中同时学习什么样的表达才最有用。

对今天的大模型来说这一点被放大了。它不是围绕单一任务训练的, 要在同一套数字里同时装下语言规律、事实、前后关系、代码模式、对话风格。 这意味着它学到的表示必须足够一般,既能撑住具体任务,又能在任务之间迁移—— 后面第 05 章说「预训练学出来的是一套非常大的表示空间」,说的就是这件事。

不过序列数据还有一个额外难题:输入不是一个固定长度的东西,而是一串有先后的信息。 机器光知道「有什么」还不够,还得弄清「谁和谁相关」「先后顺序是什么」。 第 03 章那套机制就是用来回答这个问题的。

4. 一个人工神经元:加权求和加一次弯折

现在拆最小的那块积木。

一台神经网络就是把大量简单的小零件连成一层、再一层层堆起来的东西。 它里面那个最小的计算零件(叫神经元,也叫单元)简单到几乎不像「智能」: 它接收若干个输入,每个输入配一个数表示这一路该被看重多少,把它们乘起来加在一起, 再加上一个可调的偏移量,最后过一次弯折,输出一个数10

那个「该被看重多少」的数就是第 01 章讲过的权重;那个可调的偏移量叫偏置 (不管输入是什么都会被加上的一个常数,相当于给这个单元定一个起跳线)。 三者合在一起,构成一个可调参的「小判断器」。

一个这样的单元能做的事极其有限。真正神奇的是把这块小积木重复使用几百万次之后 长出来的整体行为。

这块积木的历史比很多人想象的更戏剧化。1950 年代有人提出过它的原型, 当时媒体热情高涨,仿佛会学习的机器马上要走出实验室;可十来年后人们发现, 单层的它连一个简单的异或问题都解决不了—— 「两个开关中恰好一个打开时灯亮」,把四种情况画在平面上,亮灯点和灭灯点像棋盘格一样交错, 没法用一条直线分开11。单个单元只能画一条分界线,所以它当场就败下阵来。

这个故事的寓意至今适用:力量不在于「一个单元有多聪明」, 而在于许多简单单元如何被组织成层、用弯折连起来、并由数据训练出来。

把 m 个单元并排放,每个都接收同样的输入、各自学不同的权重,这一排就构成了一。 一层的输出是一串数,每一位对应一个单元的响应。这串数有个名字叫向量 (就是一串按顺序排好的数,比如 [0.3, -1.2, 0.8])。

把很多向量按行摞起来,就成了一个矩阵(一张数表,有行有列)。

用矩阵写出来,一整层的计算就压成一行算式:输出 = 弯折(权重矩阵 × 输入向量 + 偏置向量)12。 这个写法既数学优雅,也天然适合显卡并行——矩阵乘法正是显卡最擅长的事。 现代深度学习能跑这么快,根本原因之一就在这里,而这条线会一直延伸到第 09 章。

5. 为什么非得有那个弯折

那个弯折,行话叫激活函数,是这个单元里唯一不「按比例放大缩小」的环节。 它的存在是让多层比单层更强的关键。

先说什么叫线性:输入翻倍输出也翻倍、两个输入相加输出也相加,就是线性。 一个矩阵乘法就是线性的。

非线性就是不满足这条性质的运算——比如「负的一律归零」, 输入从 −1 变成 −2,输出还是 0,并没有跟着翻倍。

为什么非得有它?假设那个弯折是线性的,比如「乘以 2」。那么两层网络就会化成 「4 × 权重矩阵二 × 权重矩阵一 × 输入」。可两个矩阵乘起来还是一个矩阵。 无论堆多少层,最终都等价于单层,深度就完全浪费了13。 这个推演你可以自己在纸上做一遍,它是「深度」这件事成立的全部前提。

历史上这个弯折换过几代。最早是一条 S 形曲线,输入很小时输出趋近 0, 输入很大时趋近 1,中间平滑过渡;值域在 0 到 1 之间,符合「可能性」的直觉, 所以早期是默认选择。但它有一个致命弱点:输入很大或很小时,曲线几乎变平, 斜率接近零,意味着这一层的信号几乎传不回去14。这个问题困扰了这一行近二十年。

2012 年之后换上的那个简单得令人惊讶:负的归零,正的不变,仅此而已(它的名字叫 ReLU)。 就是这么一个规则改变了深网络的训练——它在正的那一半斜率恒为 1,信号不会衰减, 可以一路传到最深的层;它算起来极快,一次比较一次赋值,不用开方取幂; 它还让输出变得稀疏(大约一半单元输出为零),既省计算,也和真实神经元大部分时间沉默的情况相符15

它只有一个明显缺点:如果某个单元的输入一直是负数,它就永远输出 0、永远收不到更新信号, 这个单元就「死」了。后来出现的几种改良(把硬截断改成平滑过渡、把「该不该通过」 从硬开关改成软门)都在修这一点,今天主流大模型里那一块几乎都用这一类改良版16

实践经验很朴素:不知道用什么就用 ReLU;想进一步调优,再试那几种带闸门的变体。 它们不是「更聪明的非线性」,只是「更适合大规模训练的非线性」17

6. 层层堆叠:深度带来的是什么

把「一层」当作模块,多个模块串起来,每一层的输出作为下一层的输入, 这种网络叫前馈网络(信息单向从输入流向输出,中间没有回路,所以叫前馈)18

最左边是输入层,直接对应原始数据的每一位;最右边是输出层,对应要预测的东西; 中间那些叫隐藏层——之所以「隐藏」,是因为它们不直接接触外部世界, 只在网络内部传递中间结果。

前馈网络在今天的主流叙事里地位不显,但它从未离场。第 03 章那套结构里的 前馈子层就是一个两层的小前馈网络,而且大部分参数其实都在这种前馈里,不在别处19。 今天最先进的大模型,骨子里是「若干条负责『该看哪里』的路由」加「大量小前馈网络」的组合体。

为什么要多层?如果只用单层不就能做线性划分了吗?答案是:多层能让网络学到层次化的抽象。 在图像识别里,一个训练好的深网络,浅层大致在检测边缘(横边、竖边、斜边); 再往上检测局部纹理和小形状;再往上开始检测部件;最深层才识别出整个物体20没人教它这样分工,它自己就分了。

更令人惊讶的是,这种「浅层学边缘」的现象早在 1959 年就被人在猫的视觉皮层实验里发现过: 把电极插进麻醉猫的初级视觉皮层,发现某些神经元对特定方向的亮暗条纹产生强烈响应。 卷积网络训练后,第一层自发学出来的东西常常很像这种条纹21。 两个相隔半个世纪的发现指向同一件事:自然图像里很多有用的底层线索,都和方向性的边缘有关。

理论上还有一个经典结论:一个只带一个隐藏层、但这一层足够宽的网络, 能以任意精细程度逼近一大类连续函数。这句话听起来很强,但有三个常被忽略的限制: 所谓「足够宽」可能需要天文数字个单元;它只保证好参数存在,不保证训练能把它们找出来; 它讨论的是连续函数,而现实里很多关系并不连续22

实际经验因此是:深通常比单纯变宽更划算。同样想表达复杂关系, 一个 10 层、每层 100 个单元的网络,往往比一个 2 层、每层 10000 个单元的网络更容易学出有用的表达, 也更省参数23。深度带来的与其说是更多参数,不如说是更复杂的函数复合方式。

7. 卷积:看图像的两个想法

前馈网络最通用,而「通用」常常意味着「在专门问题上不够好」。图像就是典型例子。

先算一笔账。一张 224×224 的彩色图,摊平后有大约 15 万个数值。 如果第一层有 1000 个单元,光这一层就需要 1.5 亿个参数24。 既费数据也费算力。

更深的问题是,前馈网络把每个像素都当成独立的线索,完全不考虑它们在空间上的邻近关系。 而图像的信息恰恰藏在空间结构里:相邻像素往往属于同一个物体; 同一个视觉模式(比如眼睛)可能出现在图像的任何位置。

书里给了一个很扎心的例子:假设训练集里所有的猫都居中出现。 训练完之后模型学会了「中心位置出现特定像素模式 = 猫」。 测试时如果一张图里的猫在左上角,模型立刻傻眼——它看到的线索出现在了「陌生位置」25

卷积(用一小块权重在整张图上滑动、每个位置都做同样的加权求和)正是为此而生。 它靠两个想法解决上面两个问题。

第一个想法是局部连接: 每个单元只关注图像的一小块区域(比如 3×3),不再和整张图相连。 这符合图像的局部性——要识别「一条边缘」,只需要看邻近几个像素,不必看整张图。 这一改直接把参数数量砍了几个量级:原本 1.5 亿参数的第一层, 局部连接后一个单元只看 3×3×3 = 27 个输入26

第二个想法是参数共享: 用同一组权重在整张图上滑动,每个位置都用同样的权重做加权求和。 这一组会滑动的权重叫卷积核(一小块数表,像一个模板;图像的某处如果和模板匹配, 该位置的输出就很大)。参数共享的好处不只是进一步减少参数,更重要的是: 无论某种模式出现在图像的哪个位置,都会被同一个卷积核检测到27

一层通常有多个卷积核,分别检测不同的模式:一个可能检测水平边缘, 另一个检测垂直边缘,第三个检测某种颜色斑点。每个核在整图上滑一遍产生一张特征图, 一层的输出就是这些特征图叠起来。

卷积之后一般还会做一次汇聚(在每个小区域里只保留一个代表值, 最常见的做法是取最大值,把图缩小一倍);它更常见的另一个名字叫池化—— 同一件事的两个说法。它有两个作用:降低分辨率、减少后续计算; 以及让小幅度的位置变化不影响输出——猫的眼睛偏左一点还是偏右一点,取完最大值后结果几乎一样28

典型的架构就是「卷积 + 弯折 + 汇聚」反复堆叠,最后接几个全连接 (每个单元都和上一层所有单元相连)的老式层做判断。每经过一轮, 空间尺寸变小、通道数增加——这正对应着「由具体到抽象」。

8. 循环:处理序列,以及它记不住远处

图像有空间结构;文字、语音、视频、股价则有另一种结构:时间结构。

先说什么叫序列:一串有先后顺序、而且长度不固定的数据。 一段文字的第三个词依赖前两个词;一段语音的第五帧延续着前四帧;一支股票的明天取决于历史走势。

前馈网络和卷积网络在这里水土不服,毛病出在两处。头一处是长度不固定: 一个句子可能 5 个词,也可能 50 个词,而前馈网络的输入有多宽是写死的。 另一处是依赖往往是长程的:「小明说他没看见小红,因为她藏在桌子后面」, 要弄清这个「她」指谁,得跨越大半句话把前后连起来,而前馈网络压根没有这种跨位置的机制29

循环神经网络(每处理一个位置就更新一次内部状态,并把这个状态带到下一个位置)正是为此而生。 它给网络配了一个隐状态——一个随时间变化的内部向量,相当于一块随时被覆写的小黑板。 下一时刻的计算同时依赖当前输入和上一时刻的隐状态30

直觉上:每一步都把「之前看到的东西」和「现在看到的东西」揉在一起,形成新的记忆 (这里说的记忆就是那个被一路带下去的隐状态,不是外部数据库)。 这就像你读一句话的过程,每读一个词,都会基于前文的理解来消化当前词。

它最关键的一点是:虽然序列在时间上展开很长,但不同时间步共享同一套权重。 这有点像卷积在空间上共享卷积核,循环网络在时间上共享权重。 参数数量不随序列长度变化,这对处理变长序列至关重要31

但它有一个顽疾:记不住太久以前的信息。为什么?信息在隐状态里层层传递, 每一步都经过一次同样的权重矩阵乘法。

如果这个乘子小于 1,信息就会越滚越小,30 步就是这个数自乘 30 次—— 这种越滚越快的衰减方式叫指数衰减;反过来乘子大于 1,它又会同样快地放大直到爆炸32

书里给的例子很好记:「我生在上海,小时候和外婆住在外滩的一条弄堂里, 后来搬到了浦东……(中间三百个字)……所以我的母语是___」。 要猜对这个空,需要记住开头那句「我生在上海」; 朴素的循环网络几乎做不到,信息一路衰减,到结尾已经看不清开头了33

后来的改良给它加了一条「信息高速公路」和三道闸门:一道决定上一步的内容哪些该忘掉, 一道决定当前输入哪些该写进去,一道决定内部内容哪些该输出。 三道闸门都是输出在 0 到 1 之间的小网络,0 表示完全关闭,1 表示完全打开34。 这套改良在 2010 年代中期几乎是许多语言任务的标配,直到 2017 年被第 03 章那套结构正面打穿。

9. 训不动的三种病

把网络堆深了会碰到三种性质不同的病。分不清它们,排错时就会乱改。

第一种是走不动。 训练本质上是在一片崎岖的地形里找低处。 理想情况是一只光滑的碗,无论从哪出发,一直往下走都能到碗底。 但真实地形远非如此,它充满局部最优(周围都比它高、但并不是整个地形最低的那些小坑)、 大片平坦区,还有大量鞍点(某些方向像最低点、另一些方向像最高点的位置)35。 至于整个地形真正最低的那个点,在实践中几乎从来不是目标。

鞍点麻烦在它「骗人」:走到附近时,往哪个方向都感觉不到明显下坡, 看起来像已经走到头,其实只是被困在一个没有下降信号的区域。 而在高维(参数不是两三个而是几百万几亿个)空间里,这种情形比真正糟糕的局部最优常见得多—— 要构成局部最优,所有方向都得往上;要构成鞍点,只需要一部分方向往上36

所以有个反直觉的经验:现代训练里,我们往往不那么怕局部最优,更怕鞍点和大片平坦区。 能落到一个够好的低处就行。

第二种是信号失真。 差距往回传时,每穿一层都要乘上权重和弯折的斜率。 数字是冷酷的:每层平均乘 0.8,30 层之后只剩 0.8³⁰ ≈ 0.001,几乎传不回去; 每层平均乘 1.2,30 层后变成 1.2³⁰ ≈ 237,数值迅速爆炸37。 前者叫梯度消失,后者叫梯度爆炸。

这里再补一句:第 1 节说过,梯度既给出方向(该往哪边挪),也给出陡峭程度(挪多大值)。 反向传播干的就是一次性把所有参数的梯度都算出来这件事, 所以它一旦在深层里失真,整个网络就学不动了。

第三种是学得太死。 深网络参数众多、表达能力极强, 完全有能力把训练用的那批数据的每一个细节、甚至那些标错的和无关的干扰一起背下来。 于是训练误差(它在训练用的那批数据上答得离正确答案差多少)一路下降, 在新数据上的表现却停滞甚至恶化。

这就是过拟合:把训练数据背下来了,却没学到能用在新数据上的规律。

它的反面是欠拟合(连训练数据都没学好,通常说明模型太弱或者根本没训动)38

这三种病,分别对应后面几节的三套工具: 走不动,靠 §10 和 §11 那套走路的方法; 信号失真,靠 §12 的三根支柱;学得太死,靠 §13 的那几招。 带着这张坐标系往下读,每种技术是给哪一类问题挑的解药就清楚了。

10. 怎么走:一次挪多少、朝哪挪

训练说到底是一件优化(在一大堆可能的取值里,找出让某个目标最好的那一组)的事。 明白了它是「在复杂地形里找路」,负责走路的那个部件就不再只是一个代码选项。

那个部件叫优化器:决定每一步该往哪走、走多大。

最基本的方法叫梯度下降:沿着「差距下降最快」的方向更新参数。 但实际训练里几乎没人拿全部数据算一次再走一步——那太贵,一步更新就要扫遍整个训练集。 另一个极端是每次只用一个样本,算得快但抖得厉害,机器像喝醉一样左摇右晃39

现实中的标准做法是每次用一小撮样本估计方向再更新一次。这一小撮叫一 (一次同时喂进去的那一组样本,典型是 32、128 或 512 个)。

这一组有多少个样本,行话叫批量——同一件事的另一个说法。 它兼顾了速度和稳定:一批样本一起过网络正好利用显卡的并行; 批内取平均让方向估计更平滑;同时保留那一点随机性,还能帮它偶尔跳出鞍点40

批量大小本身也是一门小学问。显存允许时,一批大一些通常单位时间处理得更多; 但一批太大会让随机性过少,在新数据上的表现有时反而变差;太小则训练剧烈抖动。 常见经验区间是 32 到 1024;大模型训练有时会用到上万,但往往需要搭配更复杂的技巧41

朴素做法的一个典型毛病,是在狭长谷底里来回震荡:垂直谷底方向坡陡,参数左右乱摆; 沿着真正该前进的方向,步子却迈得很慢。动量借用了物理直觉—— 除了看当前方向,还保留一部分历史方向。反复来回震荡的方向,历史更新会相互抵消; 长期一致下降的方向,速度反而越走越快42

还有一个更隐蔽的问题:不同参数的坡度尺度可能差异巨大。对所有参数用同一个步长, 经常出现某些方向步子太大、另一些方向几乎不动。于是 2010 年前后出现了自适应方法, 让不同参数自动用不同的步长;把「方向上借鉴动量、步长上参考最近坡度」两件事合起来, 就是今天最常用的那一类优化器(Adam 和它的改良版 AdamW)43

工程里有一句经验话:不知道用什么优化器,就先用 Adam 或 AdamW。 但这不等于它永远最优——视觉领域的大规模训练里,带动量的朴素方法常常仍有更强的最终表现。 优化器没有抽象的绝对优劣,只有和任务、结构、数据规模是否匹配44

11. 学习率:最敏感的那个旋钮

学习率说的是每一步迈多大。它是训练中最敏感、通常也最重要的那个可调项: 太小,训练慢得像停了;太大,则可能在最低点附近来回乱跳甚至发散。 在很多项目里,只把它调对就能拿到八成以上的性能45

实践里几乎没人把它固定成一个常数。最常见的两类调法是预热 (前几百到几千步先从很小的值慢慢升到目标值,像运动员热身,直接冲刺最容易受伤) 和衰减(到后期逐渐调小,免得在最低点附近振荡跳不进谷底)46

为什么要预热?因为参数刚被随机初始化时,网络内部的数值还没进入正常范围, 一上来就大步更新,很容易把它推到一个再也回不来的坏区域。 一条极其实用的经验是:训练完全不动,先怀疑学习率;训练剧烈震荡,也先怀疑学习率。

12. 让训练站稳:初始值、规范化与那条跨层近路

优化器解决的是「走法」,但网络本身也必须是适合被训练的。 如果一开始的数值就让信号层层放大或缩小,再聪明的优化器也无能为力。

先说初始值。两个误区特别常见:一是全部设成零,那么同一层的所有单元会接收相同的输入、 产生相同的更新,它们在训练中始终一模一样,网络根本学不出多样化的线索; 二是初始值过大或过小,前者让信号一层层放大直到爆炸,后者让它们一层层衰减直到归零47

这里要先补一个词。一堆数值各自出现得多频繁、大致落在什么范围,合起来就叫分布。 初始化要管的,正是让每一层输出的那堆数值的分布不至于越走越离谱。

现代的做法都在追求同一件事:让每一层输出的波动幅度大致保持稳定,既不放大也不缩小。 两种最经典的方案分别针对 S 形弯折和 ReLU 设计, 都根据这一层进出有多宽自动缩放初值,而不是拍脑袋定范围48。 它们通常从一个高斯分布(中间高两边低的那种钟形随机取数方式,俗称正态分布)里取数。

把初始值处理好还不够,因为训练过程中,中间层的数值分布也在不断变化—— 前面层参数一更新,后面层接收到的就变了,每一层都像在追一个一直移动的目标。 为缓解这一点,人们发明了规范化:把一层的输出重新缩放到一个稳定的数值范围里, 再引入两个可学习的缩放与偏移量,允许网络在必要时恢复一些原来的样子49

这件事在中文里更常见的叫法是归一化——就是把一堆数值按同一把尺子重新摆到 一个可比的范围里,和上一段说的规范化是同一件事。

它有两种沿着不同方向做的做法,差别只在「跟谁比」。 把一批样本的中间数值摆成一张表,行是样本、列是一层里的各个位置: 批量规范化沿着一列求统计量(同一个位置跨所有样本), 另一种叫层归一化——它沿着一行求,同一个样本自己那一行内部比,和别的样本无关50

这个差别很要紧。前者依赖整批数据的统计量,一批太小时估计不稳; 在长短不一的序列、在线使用、多机协同的某些设置下,跨样本统计也不方便。 后者只看自己一行,不依赖一批有多少个——所以卷积时代主导的是前者, 大模型时代主导的是后者(以及它的轻量变种 RMSNorm)51

即使初始值合理、规范化也做了,网络一深起来,信号仍可能在长链条里逐层衰减。 2015 年有人加了一条跨层的近路,叫残差连接:让每一层的输出不再是「新生成的东西」, 而是在当前状态上加一个小修正——「残差」二字说的就是那个小修正本身52

书里把这条主干道叫残差流,比方很好记:它是一块贯穿始终、可读可写的公共白板。 每一层先从白板上读出当前状态,用自己那组参数算出一个小修正,再把修正加回白板。 流本身永远在线,层只是沿途给它写增量。

这带来两个连锁后果。第一,误差可以沿着这条主干道一路回传,不必层层乘法衰减, 这正是深层网络得以训练的关键。第二,每一层的任务从「凭空学出一个完整变换」 降级为「在已有基础上学一个小修正」,学习负担大大减轻53。 这一招把卷积网络第一次推到了 152 层,今天几乎所有主流深层模型都在用它。

13. 正则化:别让它只会背题

如果上一节解决的是「训得起来」,这一节解决的就是「训得别太像训练集」。

这里有一个反直觉的事实:把训练集上的表现做到极致,和在新数据上管用,其实在互相作对。 先说什么叫泛化——在没见过的新数据上也照样管用。 优化器的本职工作是把训练集上的误差降到最低;但降得越低, 往往意味着它把训练集的每一个细节、包括标错的和无关的干扰都背下来了。 训练误差为零经常恰恰是过拟合的预兆,算不上好消息54

正则化反过来利用了这件事:不让它舒舒服服地一路走到训练集上的最低点, 而是在训练过程中故意加入各种干扰,逼它退而求其次,找一个「宽敞」的、不那么极致的解55

书里给了一个有实验支持的直觉:在合适的尺度下,较平坦的低处往往比尖锐的低处泛化更好。 尖锐的谷底意味着参数稍微偏一点,误差就急剧上升;训练集和真实数据之间哪怕只有一点差别, 效果就大打折扣。平坦的谷底则相反,参数抖动一点、见到稍微不一样的数据,预测依然稳健56

具体招数有五样,共同点是「给训练过程加一种特定的扰动」:

招数做什么直觉
权重衰减在误差上额外加一个惩罚,让参数无法肆意变大偏好更平滑、更保守的函数
暂退法每次算一遍都随机让一部分单元暂时退出不能过度依赖某个局部路径
数据增强对已有样本做不改变意思的变换(裁剪、翻转、加干扰)告诉它哪些变化不该改变答案
提前停止验证表现不再改善就叫停并回滚到最佳参数免得继续去记忆无益的细节
标签平滑把「正确类是 100%」软化成「90%」世界并不总是非黑即白

暂退法(训练时随机让一部分单元休息)的想法特别有意思。 辛顿曾用银行柜员换岗来解释:因为任何一个柜员都可能调岗,系统就不能依赖任何一个人, 必须整体稳健57。这带来两层效果:一层是它相当于对大量子网络做了隐式集成; 另一层是它迫使模型学出更冗余、更稳健的表达。

要提醒一句:正则化不是越多越强。正则太弱会过拟合;正则太强, 连训练集都学不好,就变成了欠拟合。实践中最稳妥的做法是循序渐进: 先开基础配置(权重衰减、验证监控、必要时提前停止); 如果依然明显过拟合,再加数据增强;再不行,才考虑暂退法、标签平滑,或者干脆缩小模型58

最后有一层看不见的东西值得点出。经典统计学习理论曾预言, 参数远多于样本的模型几乎注定严重过拟合;可深度学习时代的事实恰恰相反。 目前一个被广泛接受的解释是:走路的方式本身就携带隐式偏好—— 梯度下降不是中立的搜索过程,它天然倾向于落在那种「平坦」「简单」的解上59。 说到底,能泛化靠的不只是「加了哪些正则项」,更靠「用什么方式做优化」。

14. 损失函数:评分表写歪了,它就朝错方向努力

优化器只负责把差距降下去,但损失函数就是把「答得离正确答案有多远」写成一个数的那条规则, 它本身定义了什么叫「好」。很多时候,换一个损失,比换一个更复杂的模型效果还好60

书里那个比方很到位:把它理解成参加比赛时的评分规则。 评分规则说「大错扣很多分」,它就会格外害怕离谱预测; 评分规则说「自信但错扣重分」,它就会少一点嘴硬; 评分规则说「相关样本要靠近」,它就会把相似的东西放到同一个邻居区61

它并不知道人类心里真正想要什么,它只会认真钻研这张评分表。 所以评分表写歪了,它就会非常努力地朝错误方向进步。 这句话请记住,第 06 章那个「它学会讨好评分器而不是把事做对」的问题, 和第 17 章「说出口的目标和真实意图对不上」的难题,说的都是同一件事的放大版。

预测一个数值时最常见的是均方误差,对大偏差惩罚更重,适合特别不希望出现大偏差的场景; 但它对个别极端值敏感,一个离谱的样本就可能主导整个目标。更稳健的选择是平均绝对误差; 介于两者之间的 Huber 损失,小偏差时像前者、大偏差时像后者62

做分类时最常见的一把尺子叫——它量的是「有多不确定」: 可能性平摊在十个答案上时熵最大,全押在一个答案上时熵最小。

由它派生出来的交叉熵就是拿这把尺子去量「你给正确答案打了多高的可能性」, 打得越低、罚得越狠。它会严厉惩罚「自信且错误」的预测: 真相是猫,说「80% 是猫」比说「51% 像猫」更好;但如果真相是猫却拍胸脯说「99% 是狗」, 交叉熵会让它当场社死63

书里还给了一个「换损失就换结果」最干净的案例。2017 年有人做密集目标检测时发现, 常规交叉熵在这类任务里几乎不工作:一张图里「背景」像素远多于「目标」像素, 几千个一眼就能判对的背景把损失主导了,模型懒得去钻研那些真正难的样本。 他们只做了一个看似不起眼的改动——给已经判得很准的容易样本乘一个抑制因子, 让损失更「在意」那些还吃不准的。这一拨直接催生了一个让单阶段检测器 第一次在准确程度上追平精细两阶段方法的网络64

最后给三条实战习惯,它们比任何理论都更常救命65:

  1. 不要一上来就上最新最大的模型。 先拿一个简单模型把数据读取、前向、 损失、验证整条流程打通,确认管线没硬伤。
  2. 一次只改一件事,并记录配置和结果。 同时改优化器、学习率、模型、 数据增强和损失,结果变好你也不知道是哪个起作用,变差更无法归因。
  3. 会读曲线。 训练和验证都不下降,通常是模型太弱、学习率太小或实现有错; 训练下降但验证不动,是典型的过拟合;损失剧烈震荡,大概率是学习率太大; 损失突然变成 NaN 是硬故障,常见于梯度爆炸或数据里混入异常值。

还有一个很管用的小测试:先让模型只看几十到几百个样本,故意训练到几乎完全记住。 听起来反直觉——前面刚说要防过拟合。但道理很简单: 如果它连一小撮样本都记不住,就不可能真正学会整个数据集; 这时问题多半不在泛化,而在更底层的环节(标签读错、损失方向写反、 学习率太低、信号没传到某些层)66

主走查:一张手写的「7」

这条走查贯穿本章。 我们拿最经典的那个例子:一张 28×28 的灰度手写数字图, 任务是判断它属于 0 到 9 中的哪一类67。凡不是书里给出的数,都会当场标明是为演示编的。

① 输入层 784 个数。 28×28 = 784 个像素,每个像素是一个 0(白)到 1(黑)之间的数。 那一横一撇的位置上是接近 1 的数,其余大片是 0。这就是第 3 节说的「原始表达」: 机器看到的不是「7」,只是 784 个数。

② 第一层 256 个单元各算一次。 取其中一个单元,它有 784 个权重和 1 个偏置。 假设加权求和的结果是 −0.62(这个数是为演示编的),过一次 ReLU 之后变成 0—— 这个单元在这张图上完全没有响应。另一个单元算出 +1.35,过 ReLU 后还是 1.35。 256 个单元的输出排成一串,就是这张图在第一层的新表达。

③ 第二层再来一次。 256 个数进,256 个数出。到这一层,那些数已经不再对应任何单个像素, 而是「有没有一段横线在上半部」「有没有一撇往左下」这类更抽象的线索—— 这正是第 6 节说的逐步抽象。

④ 输出层 10 个数。 假设算出来是:7 那一位 4.2,1 那一位 2.1,其余八位各 0.0 (这三组数是为演示编的)。这十个原始分数还不是可能性,它们可以是任意实数。

⑤ 变成可能性。 用 Softmax(把一串任意实数变成一组加起来等于 1 的可能性: 先各自取指数,再各自除以总和): e⁴·² ≈ 66.7、e²·¹ ≈ 8.17、e⁰ = 1.0(八个)。 总和 = 66.7 + 8.17 + 8 × 1.0 = 82.87。 于是 P(7) = 66.7 ÷ 82.87 = 0.80,P(1) = 8.17 ÷ 82.87 = 0.099,其余八位各 0.012。

⑥ 算这一次错了多少。 正确答案是 7,交叉熵损失 = −ln(0.80) = 0.22。 如果它把 P(7) 压到 0.10,损失就变成 −ln(0.10) = 2.30——十倍还多。 这就是第 14 节那张评分表:它对「正确答案给的可能性太低」罚得很重。

⑦ 反推每个权重该往哪挪。 反向传播算出某个权重的梯度是 +0.03, 意思是「把它调大一点,误差会变大」,所以要往小调。学习率设 0.01, 于是这个权重从 0.152 变成 0.152 − 0.01 × 0.03 = 0.1517 (这三个数是为演示编的)。几十万个权重同时各挪这么一丁点,然后换下一张图。

⑧ 换成卷积核走一遍(对应 §7)。 上面那个 784 → 256 的网络是全连接的。 现在换一个 3×3 的卷积核,专门检测「上白下黑」的横边,它的九个数是:

-1 -1 -1
0 0 0
1 1 1

把它贴在「7」那一横的上沿,窗口里的九个像素值是 0 0 0 / 1 1 1 / 1 1 1(上排还是白纸,中下排已经是笔画)。 算一次:(−1×0)+(−1×0)+(−1×0) + 0+0+0 + (1×1)+(1×1)+(1×1) = 3

把同一个核挪到笔画内部,窗口里九个全是 1:(−3) + 0 + (+3) = 0; 挪到空白处九个全是 0,结果也是 0同一组九个数,在边缘上给出 3、在别处给出 0 ——这就是卷积核在「找边」。 而且它在整张图上滑一遍用的都是这同一组九个数,这正是第 7 节的参数共享。

⑨ 换成循环网络走一遍(对应 §8)。 现在换一句话: 「我生在上海,……(中间三百个字)……所以我说___」。 把它按词喂进循环网络,每一步隐状态都要乘一次同一个权重矩阵。 假设这个乘子的有效大小是 0.8(这个数是书里用过的量级):

走了几步「我生在上海」那份信息还剩多少
1 步0.8
5 步0.8⁵ = 0.33
30 步0.8³⁰ ≈ 0.001
100 步0.8¹⁰⁰ ≈ 0.0000000002

走到第 100 个词时,开头那句话只剩下两百亿分之一。 这就是它为什么答不出这个空—— 不是它「不想记」,是信息在乘法里被指数级磨没了。第 03 章那套机制换了个思路: 不再一步步传,而是让任意两个位置直接建立联系。

作者的判断与证据

书里给了证据的地方:

  • 反向传播 1986 年发表、离引爆二十多年,给了明确的时间和刊物1;
  • 那次比赛的错误率从 26.2% 降到 15.3%,是公开赛事结果5;
  • 0.8³⁰ ≈ 0.001 这个衰减算例,书里直接给出了数37;
  • 通用近似定理的三个限制,书里一条条列了出来,没有只讲结论22

书里明确标成经验、而非定理的地方:

  • 平坦的低处比尖锐的低处泛化更好,书里的措辞是「研究者观察到一个广泛的经验规律」, 并加了「在合适的尺度和度量下」这个限定56;
  • 深比宽更划算,书里用的是「实际经验告诉我们」,不是证明23;
  • 隐式正则化,书里写的是「这背后的解释还在被持续研究」,只给了一个「目前被广泛接受的观点」59;
  • 卷积网络当年那个 3.6% 的错误率低于人类参照水平,书里特意加了一句: 这个参照水平「源自个人实验,不是严格意义上的人类水平基准」68

这一章还有一处值得单独说的诚实:书里承认那三十年低谷里的每一样解药 都是「从某次具体失败里挣出来的」,而不是理论推导出来的6这条判断对读后面十六章很重要——大模型时代的很多做法同样是这么来的。

边界与局限

  • 这一章刻意不铺完整教材。 书里明说「不打算把机器学习和深度学习重新讲成一门完整课程」, 只保留理解后文必需的几条主线。想系统学这一层,该去看同作者那本教科书。
  • 数学被压到最低。 反向传播那套微积分怎么推、优化器里的校正项、 正则化背后那另一套数学解释,这些书里都没展开,本组拆解也没有。
  • 这一章的例子基本停在图像和短文本上。 到了几千亿参数、上万张卡的尺度, 很多结论会变形(比如「批太大泛化反而变差」在大模型训练里就不完全成立), 第 05 章和第 09 章会把变形之后的版本讲一遍。
  • 循环网络这条线书里只讲到被打穿为止。 后来那一支「用一个压缩状态代替回看全部历史」的复兴, 书里放在第 3 章后半,本组拆解放在第 04 章。

可带走的

  1. 今天的每一样工具都对着一次具体失败。 ReLU 治梯度消失,初始化治数值走样,规范化治偏移,残差治退化。
  2. 「学习」的本质是压缩,不是背诵;而压缩出的表示要分层。 浅层学边缘和局部搭配,深层学部件和意思。
  3. 一个单元 = 加权求和 + 一次弯折。 弯折必须是非线性的,否则堆多少层都等于一层。
  4. 深比宽更划算。 深带来的不是更多参数,而是更复杂的函数复合方式。
  5. 卷积靠两个想法赢: 局部连接(只看邻近像素)和参数共享(同一组权重滑遍全图)。
  6. 循环网络记不住远处,是因为信息每传一步就乘一次权重。 30 步之后只剩千分之一。
  7. 三种病要分清: 走不动(鞍点)、信号失真(梯度消失爆炸)、学得太死(过拟合)。
  8. 学习率是最敏感的旋钮;调试顺序写死: 先查数据,再查损失与实现,然后学习率,再初始化与规范化。
  9. 残差流是一块公共白板。 层只在上面写增量,所以梯度能一路回传、训练能站稳。
  10. 训练误差为零通常是坏消息;评分表写歪了,它会非常努力地朝错方向进步。 后一句话在第 06 章和第 17 章还会回来。

原文地图

主题原书节原文位置
反向传播 1986 与低谷2.1.1text/03-ch02.txt:42(搜「反向传播算法早在 1986 年就发表了」) · text/03-ch02.txt:57(搜「投稿带」)
三位坚持者2.1.2text/03-ch02.txt:61(搜「杰弗里·辛顿」) · text/03-ch02.txt:64(搜「继续推卷积神经网络」)
2006 重启2.1.3text/03-ch02.txt:78(搜「深度信念网络」)
2012 汇合2.1.5text/03-ch02.txt:101(搜「把 Top-5 错误率从第二名的」)
每一件都对着一次失败2.1.6text/03-ch02.txt:115(搜「ReLU 是为了治 Sigmoid 的梯度消失」)
机器如何从数据中学习2.2text/03-ch02.txt:124(搜「机器学习最基本的想法」) · text/03-ch02.txt:138(搜「最直观的是监督学习」)
为什么要学表示2.3text/03-ch02.txt:161(搜「类对象之间差异很大」) · text/03-ch02.txt:168(搜「它能把这种表示学习做成分层的」)
人工神经元2.3.1text/03-ch02.txt:195(搜「深度网络的最小积木是人工神经元」) · text/03-ch02.txt:212(搜「两个开关中恰好一个打开时灯亮」)
一层的矩阵写法2.3.1text/03-ch02.txt:224(搜「这个矩阵形式既数学优雅」)
激活函数为什么必须非线性2.3.2text/03-ch02.txt:233(搜「无论堆多少层」) · text/03-ch02.txt:248(搜「负的归零」)
前馈网络与 FFN 参数占比2.3.3text/03-ch02.txt:297(搜「Transformer 的大部分参数其实都在这种 FFN 里」)
深度即抽象与猫的实验2.3.4text/03-ch02.txt:309(搜「浅层神经元大致在检测边缘」) · text/03-ch02.txt:316(搜「Hubel 和 Wiesel 在猫的视觉皮」)
通用近似定理的三个限制2.3.5text/03-ch02.txt:338(搜「三个常被忽略的限制」) · text/03-ch02.txt:342(搜「深度通常比单纯变宽更划算」)
手写数字例子2.3.6text/03-ch02.txt:355(搜「784 个神经元」)
全连接处理图像的困境2.4.1text/03-ch02.txt:373(搜「光这一层就需要 1.5 亿个参数」) · text/03-ch02.txt:377(搜「假设训练集里所有的猫都居中」)
卷积的两个想法2.4.2text/03-ch02.txt:390(搜「每个神经元只关注图像的一小块区域」) · text/03-ch02.txt:394(搜「用同一组权重」) · text/03-ch02.txt:416(搜「最常用的是最大汇聚」)
序列为什么特殊2.5.1text/03-ch02.txt:480(搜「序列长度不固定」)
隐状态与参数共享2.5.2text/03-ch02.txt:489(搜「隐状态」) · text/03-ch02.txt:504(搜「共享同一套参数」)
梯度消失与那个上海例子2.5.3text/03-ch02.txt:514(搜「信息会被指数级衰减」) · text/03-ch02.txt:518(搜「我生在上海」) · text/03-ch02.txt:528(搜「遗忘门决定」)
局部最优与鞍点2.6.1text/03-ch02.txt:574(搜「还有大量既不是峰也不是谷的鞍点」) · text/03-ch02.txt:578(搜「这种情形比真正糟糕的局部最优更常见」)
梯度消失与爆炸的算例2.6.2text/03-ch02.txt:602(搜「每层平均乘 0.8」)
过拟合2.6.3text/03-ch02.txt:614(搜「模型也可能面对第三个困难」)
小批量与批量大小2.7.1text/03-ch02.txt:635(搜「小批量梯度下降」) · text/03-ch02.txt:642(搜「批量大小本身也是一门小学问」)
动量与自适应2.7.2–3text/03-ch02.txt:655(搜「动量」) · text/03-ch02.txt:687(搜「方向上借鉴动量」)
学习率与调度2.7.4text/03-ch02.txt:713(搜「它是训练中最敏感」) · text/03-ch02.txt:721(搜「预热」) · text/03-ch02.txt:727(搜「训练完全不动」)
初始化2.8.1text/03-ch02.txt:765(搜「两个误区特别常见」) · text/03-ch02.txt:769(搜「让每一层输出的方差大致保持稳定」)
批量规范化与层规范化2.8.3–4text/03-ch02.txt:796(搜「批量规范化」) · text/03-ch02.txt:810(搜「层规范化」) · text/03-ch02.txt:824(搜「批量规范化沿着一列」)
残差与残差流2.8.5text/03-ch02.txt:849(搜「残差连接」) · text/03-ch02.txt:852(搜「残差流」) · text/03-ch02.txt:865(搜「这件事带来两个连锁后果」)
优化与泛化互相作对2.9text/03-ch02.txt:882(搜「优化和泛化其实在互相作对」) · text/03-ch02.txt:893(搜「较平坦的极」)
五种正则化2.9text/03-ch02.txt:925(搜「银行柜员轮换」) · text/03-ch02.txt:967(搜「正则化不是越多越强」) · text/03-ch02.txt:972(搜「隐式正则化」)
损失函数与评分表2.10text/03-ch02.txt:989(搜「模型参加比赛时的评分规则」) · text/03-ch02.txt:1005(搜「交叉熵会让它当场社死」)
Focal Loss 的故事2.10.1text/03-ch02.txt:1009(搜「Focal Loss 背后还有一个有趣的故事」)
实战调优三条2.10.2text/03-ch02.txt:1031(搜「一次只改一件事」) · text/03-ch02.txt:1048(搜「甚至只看一个小批量」)

Footnotes

  1. 出处:「2.1.1 反向传播之后的漫长低谷」第 42 段 (text/03-ch02.txt:42,搜「反向传播算法早在 1986 年就发表了」)与第 50 段 (text/03-ch02.txt:50,搜「在《Nature》上发表反向传播算法」)。 2

  2. 出处:同节第 57 段(text/03-ch02.txt:57,搜「投稿带」)。 书里把这句写成「甚至出现……这样的传闻」,是传闻不是事实,本组拆解沿用这个口径。

  3. 出处:「2.1.2 三位坚持者」第 61 段(text/03-ch02.txt:61,搜「杰弗里·辛顿」)、 第 64 段(text/03-ch02.txt:64,搜「继续推卷积神经网络」)、 第 70 段(text/03-ch02.txt:70,搜「专注于语言建模」)。

  4. 出处:「2.1.3 2006:『深度学习』重启」第 78 段(text/03-ch02.txt:78,搜「深度信念网络」)。

  5. 出处:「2.1.5 2012:所有努力的汇合」第 101 段 (text/03-ch02.txt:101,搜「把 Top-5 错误率从第二名的」)。 2

  6. 出处:「2.1.6 诺奖时刻」第 115 段(text/03-ch02.txt:115,搜「ReLU 是为了治 Sigmoid 的梯度消失」)。 2

  7. 出处:「2.2 机器如何从数据中学习」第 124 段(text/03-ch02.txt:124,搜「机器学习最基本的想法」)。

  8. 出处:「2.3 为什么模型需要学习表示」第 161 段 (text/03-ch02.txt:161,搜「类对象之间差异很大」)。

  9. 出处:同节第 168 段(text/03-ch02.txt:168,搜「它能把这种表示学习做成分层的」)。

  10. 出处:「2.3.1 人工神经元」第 195 段(text/03-ch02.txt:195,搜「深度网络的最小积木是人工神经元」)。

  11. 出处:同节第 212 段(text/03-ch02.txt:212,搜「两个开关中恰好一个打开时灯亮」)。

  12. 出处:同节第 224 段(text/03-ch02.txt:224,搜「这个矩阵形式既数学优雅」)。

  13. 出处:「2.3.2 激活函数」第 233 段(text/03-ch02.txt:233,搜「无论堆多少层」)。

  14. 出处:同节第 240 段(text/03-ch02.txt:240,搜「当输入」)。

  15. 出处:同节第 248 段(text/03-ch02.txt:248,搜「负的归零」)。

  16. 出处:同节第 254 段(text/03-ch02.txt:254,搜「为了修复死亡 ReLU」)。

  17. 出处:同节第 273 段(text/03-ch02.txt:273,搜「不知道用什么就用 ReLU」)。

  18. 出处:「2.3.3 前馈神经网络」第 281 段(text/03-ch02.txt:281,搜「信息单向从输入层流向输出层」)。

  19. 出处:同节第 297 段(text/03-ch02.txt:297,搜「Transformer 的大部分参数其实都在这种 FFN 里」)。

  20. 出处:「2.3.4 深度的意义」第 309 段(text/03-ch02.txt:309,搜「浅层神经元大致在检测边缘」)。

  21. 出处:同节第 316 段(text/03-ch02.txt:316,搜「Hubel 和 Wiesel 在猫的视觉皮」)。

  22. 出处:「2.3.5 通用近似定理」第 338 段(text/03-ch02.txt:338,搜「三个常被忽略的限制」)。 2

  23. 出处:同节第 342 段(text/03-ch02.txt:342,搜「深度通常比单纯变宽更划算」)。 2

  24. 出处:「2.4.1 全连接处理图像的困境」第 373 段 (text/03-ch02.txt:373,搜「光这一层就需要 1.5 亿个参数」)。

  25. 出处:同节第 377 段(text/03-ch02.txt:377,搜「假设训练集里所有的猫都居中」)。

  26. 出处:「2.4.2 卷积的两个想法」第 390 段(text/03-ch02.txt:390,搜「每个神经元只关注图像的一小块区域」)。

  27. 出处:同节第 394 段(text/03-ch02.txt:394,搜「用同一组权重」)。

  28. 出处:同节第 416 段(text/03-ch02.txt:416,搜「最常用的是最大汇聚」)。

  29. 出处:「2.5.1 序列数据为什么特殊」第 480 段(text/03-ch02.txt:480,搜「序列长度不固定」)。

  30. 出处:「2.5.2 循环结构」第 489 段(text/03-ch02.txt:489,搜「隐状态」)。

  31. 出处:同节第 504 段(text/03-ch02.txt:504,搜「共享同一套参数」)。

  32. 出处:「2.5.3 梯度消失与 LSTM」第 514 段(text/03-ch02.txt:514,搜「信息会被指数级衰减」)。

  33. 出处:同节第 518 段(text/03-ch02.txt:518,搜「我生在上海」)。

  34. 出处:同节第 528 段(text/03-ch02.txt:528,搜「遗忘门决定」)。

  35. 出处:「2.6.1 局部最优与鞍点」第 574 段(text/03-ch02.txt:574,搜「还有大量既不是峰也不是谷的鞍点」)。

  36. 出处:同节第 578 段(text/03-ch02.txt:578,搜「这种情形比真正糟糕的局部最优更常见」)。

  37. 出处:「2.6.2 梯度消失与梯度爆炸」第 602 段(text/03-ch02.txt:602,搜「每层平均乘 0.8」)。 2

  38. 出处:「2.6.3 过拟合」第 614 段(text/03-ch02.txt:614,搜「模型也可能面对第三个困难」)。

  39. 出处:「2.7.1 小批量梯度下降」第 631 段(text/03-ch02.txt:631,搜「最基本的优化方法是梯度下降」)。

  40. 出处:同节第 635 段(text/03-ch02.txt:635,搜「小批量梯度下降」)。

  41. 出处:同节第 642 段(text/03-ch02.txt:642,搜「批量大小本身也是一门小学问」)。

  42. 出处:「2.7.2 动量」第 655 段(text/03-ch02.txt:655,搜「动量」)。

  43. 出处:「2.7.3 自适应学习率」第 687 段(text/03-ch02.txt:687,搜「方向上借鉴动量」) 与第 691 段(text/03-ch02.txt:691,搜「AdamW 名字里多出来的这个 W」)。

  44. 出处:同节第 696 段(text/03-ch02.txt:696,搜「但这也不等于 Adam 永远最优」)。

  45. 出处:「2.7.4 学习率」第 713 段(text/03-ch02.txt:713,搜「它是训练中最敏感」)。

  46. 出处:同节第 721 段(text/03-ch02.txt:721,搜「预热」)与第 724 段 (text/03-ch02.txt:724,搜「衰减」)。

  47. 出处:「2.8.1 参数初始化」第 765 段(text/03-ch02.txt:765,搜「两个误区特别常见」)。

  48. 出处:同节第 769 段(text/03-ch02.txt:769,搜「让每一层输出的方差大致保持稳定」)。

  49. 出处:「2.8.3 批量规范化」第 796 段(text/03-ch02.txt:796,搜「批量规范化」)。

  50. 出处:「2.8.4 层规范化」第 824 段(text/03-ch02.txt:824,搜「批量规范化沿着一列」)。

  51. 出处:同节第 815 段(text/03-ch02.txt:815,搜「时代主导的是 BN」)。

  52. 出处:「2.8.5 残差连接」第 849 段(text/03-ch02.txt:849,搜「残差连接」)。

  53. 出处:同节第 865 段(text/03-ch02.txt:865,搜「这件事带来两个连锁后果」)。

  54. 出处:「2.9 正则化」第 882 段(text/03-ch02.txt:882,搜「优化和泛化其实在互相作对」)。

  55. 出处:同节第 886 段(text/03-ch02.txt:886,搜「不让模型舒舒服服地收敛」)。

  56. 出处:同节第 893 段(text/03-ch02.txt:893,搜「较平坦的极」)。 书里的原措辞是「研究者观察到一个广泛的经验规律,在合适的尺度和度量下」,是经验不是定理。 2

  57. 出处:同节第 925 段(text/03-ch02.txt:925,搜「银行柜员轮换」)。

  58. 出处:同节第 967 段(text/03-ch02.txt:967,搜「正则化不是越多越强」)。

  59. 出处:同节第 972 段(text/03-ch02.txt:972,搜「隐式正则化」)。 书里写的是「这背后的解释还在被持续研究,但目前一个被广泛接受的观点是」。 2

  60. 出处:「2.10 损失函数与训练实战要点」第 986 段(text/03-ch02.txt:986,搜「损失函数本身定义了什么叫」)。

  61. 出处:同节第 989 段(text/03-ch02.txt:989,搜「模型参加比赛时的评分规则」)。

  62. 出处:「2.10.1 常见损失函数」第 997 段(text/03-ch02.txt:997,搜「均方误差」)。

  63. 出处:同节第 1005 段(text/03-ch02.txt:1005,搜「交叉熵会让它当场社死」)。

  64. 出处:同节第 1009 段(text/03-ch02.txt:1009,搜「Focal Loss 背后还有一个有趣的故事」)。

  65. 出处:「2.10.2 实战调优」第 1025 段(text/03-ch02.txt:1025,搜「不要一上来就上最新最大的模型」)、 第 1031 段(text/03-ch02.txt:1031,搜「一次只改一件事」)、 第 1033 段(text/03-ch02.txt:1033,搜「它们像病人的心」)。

  66. 出处:同节第 1048 段(text/03-ch02.txt:1048,搜「甚至只看一个小批量」)。

  67. 出处:「2.3.6 例子:手写数字识别」第 348 段(text/03-ch02.txt:348,搜「MNIST 手写数字识别」) 与第 355 段(text/03-ch02.txt:355,搜「784 个神经元」)。 书里给的网络结构是「784 → 256 → 256 → 10,ReLU 激活,Softmax 输出,交叉熵损失,Adam 优化器」, 本走查沿用这个结构;所有中间数值都是为演示编的。

  68. 出处:「2.4.3 ImageNet 与 CNN 的黄金十年」第 449 段(text/03-ch02.txt:449,搜「错误率降到」)。