自监督深度学习自监督深度学习
与主线无关的部分集合。
1.
\(x\) 是数据,\(y\) 是标签,有监督学习试图得到分类器 \(p(y\mid x)\)。
倘若有 tractable 的生成器 \(p(x\mid y)\),则可以通过 \(p(y\mid x)\propto p(x\mid y)p(y)\) 来反推出分类器。
open loop:没有输出回传给自身的数据流动,因此可以并行,更加稳定。close loop 则相反。
- teacher forcing 是典型的开环训练方法,但是会带来 exposure bias。
- scheduled sampling 属于 curriculum learning,混合 teacher forcing 和 free running 的数据,且随着训练进行不断提高后者占比。
- professor forcing 引入 GAN 的逻辑,希望 teacher forcing 和 free running 生成的分布尽量贴近,无法被 discriminator 区分。为了保证内部动力学一致,给 discriminator 提供的输入是隐藏层信息。
sampling:
- argmax/beam search:容易出现 repetitive pattern。
- top-k:\(k\) 值较难调整,同时在模型高度自信、分布集中于少数几个输出时效果不佳。
- top-p (nucleus):更为鲁棒,但如果有大量低概率但非零的项,top-p 可能将它们纳入采样池。
- speculative sampling:小模型 propose 大模型 verify,后者可以并行。
- multi-token prediction (Gloeckle):使用多个头一次性输出多个 token,但容易生成无意义组合。
- multi-token prediction (DS-v3):main model 最后一层生成下一个 token,其 hidden state 输入进一个小 module 和 input 一起得到下两个 token,继续进入下一个小 module 得到下三个 token,以此类推。
- Belief State:一种通用的 MTP 模式,其期待模型学会一个 belief state \(b_t\),使得 \(\E[f(X_{t+1:T}\mid b_t)]=\E[f(X_{t+1:T}\mid X_{1:t})]\)。
- Joint State Prediction:训一个 fetch 模块从 hidden state 提取 belief state,然后基于之预测将来的联合分布。
- Belief State Transformer:对于一切可能的前缀和后缀联合信息 \(X_{1:l}\) 和 \(X_{r,n}\),提取出 hidden state 后用它们的联合预测 \(X_{l+1}\) 和 \(X_{r-1}\),代价是需要 \(n^2\) 的复杂度。
- NextLat:结合 RL 的思想,一方面期望当前的 hidden state \(h_t\) 能正确预测 \(X_{t+1}\),另一方面期望当前的 \(h_t\) 加上下一时刻的 \(X_{t+1}\) 能正确预测 \(h_{t+1}\),换句话说就是一个 HMM。
2.
ELBO:
该式子总是成立,不论 \(p(x\mid z),p(z),q(z\mid x)\) 如何选择(前提是 KL 散度不爆炸)
- \(p(x)=\int p(z)p(x\mid z)\d z\) 是模型的输出分布,训练的核心目标是最大化 NLL \(\E_{x\sim p_\t{data}}-\log p(x)\)。
- \(p(z)\) 是隐变量分布 bottleneck。
- \(p(x\mid z)\) 是 decoder。
- \(q(z\mid x)\) 是 encoder。
分类:
-
传统 VAE:encoder 是可学习均值方差的 Gaussian,bottleneck 是固定的单位 Gaussian,这样 KL 可以显式计算;decoder 是任意的 tractable 的生成器。
-
β-VAE:给 KL 项乘上系数 \(\beta\);大的 \(\beta\) 会强迫重建,让隐变量更像 Gaussian,促进各维解耦但代价是生成质量降低,而小 \(\beta\) 则相反。
-
VQ-VAE:encoder 是确定性的(因此 KL 项自动变为常数),生成高维向量,然后对于可训练的向量 codebook 在上面求 NN 得到离散的标号作为隐变量(因为 NN 不可微所以要使用 straight-through estimator,但是为了保证 estimator 准确,虽然没有 KL 项,但额外多出了最小化 NN 距离的项)。bottleneck 是离散的高维向量,为了在生成时有可采样的 \(p(z)\) 所以另外需要模型建模之;decoder 是任意的 tractable 的生成器。
优化 VQ bottleneck 的各种方法:
- 对 codebook 和 encoder 向量都归一化,相当于以余弦相似度度量 NN。
- Residue VQ:不再一次到位求 NN,而是分为多级 VQ,每次对上一级量化后的残差继续量化。
- expiring stale codes:如果一个 code 用的次数过少,就把它重置。一种实现是统计使用次数关于 batch 的 EMA,如果小于某个阈值就干掉。
- K-means Centroid Initialization:用 k-means 初始化。
- 上述所有东西都可以结合:Residue VQ 使用更小的 codebook,使得利用率更高;重置的新 code 也可以被设为 k-means。
- RQ-VAE:为了处理 STE 带来的梯度误差,把量化用一次旋转操作来近似(旋转是 Householder 矩阵),前向传播时等效于量化,反向传播时等效于乘以旋转矩阵;这仅在特定的有旋转不变性的隐空间中有意义。
- Orthogonal Regularization:原图的平移会导致 CNN 提取的特征的扰动,如果 VQ 不鲁棒就不牛。假如 VQ 能保证正交性,量化会更加鲁棒。而鲁棒的量化也会降低 STE 时梯度的跳变,从结果来看训练同样更加鲁棒了!
- Multi-Head VQ:用多个 codebook 生成多位的量化结果。
- Finite State Quantization:不 VQ,直接标量量化,更简洁。
-
Diffusion:encoder 是不可训练的加噪(没有 KL 项),bottleneck 是不可训练的 uniform gaussian,每一步的 decoder 的 target 通过插值得到。
Latent Recurrent Model:给 RNN 也传入 \(z\) 增加生成多样性。但是 RNN 可能会忽略 \(z\),所以使用 Z-Forcing 技巧,引入反向 RNN 并期望正向的 \(z\) 能被用于重建后向的 hidden state。
3.
Inception Score:使用好的分类器,并期望生成分布贴近真实分布。缺点:无法评估 mode collapse。
FID:进一步要求特征分布也贴近。
VQ-GAN:使用 VQ-VAE 作为生成器,但多了一个 discriminator 要求特征相似(和 professor forcing 一个套路)
Adversarially Learned Inference:同时给 discriminator 提供 latent \(z\) 和 sample \(x\)(真实的 \(x\) 和 encoder 的 \(z\);随机的 \(z\) 和 decoder 的 \(x\)),优化联合分布。
在 DPO 的框架下,discriminator 可以被重构为生成模型概率的比值,因此可以借鉴相关技巧作无判别器 GAN。
Domain Adaptation:保证用一种分布训出来的模型在另一种分布下仍然表现良好。
DANN:用 GAN 训一个好的特征提取器,使得提取出来的特征分布对齐;为了实现端到端学习,直接把 feature-classifier pipeline 的 loss 减去 feature-discriminator 的 loss 即可。缺点是可能导致 spurious correlation。
IRM:期望对特征提取器有一个全局的分类器;不妨假设这个分类器就是定死的某个标量。
Domain Reweighting:通过调整各个数据集的分布来实现泛化能力:每一步根据每个数据集上的梯度与平均梯度的夹角,动态调整混合比例。
4.
Consistency Model:希望对同一条 ODE trajectory \(\b x_t\),训一个一步到位的 \(\b f:(\b x_t,t)\mapsto\b x_0\),以做到 one-step generation。这需要保证一致性的边界条件,即 \(\b f(\b x_\eps,\eps)\approx\b x_\eps\)。
建模使用一种 skip connection 的结构
其中 \(\b F_\theta\) 是网络的主要部分,而 \(c_\t{skip}\) 和 \(c_\t{out}\) 是可以任意设置的系数,只要当 \(t\to0\) 时有前者趋于 \(1\) 而后者趋于 \(0\) 即可。
训练可以使用对已有的模型 \(\b V_\phi(\b x,t)\) 蒸馏:从数据中随机加噪采样 \(\b x_t\sim p_t\),用已有模型的微分方程采样器估测 \(\tilde{\b x}_{t'}\) 其中 \(t'<t\),然后用 frozen target network 命令 \(\b f_\theta(\b x_t,t)\) 贴近 \(\b f_\theta(\b x_{t'},t')\) 即可。
也可以直接 train from scratch,直接从数据中加同一个噪声的不同强度得到 \(\b x_{t'}\) 和 \(\b x_t\),然后同样使用 frozen target network。
CM 很灵活,完全可以使用类似 Langevin Dynamics 的交替加噪去噪过程,每次先一步到位生成 \(\b x_0\) 后加一个强度为 \(t\) 的噪声回退到 \(\b x_t\),
Stable Diffusion:在生成时使用 cross attention 作 CFG;结合 VQ-GAN 的技巧多了一个 GAN 增强能力。采用 VAE 降维、UNet 作为生成 backbone 的双层架构。更现代的模型会用 DiT 替换 UNet。
Cascaded Diffusion Model:通过多次 super-resolution 的方式生成。
DMD (Distribution Matching Distillation):另一种蒸馏方法。
teacher 是一个 multi-step diffusion,student 是一个 one-step 模型,直接写作 \(x=G_\theta(z),z\sim\mathcal N(0,I)\)。最小化其与 teacher 生成分布的 KL 散度 \(\t{KL}(p_\t{student}\|p_\t{teacher})\)。用加噪扰动后的平均 KL 近似
(此处的 \(x_t=G_\theta(z)+t\eps\) 是 forward process 也即加噪得到的,而不是降噪得到的)
预测 score 和预测 noise 等价,于是可以换成 noise。
除了 DMD 以外,为了保证稳定性,还需要一个朴素的回归损失,即相同 \(z,c\) 的 teacher 和 student 的结果应该相似,于是将它们的 MSE 加到损失中。
注意,此处的 \(s_\t{student}\) 必须是另外训练的模型,而不是 student 自身的 score 或 noise。这是因为:
- student 的 score 的目标是近似 teacher 的 score,但是它的 score 不一定准确。
- 而我们需要一个能反映 student 现状的 score,它客观建模了 student 当前的输出。
- 这个模型必须同步训练,以忠实反映 student 的现状。
- 因此,如果 teacher 有 CFG,则只给 teacher 加(毕竟,student 作为 single-step 模型想加也没法加。而且 fake score 必须是 student score 的无偏估计,也不能额外修饰。
7.
半监督。最常见的场景是把标签扔掉的合成数据集;一般的野生半监督数据则不会有同分布假设。
不过更可能的场合是人工对其中一小部分数据标注。
Pseudo Labeling:先跑有监督学习得到基础分类器,用其生成伪标签后在合成数据集上继续跑有监督学习,重复多次直到收敛。
事实上不用严格区分阶段,可以通过在适当的时刻(例如置信度超过阈值)把伪标签数据加入真实数据实现。一般需要伴随伪标签占比 annealing 辅助训练。
这个算法在 Two Moons 的 Toy Case 上是有效的,因为边界虽然经过 Moon 但附近的置信度不会很高。但是在数据不密集或边界不清晰的场合效果可能欠佳,此时更好的方法可能是基于临近性的:相邻数据应当有相似标签。
Cluster Assumption:假设分类边界总是经过低密度区域,在很多数据集(比如说 Two Moons 或 MNIST)上有效,但在其它场合不一定。
由此有 Π-Model,Temporal Ensembling 和 Mean Teacher。
可选择的数据增强:
- Gaussian 模糊。
- 裁剪(在大图时可能更激进)、旋转、color jitter、水平翻转。
- 灰度化。
- 总之,要视具体数据类型而定。
- Mixup:把图像和对应 one-hot label 做等比例插值。
特别地,详细解释 Mixup。它的插值系数 \(\lambda\) 一般使用 Beta 分布,一种由两个超参 \(\alpha,\beta\) 决定的 \([0,1]\) 上分布。
- \(\alpha=\beta\) 时,其是对称分布;这个值 \(<1\) 时 PDF 是 U 形的,\(=1\) 是均匀的,\(>1\) 是钟形的。
- \(\alpha>\beta\) 时 PDF 向 \(1\) 偏移,否则向 \(0\) 偏移。
Mixup 的 one-hot label 插值其实不是好选择。一种更稳定的方法是提高生成 \(1\) 的概率,使用 \(\t{Beta}(\alpha+1,\alpha)\) 的图像 mixup,但 label 不 mix,强制使用 \(1\) 的 label。或者,直接取 \(\t{Unif}(0,0.2)\),仍然不 mix label,此时解释为一种结构化的噪声。不过下文中的所有方法都没用这种改进。
CutMix 是另一种方法,把一张图的一部分 crop 掉然后用另一张图补全,也即使用一个 mask 混合。而 label mix 时的 \(\lambda\) 按照 mask 比例分配。
PuzzleMix 先求 saliency map,也即通过对输出的梯度来对像素贡献归因。先对图像做 tiling 也即 patchfy,然后允许两张图发生 tile 级别的 permutation reorder,然后仍然 tile 级别的 mask 合并。以一个优化问题最大化以下三项的加权:
- 缝合图的 saliency 之和。
- 负的搬运代价,防止搬太远。
- 负的相邻项 mask 不同数目,防止 mask 太细碎。
当然代价很高,比如说它要先跑归因算法,再接优化问题,远不如 CutMix 简单。
Manifold Mixup 选择在特征层而不是 pixel 上进行更深层融合。算法为:
- 随机采样一个层数 \(k\) 和一个系数 \(\lambda\)。
- 把第 \(k\) 层的特征 \(\lambda\)-融合后,以 \(\lambda\)-融合的 label 训练。
特点:
- 决策边缘更平滑。
- hidden layer 的奇异值衰减快,说明对高维数据的压缩效果好,能有效实现特征的压缩性。
Interpolation Consistency Training 是半监督的一种增强方式。在 Mean Teacher 的语境下解释:
- Teacher 对于两个可以无关的数据 \(x_1\) 和 \(x_2\) 得到 label \(y_1\) 和 \(y_2\)。
- 把它们混合后,希望 Student 对混合数据能预测到混合 label。
- 与之相对的,原始 consistency loss 必须要求 \(x_1\) 和 \(x_2\) 是同一个样本的不同增强方式,相当于先验知道这两张图的标签必然相同。
MixMatch 是一种统一的半监督框架。
- 有监督的直接数据增强,无监督的随机做 \(K\) 个数据增强,然后将它们的预测求平均后用 \(p\to p^{1/T}\) 锐化,其中 \(T\) 是温度,一般取 \(0.5\)。这 \(K\) 个数据增强的伪标签被统一视作锐化后的平均预测。
- 把有监督和真实标签、无监督和上述锐化后的伪标签一起扔进大池子。
- 有监督的从池子中捞一个做 mixup,然后跑正常的 CE 有监督误差。
- 无监督的也捞一个做 mixup,误差仍然是有监督的(因为有伪标签)而不是 Mean Teacher 自举式的(虽然 Mean Teacher 也可以被看做是针对 Teacher 的伪标签训练),不过用 MSE 而不是 CE 因为 MSE 更抗离群值。伪标签只作为 target,不反向传播。
FixMatch 是一种更简洁的半监督模式。
- 对于无监督数据,生成伪标签时使用 弱增强,比如翻转或位移,但置信度阈值很高;如果达到阈值,则将预测转成 one-hot 后当成真实标签。这保证了合成标签的质量。
- 但是在训练的时候使用非常剧烈的 强增强,仍然与给出的标签(真实标签或高置信度的伪标签)交叉熵对齐。
总结:
样本与标签的关系分为 causal(X->Y)、anti-causal(X<-Y)、或不明等。手写数字识别是典型的 anti-causal 场合,因为是在把脑海中的标签转为现实。
半监督被认为在 anti-causal 的场合更有用,因为无标签数据是在提供 \(P(X)\),但是生成数据的机理是 \(P(Y\mid X)\),而这是与 \(P(X)\) 独立的过程;换言之,\(I(P(X);P(Y\mid X))\) 在 causal 的场合为零。
10.
视频生成。
- 是自回归还是双向?自回归在实时生成场合确有必要,但双向更能并行。
- 隐空间还是像素空间?前者有一个显式的 latent 中继,不完全端到端,但可以只存储隐向量节省空间,因为视频存储开销太大了。
- 离散瓶颈还是连续瓶颈(如果存在的话)?前者在细节上可能会有一些问题,尤其是高分辨率场合。
Evaluation:把 FID 变成 FVD,提取特征后用 Gaussian 近似并算 Frechet 距离或 2-Wasserstein 距离。但是并不是最佳的定量 metric。
Video Pixel Networks:PixelCNN 的视频同位体,在时间-空间二维上做自回归生成,在时间轴上使用 LSTM 压缩历史信息,空间轴上使用 CNN (当然是 PixelCNN 中带掩码的形式)。
Video Vision Transformer:提出 Tubelet Embedding 概念,也就是如今已经习以为常的 3D patchfy。为了提高训练速度,初始化时将 2D ViT 权重拉伸到 3D。探索了四种不同的 attn 架构:
- Spatio-temporal Attention:所有 patch 一起 attn。显然不牛。
- Factorised Encoder:先在每一帧内做 spacial attn,然后跨帧的再时序建模。
- Factorised Self-Attention:spacial 和 temporal 深度融合,每个 attn block 中都串行过两种 self-attn。
- Factorised Dot-Product Attention:让一部分 head 做 spacial,另一部分做 temporal,二者是并行关系。潜力不如第三种,实现更复杂,唯一的优势在于运算量更小。
VideoGPT:
- 可以理解为在视频上搭 VQ-VAE,用一个纯 transformer 架构自回归地描述离散 bottleneck 的分布;也可以理解为用 VQ-VAE 转到 latent 上跑自回归。
- VQ-VAE 使用 CNN 与 Axial Attn 的叠加,即沿三个维度分别的 attn。因为是 CNN 与 attn 的融合架构,而只有 attn 需要 posemb 所以要在过 attn 前补上。
Video Diffusion Models:
- 使用经典 U-Net 架构。U-Net 不使用全 3D 卷积,而是也使用可分离思想,堆叠空间层的 2D 卷积(把 \(T\) 视作 batch 维度,所有帧共享权重)和 attn,以及时间层的 1D 卷积与 attn。
- 允许图像被当作单帧视频参与训练,此时通过 mask 屏蔽时间层。
- 使用 Cascaded Diffusion Models 架构。
- 有一个 Base U-Net 负责生成低分辨率视频,例如 \(16\times3\times 64\times 64\)。(TCHW)
- 把它的输出在空间上插值提高到高分辨率。例如 \(16\times3\times256\times 256\)。
- 额外在通道维度上拼接纯噪声 (第一步) 或当前正被降噪的模型 (中间步),得到 \(16\times6\times256\times 256\) 的输入,提供给 Spatial Super-Resolution, SSR 模型,其生成 \(16\times3\times256\times 256\) 的高分辨率视频。
- 为了让 Base 的错误能在 SSR 中被修正,Low Resolution 的输入会被加噪。
- Base 的视频除了作为 SSR 的输入以外,一种可行做法是也作为 CFG 条件传入,与低层特征更加对齐。
- 时间上提高分辨率靠插帧。
- 使用 Reconstruction Guidance 技巧在采样时免训练地提高时间轴一致性,尤其是在插帧时。
- 令 \(y\) 是一个已知参考值,比如说首帧信息、低分辨率信息或者 impainting 条件,\(A(\cdot)\) 是从完整视频中提取相应信息的算子。
- \(\hat x_0(x_t)\) 是模型对 \(x_t\) 降噪出的 \(\hat x_0\)。我们希望 \(\ell(x_t)=\|A(\hat x_0(x_t))-y\|^2\) 尽量小。
- 于是,当前的 \(x_t\) 可以关于 \(\ell\) 小跑一步 GD,也即 \(x_t'\gets x_t-\eta\nabla\ell(x_t)\),然后正常用 \(x_t'\) 重建 \(\hat x_0\) 并得到 \(x_{t-1}\)。
- 另一种做法是修正预测结果:\(\eps_\theta'\gets\eps_\theta+\eta\sqrt{1-\bar\alpha_t}\nabla\ell\),然后用 \(\eps_\theta\) 得到 \(x_{t-1}\)。
- 这样可以类似 CFG 提高对条件的服从度一样提高对参考值的服从度。
Align Your Latents:
- 取一个预训练的图像 LDM,包括 VAE 和 U-Net backbone,然后尝试用它作为冻结的 spacial layers,并手工在中间插 temporal layers。
- 形式化地:
- 时间轴没有任何降采样,不管是 VAE 还是 UNet,默认做法是把时间轴视作 batch 维。
- VAE 的 Encoder 就相当于 framewise 应用 2D Encoder,可以保持冻结;但 Decoder 为了避免 framewise 的噪声和不连续,需要插入时间层并进行 tune;tune 的时候也遵照 Stable Diffusion 的惯例,在基础的 VAE loss 上加一个 GAN Loss。
- UNet 也需要插入由时域卷积 + Temporal Attn 构成的时间层;空间层则是冻结的。
- 插入时间层通过 Residue Connection,以保证初始化时不会破坏原有模型。
- 长视频通过 chunk by chunk 生成,且通过 Recon Guidance 提高 chunk 间衔接。
- 同样使用 Cascaded 结构。
CogVideo:
- 把预训练的使用 Transformer 建模 bottleneck 的 2D VQVAE 搬到视频上。
- 2D VQVAE 变成 3D VQVAE,需要把 2D 卷积变成 3D 卷积。实际使用时空分离卷积,且初始化是把 2D kernel 在时间维度上复制多次。同时保留相同的 codebook。
- 内层使用标准的 Video GPT 式 Transformer 自回归建模。使用 Temporal Attention,不过和 Align Your Latent 的 residue 式略有不同,而是直接作为 side channel 外挂在 backbone 的 spacial channel 上,与之是并行关系,通过一个 gate 进行 merge。
- 未使用 cascaded 方法(因为不是 diffusion 所以不能用),而是直接生成高分辨率低帧率视频 (T2V),然后做插帧 (V2V)。
Stable Video Diffusion:和之前的若干方法并没有本质区别。
- 基于图像的 stable diffusion,先用野生视频训练,再用高质量视频 tune。
- 用 VAE 转隐空间,U-Net 作为隐空间的 backbone,residue 插入时间层。
- 除了 T2V,支持 I2V,给出首帧条件和一个控制运动幅度的参数,然后进行后续补帧。
Sora:隐空间 backbone 用上 DiT。
综上,统一的训练流程:
-
数据收集与清洗:虽然视频网站上有很多野生视频,但它们之中充斥着:
- 剪辑与转场,会导致模型学到错误的空间和逻辑关系,因此要跑一个 Shot Detection 识别出剪辑时间点,然后把它切分为若干连续、无剪辑的视频片段。
- 大量字幕、水印和表情包。这样的视频会导致模型学出来的东西带着文字状残影,因此也要扔掉。
-
3D VAE 训练:
- 用 pretrained 2D VAE 还是 from scratch?前者是常规操作,但会带来一个「逐帧重建」的先验,可能导致闪烁。后者潜力更大,但成本更高。
- Causal 还是 Non-Causal?
- 前者指模型在生成当前帧时,只能看到之前的特征。
- 具体地,输入 \((B,3,T,H,W)\) 的视频,输出 \((B,C,T',H',W')\) 的 latent,其中 \(i\) 时刻的 \(z_i\) 应该仅与输入中的 \(z_{1:iS}\) 相关,其中 \(S\) 是降采样因子。
- 实现方式是在 3D 卷积时只在左侧 pad,这样感受野永远只包括之前帧的信息。
- 现在一般都是 Causal 的,因为可能自发涌现出 sequencial diffusion 的能力(但不一定),与 \(T=1\) 的图像场合兼容,与下游的 clipwise 一段段生成的任务更兼容,同时引入一个时序因果性的 bias。
- Loss 怎么选?
- 经典四板斧:Recon、KL、LPIPS、GAN。
- Recon 用 L1 以抗离群值,有助于生成更锐利的图像。
- KL 的 beta 一般很小,因为下游的 DiT 能力很强,如果过度规范化反倒会让 recon 质量下降。
- LPIPS 是在预训练的 feature extractor 的每一层上计算校准后的某种距离。
- GAN loss 的系数一般会随着其与 LPIPS 的梯度模长之比动态调整,是常见的 trick。
-
DiT 训练。
- 先训图像,它可以提供除了动作以外的所有信息。再训 4-8 帧短视频,引入基础运动概念;最后训长视频。
- DiT 原生支持不同分辨率、不同形状的输入。为了实现任意分辨率生成,要把不同分辨率的输入混合。当然也不能啥都混,最好只混相似分辨率的输入,避免输入的 diversity 过大。同时为了避免过量的 padding,同一个 batch 中的分辨率一般相同。
- 架构 Vanilla DiT 用 cross-attn 注入文本 condition,信息流是单向的;MMDiT 则是直接把文本和图像 token 拼一块 self-attn,允许文本 token 也被更新。
- CFG condition 类型多样,文本、图像、视频、动作之类,都需要仔细平衡,它们的 CFG scale 一般不同,同时缝入 DiT 的模式也不同。
- 图像是空间密集、时间稀疏的,直接视作一个特殊帧,在时间轴上拼接到 latent 序列前面。
- 变长序列如文本,被 cross-attn 或 self-attn 注入。
- 标量值如时间步使用 AdaLN 注入。
- 空间稀疏、时间稠密,比如摄像机轨迹:广播到视频特征维度,然后按前两种方法注入。
-
后训练。
-
SFT,要对着高质量数据训,可以多阶段训。
-
DPO。但是 DPO 需要精确的 log prob,而 Diffusion 不是 tractable 的,所以一般用 ELBO 来辅助
\[\log p(x_0)\geq-\lambda\int_0^1w(t)\E_{x_t\sim q(\cdot\mid x_0)}\|v_t-v_\theta(x_t,t)\|^2\d t+\t{const} \]于是可以用重建 velocity 与真实 velocity 的差,也称 velocity error 来近似 log prob。这个 error 越小,就意味着模型认为该样本越符合其建模的规律。
-
PPO, GRPO 等 full RL。仍然具有和 DPO 相同的 intractable 问题。解决方案包括把去噪过程看做 MDP 并应用 RL,或者直接用 DPO 式的 ELBO 估计。前者理论更完备,且可以提供 step-wise 的监督信号,但计算量很大,且面临着 PPO 常见的不稳定问题。后者更简单高效。
-
-
蒸馏,也即造 few-step 模型提速。一般使用传统蒸馏方法,比如说 Consistency Model 或 DMD。
生成长视频的若干问题。
- cost 更高……但这不是主要问题。
- 缺少长时间录像,大部分视频都有频繁的剪辑。
- 视频的 局部一致性 很重要,这意味着模型需要把主要的 attn 放到局部,甚至贪心地优先保证相邻帧的相似性,但反倒会导致长程逻辑失控,模型无法关注长程中重要的一些细节,出现衣服变色等问题。
- 模型无法学习到物理一致性,容易生成反物理的视频。
- 缺少好的 metric,FVD 和 LPIPS 等方法均无法很好衡量 consistency。
- 文本和视频的联系不足,例如数数或精细细节常常无法有效遵守。
- 多个 condition 的平衡问题。
- 自回归和双向的问题。自回归更能扩展,而且注入 causal bias 可能是对的,但更慢,且更容易出现 exposure bias;不过优势是支持流式解码。
解决方案包括换各种各样奇怪的监督信号。
- Event Camera:
- 只产生相邻帧出现变化的数据(例如,人走路则背景不贡献数据),降低长序列的负担。
- 帧率远高于常规摄像机,可以对高速物体提供准确的建模。
- 因为本质上是一种 optical flow 式的建模,天生具有对速度和加速度的 bias。
- 适应各种光照。
- 但是问题在于数据比较少见,而且还需要额外重建才能得到肉眼可识别的视频,因此并非主流。
- Depth Camera:提供深度监督。
- Compound Eyes:用多摄像头联合去噪,适合处理天文等极端场景的图像。
- LiDAR:允许主动探测环境。
总结:
- Backbones:
- U-Net:一般会堆叠某种 factorized 卷积或者 attn。
- ViT:一般堆叠 factorized attn。
- DiT:特化了 condition 的 ViT,允许通过时间轴拼接/cross-attn/joint-attn/AdaLN 等多种手段注入 condition。
- 基本上都可以通过 2D 场景复制多份初始化。
- 裸自回归:直接在裸的 pixel space 生成。
- Pixel CNN:CNN backbone。
- 裸 Encoder:目标是训练 feature encoder,不做生成。
- ViViT:ViT backbone,探索多种 factorize 方法。
- VQ-VAE:进入 VQ latent 然后自回归离散 token。
- VideoGPT:VQ-VAE 是融入 axial attn 的 CNN,backbone 是朴素 transformer。
- CogVideo:类似,采用了 T2V 生成关键帧再 V2V 插帧的模式。
- Pixel Diffusion:直接裸 Diffusion。
- Video Diffusion Models:backbone 是 from scratch 的时空分离 3D UNet。使用 cascaded 做空间维度上采样,用 RG 做时间维度插帧。
- Latent Diffusion 生成架构:先进入 VAE latent 然后 diffusion。
- Align Your Latents:VAE 是 pretrained 2D CNN + temporal,backbone 是 pretrained 2D UNet + temporal,同样 cascade。
- Stable Diffusion:VAE + UNet backbone。图像 -> 短视频 -> 长视频的训练 pipeline。
- Sora:VAE + DiT backbone。
11.
Flamingo:
- 文本中只标注
<image>token,具体的 image 信息靠 cross-attn 注入。 - 大部分东西都 frozen,除了以下几个东西:
- vision encoder 后面的转接头。
- 插在 LLM 里的、带 residue 的 cross-attn block。
PaLI:
- 图像过 ViT 得到 feature,文本过 Encoder 得到 embeddings。
- 图像 feature 投影到文本同维度,直接拼接然后过一个多模态 encoder 融合。
- 用 cross-attn 把融合 token 融入一个 decoder 输出。
- 因此,文本态基本上是一个 encoder-decoder 架构,与 decoder-only 的 flamingo 不同。
Uni-Diffuser:
- 把图像、文本的单模态生成/联合生成/互相生成统一起来。
- 图像用 VAE 转成 latent 然后得到 patch-wise feature;同时用 CLIP 得到 global feature。
- 文本用 CLIP encoder 转成 embedding。
- 它们一视同仁地被丢入类似 U-Net 但 backbone 换成 ViT 的 U-ViT 结构。
- 通过 masking 来动态调整图像和文本谁作为条件谁作为生成目标。
- 最终生成对所有输入(patch-wise feature、global feature、text embedding)的 noise-prediction。
- 可以通过 blocked gibbs sampling 即图像与文本轮流迭代以生成真正图文一致的合成数据。
LLaVA:
- 和 PaLI 相似的处理方式,即图像和文本的 feature 直接拼接。
- 不同的是采用 decoder-only 架构,拼接后的图像-文本是作为 prompt,而不是 cross-attn。
Implicit Neural Representation:一种图像的储存方式,目标是学习一个 instance-specific 的像素坐标至 RGB 的连续映射。
- 因为是连续映射,所以可以实现任意精度插值。
- 网络参数也可以看做一种隐含的压缩和特征提取。
- 完全可微,可以根据渲染结果修正结构。
- 缺点是训练需要计算资源,而且是 instance-specific 的。
早期会直接以 \((x,y)\) 作为输入,但维数太低并不好。解决方案包括:
- 用 PosEmb 提升输入维数。
- SIREN 使用 \(\sin\) 取代 ReLU 作为激活函数以获取更好的可微性,但初始化需要更仔细。
NeRF 是其最出名的任务。其输入 3D 坐标和球面视角(共 5D 输入),输出该点的密度和颜色值。通过场景的多视角训练,可以完成高保真的 3D 重建并合成新视角的图像。
12.
MDP。
- 经典的场合是有一个黑盒的环境,可以执行任意多次,且每次重置后的状态都相同。
- 但是现实中不一定能无限重置。所以 RL 早期的成功在电子游戏而不是具身。
POMDP。
- 根据当前的 state 可以看到一个 observation。
- 特殊的场景是 Finite-memory POMDP,此时可以根据历史的若干 observation 唯一重建当前的状态(或者说,足以找到一个等价的 MDP 状态表示,虽然这个状态不一定是真实的状态,但服从的动力学方程是完全相同的)。一个例子是匀速直线运动,只需要两帧就能建模速度。
RL 式 WM 和常规生成式模型的区别。
- 传统生成式模型只能学到相关性。
- WM 因为能主动用动作干预状态,这就带来了一定程度的因果性:动作是因,状态改变是果。于是 WM 更适合做因果推理。
- WM 的「决策」也即生成结果和「状态」也即生成条件是互相干涉的。这比条件固定或给出的常规生成难很多。
- WM 的 evaluation 困难:常规的 eval 手段例如 FID 关注视觉保真,但 RL 可能更关注状态、动力学的建模正确,而这往往是难以 eval 的。
World Model (2018):
- 三个核心组件:
- 视觉模型 V,把高维的 observation 压缩为紧凑的 latent state \(z\)。原始论文使用 VAE。
- 记忆模型 M,根据历史和当前的 latent 预测下一步的 latent 分布。原始论文使用 RNN 把历史 latent 压缩为 feature,然后输入 Mixture Density Network (MDN) 建模下一步 latent 的不确定性。
- 控制器 C,根据 V 提供的 latent 和 M 提供的 feature 进行具体的动作执行。
- M 是 WM 的核心,是对动力学的核心建模。
- 在更后来的模型比如说 I-JEPA 中:
- V 被丢弃了,不需要额外训 VAE 进入 latent。
- M 的 RNN 被 MAE 式 encoder 替代,负责压缩输入得到 feature。
- M 的 MDN 成为了 predictor,负责由 context feature 预测 target feature。
- C 被丢弃了,因为 I-JEPA 是纯图像模型而不是 RL 模型。
Dreamer:
- 原始 World Models 的现代化改造。VMC 三个部件仍然存在,但是 M 除了预测下一时刻的 latent 分布以外,还额外预测这一步的 reward 以及 MDP 中的 \(V\)。
- 原始 World Model 的 C 不可导,只能使用愚蠢的优化方案;Dreamer 换了一个可导的 C。
Diffusion Trajectory:
- 一种类似 Behavior Cloning 的方法。收集一堆 \((x_{1:n},a_{1:n},r_{1:n})\),建模它们的联合分布 \(p(x_{1:n},a_{1:n},r_{1:n})\)。
- 生成时直接用 \(p(x_{1:n},a_{1:n},r_{1:n}\mid x_t=\t{goal})\) 采样一个完整 trajectory。
- 因为生成时带有 goal 的 condition,可能会自发 mix 多个训练数据集中的 trajectory 创造新策略。
Open-Loop 还是 Closed-Loop:
- Diffusion Trajectory 是经典的 Open-Loop 做法,一次性生成整个 trajectory。
- 但是如果在 deploy 时出问题咋办?可以采用类似 speculative decoding 的方法,直到出问题再重新规划;或者类似 beam search,一次性生成多个 traj 然后只要有一个没问题就继续沿着跑。
Discrete Latent Variables in diffusion policy:
- 标准 Diffusion 从纯噪音开始,收敛比较慢。
- 这种方法把 Diffusion 的 HVAE 引入了一个旁路 \(z\),有 \(\log p(x_0\mid x_1)\geq\E_{z\sim q(z\mid x_0,x_1)}\log p(x_0\mid x_1,z)\)。
- 这个 \(z\) 和正常 Diffusion 的 HVAE 路径的不同在于形状和压缩程度不同,用它辅助降噪也许可以减少需要的步数。
- 训练时有 \(x_0\) 作为条件,但生成时没有,所以要训 \(p(z\mid x_1)\) 辅助。
- 这是因为 traj 和图像具有本质的不同,traj 的自由度其实很低,而 \(z\) 有助于捕捉这一点。
Diffusion Planning 同样面临着 Control as Inference 式的问题:
-
CaI 指出,当做 conditioned MDP 例如 \(p(a_t\mid s_t,O_{1:T})\) 其中 \(O_{1:T}\) 意味着任意时刻都处于最大值的先验时,模型在 action 时会犯过度乐观的错误,倾向于学习「在数据中经常出现且最有利的行为」而不是「真正最有利的行为」。
-
为了让 Diffusion Policy 不是大号 behavior cloning,必须予以修正。具体地,考虑 1-step 的 toy case:
\[p(s'=\t{goal}\mid s,a)=\dfrac{p(a\mid s,s'=\t{goal})p(s'=\t{goal}\mid s)}{p(a\mid s)} \\\arg\max_ap(s'=\t{goal}\mid s,a)=\arg\max_a\dfrac{p(a\mid s,s'=\t{goal})}{p(a\mid s)} \]我们真实训练的目的是最大化「执行该 action 后达成目标的概率」,也即 \(p(s'=\t{goal}\mid s,a)\);Diffusion Policy 在学习 \(p(a\mid s,s'=\t{goal})\),其离真实目标差了一个 \(p(a\mid s)\) 的频率项。
这个项应该被除掉;而如果 \(p(a\mid s)\) 在数据中偏好某些 \(a\),那么模型学习的 policy 也会偏好。因此在采样时,应该削弱那些高频动作的权重,类似 CFG。
Diffusion Policy 是一种 RL planning 策略。以下考虑转移到 RL 中的 feature learning 环节。
Inverse Models:
-
一种做 feature learning 的代理任务。希望学习一个 encode 使得能有效解逆动力学,即 \(p(a_t\mid\t{enc}(o_t),\t{enc}(o_{t+1}))\)。
-
但是这个代理任务会出现很多走捷径的场合。比如有可能 \(o_{t+1}\) 中有一块局部区域记录了历史动作,那 encoder 会直接学到 \(\t{enc}(o_{t+1})=a_t\),显然不是一个好的全局 encoder。
-
另一方面,这个代理有时也是不足的,比如说赛车游戏中每一圈的 observation 都是相同的,而 IM 不一定能学会分辨现在到底是第几圈。
-
证明这个任务的不足性,有一个显然的反例如下图:
A--B--C | | | D E F | | | G--H--I模型会学到把
DEF三者揉成同一个 latent。
Multi-Step Inverse Model:
-
只还原一步可能有点太简单了。如果换一个难一点的任务,比如说 \(p(a_t\mid\t{enc}(o_t),\t{enc}(o_{t+k}))\) 呢?为了在 \(k\) 步后到达一个状态,下一步应当是什么?
-
形式化地,直接对着 NLL 优化:
\[\mathcal L=-\E_{t,k}\log p(a_t\mid f(x_t),f(x_{t+k}),k) \] -
希望找到一个既能最小化 NLL 又不过度复杂的 \(f\)。
-
如果间隔过长,预测可能是困难的。
-
也有一些反例建立某些 \(K\) 部图等周期性结构,能 hack 掉 MSI。
-
如果加入一个 BYOL 式的 self-prediction 任务,也即最大化 \(p(f(x_{t+1})\mid f(x_t),a_t)\),在确定性转移的场合是没有反例的。
exogenous noise:
- 环境的总状态 \(z_t\) 可以被拆分为不交的两部分,包括 Endogenous 的 \(s_t\),其受到 agent 动作影响,服从动力学 \(p(s_{t+1}\mid s_t,a_t)\);以及 Exogenous 的 \(e_t\),其不受 agent 动作影响(但可能服从内在动力学),比如说机器人背后电视机中的视频,背景中走动的行人等,服从动力学 \(p(e_{t+1}\mid e_t)\)。
- Observation 是二者综合的结果,也即 \(o_t=g(s_t,e_t)\)。
命题:所有 Inverse Model 都能自动过滤掉噪声影响。
\[p(a_t\mid o_t,o_{t+k})=\dfrac{p(o_{t+k},a_t\mid o_t)}{p(o_{t+k}\mid o_t)} \\=\dfrac{p(o_{t+k}\mid o_t,a_t)p(a_t\mid o_t)}{\sum_{a'_t}p(o_{t+k}\mid o_t,a'_t)p(a'_t\mid o_t)} \]注意到有 \(p(o_{t+k}\mid o_t,a_t)\) 可以被拆解为:
- 内生动力学 \(p(s_{t+k}\mid s_t,a_t)\)。
- 外生动力学 \(p(e_{t+k}\mid e_t)\)。
- 渲染过程 \(p(o_{t+k}\mid s_{t+k},e_{t+k})\)。
于是有 \(p(o_{t+k}\mid o_t,a_t)=\sum_{s_{t+k},e_{t+k}}p(s_{t+k}\mid s_t,a_t)p(e_{t+k}\mid e_t)p(o_{t+k}\mid s_{t+k},e_{t+k})\)。
另一方面,可以认为 action 与 noise 无关,也即 \(p(a_t\mid o_t)=p(a_t\mid s_t)\)。
把上述分式上下同时应用上述推导,就会发现所有包含 \(e\) 的项都因为与 \(a_t\) 和 \(a_t'\) 无关而上下抵消了(可能需要 \(p(o_{t+k}\mid s_{t+k},e_{t+k})\) 是 Dirac 分布这个性质)
WM 中 representation learning 任务从易到难:
- BYOL:纯视觉任务,只学习图像的特征。完全对 action 不关心,学不到真正有关决策的特征。
- 1-step inverse:\(p(a_t\mid\t{enc}(o_t),\t{enc}(o_{t+1}))\)。过于简单。
- multi-step inverse:\(p(a_t\mid\t{enc}(o_t),\t{enc}(o_{t+k}))\)。可能较为稀疏。
- self-prediction:\(p(\t{enc}(x_{t+1})\mid\t{enc}(x_t),a_t)\)。结合 MSI 效果很好。
- temporal contrastive:带有负样本的 self-prediction。如果不用 MSI 辅助,可能过度关注正负样本间微小差异。
- generative model & MAE:\(p(o_t\mid\t{enc}(x_t),a_t)\),完美像素级重建,显然会过度注重噪声。
越简单的任务越不容易提取出真正有用的特征;越困难的任务越容易过度关注无用噪声。
BYOL-explore:一个用学习出的 feature 来进行 explore 的 RL 算法。
- 模型根据当前的 student encoder 得到 feature \(f_\theta(o_t)\),进入 RNN 生成当前的 belief state \(b_t\) 以及一系列 action 序列 \(a_t,\dots\) 推演未来的 belief state \(b_{t+1},\dots\)。
- 一个 projector 把 \(b_{t+i}\) 映射到 \(g_\phi(b_{t+i})\),并希望其贴近 target encoder 的 feature \(f_{\theta'}(o_{t+k})\)。
- 其是一个标准的 latent self-prediction model。同时 BYOL 的 loss 还被用来指引探索。
HOMER:学习一种 POMDP (Block MDP) 的 latent state 和 policy。
- 隐状态:离散且不可见的空间 $ S$。
- observation:高维的 $ X$,通过 \(q(x\mid s)\) 建立 $ S\to X$ 的关系。
- 目标:学习状态还原映射 \(\phi: X\to S\),并找到能到达所有可能隐状态的策略 \(\Psi\)。
算法分为多轮,第 \(h\) 轮处理离原点 \(h\) 步远的场合。
- 收集若干用 \(\Phi_{h-1}\) 运行 \(h-1\) 步的 trajectory。
- 正样本:在此 trajectory 上采取 \(a\) 到达 \(x'\) 的真实后继。
- 负样本:把 \(x'\) 用一个随机同层后继替代。
- 学一个最小化 NCE 的分类器,但是其有一个离散的 bottleneck 作为 \(\phi_h\)。
- 用 \(\phi_h\) 定义奖励函数然后跑经典 RL 算法。
- 更新策略 \(\Phi_h\)。
分为多轮处理是 RL 保证策略覆盖的完备性、消除分布偏移的方法。
Latent Action Models:
- RL 中一般 traj 需要 state-action (有时还需要 reward) 对。但是如果只有 state 数据(例如视频)应该怎么训?
- 此时可以引入变量 \(z_t\) 表示 latent action,并且可以通过 \(z_t=\t{enc}(s_t,s_{t+1})\) 的 inverse 式方式表出。其同时支持 \(p(s_{t+1}\mid s_t,z_t)\) 的动力学模型。
- 同上述分析一样,\(z_t\) 有可能作弊,学习到 \(z_t=s_{t+1}\)。因此有必要设置一个合适的 bottleneck。
- 但是这个 \(z_t\) 不一定有可解释性。同时这个 \(z_t\) 也不一定有唯一解。
Genie:
- Encoder 就是 \(z_t=\t{enc}(s_t,s_{t+1})\)。
- Decoder 用 \(z_t\) 和历史帧 \(s_{1:t}\) 预测下一帧。
Motus:把视频、action 和 prediction 联合在一起跑 uni-diffuser。
BC-MSI 等价性:
-
Behaviour Cloning 建模 \(p(a_t\mid s_t)\)。
-
MSI 建模逆动力学模型 \(p(a_t\mid s_t,s_{t+k})\)。
-
\[ p(a_t\mid s_t)=\int p(a_t,s_{t+k}\mid s_t)\d s_{t+k} \\=\int p(s_{t+k}\mid s_t)p(a_t\mid s_t,s_{t+k})\d s_{t+k} \]
-
如果有最优的 \(p(s_{t+k}\mid s_t)\) 动力学,则二者确实等价。
-
MSI 因为有额外监督信号,数据量少时更鲁棒,且因为有 \(s_{t+k}\) 辅助,更不容易出现 mode collapse 问题。
-
过拟合时,BC 无法处理 o.o.d,而 MSI 会在 \(p(s_{t+k}\mid s_t)\) 动力学不准时导致错误。

浙公网安备 33010602011771号