生成模型综览与图像分类训练技巧清单

这两天整理了一些深度学习方向的笔记,一部分是生成模型(Generative Models)的基本脉络,另一部分是图像分类任务里积攒的训练技巧。两者放在一起,是因为生成模型的一些思路——正则化方式、训练稳定性——和判别式分类模型的训练其实有不少互通之处。

生成模型综览

出发点:对数据分布建模

生成模型的根本目标是对数据的概率分布建模,从而能够采样出新的、与训练数据分布一致的样本。

最直观的起点是自编码器(Auto-encoder):将高维输入压缩到低维隐空间,再从隐空间重建。编码器学习有效特征,解码器学习重建。

要从隐空间采样并生成新样本,就需要隐空间本身具备结构性。核密度估计(KDE) 提供了一种非参方式:用已有样本的核函数叠加来近似整个分布,但在高维空间中效率极低。

上面几张图归纳了从参数化密度估计到隐变量模型的几条路径,是理解各类生成模型的出发点。

Pixel RNN 与 Pixel CNN

自回归模型绕开了”如何定义隐空间”的问题,改为对联合概率做链式分解:

p(x)=ip(xix1,,xi1)p(x) = \prod_{i} p(x_i \mid x_1, \ldots, x_{i-1})

Pixel RNN 用 LSTM 对像素序列建模,能捕捉长程依赖,但速度慢;Pixel CNN 用掩码卷积(masked convolution)实现局部因果依赖,速度更快。两者都是自回归生成在图像上的早期典范。

自回归模型训练目标明确(最大化似然),没有训练稳定性问题;缺点是生成时必须逐步采样,无法并行,推理开销大。

Auto-Encoder 与 VAE

变分自编码器(VAE) 对隐变量引入先验分布(通常是标准正态),通过变分推断让后验逼近先验,使整个隐空间都具备可采样性。

需要注意的是,Auto-Encoder 方法生成的图片与 sota 的 GAN 相比会显得比较模糊。这是像素级重建损失对高频细节不敏感造成的,而不是 VAE 框架本身有根本性缺陷。

GAN:基于博弈论的生成方式

GAN 完全抛弃了显式密度估计,转而用一个判别器来提供训练信号:生成器尝试欺骗判别器,判别器尝试区分真假样本。可以证明,在最优判别器下,训练最终是可以达到纳什均衡(Nash Equilibrium)的,生成分布等于真实分布。

GAN 的生成质量在视觉锐利度上明显优于 VAE,但训练不稳定是公认的难题。训练 GAN 有一些实践技巧:

常见的稳定训练经验包括:使用 Batch Normalization 或 Spectral Normalization、采用 Wasserstein 距离替换 JS 散度、判别器每步多次更新、使用较小的学习率搭配 Adam 等。这些技巧本质上都在解决同一个问题:如何避免两个网络的训练节奏严重失衡。

图像分类实战技巧清单

下面整理的是在 CIFAR-10、ImageNet 等 benchmark 上可以尝试的训练技巧,大体按训练过程、数据增强、验证过程三部分组织。

You can try these tricks to get higher accuracy on several image classification benchmarks (e.g. CIFAR10, ImageNet) and thus fool the reviewers to get your paper accepted

训练过程

  • Use cosine descending strategy for learning rate 学习率按余弦曲线从初始值平滑降至 0,下降过程连续,越接近训练末期越慢,给模型充分的精细调整空间,比阶梯式 step decay 更稳定。

  • When increasing batch size, increasing learning rate proportionally Batch size 扩大 kk 倍时,同步将学习率乘以 kk(Linear Scaling Rule)。直觉来自 SGD 更新的统计特性:batch size 增大后梯度信号方差降低,同步提升学习率可以维持整体更新幅度一致。

  • Warm-up at the beginning of training process 训练初期模型权重随机,梯度嘈杂,直接使用目标学习率容易震荡甚至发散,尤其在大 batch 训练时。Warm-up 策略是前若干 epoch 从很小的学习率线性增加到目标学习率。

  • Do NOT use weight decay on BN layers BN 层的 scale(γ)和 bias(β)参数承担特征缩放和偏移的作用,对它们施加 weight decay 会削弱 BN 的表达能力。将 BN 参数排除在 weight decay 之外通常能带来稳定的准确率提升。

  • Auxiliary loss on shallow layers 在网络的中间浅层接一个分类头,计算辅助损失并加权叠加到主损失中一起反向传播。深网络中浅层梯度信号传播会衰减,辅助损失可以直接向浅层提供更强的监督,避免浅层特征退化。训练时起作用,推理时不使用。

  • Add knowledge distillation loss 让学生网络不仅学习 one-hot 标签,还学习教师网络输出的 soft logits(“暗知识”)。Soft logits 包含类间相似度信息,比硬标签提供的监督信号更丰富。

  • Use label smooth 把 one-hot 标签平滑为 (1ϵ)yi+ϵ/K(1-\epsilon) \cdot y_i + \epsilon/K(通常 ϵ=0.1\epsilon=0.1),防止模型在 logit 空间过于自信,显著提升模型校准性,在 ImageNet 上也有可观的准确率提升。

  • Drop path & dropout Dropout 在全连接层随机丢弃神经元;Drop Path(Stochastic Depth)针对残差网络,以一定概率完全丢弃某个残差块只保留恒等映射,效果类似 ensemble——训练了不同深度的网络。

  • Shake-shake 针对多分支网络的正则化方法。训练时每条分支的输出乘以随机系数,且前向传播和反向传播用不同的随机系数,增加训练噪声,防止网络过度依赖某一分支。推理时系数固定为 0.5。

数据增强

  • Random flip, padding and random crop, etc. 几乎所有实验的基础增强:随机水平翻转(0.5 概率),以及先 pad 若干像素再随机裁回原尺寸,引入位移不变性。

  • Cutout 随机选取图像中的一个正方形区域将其像素置零。强迫网络不依赖局部判别性区域,而是从整图学习更全局的特征表示,类比 Dropout 但作用在输入空间。

  • Mixup 对一对随机训练样本做线性插值:x~=λxi+(1λ)xj\tilde{x} = \lambda x_i + (1-\lambda) x_j,标签也同步插值。鼓励网络在特征空间和标签空间上保持线性行为,是一种隐式正则化手段。

  • Auto augmentation 把增强策略的选取本身变成一个搜索问题,用强化学习在增强操作的组合空间中搜索最优策略,操作包括 ShearX、Rotate、Brightness、Contrast 等,每个操作还有应用概率和幅度两个维度。

验证过程

  • 10 crop and average 将测试图像裁出 4 个角落 + 1 个中心,再水平翻转,共得到 10 个 crop,分别推理后取 softmax 概率的平均值作为最终预测。本质是推理阶段的 ensemble,通过不同裁剪位置降低单次裁剪带来的随机性,是刷 benchmark 时稳定可靠的涨点手段。