跳转至

第6章:如何为影像应用构建人工智能算法(How to Build Artificial Intelligence Algorithms for Imaging Applications)

6.1 分类卷积神经网络(Classification CNNs)

分类 CNN 通常由若干卷积层和介于其间的池化层交替堆叠而成。第一个卷积层记录输入图像的局部信息,例如边缘、纹理、亮度等底层特征;后续的卷积层在前面局部信息的基础上进一步组合,从而每一层都识别出比前一层更复杂的视觉信息合成。最终的几层通常是全连接层,给出网络的输出或分类结果。分类 CNN 区别于其他架构的一个关键特性,是它执行降维(dimensionality reduction):它把 2D 或 3D 的输入图像压缩为 1D 的输出类别向量。CNN 的卷积核通过在整幅图像上滑动来测量图像对任意小尺寸模式的局部响应,从而形成对应的激活图,并送入下一层。池化层(例如 2×2 的最大池化)则通过对每个小块取最大值来进一步降低特征图的空间尺寸。

这种架构的原型例子是 LeNet-5,它在 1998 年提出,由三层卷积层配合平均池化层构成,并被成功应用于 MNIST 数据集的手写数字识别。后来广为人知的 AlexNet 赢得了 2012 年的 ImageNet 比赛,它由五层卷积层和三层最大池化层组成;其性能优势的重要来源之一是加入了 dropout 和数据增强(data augmentation)两项技术,这两项都提高了模型的泛化能力。后续最先进(state-of-the-art)的架构——GoogLeNet(又名 Inception v1)、VGG、ResNet、DenseNet、ResNeXt、SENet 等——本质上仍以 CNN 为基础,只是在架构上加入了各种技巧和改进。

CNN 已经被广泛地应用到胸影像的多个具体任务中。Lakhani 等人使用 GoogLeNet 和 ResNet 将胸片分类为结核阳性或阴性。一种五层 CNN 在 32×32 的体素块(voxel patches)上对间质性肺疾病(interstitial lung disease, ILD)进行分类。Tang 等人使用 AlexNet、VGG、ResNet、Inception、DenseNet 等多种架构将胸片分类为正常或异常,并取得了优秀表现。

6.2 目标检测(Object Detection)

目标检测(object detection)在分类的基础上进一步给出物体在图像中的位置——这是一个回归问题,因为输出是数值(边界框的坐标)而不是类别。R-CNN 及其后续版本 Fast R-CNN、Faster R-CNN 是一类非常流行的目标检测方法,其结构包括三个组件:(1) 一个预训练的特征提取器(pre-trained feature extractor),通常取自一个分类算法的前若干层(例如 VGG 的前面几层),用于从候选边界框中抽取特征;(2) 一个区域提议算法(region proposal algorithm),用来在图像中搜索潜在的目标位置(bounding boxes);(3) 一个分类器(classifier),它用提取到的特征来判断目标的具体类别。R-CNN 和 Fast R-CNN 使用独立于网络的区域提议算法,而 Faster R-CNN 把区域提议整合进同一个神经网络,从而能够端到端(end to end)训练:先训练特征提取器,再在它的基础上训练区域提议网络(region proposal network),区域提议网络的输出经过一个池化层后被送入分类器。区域提议网络与其他组件的训练交替进行。Faster R-CNN 在 2015 年的 ImageNet 大规模视觉识别(ILSVRC)目标检测挑战赛中获得了第一名。

另一类被广泛使用的目标检测方法是 YOLO(You Only Look Once)。YOLO 把图像划分为网格单元(grid cells);对每个网格单元,算法同时给出多个候选边界框以及"置信度"——也就是预测的每个边界框与真值边界框的重叠程度(IoU),并生成该网格代表一个目标的概率估计。YOLO 的网络设计与分类网络类似:多层卷积/最大池化交替堆叠,再接全连接层产生上述输出。这种设计的优点是速度快,相对其他方法(例如 Faster R-CNN)以较小的精度代价换取了显著的加速,后续的 YOLO 更新版本带来了逐步的性能提升。

