《深度学习速成课》
- 出版时间
- 2026年1月
- 页数
- 680页
- 作者单位
- 瑞典哥德堡大学 等
- 中文书名
- 本页自译
- 原作名
- Deep Learning Crash Course
- ISBN
- 9781718503922
我的读书笔记 · BOOK OVERVIEW
学深度学习,最好的办法是写代码
《深度学习速成课》(Deep Learning Crash Course,暂译,未查到中文版)有七位作者,大多出自瑞典哥德堡大学(University of Gothenburg)。领衔的 Giovanni Volpe 是该校物理系教授、软物质实验室(Soft Matter Lab)负责人,研究深度学习、脑连接、统计力学和软物质。Benjamin Midtvedt、Jesús Pineda、Harshith Bachimanchi 在哥德堡大学获博士学位,Henrik Klein Moberg 在查尔姆斯理工大学(Chalmers University of Technology)获博士学位,方向都是把深度学习用到显微成像和物理科学上;Joana B. Pereira 是卡罗林斯卡学院(Karolinska Institute)副教授,研究阿尔茨海默病等神经退行性疾病的生物标志物;Carlo Manzo 是西班牙维克大学(University of Vic)副教授,领导定量生物成像实验室(Quantitative Bioimaging Lab)。书里用到的两个开源库 DeepTrack 和 Deeplay 就是他们开发的(作者简介)。书的材料来自他们多年在苏黎世联邦理工学院(ETH Zurich)、哥德堡大学等地讲授的深度学习课程(致谢)。
作者的三个主张
- 亲身体验动手理解 AI 最好的途径是亲手做
- 从简到繁项目一串独立的项目,边做边学
- 原理不变原理框架一直在变,核心原理不变
引言
这是一本动手教材。作者假定读者会一点 Python,但不懂深度学习。全书 14 章,每章讲一类神经网络:先讲原理,再做几个项目(Project),最后是小结和奠基文献。前两章从单个人工神经元讲到多层网络,是新手必读;中间各章依次是卷积神经网络、自编码器、U-Net、自监督学习、循环网络、注意力和 Transformer、生成对抗网络、扩散模型、图神经网络;最后三章相对独立,讲主动学习、强化学习和储备池计算(引言)。项目的数据很多来自作者自己的科研:疟疾血涂片、显微镜下的粒子和细胞、心电图、分子、沙粒、天气。
笔记不抄代码和公式,每章只记这类网络解决什么问题、核心想法、书里的项目用什么数据做了什么、得到什么结果,以及作者强调的经验和坑。书中代码依赖的库接口会随版本变化,这部分从略;书里的准确率等数字都是作者那次运行的结果。
我们相信,学深度学习最好的办法是写代码。
We believe that the best way to learn deep learning is by coding.
引言 This Book’s Approach,p.xxiii
引言
为什么要亲手学
三个概念(引言):作者先分清三个常被混用的词。人工智能(artificial intelligence,AI)是让机器完成通常需要人类智能的任务的任何技术,比如认人脸、听懂语音、做复杂决策、翻译;基于规则的系统和专家系统也算 AI,但不涉及“学习”。机器学习(machine learning)是 AI 的一个分支,让计算机用算法从数据中学习、做出预测,例如 2000 年代初流行的决策树(decision trees)和支持向量机(support vector machines)。深度学习(deep learning)又是机器学习的一个分支,用的是神经网络,通常有很多层人工神经元,“深”字由此而来。
这场革命从哪里来(引言):作者回顾,深度学习的基础是 1950—1980 年代的神经网络研究,2000 年代初取得突破,2010 年代中期爆发。转折点是 2012 年:AlexNet 赢得 ImageNet 大规模视觉识别挑战赛(ImageNet Large Scale Visual Recognition Challenge,一个给大量标注图像里的物体分类的比赛),几年之内深度学习就被广泛采用。
推动这场革命的,是游戏玩家和社交网络。
This revolution was fueled by gamers and social networks.
引言 Introduction,p.xxii
作者的解释是:游戏催生了越来越强的图形处理器(graphics processing units,GPUs),社交媒体提供了海量训练数据(引言)。
为什么要亲手做(引言):AI 发展太快,引来种种耸人听闻的猜想,从乌托邦式的社会重塑到人类灭绝。作者认为,理解 AI 从未如此要紧,而最好的途径是亲身体验。
这种亲身体验也应该让你相信:尽管有种种末日预言,我们生活和事业中最有创造性、最有意义的部分,很可能在很长时间里仍然只属于人类。
This direct experience should also convince you that, despite predictions of doom and gloom, the most creative and purposeful aspects of our lives and careers will likely remain uniquely human for a long time.
引言 Introduction,p.xxii
写给谁、怎么读(引言):作者设想的读者有优化模型的工程师、找新数据分析工具的科学家、想自动化诊断的医生、想做“迷幻”图像变换的艺术家,以及 AI 爱好者。编程上只要求基础 Python;数学上高中代数、概率、统计有帮助,书里会在直觉层面讲需要的线性代数和微积分。每章的例子规模真实,但普通电脑算得动,大多几分钟跑完;涉及生成对抗网络和扩散模型的例子没有 GPU 会太慢,可以用在线平台的免费算力。作者说,框架会不断演变,但核心原理始终一致,书里主要用 PyTorch,学到的东西可以带到别的框架。
写书像训练神经网络(致谢):作者在致谢里开玩笑说,写一本深度学习的书很像训练神经网络:不停调参,怀疑自己,忍住想放弃改去种花的冲动。初稿完成后,他们把全书代码从 TensorFlow 改写成了 PyTorch;最初向出版社提案时,书名是“Hello, Deep Learning!”。
第 1—2 章
第一个神经网络:分类与回归
一个人工神经元(第 1 章):人工神经元(artificial neuron)受生物神经元启发。生物神经元从别的神经元接收信号,信号总量超过某个阈值就“放电”。人工神经元也是这样:把输入乘以各自的权重(weights)相加,再加一个偏置(bias,用来平移门槛),总和大于 0 就输出 1,否则输出 0。本章的训练方式是监督学习(supervised learning):每个输入都配好标准答案(书中叫 ground truth,真值),网络反复调整参数,让预测和答案的差距越来越小。
猜错了就改(第 1 章):训练单个神经元的办法很朴素:权重先随机设;随机挑一个数据点让它预测;猜对了什么也不做,猜错了就把权重往减小误差的方向挪一点。每次挪多少,由学习率(learning rate)决定。
学习率是一个非常重要的参数。设定它时,要在收敛速度和“冲过头”的风险之间权衡。
The learning rate is a very important parameter. When setting it, there’s a trade-off between the rate of convergence and the risk of overshooting.
第1章 Training the Neuron,p.8
学习率太高会跳过最低点,太低则收敛太慢,或卡在不理想的地方,所以训练中常让学习率随时间变化(第 1 章)。
单个神经元的极限(第 1 章):一个神经元先做加权求和,再过一道只升不降的函数,所以它只能在平面上画一条直线(高维时是一个平面,术语叫“超平面”)把两类分开。一维数据里两类之间只要出现三个变化点,它就学不会。加偏置、做权重正则化(weight regularization,每次更新后把权重缩放到固定长度,防止权重失控变得过大或过小)、把阶跃函数换成 sigmoid、ReLU 等平滑的激活函数(activation function),都改变不了这一点。要分开弯曲的边界,需要多层、多个神经元。
多层网络:半平面的“并”和“交”(第 1 章):作者给了一个很直观的解释。第一层(隐藏层,hidden layer)每个神经元用一条直线把平面切成两半;输出层再把这些“半平面”拼起来:取它们的并集,或者取重叠的交集,于是能围出更复杂的区域。对本章那种隐藏神经元很少的小网络,有的区域单靠一次“并”或“交”拼不出来,再加一层、把两种运算组合起来就行。作者说,网络有两个或更多隐藏层时,通常就算“深”了,但和动辄几十上百层的现代模型比,仍然很浅。
事实上,只要层数和神经元足够多,神经网络就能逼近任何函数。
In fact, with enough layers and neurons, a neural network becomes able to approximate any function.
第1章 Classifying Data with a Three-Layer Neural Network,p.32
反向传播(第 1 章):多层网络怎么训练?思路是逐个看每个权重对误差的影响:把某个权重稍微调大,误差下降就说明方向对了,否则反过来调。每次都朝减小误差的方向挪一小步,就是梯度下降(gradient descent),“梯度”指误差随权重变化的方向和快慢。反向传播(backpropagation)是高效计算这些梯度的办法:从最后一层开始,把误差一层一层倒着传回前面的层,“反向传播”之名由此而来。
你可以借助非常强大的反向传播算法高效地完成梯度下降,这一算法可以说是深度学习广泛成功的头号功臣。
You can perform gradient descent efficiently using the very powerful backpropagation algorithm, which is arguably the main technique responsible for the widespread success of deep learning.
第1章 Training with Error Backpropagation,p.25
项目 1A:认手写数字(第 1 章):MNIST 是 Yann LeCun 等人构建的手写数字数据集,6 万张训练图、1 万张测试图,每张 28×28 像素,作者称给它分类是深度学习入门的“入门礼”。网络是全连接网络(dense neural network,每个神经元都和上一层所有神经元相连,又叫多层感知机,multilayer perceptrons):784 个输入(每个像素一个),两个各 32 个神经元的隐藏层,10 个输出(每个数字一个)。作者一步步改进,看每一步带来多少提升:
- 起步:激活函数用 sigmoid,训练一轮(epoch,把训练集完整过一遍),测试准确率约 0.67;
- 输出层改用 softmax(让 10 个输出加起来等于 1,成为真正的概率分布),约 0.77;
- 隐藏层改用 ReLU:sigmoid 在输入很大或很小时梯度几乎为零,学习会慢下来甚至停住(梯度消失,vanishing gradient problem),ReLU 对正输入保持较强的梯度,准确率升到约 0.94;
- 每次用 32 张图的平均梯度更新(小批量,mini-batches),优化器换成 RMSprop(给每个权重单独调学习率,连续同向更新的权重会积累“动量”、步子越迈越大),训练 10 轮,约 0.97。
评估用混淆矩阵(confusion matrix):一个 10×10 的表,第 i 行第 j 列记的是真实为 i 的数字被判成 j 的次数,一眼就能看出模型最常把哪些数字搞混。起步网络最难分的是 5、8、9。作者还解释了超参数(hyperparameters):层数、神经元数、学习率、批大小、训练轮数这些在训练开始前设定、不靠训练改变的量。
看看它错在哪里(第 1 章):最后一步是失败分析:把每个数字分错的图挑几张出来看。
最后,检查网络在哪些输入上失败,你能学到很多。
Finally, you can learn a lot by checking for which inputs the network fails.
第1章 Performing Failure Analysis,p.46
作者发现,有些分错的数字确实写得潦草,混淆可以理解(第 1 章)。章末文献从 1943 年 McCulloch 和 Pitts 提出人工神经元,讲到 1986 年 Rumelhart、Hinton 等人的反向传播论文;作者提到 Hinton 因神经网络方面的开创性工作分享了 2024 年诺贝尔物理学奖(第 1 章)。
回归:预测连续的数(第 2 章):分类是判断属于哪一类,回归(regression)是推断输入和一个连续数值之间的关系,比如由位置推出受力,用于金融预测、气候建模等。单个线性神经元只能拟合一条过原点的直线;加一个隐藏层,网络就能拟合曲线。
训练数据怎么喂(第 2 章):
你怎样把训练数据呈现给神经网络或人工神经元,关系重大。
The way you present the training data to the neural network or artificial neuron matters a great deal.
第2章 Training Using Batches,p.65
作者比较了三种喂法:每次一个样本(在线训练,online training)、每次一批取平均(批量训练,batch training)、每次用整个训练集(最速下降,steepest-descent training)。他的建议是:一般用中等大小的批量学得最好;每一轮还要打乱样本顺序,否则固定的顺序会给网络带来偏差。评估时,作者推荐画“预测值对真值”图:完美预测的点都落在对角线上,偏离多少、偏向哪边,一看便知(第 2 章)。
训练集、验证集、测试集(第 2 章):训练集用来拟合权重;验证集(validation dataset)用来调超参数,也用来决定何时停止训练(早停,early stopping);测试集只在最后用一次,给出不偏不倚的评估。经验法则是约 70% 的数据用于训练。书里的图很典型:训练误差一直下降,验证误差降到某一点后开始回升,这就是过拟合(overfitting):模型贴训练数据贴得太紧,记住了噪声,换了新数据就不灵。反过来,模型太简单、训练集和验证集上都差,叫欠拟合(underfitting)。
项目 2A:给光镊做“数字孪生”(第 2 章):光镊(optical tweezer)用聚焦激光夹住微小颗粒,生物物理实验室常用它施加和测量微观的力,例如测 DNA 的力学性质、研究马达蛋白。计算颗粒受的光力很难;颗粒比光的波长大得多时,常用几何光学近似:把光束拆成许多条光线,逐条算反射和折射。光线越多越准,也越慢。作者用只有 100 条光线的模拟数据训练一个全连接网络(三个隐藏层,各 256 个神经元),让它由位置预测力。数字孪生(digital twin)是物理系统的虚拟替身,不必建模所有细节,就能模仿和预测真实系统。训练结束时平均误差约 30 飞牛(fN,1 飞牛是 10^−15 牛顿),而光力的典型大小是几千飞牛。更有意思的是,网络的预测比训练数据本身更接近精确的理论值:
神经网络能去掉这些伪影,因为它的复杂度刚好够学到平滑的力曲线,却学不到叠加在上面的波动伪影,于是精度比训练数据本身还高。
The neural network manages to remove these artifacts because it’s designed to be complex enough to learn the smooth force profile, but not the superimposed fluctuating artifacts, achieving an accuracy higher than that of the training data.
第2章 Evaluating Performance,p.92
第 3 章
卷积神经网络:让机器看图
卷积是什么(第 3 章):卷积(convolution)是拿一个小窗口(滤波器,filter)在数据上逐格滑动,每到一处,把窗口里的数和滤波器对应相乘再相加,得到一个数。用平均滤波器滑一遍,图像变平滑;用 Sobel 这类求差的滤波器,强度突变的地方(边缘)会被突出出来。卷积层(convolutional layers)里有许多这样的滤波器,关键在于:它们不是人设计的,而是在训练中为了任务学出来的。作者认为,正是这种可训练的适应性,让卷积成了神经网络的基本构件(第 3 章)。
卷积网络的积木(第 3 章):除了卷积层,还有 ReLU(把负值变成 0)、池化层(pooling layers,又叫下采样层:把相邻像素合并,图变小,既省计算又能看到更大尺度的特征)、上采样层(upsampling layers,反过来把图放大,图像分割要用)。几层叠下来,图像的空间分辨率降低了,特征的种类却丰富了。要分类,就在卷积部分后面接一个全连接的“顶”(dense top)。
项目 3A:疟疾血涂片(第 3 章):疟疾通常靠人在显微镜下看血涂片诊断。作者认为用神经网络自动筛查,能缩短响应时间、减轻专家负担、保证结果可重复。数据是 27,558 张单细胞图像,感染和未感染各一半。先用全连接网络:准确率约 0.68。作者引入 ROC 曲线(receiver operating characteristic):分类器输出 0 到 1 之间的数,再用一个门槛判断阳性还是阴性;门槛从 0 调到 1,画出“查出了多少真阳性”对“误报了多少阴性”的曲线,曲线下面积(AUROC)0.5 等于瞎猜,1 是完美。全连接网络的 AUROC 约 0.75:要查出 90% 的感染细胞,得把约 60% 的健康细胞误报成阳性,远不够医用。换成卷积网络,准确率约 0.95,AUROC 约 0.99。
看网络在看哪里(第 3 章):作者说,光把滤波器的数值打印出来看不出名堂,看每层的输出(激活)更有用。第一层抓的是边缘和简单纹理;最后一层清楚地突出了疟原虫所在的位置。各张激活图很相似,作者据此推测网络还可以缩小。再进一步是热图(heatmaps,书中用的方法叫 Grad-CAM):
热图直观地告诉你,输入的哪些部分在“点亮”你的卷积神经网络,尤其是在靠后的层。它们就像 X 光片,让你看到模型认为一张图里什么重要。
Heatmaps give you a visual representation of which parts of the inputs are firing up your convolutional neural network, particularly in the later layers. They’re like X-rays that show you what the model considers important in an image.
第3章 Visualizing Heatmaps,p.124
本例热图的亮点正好落在疟原虫上。作者提醒,热图也是调试工具:如果亮在只有背景的角落,说明模型可能在学噪声或伪影(第 3 章)。
项目 3B:显微粒子定位——人工标注还是模拟(第 3 章):任务是在视频里找出光阱中一个微粒的中心。第一种做法是人工标注:用鼠标在 100 帧上点出粒子中心,用这些标注训练网络,误差在 0.2 到 2 个像素之间。作者提醒,这个误差反映的只是标注的精密度(precision,前后是否一致),不是准确度(accuracy,离真实位置多近);没有真值,就无法评估准确度。人工标注还会因人而异(观察者间差异,interobserver variability),同一个人前后也会不一样(观察者内差异,intraobserver variability),而且又慢又累。第二种做法是用物理模拟生成 1 万张带精确位置的图像,模拟时让粒子大小、折射率、噪声都随机变化,以贴近真实实验。
相比之下,用模拟数据集训练,既消除了人工标注带来的不一致,又能生成大得多的数据集。
In contrast, using simulated datasets for training removes the inconsistencies associated with human annotations and enables the generation of substantially larger datasets.
第3章 Simulating the Training Data,p.137
用模拟数据训练的网络,误差降到 0.1 像素以下,精度提高了一个数量级(第 3 章)。“用模拟代替人工标注”是全书反复出现的做法,第 5、6 章还会再用。
项目 3C:DeepDreams(第 3 章):这是 Google 工程师 Alexander Mordvintsev 提出的玩法。作者说它把训练过程“倒了过来”:不改网络的权重,而是改输入图像,让网络某一层的反应尽量强。
比如说,一朵云要是有点像鸟,DeepDreams 算法就会调整图像,让它更像鸟。
For example, if a cloud looks slightly like a bird, the DeepDreams algorithm will adjust the image to make it look even more like a bird.
第3章 Implementing the DeepDreams Algorithm,p.149
作者用一个在 ImageNet 上预训练好的网络(VGG16),对一张果蝇神经组织的电镜图做这件事:放大浅层的反应,图上冒出点状图案和纹理;放大深层的反应,冒出像眼睛、像生物的超现实形状。由此可以看出每一层“看见”了什么(第 3 章)。
项目 3D:风格迁移(第 3 章):把巴塞罗那奎尔公园(Parc Güell)里高迪(Antoni Gaudí)的马赛克蜥蜴的纹理,“画”到果蝇神经组织的显微图上。原理是:浅层多管边缘、纹理,接近“风格”;深层管大尺度结构,决定“内容”。内容用深层的反应来比,风格用浅层各特征图之间的相关程度(Gram 矩阵,Gram matrix)来比,两者同时逼近,反复修改图像。
做神经风格迁移时,你要求神经网络保留照片里的大尺度结构,但用画作里的纹理和图案去画它们。
During neural style transfer, you ask the neural network to keep the large-scale structures from the photograph, but to paint them with the textures and patterns you see in the painting.
第3章 Project 3D: Transferring the Style of Images,p.158
章末文献里,作者特别提到 1998 年 Yann LeCun 等人的 LeNet-5,以及 2012 年 Alex Krizhevsky 等人的 AlexNet,后者被称为计算机视觉深度学习革命的主要催化剂(第 3 章)。
第 4—5 章
压缩与重建:自编码器和 U-Net
编码器—解码器与自编码器(第 4 章):本章进入无监督学习(unsupervised learning):数据没有标注,让网络自己找出其中的模式和结构。核心结构是编码器—解码器(encoder-decoder):编码器把输入压缩成一个低维的“潜在表示”(latent representation),解码器再从它重建出数据,中间那道窄口叫瓶颈(bottleneck)。如果要求输出等于输入本身,就叫自编码器(autoencoder)。
这种做法看似毫无意义,其实很有用:解码器只能靠挤过潜在空间瓶颈的那点信息,从头重建输入数据。
While this practice might seem pointless, it’s useful because the decoder has to rebuild the input data from scratch by using what squeezes through the bottleneck of the latent space.
第4章 Understanding Encoder-Decoders,p.168
挤过瓶颈的是输入更紧凑的形式,所以这种技术常用于图像和音频的去噪、滤波和压缩;压缩后的“潜在空间”还能用来看数据的结构、生成新数据(第 4 章)。
去噪,以及模式崩溃(第 4 章):作者用模拟的显微粒子图像加上很强的噪声,训练网络还原干净图像,效果不错,但粒子周围精细的衍射环只恢复了一部分。他特别提醒一个坑:训练时干净的目标图始终是同一张,网络可能根本不看输入,只会输出那张图。
这种情形可能导致模式崩溃:神经网络选了一个简单、重复的解,而不是真正学会完成任务。
Such a scenario can lead to mode collapse: The neural network opts for a simplistic, repetitive solution instead of learning to actually perform the task.
第4章 Checking for Absence of Mode Collapse,p.175
检验办法很简单:喂一张只有噪声、没有粒子的图。网络输出里没有粒子,说明它确实在输入里找粒子。另一个检验是泛化:训练时粒子总在中央,换成偏离中心、大小不一的粒子,网络就画出“一簇粒子”;用位置和大小都随机的模拟数据重训后,大小和位置就对了(第 4 章)。
项目 4A:变分自编码器(第 4 章):普通自编码器训练好以后是完全确定的,同一输入永远得到同一输出,不能“创造”。变分自编码器(variational autoencoders)把每个输入编码成潜在空间里的一个分布(一个中心加一个范围),解码时从中随机取点,于是能生成新样本。它的损失有两项:重建项要求输出像输入;正则项用 KL 散度(Kullback–Leibler divergence,衡量一个概率分布偏离另一个有多远)把潜在表示拉向规整的标准形状。
损失函数中这两项的相互作用,可以想象成一股斥力和一股吸力。
The interplay between these two terms in the loss function can be imagined as a repulsive force and an attractive force.
第4章 Understanding Variational Autoencoders,p.180
重建项把各个表示推开、铺满空间,正则项像磁铁一样把它们往一处吸,带来连续和秩序(第 4 章)。作者用 MNIST 训练了一个只有两个潜在变量的模型:在这个二维平面上取一张网格逐点解码,数字平滑地从 6 渐变到 1,再沿对角线变成 2、3、5、4、9、7;把测试图编码后按数字上色,同一数字聚成一簇,7 和 9 靠得很近,说明编码器认出了两者长得像。
项目 4B:Wasserstein 自编码器(第 4 章):这种自编码器借用最优传输理论(optimal transport theory),用“把一堆土搬成另一种形状最少要花多少力气”来衡量两个分布的差距,这个距离又叫推土机距离(Earth mover’s distance)。作者认为它比变分自编码器给压缩表示留了更大的变化余地,重建更能保留原数据的多样性。在服装图片数据集 Fashion-MNIST(Zalando 发布)上,它能重建衣物,随机生成的图有的清晰、有的模糊;在两件衣服的编码之间取几个中间点解码,就得到从一件衣服平滑过渡到另一件的渐变图。
项目 4C:心电图里的异常心跳(第 4 章):异常检测(anomaly detection)就是找出偏离常态的观测。思路是只用正常心跳训练自编码器:它只学过正常的样子,遇到异常心跳就重建不好,误差一大就报警。门槛取正常训练样本重建误差的第 95 百分位。这样做准确率 0.852。第二种办法是在潜在空间里看:正常心跳聚在一起,一条新心跳离它最近的几个正常样本有多远,就是它“不正常”的程度。这样准确率升到 0.976。作者说,当异常很罕见或说不清是什么样子时(罕见病、欺诈),这种只学“正常”的办法特别有用(第 4 章)。
U-Net:给编码器—解码器加“跳跃连接”(第 5 章):瓶颈有意限制网络能学的复杂度,好少留噪声,代价是细节可能丢失。降维、去噪无所谓,但图像分割要的正是细节。U-Net 由 Olaf Ronneberger 等人在 2015 年提出,因结构呈 U 形得名。
U-Net 的效力来自它创新的跳跃连接:把对应的收缩层和扩张层连起来,从而限制了瓶颈处的细节损失。
The U-Net’s efficacy stems from its innovative skip connections, which link corresponding contraction and expansion convolutional layers, thus limiting the loss of detail at the bottleneck.
第5章 Introducing U-Nets,p.210
也就是说,下采样路上每一层的特征图,原样送到上采样路上同样大小的那一层,网络既看到全局,又保留了最细的细节(第 5 章)。语义分割(semantic segmentation)是给每个像素判一个类别,比如“属于线粒体的概率”;区分同类的不同个体叫实例分割(instance segmentation)。
分割果蝇神经组织(第 5 章):数据是 20 张果蝇幼虫神经组织的电镜图,每张都有专家费力画出的分割图,作者只取细胞内部和线粒体两类。图很少,就用上下、左右翻转来扩充(数据增强,data augmentation)。评估用 Jaccard 指数(Jaccard index,又叫交并比 IoU:预测区域和真实区域的重叠面积除以两者合起来的面积,1 是完美)。训练曲线又出现了过拟合的迹象,作者改用早停:验证集上连续 5 轮没有进步就停,约 40 轮停下,测试图的 Jaccard 指数 0.861。
项目 5A:荧光图里的量子点(第 5 章):量子点(quantum dots)是纳米尺度的半导体颗粒,在显微镜下是一个个亮斑。它比显微镜能分辨的尺度小得多,所以可以当作“点光源”来模拟。作者先裁出实验图里的一个量子点,调模拟参数,直到模拟图和真实图的像素分布对得上,再批量生成每张 10 到 20 个点的训练图。
这种模拟是关键的一步,因为它让你能生成大型数据集来训练 U-Net,而不必对真实图像做大量人工标注。
This simulation is a crucial step, because it’ll allow you to generate a large dataset to train the U-Net without the need for extensive manual labeling of real images.
第5章 Simulating Quantum Dots,p.225
另一个坑是类别不平衡:背景像素远多于量子点像素,不加处理的话,网络只要全猜“背景”误差就很小。作者给漏掉量子点加了 10 倍的惩罚。训练好的网络在真实实验图上表现良好(第 5 章)。
项目 5B:数细胞(第 5 章):真实数据是公开的 BBBC039 细胞核荧光图,约 23,000 个细胞核都有标注,但作者只拿它当测试集,训练数据全靠模拟,并一步步加真实感:先是单个椭圆,再是多个椭圆加弹性形变,再加核内纹理和成像缺陷,最后避免细胞核重叠、给背景加噪声。分割图里把每个细胞核稍微“缩小”,好让相邻的核分得开。在真实图上,平均每张图数错约 8.5 个细胞,误差一般在 8% 以内,总体略有低估。作者提醒,目标是计数,所以只要每个细胞核对应一块白色区域就行,不必精确复现分割图(第 5 章)。
第 6 章
用对称性代替标注:自监督学习
本章要做到的事(第 6 章):
这样,你将把对大量训练数据的需求,从数十万张图像降到只需一张,同时还免去了对物体位置的先验知识。
In this way, you’ll reduce the need for extensive training data—from hundreds of thousands of images to just one—while also eliminating the need for prior knowledge of the object’s position.
第6章 Training Neural Networks with Self-Supervised Learning,p.251
三类自监督学习(第 6 章):自监督学习(self-supervised learning)也用没有标注的数据,但处理的是分类、检测这类传统上要靠标注的任务;它可以完全替代监督学习,也可以先在大量无标注数据上预训练,之后只需少量标注。作者讲了三类:
- 对比学习(contrastive learning):同一张图的两个变形版本是“正样本对”,在表示空间里拉近;不同的图是“负样本对”,推远。
- 非对比学习(non-contrastive learning):只拉近正样本对。只拉近容易“坍缩”成所有输入都给同一个答案,办法是用两个网络,一个当学生、一个当老师,结构上故意不对称。作者说它适合医学影像、语言处理这类很难定义“负样本”的场合。
- 几何学习(geometric learning):不只要求表示对变形“不变”,还要求它随变形“同步变化”,即等变(equivariance)。比如图像平移了,预测的位置也该平移同样的量。
平移给的线索(第 6 章):任务是在只有一个粒子的图里找出它的中心。作者的出发点是:即使不知道粒子在哪,也能确定把图像平移多少,粒子就跟着移动多少。训练于是不需要任何答案:把同一张图随机平移几次,让网络分别预测位置,再把各自的平移减回去;预测得对的话,这些位置应该重合,它们之间的差距就是损失。这样训出来的网络“相对自己一致”,但整体可能偏一个固定量。作者先用一个小技巧修正(把图翻转后再预测一次,两次一比就能算出偏差),再把翻转直接加进训练:
网络要在所有情况下都正确,唯一的办法就是找到物体的真实中心。
The only way the network can be correct in all cases is to find the actual center of the object.
第6章 Learning from Flipping the Image,p.263
LodeSTAR(第 6 章):作者指出,卷积层对平移是等变的,但全连接层不是,所以带全连接顶的网络得把粒子在每个位置的情形都学一遍;全局平均池化也只是对平移“不变”,不是“等变”。他们团队提出的 LodeSTAR(Localization and Detection from Symmetries, Translations, and Rotations)去掉全连接层,改用“质心”汇总:网络为每个像素给出“粒子在这附近”的概率和一个偏移量,按概率加权平均得到位置。这样它天生平移等变,还可以在只含一个物体的小图上训练,直接拿去处理含多个物体的大图,不用再训练(第 6 章)。
项目 6A:小鼠造血干细胞(第 6 章):数据是细胞追踪挑战赛(Cell Tracking Challenge)中增殖的小鼠造血干细胞视频。训练只用一张 50×50 的裁剪图,里面只有一个细胞,再随机改变它的明暗,做出 400 个版本。训练好的网络在整段视频里找细胞:对上 6,459 个,误报 339 个,漏掉 16 个,F1 分数 0.973(F1 是把“报出来的有多少是对的”和“该找的找到了多少”合在一起的分数,1 是完美)。作者提醒,训练集这么小,不同次运行的结果可能差别很大。章末文献中,作者提到 2020 年的对比学习框架 SimCLR(Ting Chen 等)和非对比学习方法 BYOL(Jean-Bastien Grill 等)(第 6 章)。
第 7—8 章
序列与语言:循环网络、注意力和 Transformer
循环网络:带记忆的网络(第 7 章):前面的网络把每个样本当作互不相干的;循环神经网络(recurrent neural networks)按顺序处理序列,比如一段时间里的温度、一个句子里的词。作者从信号处理里的梳状滤波器(comb filter)讲起:每一步的输出是当前输入和上一步输出的平均,输出又被送回输入,形成反馈回路。循环网络也这样把自己的“隐藏状态”送回去当额外输入,用这种记忆利用过去的信息。
预测耶拿的气温(第 7 章):数据是德国耶拿马克斯·普朗克生物地球化学研究所(Max Planck Institute for Biogeochemistry)2009—2016 年每 10 分钟记录一次的 14 项气象数据。任务是用前两天的数据,预测次日中午的气温。归一化时作者提醒别丢掉关键信息,比如气温几个月、几年的缓慢变化。他先设了一个“常识基准”(commonsense benchmark):明天中午的气温和今天中午一样。这个猜法的平均误差是 2.67°C。
这在机器学习中普遍是好做法,因为它为评估模型性能提供了基线。没有这样的基准,很难判断你的模型是否真的有效。
This is good practice in machine learning in general because it provides a baseline to evaluate the performance of your model. Without such a benchmark, determining whether your model is genuinely effective can be difficult.
第7章 Implementing a Commonsense Benchmark,p.287
结果最简单的循环网络在训练集、验证集上看着都不错,却输给了基准:
因此,这个网络的预测力,还不如直接说“气温和前一天一样”。
Therefore, this network has less predictive power than saying that the temperature will be the same as that of the preceding day.
第7章 Plotting the Training and Validation Losses,p.292
叠三层循环层,误差只和基准持平;层数多了,梯度还可能小到传不动(梯度消失)或大到失控(梯度爆炸,exploding gradients)。改用门控循环单元(gated recurrent unit,GRU)才明显超过基准。“门”(gates)像开关一样,按信息和任务的相关程度决定保留多少、忘掉多少。再配上 dropout(训练时每次随机关掉一部分神经元,逼其他神经元也学会用这些信息,防止过拟合;预测时全部神经元都工作),验证误差降到 0.27(归一化后的数,基准是 0.32)。门更多的长短期记忆网络(long short-term memory,LSTM)结果相近;作者认为在依赖长期关系的更复杂任务上,LSTM 一般更可能胜出(第 7 章)。
项目 7A:英译西(第 7 章):序列到序列(sequence-to-sequence,seq2seq)翻译由两个循环网络组成:编码器逐词读完英文句子,把整句意思压进一个“上下文向量”(context vector),解码器从它出发逐词写出西班牙文。
这个上下文向量就像输入序列所表达内容的一张“心理快照”,比如一份抓住整句意思的概要。
This context vector is like a mental snapshot of what the input sequence represents—for example, a summary that captures the meaning of the entire input sentence.
第7章 Defining the Sequence-to-Sequence Application,p.308
准备工作很繁琐:分词(把句子拆成词元,tokens)、把英文缩写展开、去掉杂乱符号、建词表、把句子补齐到同样长度。词的含义用斯坦福 NLP 组的预训练词向量 GloVe(Global Vectors for Word Representation)表示,训练时冻结不动。训练中还用了“教师强制”(teacher forcing):解码器下一步的输入有时用标准答案、有时用它自己上一步的预测。作者说这样学得快、更稳,但模型可能过度依赖答案,学不会从自己的错误里恢复,这叫曝光偏差(exposure bias)。结果是:“I bought a book.”这类简单句翻得对,但带关系从句的“The book that I bought is very interesting.”翻乱了。评估用 BLEU 分数(BiLingual Evaluation Understudy,比较机器译文和人工译文有多少相同的词和短语),测试集约 0.26。作者也指出 BLEU 只看语言的表层形式,未必反映语义是否准确、风格是否恰当(第 7 章)。
注意力(第 8 章):作者用一个句子开头:“The teacher praised a student because she improved.”人马上知道 she 指学生,算法却很难判断。注意力机制(attention)评估句中每个词相对其他词的重要性:在同一句话内部叫自注意力(self-attention),在两句话之间叫交叉注意力(cross-attention)。最简单的算法是拿词向量两两做点积:作者说可以把向量看成箭头,点积就是“对齐分数”,衡量一个箭头有多指向另一个。
就像在键值存储里查找一个查询,注意力过程依据各个键与查询的相关程度来取回信息(值)。
Like looking up a query in a key-value store, the attention process retrieves information (values) based on the relevance of keys to the query.
第8章 Attention Mechanism,p.330
这就是查询、键、值(query、key、value)这套术语的来历。作者用 GloVe 词向量算了两句话的注意力热图:相同的词互相关注,she 和 her 这样意思相关、写法不同的词也有注意力。但这里没有任何可学习的权重,只反映 GloVe 里固定的词间关系;作者说,注意力真正的力量在于模型能按上下文学会关注哪里,于是给查询、键、值各加一个可训练的变换,这就是现代 Transformer 自注意力的骨干(第 8 章)。
项目 8A:给翻译加上注意力(第 8 章):上一章的解码器只靠一个向量装下整句话,句子越长丢的信息越多。加注意力后,解码器每写一个词,都回头看原句里最相关的部分。这样做不增加任何可训练参数,测试集 BLEU 却从约 0.26 升到 0.43,那句带关系从句的英文也翻对了。注意力热图还让翻译过程看得见:西语的 compré 一个词同时对应英文的 I 和 bought,作者称之为软对齐(soft alignment);疑问句里西语句首的倒问号“¿”在英文里没有对应,它强烈关注的是原句末尾的问号(第 8 章)。
项目 8B:用 Transformer 分析影评情绪(第 8 章):Transformer 由 Google 在 2017 年提出,不像循环网络那样一个词一个词地读,而是用多头注意力(multi-head attention)同时并行地看整个句子。
这个过程常被比作一组专家从多个侧面分析一个复杂问题,再综合各自的见解得出结论。
This process is often likened to a team of experts analyzing multiple facets of a complex problem and combining their insights to reach a conclusion.
第8章 Breaking Down Multi-Head Attention,p.343
每个 Transformer 层由多头注意力、一个前馈网络、残差连接(把输入直接加到输出上,帮助训练稳定)和层归一化组成。只用编码器的 Transformer 适合分类,只用解码器的常用于生成文本。因为 Transformer 把输入当作无序的集合,还要给每个词加上位置编码(positional encodings),它才知道词序。在 IMDb 的 5 万条影评上判断正面还是负面,测试准确率约 87%(第 8 章)。
项目 8C:视觉 Transformer(第 8 章):视觉 Transformer(vision transformer,ViT)由 Google Research 在 2020 年提出:把图像切成小块,每块当作一个“词”,再加一个代表整张图的特殊标记,交给 Transformer。作者在 CIFAR-10(6 万张 32×32 的小图,飞机、汽车、鸟、猫等 10 类)上从零训练,准确率约 70%,低于最好的卷积网络。
没有这些内置的归纳偏置,ViT 需要大量数据才能有效学习。
Without these built-in inductive biases, ViTs need a substantial amount of data to learn effectively.
第8章 Improving the ViT Model with CutMix,p.364
归纳偏置(inductive biases)是模型对数据结构预先的假设。卷积网络天生假设相邻像素更相关,ViT 得从零学这些关系,而 CIFAR-10 只有 6 万张图,ImageNet 有 1,400 多万张。作者用 CutMix 扩充数据:从一张图剪下一块贴到另一张图上,标签按面积比例混合;再配合学习率调度,训练 700 轮后准确率约 90%,与卷积网络相当。换成在大数据集上预训练好的 ViT,只微调 2 轮,准确率约 98%(第 8 章)。章末文献里,作者提到 2014 年 Bahdanau 等人首次提出神经网络中的注意力,以及 2017 年 Vaswani 等人的“Attention Is All You Need”(第 8 章)。
第 9—10 章
生成模型:GAN 和扩散模型
GAN:一个造假,一个验货(第 9 章):生成对抗网络(generative adversarial networks,GANs)由两个网络组成:生成器(generator)从随机噪声出发造数据,判别器(discriminator)判断一张图是真是假。自编码器有固定的损失函数(输出和原图差多少),GAN 的生成器没有,它的好坏由判别器说了算。
这种对抗设置产生了一个动态学习的损失函数:损失函数不是固定的,而是在训练过程中学出来的。
This adversarial setup gives rise to a dynamically learned loss function; the loss function is not fixed but is learned in the training process.
第9章 Understanding GANs,p.377
与把损失降到最低的常规训练算法不同,GAN 的目标是在生成器和判别器之间达成平衡。
Unlike conventional training algorithms that minimize the loss, GANs aim to achieve an equilibrium between the generator and the discriminator.
第9章 Training a GAN,p.379
理想状态是生成器造出完美的赝品,判别器只能随机猜,一半对一半错,但实践中很难做到。作者在 MNIST 上训练了 20 轮:第 1 轮生成的图毫无结构,20 轮后已接近真实的手写数字,但还有些不成形。他给的经验:GAN 计算量大,用 GPU 每轮几分钟,用 CPU 可能要几小时;生成器和判别器的学习率要分别调,别让一方压倒另一方;损失曲线总在波动,反映两者之间的张力;还要提防模式崩溃,即生成器只会产出有限几种样子(第 9 章)。
项目 9A:按需生成数字(第 9 章):普通 GAN 不能指定生成哪个数字。条件 GAN(conditional GAN)把类别标签变成一个可学习的向量,和噪声一起交给生成器,也交给判别器。训练 10 轮后就能按要求生成指定数字。作者说,有了类别信息网络学得更快,多训练反而容易模式崩溃:给了不同的标签,生成的图却越来越像(第 9 章)。
项目 9B:虚拟染色(第 9 章):研究细胞结构传统上要化学染色,再用荧光显微镜看;作者说染色是侵入性的,常涉及有毒物质,会改变细胞的自然状态。用条件 GAN 可以把普通明场显微图像(bright-field,不染色直接拍的)直接转换成“染过色”的荧光图像,这叫虚拟染色(virtual staining)。数据是人类运动神经元的 22 对逐像素对齐的明场和荧光图,每张明场图由 13 个焦平面叠成;荧光图里绿色是神经元,蓝色是细胞核。生成器是改造过的 U-Net;判别器不判整张图,而是对每一小块分别判真假(PatchGAN),更关注局部细节;损失里还加了“感知损失”,用预训练网络比较两张图的纹理和细节,更接近人眼的感受。训练 500 轮后,生成的荧光图和真实染色图非常接近,绿色、蓝色出现在与化学染色相近的位置(第 9 章)。
项目 9C:CycleGAN,没有配对图也能转换(第 9 章):全息显微(holography)拍一张就能得到微小物体的三维信息;明场图像质量更高,但要三维信息就得调焦拍很多张。通常的图像转换需要同一样本用两台显微镜各拍一张、精确对齐,对很多活的生物样本几乎做不到。CycleGAN 的核心是循环一致性(cycle consistency):全息图转成明场图,再转回全息图,应该回到原样,反过来也一样。数据是海洋微型浮游生物的全息图和明场图,两者没有配对。训练 100 轮后,两个方向的转换都成功,每对图里物体的真实位置都保留了下来(第 9 章)。
扩散模型:先加噪,再学去噪(第 10 章):作者称扩散模型(diffusion models)是生成式 AI 的“最新旗手”,DALL-E、Stable Diffusion 等文生图模型的核心都是它;它还常在图像去噪、修复、超分辨率上胜过最先进的 GAN。名字来自物理:墨滴在水里、香水在无风的房间里会慢慢散开,单个粒子走的是看似随机的布朗运动(Brownian motion)。
这个过程就像一点一点地模糊一张照片,直到完全认不出来,类似于粒子在流体中做布朗运动时随机散开的样子。
This process is like blurring a picture little by little until it’s entirely unrecognizable, similar to the way particles spread out randomly in a fluid in their Brownian motion.
第10章 Understanding Diffusion,p.426
正向过程(往图上一步步加噪声,直到变成纯噪声)很容易;反向过程(从纯噪声一步步还原出清晰的图)很难,要训练神经网络来做。书中讲的是去噪扩散概率模型(denoising diffusion probabilistic models,DDPMs),通常分 1,000 步左右。作者指出,让网络预测“这一步加进去的是什么噪声”,比让它直接预测去噪后的图更简单;而且数学上可以从原图一步跳到任意一步的加噪图,训练时不必一步步算(第 10 章)。
本质上,网络是透过噪声的镜头来看数据,从而隐式地学会数据的分布,就像第 9 章的 GAN 通过竞争来学习一样。
In essence, the network implicitly learns the data distribution by looking at the data through the lens of noise, much as the GANs in Chapter 9 learn through a competitive process.
第10章 Modeling the Reverse Diffusion Process,p.432
作者认为扩散模型和自编码器的根本不同在于:它不把数据压缩成小的表示,而是在大得多的空间里运作,数据中细微的变化得以保留(第 10 章)。在 MNIST 上训练 20 轮,从纯噪声出发就能生成像样的数字;因为反向过程每一步都带随机性,同一份初始噪声跑两次会得到不同的数字。噪声范围设得太大,图会模糊;太小,图清晰但可能过拟合(第 10 章)。
项目 10A:按需生成数字(第 10 章):扩散模型只有一个网络,没有判别器,不能照搬条件 GAN 的办法。一种做法是另训一个分类器来引导,但要训两个网络。作者用的是无分类器引导(classifier-free guidance):只训一个网络,训练时随机地有时给它类别标签、有时不给;生成时把“有标签”和“无标签”两次预测按一定强度组合起来。作者说这样既保留了生成能力,又省掉了单独的分类器(第 10 章)。
项目 10B:用文字生成图像(第 10 章):每张数字图配一句提示,有的很简单(“写出手写数字 0”),有的要动脑:“动物园里有五头大象和三头狮子,有几只猫科动物?”句子里有好几个数字,问的是同义词,数字既有单词也有阿拉伯数字。文字先经文本编码器变成向量,再通过交叉注意力引导图像生成。作者比较了两种编码器:自己基于 Transformer 搭的,和 OpenAI 用从互联网收集的 4 亿张图像及其标题训练的 CLIP(Contrastive Language-Image Pre-training),结果相近。训练 20 轮后,生成的数字与提示里所问的数字一致。作者提醒,文生图效果高度依赖文本数据:提示越多、越多样,生成图像的质量和相关性越好(第 10 章)。
项目 10C:超分辨率显微(第 10 章):一百多年前,显微学家阿贝(Ernst Abbe)指出光学显微镜的分辨率受光的波长限制,实际上分辨不出相距小于 200 纳米的细节,而 DNA 分子直径只有约 2 纳米。突破这一极限的超分辨率显微镜昂贵而复杂。作者用条件扩散模型,把低分辨率的微管(microtubules)显微图作为条件,生成对应的高分辨率图:训练数据是 BioSR 数据集的 4 万多对图。训练 30 轮后,生成的图与真实高分辨率图非常相似。作者强调这个方法不限于显微镜,照片等各种低分辨率图像都能用(第 10 章)。章末文献里,作者提到 2020 年 Jonathan Ho 等人提出 DDPM,以及 2021 年 Dhariwal 和 Nichol 的论文,表明扩散模型在关键图像合成基准上可以超过 GAN(第 10 章)。
第 11 章
图神经网络:分子、沙粒和细胞轨迹
图和图卷积(第 11 章):图(graph)由节点(nodes)和边(edges)组成:分子里节点是原子、边是化学键;社交网络里节点是人、边是交往。作者认为图神经网络(graph neural networks)成功的主要原因,就是利用了图对“谁和谁相连、怎样相互作用”的表示。
这样,图为描述和分析生物学、计算机科学、社会科学等各领域的模式与联系,提供了一种通用语言。
In this way, graphs provide a universal language to describe and analyze the patterns and connections of various domains, such as biology, computer science, social science, and more.
第11章 Understanding Graph Convolutions,p.476
图像是规则的网格,图却没有固定样式,所以卷积要重新定义:图卷积(graph convolutions)让每个节点汇总相连邻居的信息,就像根据朋友的喜好推测一个人的喜好。作者用一个五节点的环演示:一个节点上的值沿着边一步步传下去,五步后回到起点。简单的图卷积有两个毛病:只看邻居、不看节点自己(办法是给每个节点加一条连向自己的边);邻居多的节点汇总出的值偏大(办法是按邻居数归一化)(第 11 章)。
预测分子的亲脂性(第 11 章):数据集 ZINC 收录了大量分子图,任务是预测 logP,它衡量一个分子在脂肪里比在水里更容易溶解的程度(亲脂性,lipophilicity),会影响药物的吸收、分布和代谢;准确预测能加快筛选候选药物。用图卷积网络(graph convolutional network)预测,测试误差约 0.46。但图卷积只用到节点,不用到边上的信息,比如两个原子之间是单键、双键还是三键。
处理图时,有价值的信息不仅在节点里,也在边里。
When dealing with graphs, valuable information is found not only in the nodes but also in the edges.
第11章 Predicting Molecular Properties with Message Passing,p.491
消息传递网络(message-passing network)让每条边把两端节点和边本身的信息合成一条“消息”,每个节点收集发给它的消息再更新自己。作者说,图卷积可以看作消息传递的一个特例。改用消息传递后,误差降到约 0.22(第 11 章)。
项目 11A:模拟沙子(第 11 章):传统的力场模拟要计算每对粒子之间的相互作用和摩擦,计算量很大。作者用 SAND 数据集(模拟沙子的颗粒体系)训练一个图网络模拟器(graph network–based simulator):每个粒子是一个节点,距离近的粒子之间连边;网络预测每个粒子的加速度,再一步步推算出速度和位置,接着进入下一步。训练时故意给位置加一点随机噪声,作者解释,这样一步步往前推时误差不容易越积越大。训练可能长达数周,作者提供的预训练模型在一台配高端 GPU 的电脑上训练了几天。
不过,一旦训练完成,图网络模拟器做模拟的速度要比传统力场方法快得多。
However, once trained, the graph network–based simulator can perform simulations much faster than traditional force-field methods.
第11章 Training the Model,p.508
单算一次的话力场方法可能更快,但训练好的网络可以反复用于任意多次模拟(第 11 章)。
项目 11B:MAGIK 追踪细胞(第 11 章):细胞追踪通常分两步:每帧里找出细胞,再跨帧连成轨迹。本项目做第二步,用作者团队 Jesús Pineda 等人 2023 年发表的 MAGIK 算法。数据是细胞追踪挑战赛里增殖的 HeLa 细胞视频,并故意用计算机生成的、不完美的分割结果,模拟真实场景。每个细胞是一个节点,空间和时间上相近的细胞之间连边;网络的任务是判断每条边是不是真连接(同一个细胞在移动,或者母细胞分裂成子细胞)。MAGIK 的关键是局部注意力:更新某个细胞的信息时,给邻近细胞的连接更大权重。训练数据只有一张图,作者说看似太少,但够用,办法是从中截取许多时间片段,再随机旋转、翻转。测试视频上边分类的 F1 约 0.99;再用一段后处理把判为相连的边串成轨迹,细胞分裂时也大多重建正确(第 11 章)。章末文献里,作者提到 2017 年 Gilmer 等人的消息传递框架,以及 2021 年 John Jumper 等人发表的 AlphaFold 论文;作者说 AlphaFold 的两位创造者 Demis Hassabis 和 John Jumper 分享了 2024 年诺贝尔化学奖(第 11 章)。
第 12—13 章
少标注和会决策:主动学习与强化学习
主动学习:挑最值得标的数据(第 12 章):
并非所有数据都同样重要。很多时候,标注数据的成本很高,已标注的数据又很有限。
Not all data is created equal. In many cases, the cost of labeling data is high, and the amount of labeled data is limited.
第12章 Continuously Improving Performance with Active Learning,p.529
主动学习(active learning)让算法自己挑出最有信息量的数据去请人标注。三个要素:查询策略(query strategy,决定挑哪些)、未标注池(unlabeled pool,从中挑选的大量数据)、标注者(书中叫 labeling oracle,可以是人工、领域专家或自动系统)。最常见的策略是不确定性采样(uncertainty sampling):专挑模型最没把握的样本。作者在二维玩具数据上演示:随机挑的点多落在两组数据的中心,对确定分界线帮助不大;不确定性采样挑的点集中在分界线附近,用同样多的标注达到更高准确率。随机挑选有偶然性,作者重复做了 50 次再比较平均结果(第 12 章)。
项目 12A:用 3% 的标注认数字(第 12 章):用全部 6 万张 MNIST 训练图,卷积网络准确率约 99%。每轮只新标 120 张、总共 1,800 张时:随机挑约 92%,不确定性采样约 95%。
然而,99% 的基线准确率与不确定性采样所达准确率之间的差距表明,神经网络通常不擅长估计自己的不确定性。
However, the gap between the baseline accuracy of 99 percent and the accuracy achieved through uncertainty sampling reveals that neural networks are generally poor at estimating their own uncertainty.
第12章 Uncertainty Sampling,p.551
作者指出的另一个坑:不确定性采样会偏爱离群点和信息残缺的数据,它们最不确定,却未必最有用。对策是同时考虑样本之间的差异(多样性)和对整体分布的代表性。他用的对抗采样(adversarial sampling)就是把不确定性和多样性结合起来:另训一个判别器区分已标注和未标注的图,判别器把一张未标注图误认成“已标注”,说明它和已有的图很像,标它意义不大。结果对抗采样只用 3% 的训练数据,就接近了全量训练的准确率。另一个经验:每轮都把模型重置到初始状态再训练,否则模型会越来越偏向早期挑中的样本(第 12 章)。作者强调,主动学习在数据分布随时间变化的真实场景里尤其有用:持续挑出最相关的新样本去标,模型不必在海量数据上从头重训就能保持准确(第 12 章)。
强化学习的基本概念(第 13 章):强化学习(reinforcement learning)训练计算机作为智能体(agent)做决策、控制系统:它观察环境的状态(state),选一个动作(action),得到奖励或惩罚(reward),再调整策略(policy),让将来的总奖励最大。应用从机器人学走路、管理投资组合,到击败围棋世界冠军的 AlphaGo。Q 学习(Q-learning)给每个“状态加动作”估一个分数(Q 值):这一步的即时奖励,加上打过折扣的未来最好奖励(贝尔曼方程,Bellman equation)。强化学习的一个关键难题是在探索(exploration,试新动作看效果)和利用(exploitation,用已知最好的做法)之间取得平衡。作者介绍了一种近年的思路,好奇心驱动探索(curiosity-driven exploration):
智能体遇到可预测的奖励时会感到某种“厌倦”,而意外的奖励或惩罚更让它好奇、更值得探索。
the agent experiences a form of “boredom” when encountering predictable rewards, while it finds unexpected rewards or penalties more intriguing and worth exploring.
第13章 Understanding Reinforcement Learning and Q-Learning,p.561
简化版俄罗斯方块(第 13 章):作者自己写了一个 4×4 的简化版俄罗斯方块(Tetris,1984 年由 Alexey Pajitnov 创造):四种由 2 到 4 个小方块组成的方块,一次消 1 行得 1 分、消 2 行得 10 分,鼓励一次多消几行;方块堆到顶就输,罚 100 分。难点是奖励太稀少:没训练的智能体几乎随机乱动,要经过一长串左移、右移、旋转才可能消一行,迟迟得不到反馈。作者的办法是“瞬移”:让智能体直接选定方块落在哪一列、朝哪个方向(第 13 章)。
Q 表的局限(第 13 章):棋盘 16 个格子各有空、满两种状态,再加当前方块的种类,共 262,144 种状态,每种状态 16 个动作,Q 表有 400 多万格。在固定的方块序列下训练 1,000 局,约第 350 局时智能体学会了不输。但这只是死记:它每次都走同一套,只要偶尔插入一步随机动作,就玩不下去了。
非零行这么少,说明智能体只学会了把策略集中在固定方块序列遇到的那一小部分状态上,并没有学会推广到其他情形。
Such a small number of nonzero rows suggests that the agent has learned to focus its strategy on the subset of states encountered with the fixed sequence of tiles but has not learned to generalize to other situations.
第13章 Training the Q-Learning Agent,p.583
换成随机方块序列,训练 20 万局,平均奖励最好也只在 0 附近,Q 表仍有大片状态从没碰到过(第 13 章)。
深度 Q 学习(第 13 章):深度 Q 学习(deep Q-learning)不用表,而用神经网络根据状态估计每个动作的 Q 值,相似的状态可以共享经验。如果同一个网络既选动作又给自己定目标,容易形成恶性循环:它稍微高估了某个动作,就反复选它,更新又强化这个错误。所以要再设一个更新得慢的目标网络(target network)。作者的比喻是师生:
TargetNet 扮演睿智的老师,提供稳定可靠的指导。
The TargetNet acts as the wise teacher, providing stable and reliable guidance.
第13章 Understanding Deep Q-Learning,p.586
学生(主网络)随新经验不断更新,老师的知识固定一段时间,再定期按学生的进步更新。另外两个办法是:开始时多探索、随训练逐步减少随机动作;把经历存进一个“经验回放缓冲区”(replay buffer),训练时随机抽取,减少前后相邻样本太相似带来的偏差。在随机方块序列下训练 1 万局,约 4,000 局后开始学会,平均奖励稳步升到约 50(第 13 章)。章末文献里,作者提到 2013 年 Mnih 等人用深度 Q 网络以超人水平玩 Atari 游戏,以及 2016 年 Silver 等人的 AlphaGo 论文(第 13 章)。
第 14 章、结语
储备池计算与结语
储备池计算:只训练最后一层(第 14 章):前面各章的网络都要靠反向传播大量训练、反复调参。储备池计算(reservoir computing)换了思路:用一个大的、随机连接的神经元网络当“储备池”(reservoir),它的权重固定不训练,只训练最后一个简单的读出层(readout layer)。储备池像输入序列的动态记忆,把输入投射到更高维的空间里,让模式更容易区分。
基本思想是利用储备池丰富的动力学来干重活,让系统从过去中学习、预见未来。
The basic idea is to harness the rich dynamics of the reservoir to do the heavy lifting, allowing the system to learn from the past and anticipate the future.
第14章 Introducing Reservoir Computing,p.602
作者认为,只训练输出权重大大减轻了计算负担,还避开了深度学习常见的过拟合陷阱;训练过程完全确定,同样的数据和配置一定得到同样的权重,模型可能更简单、更好解释。缺点是可能找不到随机训练能找到的解,而且为特定数据设计储备池需要不少专业知识(第 14 章)。储备池权重矩阵的整体放大倍数(术语叫谱半径,spectral radius)很关键:它决定信号在网络里是衰减还是放大,作者说要让储备池既不太稳定(信号消失太快),也不太混乱(信号失控)(第 14 章)。
洛伦兹系统与蝴蝶效应(第 14 章):混沌系统(chaotic system)的初始条件差一点点,结果就截然不同,这就是蝴蝶效应(butterfly effect),天气和金融市场都是例子。洛伦兹系统(Lorenz system)是气象学家爱德华·洛伦兹(Edward Lorenz)在 1960 年代初提出的简化天气模型,只有三个方程,却表现出无法预测的混沌行为,画出来是著名的蝴蝶形“洛伦兹吸引子”(Lorenz attractor)。作者把初始值改动百万分之一,两条轨迹起初几乎重合,随后越分越开;但两条轨迹最终都落在同一个吸引子上。
这种收敛说明:系统的短期行为依赖初始条件,高度敏感、无法预测;它的长期动力学却被限制在一组特定的模式和结构里,这就是洛伦兹吸引子。
This convergence suggests that while the system’s short-term behavior is highly sensitive and unpredictable because of its dependence on initial conditions, its long-term dynamics are confined to a specific set of patterns and structures, represented by the Lorenz attractor.
第14章 Demonstrating the Butterfly Effect,p.609
作者把这称为“短期敏感、长期确定”的二重性:不可预测与秩序在混沌系统里并存(第 14 章)。
预测的结果(第 14 章):作者搭了一个 300 个神经元的储备池,用一半轨迹训练,一次性解出输出权重,再让它自己一步步往后预测另一半。预测起初和真实轨迹吻合,随后分离,这是混沌系统对初值敏感的必然结果;但预测轨迹重现了吸引子的形状。
因此,尽管单条轨迹终将随时间分道扬镳,反映出它们对初始条件与生俱来的敏感,吸引子的整体模式依然保持。
Thus, even as individual trajectories inevitably part ways over time, reflecting their innate sensitivity to initial conditions, the overall pattern of the attractor prevails.
第14章 Comparing Lorenz Attractors,p.619
作者据此认为,这样的模型可以用来预测系统长期的定性特征(第 14 章)。章末文献里,作者提到 2004 年 Herbert Jaeger 和 Harald Haas 在 Science 发表的论文,最早显示储备池计算能在真实任务上与其他机器学习方法竞争;还提到 1982 年提出霍普菲尔德网络的 John J. Hopfield 分享了 2024 年诺贝尔物理学奖(第 14 章)。
结语:这只是开始(结语):作者祝贺读者从全连接网络一路学到 GAN、Transformer 和储备池计算,接着给出后续的路:拿新数据集做自己的项目;跟踪期刊、会议和预印本上的最新研究;深入计算机视觉、自然语言处理、强化学习等专门领域,研读奠基论文;加入社区、参与开源,在 GitHub 上记录和分享项目,建立作品集,用来展示技能、结识合作者和雇主。
但这只是开始。现在是时候去实验、去创新了。
But this is just the beginning. Now it’s time to experiment and innovate.
结语 Conclusion,p.623
保持好奇,持续学习,不断拓展深度学习所能达到的边界。
Stay curious, keep learning, and continue pushing the boundaries of what’s possible with deep learning.
结语 Conclusion,p.624