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

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

生成模型综览

出发点:对数据分布建模

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

Overview

- Unsupervised Learning
- Generative Models
  - PixelRNN and PixelCNN
  - Variational Autoencoders (VAE)
  - Generative Adversarial Networks (GAN)

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

自编码器结构图:输入 x 经编码器得到隐特征 z,再经解码器重建为 x̂,用 L2 重建损失 ‖x − x̂‖² 训练
图 1:自编码器结构——编码器把输入 xx 压缩为隐特征 zz,解码器重建为 x^\hat{x},以 L2 重建损失训练。

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

一维与二维密度估计示意:散点样本经核函数叠加近似出连续概率密度
图 2:核密度估计示意——一维(上)和二维(下)情形下,用样本点的核函数叠加近似出连续分布。
生成模型目标示意:给定训练数据,生成与同一分布一致的新样本,希望 p_model(x) 逼近 p_data(x)
图 3:生成模型的目标——从训练数据学到 pmodel(x)p_{\text{model}}(x),使其逼近真实分布 pdata(x)p_{\text{data}}(x),从而采样出新样本。
生成模型的应用:艺术创作、超分辨率、上色等逼真采样,时序数据仿真与规划,以及学习可用作通用特征的隐表示
图 4:为什么需要生成模型——逼真采样(艺术、超分辨率、上色等)、时序数据仿真与规划,以及学习可作通用特征的隐表示。
生成模型分类树:显式密度(可解析密度如 PixelRNN/CNN、近似密度如变分自编码器)与隐式密度(GAN、马尔可夫链)
图 5:生成模型分类树——分为显式密度(可解析密度 PixelRNN/CNN、近似密度 VAE)与隐式密度(GAN、马尔可夫链)两大谱系。

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

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)实现局部因果依赖,速度更快。两者都是自回归生成在图像上的早期典范。

PixelRNN 示意:从角落开始逐像素生成,用 RNN(LSTM)建模对已生成像素的依赖,缺点是顺序生成速度慢
图 6:PixelRNN——从图像角落开始逐像素生成,用 LSTM 建模对先前像素的依赖,缺点是顺序生成速度慢。
PixelCNN 示意:同样从角落逐像素生成,但用 CNN 在上下文区域上建模对已生成像素的依赖
图 7:PixelCNN——同样逐像素生成,但改用 CNN 在上下文区域上建模像素依赖,可并行训练。
PixelRNN and PixelCNN

Pros:
- Can explicitly compute likelihood p(x)
- Explicit likelihood of training data gives good evaluation metric
- Good samples

Con:
- Sequential generation => slow

Improving PixelCNN performance
- Gated convolutional layers
- Short-cut connections
- Discretized logistic loss
- Multi-scale
- Training tricks
- Etc...

See
- Van der Oord et al. NIPS 2016
- Salimans et al. 2017 (PixelCNN++)

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

Auto-Encoder 与 VAE

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

自编码器作为背景:编码器把输入 x 编码为特征 z,解码器再重建出原始数据,以学习有用的特征表示
图 8:作为背景的自编码器——通过「编码再重建」学习特征表示,编码器与解码器分别为 4 层卷积与 4 层反卷积。
变分自编码器结构:编码器网络 q_φ(z|x) 输出隐变量的均值与协方差并从中采样 z,解码器网络 p_θ(x|z) 输出数据的均值与协方差
图 9:变分自编码器——编码器(识别网络)qϕ(zx)q_\phi(z \mid x) 与解码器(生成网络)pθ(xz)p_\theta(x \mid z) 都建模为概率分布,从中采样得到隐变量与重建。

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

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

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

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

DCGAN 给出的稳定训练深度卷积 GAN 的架构准则:

Architecture guidelines for stable Deep Convolutional GANs

  • Replace any pooling layers with strided convolutions (discriminator) and fractional-strided convolutions (generator).
  • Use batchnorm in both the generator and the discriminator.
  • Remove fully connected hidden layers for deeper architectures.
  • Use ReLU activation in generator for all layers except for the output, which uses Tanh.
  • Use LeakyReLU activation in the discriminator for all layers.
GAN 概述幻灯片:不使用显式密度函数,采用博弈论的双人对抗方式;优点是样本质量最佳,缺点是训练困难且无法回答 p(x)、p(z|x) 等推断查询
图 10:GAN 概述——不依赖显式密度函数,用双人博弈方式学习生成;优点是样本质量最佳,缺点是训练不稳定、无法回答 p(x)p(x)p(zx)p(z \mid x) 等推断查询,活跃方向包括 Wasserstein GAN、LSGAN、条件 GAN 等。
三类生成模型对比小结:PixelRNN/CNN 显式密度、优化精确似然但顺序生成低效;VAE 优化变分下界、隐表示有用但样本质量一般;GAN 博弈论方式、样本最佳但训练不稳定且无推断查询
图 11:三类生成模型小结——PixelRNN/CNN(显式密度、似然精确但生成低效)、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 时稳定可靠的涨点手段。