Faster R-CNN 与 YOLO 已经在胸影像的多个应用中被使用,包括胸片上的异物检测、胸部 CT 上的肺结节检测以及胸片上的其它异常检测。

6.3 分割(Segmentation)

现代大多数分割架构都采用全卷积神经网络(fully convolutional neural networks, FCNs),其特点是去掉了全连接层。FCN 原本是为图像分类设计的 CNN 向分割任务的扩展。其核心洞见是:一个 CNN 的全连接层等价于一个卷积层。例如,假设一个 CNN 的最后卷积层有 j 个激活图、空间尺寸为 k×k,而其最终稠密层有 n 个神经元,那么该 CNN 对每个 n 神经元的输出就是 j×k×k 个激活的加权和;这与一个具有 n 个尺寸为 k×k 的滤波器(filter)的卷积层在数学上是等价的。

这种转换的好处在于:与全连接层不同,卷积层没有固定的输入尺寸要求,因此网络可以处理任意大小的图像。如果把一个 FCN 应用到比训练时更大的图像上,得到的不是单一的类别预测,而是一张较低分辨率的整图分割图(segmentation map)。要得到与原始分辨率一致的精细分割图,需要添加上采样层(upsampling layers)来放大输出激活图的尺寸。在 FCN 中,上采样通常通过转置卷积层(transposed convolutional layer,等价于先对输入做零填充再做一次卷积)来实现;进一步地,通过跳跃连接(skip connections),可以把来自更浅层的、更精细的结构信息补充进来,从而进一步细化分割结果。

这些思想在流行的 U-Net 架构中被采用。U-Net 同样由一组卷积/下采样层接着一组上采样层构成;与 FCN 相比,它的下采样路径和上采样路径完全对称,且跳跃连接做的是拼接(concatenation)而不是加法运算。这些跳跃连接还具备对抗梯度消失(vanishing gradient)的能力——所谓梯度消失,是指在很深的网络中,浅层权重因梯度极小而更新效率极低的现象。下采样与上采样路径对称地呈 U 形,因此得名 U-Net,这类架构也被称为编码器-解码器架构(encoder-decoder architectures)。

Mask R-CNN 是 Faster R-CNN 面向分割的扩展,对每个被提议的区域增加一个 FCN 分支,在分类的同时并行地预测其分割掩码(segmentation mask)。U-Net 已经被用于许多应用,包括从心脏 MRI 量化左心室的尺寸和功能、对主动脉夹层 CT 中真腔和假腔的分割;一种 3D U-Net 风格的网络被用于量化肥厚型心肌病(hypertrophic cardiomyopathy, HCM)患者的心肌延迟强化。Mask R-CNN 则被用于 PET-CT 上的肺癌检测与分割。

6.4 重建(Reconstruction)

将原始 CT 或 MRI 数据转换为图像的重建算法通常需要专门的知识背景才能开发。这些重建算法通常被表述为具有已知解的最小化问题(minimization problems);但深度学习方法可以在其中发挥作用:用来加速这一过程,确定其中的特定超参数。例如,Yang 等人将压缩感知 MRI 的交替方向乘子法(Alternating Direction Method of Multipliers, ADMM)重新表达为一个深度神经网络,并由此在保持低重建时间的同时获得了优于传统方法的图像质量。

6.5 后处理(Postprocessing)

另一类算法作用于已经转换到图像域(image domain)的数据,并对其执行一些操作,例如伪影抑制、降噪或其它增强图像质量的过程。这一类算法在结构上通常复用了前面已经讨论过的多种基本构件。例如,一种用于 CT 的去噪算法使用了带跳跃连接和残差连接(residual connections)的编码器-解码器架构。Jin 等人用带跳跃/残差连接的 U-Net 来提升低剂量 CT 的图像质量。Masutani 等人使用两种架构——一个三层卷积网络和一个 U-Net 风格的网络——基于仅从一部分 k-space 采样重建出的图像来生成"超分辨率"(super-resolution)的心脏 MRI 图像。

6.6 其他常用架构组件(Other Common Architectural Components)

