ResNet 残差网络详解
ResNet 是深度学习史上最重要的架构创新之一。它通过残差连接解决了”网络越深越难训练”的困境,让训练上百层甚至上千层的网络成为现实。前置阅读:卷积神经网络 CNN。
想象你在传递一条信息。如果每一层都要从头重新组织全部信息,层数一多,信息就会层层失真——最终连最基本的东西都传不对。ResNet 的思路极其简单:给每条信息留一条”抄近路”的捷径(shortcut),让信号可以跳过中间某些层直接传下去。
数学上,普通网络让每一层去学习完整的目标映射 ,而残差网络让每一层去学习残差 。最终输出是:
这个加法就是”残差连接”。为什么这样做更好?因为学”偏离原来多远”(残差)比学”全新的完整答案”容易得多。最极端的情况:如果最优映射就是恒等变换(x 直接等于 y),普通网络要费力地把一堆非线性层调到恒等,而残差网络只要把 F(x) 学成零即可——加零等于什么都不变,这太容易了。
退化问题:不是梯度消失,而是精度下降
Section titled “退化问题:不是梯度消失,而是精度下降”很多人以为深层网络训练困难就是梯度消失。ResNet 论文揭示了一个反直觉的现象:当你把网络从 20 层加到 56 层时,不是梯度爆炸或消失导致训不动——网络确实能正常收敛,但训练误差反而更高了。这叫退化问题(degradation problem)。
合理的解释是:深层普通网络很难学到一个好的恒等映射。增加的层不是被”跳过”了,而是那些额外层非要把恒等映射扭曲成别的东西,结果反而帮倒忙。残差连接让网络可以轻松实现”什么都不做”(把残差学成零),所以更深的网络至少不会比浅层网络差。
残差块的数学
Section titled “残差块的数学”一个基本残差块包含两条路径:
- 主路径:经过两个 3x3 卷积(各带 BN 和 ReLU),输出 F(x)
- 捷径:直接把输入 x 传过去
- 合并:y = F(x) + x,再进入下一层
当主路径的输出通道数与输入不同时,捷径需要一个 1x1 卷积来调整维度(称为 projection shortcut)。注意加法发生在 ReLU 之前,确保梯度的加法通路畅通无阻。
残差连接的关键优势在反向传播时体现。对 求导:
这个 “+1” 意味着梯度可以不经过任何变换直接从输出跳回输入——即使 很小,梯度也不会消失。对比普通网络中梯度 (一连串乘法),残差连接让深层网络的梯度传播变得稳定得多。
从信息论角度看,残差连接创造了一条信息高速公路:正向传播时,输入可以直接到达后续层;反向传播时,梯度可以直接回传到前面的层。这种”短路”机制是 ResNet 能训练上千层网络的核心原因。
瓶颈结构 Bottleneck
Section titled “瓶颈结构 Bottleneck”对于 ResNet-50/101/152,每个残差块改用三层瓶颈结构:
- 1x1 卷积降维(如 256 通道降到 64)
- 3x3 卷积在低维空间做空间特征提取
- 1x1 卷积升维(64 升回 256)
瓶颈结构将计算量大幅压缩——3x3 卷积只在 64 维而非 256 维进行,参数量和计算量都减少了约一个数量级。虽然每个块只有 3 层,但通过堆叠更多块,网络可以达到很深的层数。
以一个 256→256 的残差块为例:
- 基本块(两个 3x3 卷积):256×256×3×3×2 ≈ 1.18M 参数
- 瓶颈块(1x1 + 3x3 + 1x1):(256×64×1×1) + (64×64×3×3) + (64×256×1×1) ≈ 0.07M 参数
瓶颈块参数量减少了约 17 倍。这就是为什么 ResNet-152 的计算量(约 11.3 GFLOPs)只比 ResNet-50(约 4.1 GFLOPs)多 2.75 倍——瓶颈结构让堆深变得”廉价”。
ResNet 的 Stem 设计
Section titled “ResNet 的 Stem 设计”ResNet 的第一层不是残差块,而是一个”Stem”(茎部):
输入图像 224x224x3 → 7x7 卷积,stride=2,64 通道 → 112x112x64 → 3x3 MaxPool,stride=2 → 56x56x64 → 进入第一个残差 stage7x7 大卷积核的作用是在网络初期快速提取大范围的空间特征,同时 stride=2 将分辨率减半。这个 Stem 设计在后来的研究中被改进——ResNet-D 将 7x7 卷积替换为三个堆叠的 3x3 卷积(计算量更少,精度更高),这一思路被后来的 EfficientNet、ConvNeXt 等现代架构采纳。
ResNet-50/101/152 的架构差异
Section titled “ResNet-50/101/152 的架构差异”三种网络的结构完全相同,区别只在于每个 stage 堆叠的瓶颈块数量:
- ResNet-50:3 + 4 + 6 + 3 = 16 个瓶颈块 = 50 层
- ResNet-101:3 + 4 + 23 + 3 = 33 个瓶颈块 = 101 层
- ResNet-152:3 + 8 + 36 + 3 = 50 个瓶颈块 = 152 层
更深的网络在 ImageNet 上有更低的误差,但训练和推理成本也更高。
Stage 间的下采样机制
Section titled “Stage 间的下采样机制”每个 stage 之间的过渡通过 stride=2 实现:第一个 stage 的第一个瓶颈块中,3x3 卷积使用 stride=2,将空间分辨率减半(如 56x56 → 28x28),同时通道数增加(如 256 → 512)。这遵循了 CNN 的经典设计哲学:随着网络加深,分辨率降低、通道数增加,用空间分辨率换取语义抽象能力。
同时,下采样块的捷径也需要 stride=2 的 1x1 卷积(projection shortcut),确保维度匹配:
输入 56x56x256 → 捷径:1x1 conv stride=2 → 28x28x512 → 主路径:1x1 conv → 3x3 conv stride=2 → 1x1 conv → 28x28x512 → 相加 → ReLU残差连接的核心思想
Section titled “残差连接的核心思想”ResNet 网络整体架构
Section titled “ResNet 网络整体架构”梯度流:残差连接的反向传播优势
Section titled “梯度流:残差连接的反向传播优势”ResNet 原始论文使用了以下训练配方:
- 初始学习率:0.1(SGD with momentum=0.9),在 8 张 GPU 上以每 256 的 batch size 训练
- 学习率衰减:当验证误差停滞时,学习率除以 10(step decay)
- 训练轮数:120 个 epoch(约 30 个 epoch 后开始衰减)
后来的研究发现,以下改进可以显著提升 ResNet 的精度:
- Cosine Annealing(余弦退火):学习率从初始值按余弦函数缓慢下降到接近 0,比 step decay 更平滑,已被现代训练框架广泛采用: 其中 T 是总训练步数,t 是当前步数。
- 学习率预热(Warmup):前几个 epoch 将学习率从 0 线性升到 0.1,避免训练初期 BN 统计量不稳定导致的震荡。这一技巧后来在大规模训练(ViT、LLM)中变得至关重要。
ResNet 原始训练仅使用了随机裁剪和水平翻转。现代训练配方增加了:
- Mixup(Zhang et al., 2018):将两张图像及其标签按比例混合——,,其中 λ 从 Beta 分布采样。Mixup 强制模型学习平滑的决策边界,显著提升泛化性。
- CutMix(Yun et al., 2019):从一张图裁剪一个矩形区域粘贴到另一张图上,标签按面积比例混合。比 Mixup 更好地保留了局部纹理信息。
- RandAugment:自动从一组数据增强操作中随机选择并应用,不需要手动搜索增强策略。
- Random Erasing:随机遮挡图像的一个矩形区域,提升对遮挡的鲁棒性。
- Weight Decay(权重衰减):L2 正则化,惩罚大权重,防止过拟合。ResNet 原始配方设为 1e-4。现代配方中,结合 Mixup 等强增强时通常会增大到 5e-4 甚至 1e-3。
- Dropout:ResNet 原始论文在全连接层(最终分类头)后使用了 dropout(p=0.5),但卷积层和残差块内部一般不用。
- Label Smoothing(标签平滑)(Szegedy et al., 2016):将 one-hot 标签
[0, 1, 0]平滑为[0.1, 0.9, 0.1](平滑系数 0.1),防止模型过度自信,提升泛化。ResNet 原始训练未使用,但现代配方几乎必加。
BatchNorm 的关键作用
Section titled “BatchNorm 的关键作用”BatchNorm(批归一化)是 ResNet 能训练成功的必需品。BN 在每个 mini-batch 内对每层输出做归一化:
BN 的作用:① 使损失函数景观更平滑,允许更大学习率;② 减少对初始化的敏感度;③ 轻微的正则化效果(batch 统计量的随机性相当于噪声)。没有 BN 的深层残差网络同样难以训练——ResNet 和 BN 是同时期(2015 年)的工作,二者配合才让深网络训练成为现实。
现代 ResNet 训练配方(ResNet Strikes Back, 2021)
Section titled “现代 ResNet 训练配方(ResNet Strikes Back, 2021)”Wightman 等人在 “ResNet Strikes Back” 中证明:用 2021 年的训练技巧(Cosine LR + Mixup + CutMix + RandAugment + Label Smoothing + 更长训练周期 300 epoch),原始 ResNet-50 的 ImageNet Top-1 准确率可以从 76.1% 提升到 80.4%——提升 4.3 个百分点,完全靠训练策略而无需改架构。这一结论在社区广泛传播后,“现代训练配方”成为评估老架构的标配。
PyTorch:用 torchvision 加载预训练 ResNet 并推理
Section titled “PyTorch:用 torchvision 加载预训练 ResNet 并推理”import torchfrom torchvision import models, transformsfrom PIL import Image
# 加载预训练 ResNet-50(自动下载 ImageNet 权重)model = models.resnet50(weights=models.ResNet50_Weights.DEFAULT)model.eval() # 切换到推理模式
# 图像预处理:缩放 + 裁剪到 224x224 并归一化preprocess = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),])img = preprocess(Image.open("cat.jpg").convert("RGB")).unsqueeze(0)
# 推理并取 Top-5 预测with torch.no_grad(): preds = model(img).squeeze()idx = preds.topk(5).indices.tolist()print("Top-5 类别索引:", idx)# 输出示例:[281, 282, 285, 287, 276](各种猫)PyTorch:手写一个残差瓶颈块
Section titled “PyTorch:手写一个残差瓶颈块”import torch.nn as nn
class Bottleneck(nn.Module): expansion = 4 # 输出通道是中间通道的 4 倍
def __init__(self, in_ch, mid_ch, stride=1): super().__init__() out_ch = mid_ch * self.expansion # 1x1 降维 → 3x3 卷积 → 1x1 升维 self.conv1 = nn.Conv2d(in_ch, mid_ch, 1, bias=False) self.bn1 = nn.BatchNorm2d(mid_ch) self.conv2 = nn.Conv2d(mid_ch, mid_ch, 3, stride=stride, padding=1, bias=False) self.bn2 = nn.BatchNorm2d(mid_ch) self.conv3 = nn.Conv2d(mid_ch, out_ch, 1, bias=False) self.bn3 = nn.BatchNorm2d(out_ch) self.relu = nn.ReLU(inplace=True) # 维度不匹配时用 1x1 卷积调整捷径 self.shortcut = nn.Sequential() if stride != 1 or in_ch != out_ch: self.shortcut = nn.Sequential( nn.Conv2d(in_ch, out_ch, 1, stride=stride, bias=False), nn.BatchNorm2d(out_ch))
def forward(self, x): out = self.relu(self.bn1(self.conv1(x))) # 降维 out = self.relu(self.bn2(self.conv2(out))) # 空间卷积 out = self.bn3(self.conv3(out)) # 升维 out += self.shortcut(x) # 残差连接:y = F(x) + x return self.relu(out)PyTorch:完整 ResNet-50 的组装逻辑
Section titled “PyTorch:完整 ResNet-50 的组装逻辑”import torchimport torch.nn as nn
class ResNet(nn.Module): def __init__(self, block, num_blocks, num_classes=1000): super().__init__() self.in_ch = 64 # Stem:7x7 卷积 + BN + ReLU + MaxPool self.conv1 = nn.Conv2d(3, 64, 7, stride=2, padding=3, bias=False) self.bn1 = nn.BatchNorm2d(64) self.relu = nn.ReLU(inplace=True) self.maxpool = nn.MaxPool2d(3, stride=2, padding=1) # 四个 stage:通道数 256, 512, 1024, 2048 self.layer1 = self._make_layer(block, 64, num_blocks[0], stride=1) self.layer2 = self._make_layer(block, 128, num_blocks[1], stride=2) self.layer3 = self._make_layer(block, 256, num_blocks[2], stride=2) self.layer4 = self._make_layer(block, 512, num_blocks[3], stride=2) # 分类头 self.avgpool = nn.AdaptiveAvgPool2d((1, 1)) self.fc = nn.Linear(512 * block.expansion, num_classes)
def _make_layer(self, block, mid_ch, num_blocks, stride): # 第一个块做下采样(stride),后续块 stride=1 strides = [stride] + [1] * (num_blocks - 1) layers = [] for s in strides: layers.append(block(self.in_ch, mid_ch, s)) self.in_ch = mid_ch * block.expansion return nn.Sequential(*layers)
def forward(self, x): x = self.maxpool(self.relu(self.bn1(self.conv1(x)))) # Stem x = self.layer1(x) # 56x56 x = self.layer2(x) # 28x28 x = self.layer3(x) # 14x14 x = self.layer4(x) # 7x7 x = self.avgpool(x).flatten(1) # 全局平均池化 → (B, 2048) return self.fc(x)
# ResNet-50 = Bottleneck × [3, 4, 6, 3]resnet50 = ResNet(Bottleneck, [3, 4, 6, 3])print(f"参数量: {sum(p.numel() for p in resnet50.parameters()) / 1e6:.1f}M")# 输出: 参数量: 25.6MResNet 家族变体
Section titled “ResNet 家族变体”ResNet 自 2015 年问世以来,衍生出大量变体。以下是最重要的几条路线:
| 变体 | 年份 | 核心改进 | ImageNet Top-1 (ResNet-50 基准) |
|---|---|---|---|
| ResNet | 2015 | 残差连接 + 瓶颈块 | 76.1% |
| ResNet v2 | 2016 | 预激活(pre-activation),BN-ReLU-Conv 顺序 | 76.9% |
| Wide ResNet | 2016 | 增加通道宽度而非深度 | 78.5% (WRN-50-2) |
| ResNeXt | 2017 | 分组卷积,引入”基数”(cardinality)概念 | 77.8% |
| SE-ResNet | 2017 | 通道注意力(Squeeze-and-Excitation) | 78.3% |
| ResNet-D | 2019 | Stem 改为 3 个 3x3 卷积 + 捷径下采样改用 avgpool | 77.2% |
| ResNeSt | 2020 | Split-Attention,多分支通道注意力 | 81.0% |
| ResNet-RS | 2021 | 系统性缩放策略 + 现代训练配方 | 80.9% |
| ConvNeXt | 2022 | 用 Transformer 训练技巧全面改造卷积网络 | 82.1% (ConvNeXt-T) |
ConvNeXt:纯卷积的反攻
Section titled “ConvNeXt:纯卷积的反攻”ConvNeXt(Liu et al., CVPR 2022)是 ResNet 演进线上最重要的近期工作。作者从一个标准 ResNet 出发,逐步引入 Swin Transformer 的设计理念和训练策略:
- 将 stage 比例从 (3,4,6,3) 调整为 (3,3,9,3),让网络在中间 stage 更深
- 用 7x7 depthwise 卷积替代标准卷积(模拟 ViT 的大窗口自注意力)
- 用 GELU 替代 ReLU、用 LayerNorm 替代 BatchNorm
- 减少激活和归一化层的数量(模拟 Transformer 的简洁结构)
- 使用 Mixup、CutMix、RandAugment、Label Smoothing 等现代训练策略
最终 ConvNeXt 在 ImageNet 分类、COCO 检测、ADE20K 分割上全面匹敌甚至超越同规模的 Swin Transformer,证明了纯卷积架构在充分的训练优化下并不逊色于 Transformer。
最新进展(2024-2025)
Section titled “最新进展(2024-2025)”现代化 ResNet 训练成为标配
Section titled “现代化 ResNet 训练成为标配”2024 年以来,“用现代训练配方重新训练经典 ResNet” 已成为视觉模型评估的基线标准。HuggingFace timm 库提供了大量使用现代增强策略训练的 ResNet 权重——同样的 ResNet-50 架构,用 Cosine LR + Mixup + CutMix + RandAugment + Label Smoothing 训练 600 epoch,ImageNet Top-1 可达 81.8%,比原始论文的 76.1% 高出近 6 个百分点。这一结果说明:很多时候,训练策略的改进比架构设计更重要。
ConvNeXt V2(2023)
Section titled “ConvNeXt V2(2023)”ConvNeXt V2 引入了 FCMAE(Fully Convolutional Masked Autoencoder)自监督预训练,在纯卷积架构上实现了 MAE 式的掩码重建预训练。ConvNeXt V2 在 ImageNet 上达到了 88.9% Top-1(ConvNeXt V2-Huge,使用 384 分辨率微调),刷新了纯卷积网络的精度纪录,与 MAE 预训练的 ViT-Huge 持平。
ResNet 在边缘部署中持续流行
Section titled “ResNet 在边缘部署中持续流行”尽管在学术基准上 Transformer 变体已超越 ResNet,但在工业界——特别是移动端和边缘设备——ResNet 仍然是部署最广泛的视觉骨干之一。原因包括:① 结构简单、易于量化(INT8 量化精度损失极小);② 各种推理框架(TensorRT、ONNX Runtime、CoreML)对卷积运算的优化极为成熟;③ 预训练权重生态丰富。2024-2025 年的许多端侧 AI 应用(工业质检、智能安防、无人机视觉)仍在大量使用 ResNet-18/34/50。
残差思想的深远影响
Section titled “残差思想的深远影响”残差连接已经超越了 CNN 范畴,成为几乎所有深度学习架构的标准组件:
- Transformer 中每层的
x + Attention(LN(x))和x + FFN(LN(x))都是残差连接 - 扩散模型(DDPM)的 U-Net 中大量使用残差连接和跳跃连接
- 大语言模型(GPT、LLaMA)中每个 Transformer Block 都有残差连接
可以说,ResNet 提出的残差思想已经深深嵌入深度学习的 DNA 中。
- 迁移学习的默认起点:ResNet-50 是图像分类、目标检测、语义分割的基干网络(backbone)首选,在 ImageNet 上预训练后微调,几乎适用于所有中小规模视觉任务。详见卷积神经网络 CNN。
- BatchNorm 是 ResNet 的必需品:没有 BN 的深层残差网络同样难以训练。BN 将每层输入归一化,使学习率可以设得更大,训练更稳定。推理时使用运行均值/方差(eval 模式),训练时使用 batch 统计量(train 模式)——部署时一定要确保
model.eval()被调用。 - 下采样策略:每个 stage 的第一个块用 stride=2 的卷积做空间下采样(56x56 → 28x28 → 14x14 → 7x7),同时通道翻倍,保持特征表达力。
- 冻结 vs 微调:数据少时冻结除最后一层外的所有层(只训练新分类头);数据多时解冻后面的 stage 一起微调。实用经验:先只训分类头 3-5 个 epoch,再解冻全部层用小学习率(如 1e-4)联合微调。
- 别盲目堆深:152 层以上的收益递减。要进一步提升精度,方向是宽度(Wide ResNet)、多分支(ResNeXt)、注意力增强(SE-ResNet)或架构革新(ConvNeXt)。
- 何时选 ResNet vs ViT:数据量少(< 10 万张)→ ResNet 仍是最稳妥的选择,预训练特征泛化性好;数据量大 + 计算充足 → ViT/Swin 更有潜力。推理延迟敏感的端侧场景 → ResNet 通常更友好。
- ImageNet 图像分类:ResNet-152 Top-5 错误率约 3.6%,远超 VGG 的 7.3%,成为 2015 年冠军。
- 目标检测与实例分割的 backbone:Faster R-CNN、Mask R-CNN、YOLOv3 等都以 ResNet 作为特征提取网络。详见目标检测与 YOLO。
- 语义分割的编码器:DeepLab、FCN 等分割模型用 ResNet 作为下采样编码器。详见图像分割。
- 人脸识别:ArcFace 等工业级人脸识别模型基于 ResNet-50/100 架构训练。
- 医疗影像:ResNet 被广泛用于 X 光、CT、病理切片的分类与分割。
- 扩散模型的 U-Net:Stable Diffusion 的核心 U-Net 中大量使用残差块(ResBlock),每个块内部就是 ResNet 式的 3x3 + 3x3 + shortcut 结构。详见扩散模型。
典型类库与工具
Section titled “典型类库与工具”| 类库 | 语言 | 说明 |
|---|---|---|
| torchvision.models | Python | PyTorch 官方视觉库,提供 ResNet-18/34/50/101/152 预训练权重 |
| timm | Python | HuggingFace 生态的 PyTorch 图像模型库,包含 60+ 种 ResNet 变体,含现代训练配方的权重 |
| tensorflow.keras.applications | Python | TensorFlow / Keras 内置的 ResNet50 预训练模型 |
| mmcls | Python | OpenMMLab 图像分类工具箱,含完整 ResNet 训练/评估流程 |
| onnxruntime | Python / C++ | 将 ResNet 导出为 ONNX 后在边缘设备上高效推理 |
| 术语 | 英文 | 解释 |
|---|---|---|
| 残差连接 | Residual Connection / Skip Connection | 将输入直接加到层的输出上(y = F(x) + x),让信息有一条无障碍通路 |
| 退化问题 | Degradation Problem | 网络加深后训练误差不降反升,原因是深层网络难以拟合恒等映射 |
| 恒等映射 | Identity Mapping | 输出等于输入(H(x) = x),残差网络通过把 F(x) 学成零来轻松实现 |
| 瓶颈结构 | Bottleneck Block | 用 1x1 卷积先降维再升维的三层结构,大幅减少 3x3 卷积的计算量 |
| 投影捷径 | Projection Shortcut | 当输入输出维度不同时,用 1x1 卷积调整捷径维度以配合残差加法 |
| 批归一化 | Batch Normalization (BN) | 在每层输出上加归一化,使深层网络可以用更大学习率稳定训练 |
| 基干网络 | Backbone | 作为特征提取器的主体网络(如 ResNet-50),后面接各种任务头 |
| Wide ResNet | Wide ResNet | ResNet 变体:不增加深度而增加每层通道宽度,训练更快且精度相当 |
| ResNeXt | ResNeXt | ResNet 变体:引入分组卷积(多分支),在不增加复杂度的情况下提升精度 |
| SE 模块 | Squeeze-and-Excitation | 通过全局池化+全连接层学习通道权重,自适应增强重要通道的特征 |
| ConvNeXt | ConvNeXt | 2022 年用纯卷积结构对标 Transformer 的现代 ResNet 变体,性能匹敌 ViT |
| Mixup | Mixup | 将两张图像及标签按比例线性混合的数据增强方法,提升泛化性 |
| 标签平滑 | Label Smoothing | 将 one-hot 标签平滑为软标签,防止模型过度自信 |
- He et al., 「Deep Residual Learning for Image Recognition」(CVPR 2016):ResNet 原始论文,提出残差学习框架,获 CVPR 2016 最佳论文,引用量 20 万+,深度学习最具影响力的论文之一。
- He et al., 「Identity Mappings in Deep Residual Networks」(ECCV 2016):ResNet v2,分析残差连接的信息传播路径,提出预激活(pre-activation)结构,进一步改善深层网络训练。
- Zagoruyko & Komodakis, 「Wide Residual Networks」(BMVC 2016):Wide ResNet 论文,证明加宽比加深更高效,一个加宽的 28 层网络可以超过 1000 层的原始 ResNet。
- Xie et al., 「Aggregated Residual Transformations for Deep Neural Networks」(CVPR 2017):ResNeXt 论文,引入基数(cardinality)概念,用分组卷积构建多分支残差块。
- Hu et al., 「Squeeze-and-Excitation Networks」(CVPR 2018):SENet 论文,引入通道注意力机制,SE-ResNet-50 提升约 2 个百分点。
- Liu et al., 「A ConvNet for the 2020s」(CVPR 2022):ConvNeXt 论文,用现代训练技巧和设计改良纯卷积网络,在多项视觉基准上匹敌甚至超越 Swin Transformer。详见视觉 Transformer。
- Woo et al., 「ConvNeXt V2」(CVPR 2023):引入 FCMAE 自监督预训练到 ConvNeXt,纯卷积网络达到 88.9% ImageNet Top-1。
- Wightman et al., 「ResNet Strikes Back」(2021):证明用现代训练配方可以让 ResNet-50 从 76.1% 提升到 80.4%,强调训练策略的重要性。