Dropout 层是防止过拟合(overfitting)的有效方法,它在训练过程中随机地"关闭"一些神经元。在训练开始之前选定一个 dropout 概率 p,则每个神经元都以概率 p 被随机置零。由于神经元是被随机停用的,神经网络不会过度依赖任何单个神经元的输出,从而在结构中建立冗余。其效果是降低过拟合、提升模型的鲁棒性,并改善泛化能力。使用 dropout 也会延长训练时间,但通常能带来更好的结果。

Batch Normalization(批归一化)解决的是训练深度网络时的一个具体问题:作为权重优化方法,梯度下降(gradient descent)过程中的梯度有越来越小(梯度消失,vanishing gradient)或越来越大(梯度爆炸,exploding gradient)的趋势,导致网络的权重或完全不更新、或数值变得很大、不稳定,从而无法训练出好的模型。这一现象的根源在于:深层的输出方差倾向于增大,而激活函数在极端输入值下又可能进入饱和区(例如 sigmoid 在 0–1 输入范围内),造成小梯度。已经提出的对策包括使用不饱和的激活函数(nonsaturating activation functions),而一种最流行的解决方法就是 batch normalization:它本质上在每一层对输入做归一化以控制其方差。正因如此,batch normalization 现在经常被插入到深度神经网络相邻的卷积层之间。

预训练 vs 从头开始(pretrained vs de novo)。神经网络既可以从零开始(from scratch)开发,也可以利用公开的在线代码库复用他人的工作。快速原型阶段通常更快的方式是直接采用久经考验的现有网络架构,而不是开发新的。在许多情况下,在线模型仓库中已经存在预训练网络(pretrained networks),即网络的权重已经在某个独立的数据集上完成过预训练。从一个预训练网络出发,相比从零开始,可以缩短训练时间、减少所需的数据量;这个过程称为迁移学习(transfer learning)。理想的情况是,模型在一个与新任务相似的数据集上预训练;例如,肺结节检测的预训练 CT 模型就是一个很好的起点,可以用来开发识别实变(consolidation)的模型。然而,即便预训练所用的特征并非直接相关,使用预训练网络仍然是有用的。例如,从 ImageNet 这样的彩色物体(船、飞机)分类数据集预训练出来的 CNN 仍然对放射学应用有用,这是因为神经网络较早的几层识别的是通用的底层视觉特征,这些特征在不同模态之间可以迁移。在大多数情况下,从预训练网络开始是有益的;但在某些情况下,所需的相关架构可能根本不存在。

6.7 损失函数的确定(Determine the Loss Function)

与任何优化问题一样,需要指定一个损失函数(loss function,也叫 cost 或 objective function),它是算法试图最小化的目标。损失函数的一个重要性质是可微(differentiable),因为这正是通过反向传播(backpropagation)来优化权重所需要的。

对 N 类分类问题,损失函数通常使用交叉熵损失(cross entropy loss),定义为

\[ L = -\sum_{k=1}^{N} c_k \log p_k \]

其中 \(c_k\) 是真实标签(真类时为 1,否则为 0)。这一损失函数背后的直觉是:它等价于对"预测为真类"这一事件取对数概率。例如,若真类为 a(\(1 \le a \le N\)),则损失就是 \(-\log p_a\);也就是说,当 \(p_a\) 较低时损失较高,当 \(p_a\) 较高时损失较低。在两类情况下,损失退化为二元交叉熵(binary cross entropy)

\[ L = -\left[c \log p + (1 - c) \log(1 - p)\right] \]

其中 \(p\) 是类别 \(c = 1\) 的概率。

目标检测问题,损失函数会同时包含一项用于判定真类的分类损失和一项用于评估边界框拟合程度的回归损失。最常用的回归损失是均方误差(mean square error, L2 loss)和平均绝对误差(mean absolute error, L1 loss)。L2 损失对 N 个预测值 \(\hat{y}_k\) 和真值 \(y_k\) 的定义为

\[ L_2 = \frac{1}{N} \sum_{k=1}^{N} (y_k - \hat{y}_k)^2 \]

L1 损失为

\[ L_1 = \frac{1}{N} \sum_{k=1}^{N} |y_k - \hat{y}_k| \]

举例来说,Faster R-CNN 的损失函数是交叉熵与一种叫 smooth L1 损失的改进 L1 的加权和。

分割问题,损失函数也可以用二元交叉熵,但在类别不平衡(class imbalance)时用其它损失函数更合适。Dice 系数(dice coefficient)经常被用来评估两个集合 A 和 B 的重合度,其定义为两个集合交集的两倍除以各自元素数目之和。为使其可微,在 dice loss 中做了一个小的修改:

\[ L = 1 - \frac{2 |A \cap B|}{|A| + |B| + \varepsilon} \]

其中 \(\varepsilon\) 是一个小常数。一些分割损失会把这一项与二元交叉熵合并使用。

重建问题,损失函数可以选用 L2 损失,或使用包含结构相似性指标(structural similarity index, SSIM)的损失。两幅图像 x 和 y 之间的 SSIM 定义为

\[ \text{SSIM}(x, y) = \frac{(2\mu_x\mu_y + C_1)(2\sigma_{xy} + C_2)}{(\mu_x^2 + \mu_y^2 + C_1)(\sigma_x^2 + \sigma_y^2 + C_2)} \]

其中 \(\mu_x\)\(\mu_y\) 分别是 x、y 的均值,\(\sigma_{xy}\) 是 x 与 y 的协方差,\(\sigma_x^2\)\(\sigma_y^2\) 是 x、y 的方差,\(C_1\)\(C_2\) 根据 x、y 的动态范围选取。

6.8 训练参数设置(Set Training Parameters)

在实际开始训练之前,还有若干需要先确定的事项;它们属于训练神经网络的通用问题,与为影像构建算法的具体情境关系不大。

学习率与优化器(Learning Rate and Optimizers)学习率(learning rate)这个超参数控制着每一步更新权重的幅度——它由损失函数及其各中间项的梯度决定。如果学习率过高,权重会变化过快,从而无法收敛到一个损失最小值;如果学习率过低,模型可能落入一个局部最小(local minimum)而不是一个更优的最小值,并且收敛所需的时间也会变长。因此学习率对算法的性能和训练时长都有显著影响。一族学习率优化器算法被开发出来,用以考虑前几步梯度的大小来改进这一过程,常用的例子包括 AdaGrad、RMSProp、Adam。但经验上的好做法仍然是:在数量级上跨越多个取值来训练算法——找到学习率的"甜蜜点"往往决定模型能不能收敛。

批量大小(Batch Size)。批量大小是指每次更新权重时所考察的训练样本数。对很多影像任务来说,批量大小受 GPU 显存的限制,应在不超出显存的前提下尽量取较大的批量。

数据增强(Augmentation)。训练时常常使用数据增强(augmentation)方法来"等效地"扩大训练集的大小。数据增强的核心思想是:很多图像层面的操作不会改变图像的内容——例如,肺结节旋转之后仍然是肺结节。因此,一张经过旋转的肺结节图像连同其标签可以作为一条有效的训练样本。常见的数据增强技术包括亮度/对比度调整、模糊、翻转、平移、旋转、剪切、裁剪、缩放等。与 dropout 类似,数据增强也有助于滤除虚假信号,并让算法更具有泛化能力。

6.9 训练算法与超参数调优(Training Your Algorithm / Hyperparameter Tuning)

关于数据准备的提醒(A Note on Data Preparation)。在算法选型和训练之前,必须对数据的整理(curation)付出特殊的关注,因为任何机器学习算法的强度和准确性最终都完全取决于所提供训练数据的质量和数量。训练所需的样本量随任务的复杂度而增加——例如,在胸部 CT 上对心脏各腔室做分割所需要的训练数据,可能少于对先天性心脏病患者的心脏腔室做分割;但作为最低要求,至少需要几百例来自不同患者的样本。同时还必须考虑:需要哪些标注?这些标注是否可获得?如果只想识别先天性心脏病患者,从临床记录中获取该诊断可能比较容易,但若要分割心脏各腔室,就需要相当大量的人工标注。最后,必须特别小心地把数据切分为相互独立的训练集和测试集。以胸部 CT 的心脏腔室分割为例:CT 本身就是一组 2D 切片的堆叠,同一患者的各切片不应同时出现在训练集和测试集里,否则会引入过拟合——算法会在训练集上"见过"相似的图像,从而以牺牲对独立数据集的表现为代价换取训练集上的高性能。换句话说,不恰当的数据切分会导致模型性能被严重高估。读者可以参考本书第 5 章中关于心血管 AI 算法数据准备与整理的更多细节和建议。

超参数调优(Hyperparameter Tuning)。在数据准备、算法开发和训练参数设置完成之后,下一步是训练算法。训练过程中需要调整多种参数——学习率、批量大小、正则化程度、dropout 程度、数据增强方式等——以取得最优结果。这一过程叫做超参数调优(hyperparameter tuning)。超参数空间可能很大,因此调优是一项艰巨的任务。最基本的做法是为每个超参数挑选若干候选值,然后对所有组合一一尝试,这叫网格搜索(grid search)。网格搜索虽然穷尽,但也是最耗时的。在随机搜索(randomized search)中,为每个超参数指定一个取值范围,从中随机抽取一组超参数组合;当候选值范围很大时,随机搜索比网格搜索更快地找到一个合理的解,并且由于取值不受网格的约束,结果甚至可能优于网格搜索。然而,随机搜索仍只覆盖了搜索空间的一小部分。更系统的方法是:在尝试不同超参数组合的同时,把已获得的信息用于引导下一组超参数的选择。例如,若发现学习率取 0.1 时训练发散(divergence),就不应再尝试这么大的学习率。这一优化问题可以通过贝叶斯优化(Bayesian optimization)来解决。简言之,贝叶斯优化包含两部分:先定义一个代理模型(surrogate model),把损失建模为超参数的函数;再用一个采集函数(acquisition function)来决定下一组要尝试的超参数。代理模型的例子包括 Random Forest Regression、Gaussian Process 和 Tree-structured Parzen Estimator (TPE);采集函数的例子包括 expected improvement (EI) 和 upper confidence bound (UCB)。许多优化方法都已经有公开的实现,例如 Scikit-Optimize。训练完成之后,下一步是对算法进行验证和测试,这将在第 12 章进一步讨论。

6.10 进阶方法(Advanced Approaches)

集成网络(Ensemble Networks)。集成网络——具体而言是堆叠集成网络(stacked ensemble networks)——是一类通过同时利用多个组成网络的预测能力来提升算法表现的方法。集成时不用单一网络来完成任务,而是同时开发多个网络来执行同一任务;这些网络的预测结果再通过投票或平均汇总,在某些情况下会用一个独立的网络以更复杂的融合(fusion)方式进行合并。集成中的各组成网络可以采用差别很大的架构,从而捕捉到多样化的特征组合,以提升算法性能。集成中的组成单元也可以是完全不同种类的机器学习算法,例如广义可加模型(generalized additive models)、随机森林(random forests)和支持向量机(support vector machines)。虽然深度学习算法延长的训练时间和计算复杂度限制了大型集成网络的实现,但包含 2–3 个精心挑选的网络架构的小型集成算法仍可带来显著的性能提升。例如,Bahrami 等人提出了一个仅包含两个组成网络的集成深度学习算法,用于自动选择心肌反转时间(myocardial inversion time)。第一个组成网络采用 VGG19 架构以捕捉空间影像特征;第二个组成网络是双向 LSTM(bidirectional LSTM),用来捕捉跨图像序列的时序信息;两个网络的输出特征再被送入一个较小的全连接网络以选择心肌反转时间。该集成算法在相对于专家标注的真值时取得了 92.1% 的准确率,高于其各个组成网络(VGG19: 83.9%,LSTM: 81.9%)。

级联网络(Cascaded Networks)。放射科医生在内部实际上是以多阶段的方式完成影像任务的。例如,要在 CT 上对肺结节进行定性,医生可能先在 CT 序列中滚动浏览以检测出一个结节候选;然后在第二阶段,根据其影像特征进一步把候选结节细分为恶性或良性。级联式深度学习算法(cascaded deep learning algorithms)是集成学习的一个子集,显式地模拟这种多阶段过程:把一项复杂的影像任务(如结节检测)拆分为若干较简单的子任务,由各自独立训练的网络完成;这些独立训练的网络再被依次串接。多种级联方法已经在心血管胸影像的多种任务上被开发出来,包括 CT 上的肺结节检测和心脏 MRI 的成像平面定位。Cui 等人和 Tan 等人都用级联方法做肺结节检测:第一阶段用一个网络来定位候选结节;候选结节被裁剪后送入第二阶段的网络做结节分类。Tan 等人还在定位候选结节之前先用一个肺分割网络,以确保结节检测被限制在肺区内。Blansit 等人开发了一个级联深度学习算法,用于在心脏 MRI 中自动给出成像平面(prescribe imaging planes)。他们把"自动平面给出"这一总任务拆解为三个子任务,由三个独立训练的网络完成:一个二尖瓣层面(MVS)定位网络、一个心脏边界框(BB)网络,以及一个用于瓣膜定位的第三个网络。MVS 定位网络得到的 MVS 层面先被 BB 网络裁剪,再被送入最终的瓣膜定位网络,得到用于确定成像平面的瓣膜位置。

多任务网络(Multitask Networks)。心血管胸影像中的深度学习算法通常被设计为完成单一的总任务(如结节检测、心脏分割、肺炎检测)。通过训练,网络可以学到对完成该任务有用的影像特征。然而,由于只关注单一任务,网络可能会忽略那些本可进一步提升算法表现的影像特征。多任务网络通过强制深度学习算法同时执行多项相关任务来挖掘这些未被充分利用的特征。结果是:网络学到的影像特征被多项相关任务协同地共享,通常能提升算法的整体表现。

空间变换层与图像配准(Spatial Transformation Layers and Image Registration)空间变换网络(spatial transformation networks, STNs)通常被嵌入到更大的网络内部,学习对图像做空间上的操作,从而使算法对空间差异具有鲁棒性(典型例子是患者在扫描仪中的体位差异)。在放射学中,STN 最常被用来通过快速自动的仿射和可变形配准(affine and deformable registration)来标准化图像视角

定制化架构(Customized Architectures)。上述所有进阶方法都可以以多种方式组合,从而得到越来越灵活的算法架构来应对各种影像任务。例如,可以先用空间变换网络来标准化图像视角,再把它送入一个堆叠集成网络的级联,每个组成网络有各自的多任务目标——那么这条路走到哪里才是尽头?过于复杂架构的开发通常受限于算力可用训练数据量。因此,在心血管胸影像的语境下,借助领域专家的知识来理解所期望任务背后的机制,对于设计更复杂的网络架构非常重要。

6.11 深度学习库与硬件(Deep Learning Libraries and Hardware)

软件(Software)。Python 通常是机器学习首选的编程语言——它最常用,也最易上手。市面上有多种可用于深度学习的软件库。TensorFlow 是 Google 的开源深度学习库,是目前使用最广泛的;它有出色的文档,且大多数放射学应用都是在 TensorFlow 中实现的。TensorFlow 的使用者可以访问大量的预训练模型;TensorFlow 还非常适合部署和上线(deployment/production),并能相对容易地使用 Tensor Processing Units (TPUs)——这是 Google 自研的用于加速机器学习任务的应用专用集成电路(ASIC)。Keras 是构建在其它深度学习库之上的库,由于易用和文档完善,对经验不足的程序员非常友好;Keras 可以在 TensorFlow、Theano 以及其它深度学习后端上运行,并已因其实用性而被完整集成到 TensorFlow 2 中。Keras 一般较高级,可能缺少某些可定制性,但可以用 TensorFlow 的灵活性加以补充。PyTorch 是由 Facebook 的 AI 研究组(FAIR)开发的开源库;其命名保留了 Python 的语法,因此对已经熟悉 Python 的人来说非常容易上手。PyTorch 相比 TensorFlow 使用较少,但由于支持快速原型开发而受到许多 AI 研究者的青睐。TensorFlow 之前要求固定的计算图,而 PyTorch 采用动态计算图,可以在任何时刻调整——例如用以处理大小不一的输入。PyTorch 最初是作为 Torch(一个不再活跃维护的机器学习库)的 Python 版本开发的。Caffe 是伯克利开发的、面向计算机视觉应用的库;它在学术圈很受欢迎,许多早期的心血管胸影像放射学研究是用 Caffe 写成的。Caffe 现在已经被 Caffe2 取代,后者又并入了 PyTorch;Caffe2 强调可扩展性以及面向移动端的生产部署。其它框架还有 Microsoft Cognitive Toolkit、MXNet 和 Theano;它们各有优劣,本章建议初学者从 Keras/TensorFlow 或 PyTorch 入手,因为它们的文档完善且上手容易。

硬件(Hardware)。硬件需求因应用而异。层数少的浅层 2D CNN 在 CPU 上就能在合理时间内完成训练。但实际中医学图像体量很大,许多应用需要相当大的内存。本章建议配备至少 11 GB 显存的显卡(例如 Nvidia GTX 1080 Ti),如果预算允许,更大则更好。任何使用 3D 卷积的网络(如 3D U-Net)都吃资源,更大的内存是必需品。对机器学习的从业者来说,硬件选择上需要决定自建工作站使用云服务(如 Amazon Web Services、Google Cloud、Microsoft Azure)之间的取舍。对低频使用或轻量应用,云服务更具成本效益;但对持续使用(如连续数月不间断使用 GPU),同等配置下自建会更便宜。云服务可以随时启动不同硬件规格的实例,灵活度高,也更可靠;自建工作站则要自己处理硬件故障。一个折中方案是预装工作站——通常附带保修和技术支持,但比自行组装更贵。最后,云端方案更易遭受网络攻击,而本地方案通常更安全。

6.12 结论与延伸阅读(Conclusion / Further Reading)

本章概述了为影像构建一个 AI 算法的完整流程:从问题类型的定义常见架构再到训练的基本概念。作者邀请读者通过领域内专家撰写的资源进一步深入。Computer Vision: Algorithms and Applications(Szeliski)给出了经典计算机视觉方法的全面综述,修订版预计于 2021 年出版。Deep Learning with Python 由 Keras 的作者 François Chollet 撰写,是开始写深度神经网络的优秀入门。在线课程包括 Andrew Ng 在 Coursera 上的 Deep Learning 课程,以及 Stanford 的 CS231n(Convolutional Neural Networks for Visual Recognition),其讲义和笔记在网上可以免费获取。最后,构建影像算法的能力只能通过经验积累这一点怎么强调都不为过——最好的学习方式就是动手编程,本章只是一个起点。

本章个人批注

本章是全书"算法侧"的核心一章,它实际上把前几章分散讨论的"卷积、池化、激活、损失"等组件按"任务类型 → 架构 → 训练"重新组织成了一张工程化的工作流图:分类 → 检测 → 分割 → 重建/后处理 → 通用组件(dropout/BN/迁移学习)→ 损失函数 → 训练参数 → 超参数调优 → 进阶方法(集成/级联/多任务/STN)→ 库与硬件。整章写法更接近一本工程手册而不是一篇综述:每一类问题给出代表性架构,附带"什么时候用、有什么坑、和前一类差在哪里"的解释,最后再补充"如果你想做更复杂的事"的进阶方法。

读的时候我有几个具体的想法。第一,分类、检测、分割三节虽然各自给出了代表性架构(LeNet/AlexNet → Faster R-CNN/YOLO → FCN/U-Net/Mask R-CNN),但其实它们之间并不是平行关系——检测是分类 + 定位(即回归),分割是逐像素分类。作者用"分类 → 检测 → 分割"顺序展开,其实是在把"输出粒度从 1D 类别 → 1D+位置 → 2D/3D 像素图"这条递进讲清楚,这是非常贴心的设计。第二,本章对全连接层 = 1×1 卷积这件事的强调("全连接层等价于一个卷积层")是 FCN 论文里最关键的一句话,把它从数学上独立列出来讲,对读者后续理解全卷积分割网络为什么能处理任意分辨率图像非常关键——这是 ch6 整章里"分子结构"级别的概念。第三,dropout 与数据增强本质都是"在训练时制造扰动以减少对个别特征/样本的依赖",作者把这两件事分开放在不同小节是惯例,但记住它们背后的思想是统一的:让网络学到冗余而不是捷径。第四,预训练 + 迁移学习那一节点出"即便 ImageNet 船/飞机的特征对放射学有用,是因为早期层学的是通用底层视觉特征"——这是迁移学习有效性的微观机理,比"用预训练就完事"这一类泛泛说法有价值得多。第五,作者在损失函数那一节同时列了L1/L2/smooth L1/交叉熵/dice/SSIM,几乎把所有主流任务的常用损失都覆盖了,这种"把损失函数当作工具箱"的写法比单一深度推演更接近实战。第六,超参数调优那一节从网格 → 随机 → 贝叶斯优化的推进,本质是"信息复用程度"的递进:网格完全不用前次结果,随机只看采样分布,贝叶斯则用前次结果来估计"超参数空间的代理模型"——这是工程上的一个很好示范,告诉我们实验设计本身就是机器学习问题。第七,集成/级联/多任务这三种进阶方法其实在动机上不同:集成是"用投票/融合换稳定性",级联是"用多阶段拆解换可解释性与难度分散",多任务是"用任务共享换特征复用"——我以前经常把这三者混在一起讨论,读完本章发现作者的拆分更干净。第八,作者对STN 与图像配准只用了很小的篇幅("通常嵌入到更大的网络内部"),这其实映射了 ch6 的一个隐含假设——几何标准化最好由上游的预处理或网络自己内部消化掉,而不是单独变成一个研究主题。

我自己做研究时本章最值得记的两条具体建议是:(1) Dice loss 加 ε 防止分母为 0 —— 看似微不足道,但实际跑分割训练时这个常数就是分水岭,不加 ε 会在小目标上直接 NaN;(2) 贝叶斯优化(Scikit-Optimize)替代网格搜索——超参数空间很大时网格搜索的代价是天文数字,从工程角度几乎不可行,引入代理模型 + 采集函数是真正实用的起点。

与上下章的衔接(一段话)

本章是第 3 章"算法开发"流程的深度展开:第 3 章给出从问题定义到训练的整体流程图,并提示"我们将在后续章节讨论具体的算法"。第 4 章展开了"数据准备"这一支,第 5 章展开了"IT 基础设施"这一支,而本章则展开"算法本身"——它从任务类型(分类、检测、分割、重建/后处理)出发,逐一介绍代表性架构及其在胸影像中的应用;然后再讲通用组件(dropout/BN/预训练)、损失函数、训练参数(学习率/批量/增强)、超参数调优方法;最后进入"集成/级联/多任务/STN/定制"等进阶主题,并讨论深度学习库与硬件选型。因此本章可以视为第 3 章末尾那张流程图的具体填表——任何一项任务(结节检测、心脏分割、心肌延迟强化定量、CT 重建等)都可以在本章找到对应的"任务类型 → 架构 → 损失 → 训练 → 调优 → 库/硬件"组合的入口。下一章(第 7 章)则跳出"深度学习算法"这个视角,转向"影像组学(radiomics)"——即不依赖大规模标注,而是从医学影像的像素灰度分布中以手工或半自动方式提取大量定量特征,再用传统机器学习建模。两者在很多应用场景下是并行的方法论(深度学习 vs 影像组学 + 经典机器学习),但对数据标注量的要求、可解释性、外推性都不同——第 6 章与第 7 章实际上是在为读者建立这两条平行的"算法/建模"路径上的基础。