十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

V-RAE:重新思考视频生成中的Latent Space设计

V-RAE:重新思考视频生成中的Latent Space设计 视频生成的迭代速度很快但很多时候决定成片质量高低的分水岭不在扩散模型的 Attention 层而在视频被压缩进 latent space 的那一步。V-RAE: Rethinking Video Latent Spaces for Generation这个标题之所以值得细读是因为它把一个以前常被当作“预处理模块”的 Video VAE 推回了研究焦点真实视频进入生成模型前应该如何编码才能既保住重建细节又不干扰扩散模型的噪声学习。围绕 Video Latent Spaces 这条主线本文会先解释视频生成为什么必须在压缩后的潜在空间里工作再拆解 V-RAE 这类研究所针对的 latent 容量、分布、时域结构和因果性问题然后用一个可运行的最小探针实验把 latent 拉到代码层面检查最后给出复现与工程落地时的常见坑。适合正在复现视频生成论文、想理解 Sora 类架构底层组件或者要给自己项目接入视频编码能力的读者。1. 先理清 latent space 在视频生成链路中的位置1.1 像素空间直接扩散的算力和时域代价扩散模型的核心任务是去噪训练时给干净样本逐步加噪声推理时从纯噪声开始逐步还原。如果这个过程直接发生在像素空间每一步网络都要处理一个非常庞大的张量。以一段 4 秒、30fps、256x256 的视频为例仅像素输入就是 120 帧 RGB单步去噪的输入规模是[B, 3, 120, 256, 256]这已经是上千万维度的输入空间。更大的问题在 Attention 层。无论是 Video Diffusion Transformer 还是时空 U-Net都会把视频切成 token 参与注意力计算。像素空间 token 数量大注意力矩阵会随 token 数量二次增长带来显存和时间上的双重压力。视频只要变长一点或分辨率变大一点很多团队就会立刻回到显存不足和训练不稳定的老问题。另一种更现实的思路是模仿图像 Latent Diffusion用一个自编码器先把像素视频压缩成低维 latent扩散模型在 latent 空间里加噪、去噪最后再通过 decoder 还原成视频。压缩后网络处理的通道数更少、空间分辨率更低、有时时间维度也被抽稀注意力层的计算量会显著下降。1.2 Video VAE 的输入输出与时间维压缩图像领域常见的做法是把[B, C, H, W]的图像编码成[B, z_dim, H/f, W/f]的 latent比如空间上压缩 8 倍。视频情况类似但多了一个时间轴输入通常表示为[B, C, T, H, W]Video VAE 的 encoder 需要把时间和空间一起处理输出形状接近[B, z_dim, T/frame_rate_stride, H/spatial_stride, W/spatial_stride]例如一段输入视频是[1, 3, 32, 256, 256]如果时间上每 4 帧抽出一个 latent 帧空间上每 4 倍压缩latent 会变成[1, z_dim, 8, 64, 64]。生成时扩散模型在这样一个小得多的空间里做预测再用 decoder 还原到完整分辨率。这里存在一个工程习惯差异图像 VAE 的 2D 卷积只需要考虑H和W而 Video VAE 的 3D 卷积同时处理时间轴。看似只是把卷积从 2D 换成 3D实际难点在于时间维的因果性、帧间一致性和运动语义的保留程度都不像空间维那样可以直接套用成熟经验。1.3 为什么重建任务的高分不能直接换算成生成质量很多团队在评估 VAE 时只看重建 PSNR 和 SSIM。重建分数高说明 encoder-decoder 能把输入视频比较完整地还原但这并不能说明 latent 适合扩散模型继续生成。原因是两种任务的优化目标不同重建任务希望 latent 保留尽可能多的像素信息包括水印、传感器噪声、高到肉眼分辨不了的纹理。生成任务希望 latent 结构紧凑、语义稳定、时间一致并且 latent 空间的分布接近某个先验扩散模型才能在其中训练。一个极端情况是 latent 把训练视频的细节全部像素级保存导致 latent 里混入大量不必要的高频信息。当成视频帧、生成场景复杂度发生变化时这些噪声会被扩散模型当成一种“语义”生成结果就可能出现纹理崩坏、内容闪烁或细节无意义堆叠。所以视频 latent 设计不能只用重建指标衡量。2. V-RAE 重新思考 Video Latent 时最可能动刀的环节2.1 Latent 容量压缩率要同时照顾内容和运动V-RAE这个工作名里最值得注意的不是 VAE 本身而是 “Rethinking”。如果一个 latent 只是把视频压得越小越好那问题就退化成普通视频压缩。可生成任务要求 latent 不但能压缩还要给扩散过程提供容易学习的信息结构。实际设计时要平衡三个数字时间下采样倍率、空间下采样倍率、latent 每帧通道数。压缩率越高latent token 越少训练扩散模型越省显存但如果压缩到信息瓶颈以下视频里的小物体、快速局部运动通常会被 encoder 主动丢弃。反过来说latent 容量太大扩散模型要学习的变量维度过高又可能失去 latent diffusion 的优势。实际较常见的选择是空间下采样 4 或 8 倍、时间下采样 4 倍左右、latent 通道数取 4 到 16 不等。但这些数值不能照搬要先看视频数据特点运动剧烈的数据集时间维压缩过大会让相邻 latent 帧之间仍然存在明显运动模糊镜头切换频繁的数据则需要保证 latent 不能把两段完全不同的内容平均到同一个隐向量里。2.2 从重建损失到生成先验KL 和 latent 分布不能再随意经典 VAE 训练使用两部分损失重建损失加上 KL 项。KL 项希望 latent 的后验分布靠近标准正态先验。图像 VAE 这样做问题不大因为扩散模型还可以通过微调手段适配 latent 分布。但在视频 latent 空间里KL 权重的微小变化会被时间维度放大。KL 权重偏大时latent 会被过度约束encoder 输出的特征趋同扩散模型能利用的信息不足生成视频容易出现内容单调、运动幅度小、长期越来越模糊。KL 权重偏小时latent 空间保留更多细节但后验分布与先验差距大扩散模型推理时从标准正态噪声开始采样相当于在一个模型没见过的高概率区域起步生成早期就会偏离。V-RAE 这类标题强调生成导向背后反映的是研究者不再把 VAE 当独立的压缩工具而是把它和扩散训练整体考虑。合理做法不是去搜索最优 KL 权重而是建立一套可复现的 latent 分布监控机制训练过程中持续记录每个 latent channel 的均值、方差、和先验分布之间的差距防止模型静默漂移。2.3 内容与运动是否需要不同的特征结构视频和图像的本质差异是时间。图像 VAE 只需要编码一个静态内容而视频 latent 需要同时描述“画面里有什么”和“画面怎么变化”。如果直接把视频切成单帧并用图像 VAE 独立编码生成时每一帧的语义相对独立下一帧无法稳定继承前一帧的内容最终就会出现闪烁、抖动和运动崩溃。另一种常见做法是把视频当成一个三维张量直接堆 3D 卷积或 3D Transformer 编码。这个方案能拉开时间维的关联但问题是 latent 里内容特征和运动特征混在一起。实际生成需求往往希望只改变运动、保持身份不变或者只改变主体、保持运动节奏一致如果 latent 的通道之间没有语义分工这种条件控制会非常困难。V-RAE 在方法名上强调 “Video Latent Spaces”一个合理的解读是把 latent 空间结构化为多个层面一个通道组或 token 组负责稳定的外观、材质和身份另一个负责时间变化、姿态和运动轨迹。拆分之后扩散生成可以只对运动子空间施加更强的噪声扰动同时保持内容子空间相对稳定。这样做有利于生成更长时间的连贯视频也让编辑、插值、运动迁移等任务更容易实现。2.4 时间因果性离线编码和在线生成的错配点视频 VAE 在训练时通常可以访问完整的视频片段。这意味着 decoder 重建某一帧时既能看到过去帧也能看到未来帧。这种“双向”结构适合压缩但不适合流式生成。生成场景里扩散模型在推理时通常是从一个随机噪声 latent 开始逐步去噪模型并不知道未来会生成什么。如果 latent decoder 依赖未来帧离线训练的 encoder 输出分布与在线生成时模型内部状态之间就会出现不一致。要解决这个问题比较直接的方案是让视频 encoder 的时间卷积只使用当前帧和过去帧的信息也就是采用 causal 3D 卷积或因果注意力。很多落地方案会提前设计 temporal padding 方式例如在时间轴开头补零而不是在时间轴两端对称 padding并在每层配置对应的时间下采样。代码实现里这未必复杂但它影响的不只是几行 padding 逻辑而是整个训练推理一致性问题。只要一个阶段的 padding 方向不一致最终解码视频就可能出现开头几帧异常或切换片段时画面跳变。3. 建一个最小探针实验把 Video Latent 拉出来检查3.1 环境准备Torch 版本、依赖和显存基础下面实验用于观察 Video Latent 的输出形状和统计量不是 V-RAE 论文仓库的完整复现。实际跑任何视频生成代码前最好先建立一个这样的小探针脚本确认环境、模型输出和显存都符合预期再进入大规模训练。推荐使用 Linux 环境配合 NVIDIA GPU。Python 版本建议 3.10 或 3.11PyTorch 版本建议高于 2.1。代码中会用 einops 做张量维度变换用 imageio 读视频用 matplotlib 记录可视化结果。依赖安装命令conda create -n vrae-probe python3.11 conda activate vrae-probe pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121 pip install einops imageio[ffmpeg] matplotlib tensorboard这里的torch版本要根据自己的 CUDA 驱动版本调整。如果 GPU 驱动较老不要盲目安装高版本的 CUDA 对应包。可以先用nvidia-smi查看驱动支持的 CUDA 版本再选择匹配的 PyTorch 轮子。探针实验并不是越大越好。64x64、32 帧左右的视频已经足够检查 latent 结构显存占用可以控制在很低的范围内方便在单卡上快速迭代。3.2 实验目录与准备 5 个短视频常见的项目目录可以这样组织vrae_probe/ ├── configs/ │ └── vae_probe.yaml ├── data/ │ └── clips/ │ ├── clip_01.mp4 │ ├── clip_02.mp4 │ └── ... ├── models/ │ └── video_vae_probe.py ├── tools/ │ ├── train_probe.py │ └── inspect_latent.py └── outputs/ └── runs/准备数据时不需要下载大的公开数据集。可以先从一段自己拍摄或版权安全的视频里切 5 个短视频每个 2 到 4 秒分辨率统一缩放到 64x64 或 128x128并记录原始帧率。真正做论文复现时再使用 UCF101、Kinetics 或项目指定的数据集。读取视频时要注意像素值范围。常见做法是把 float 像素归一化到 [-1, 1]再做 BGR 或 RGB 通道顺序统一否则同一段视频检查两次得到的结果可能相反。3.3 一个可运行的 Probe Video VAE 结构下面代码实现一个非常小的 Video VAE。它的目标不是达到 SOTA 重建质量而是演示 3D 卷积如何把[B,C,T,H,W]压缩成低维 latent再解码回目标分辨率。import torch import torch.nn as nn import torch.nn.functional as F class VideoEncoderBlock(nn.Module): def __init__(self, in_ch, out_ch): super().__init__() self.conv nn.Conv3d(in_ch, out_ch, kernel_size3, stride2, padding1) self.norm nn.GroupNorm(8, out_ch) self.act nn.SiLU() def forward(self, x): return self.act(self.norm(self.conv(x))) class VideoDecoderBlock(nn.Module): def __init__(self, in_ch, out_ch): super().__init__() self.conv nn.ConvTranspose3d( in_ch, out_ch, kernel_size4, stride2, padding1 ) self.norm nn.GroupNorm(8, out_ch) self.act nn.SiLU() def forward(self, x): return self.act(self.norm(self.conv(x))) class ProbeVideoVAE(nn.Module): def __init__(self, latent_dim8, base_ch128): super().__init__() self.encoder nn.Sequential( VideoEncoderBlock(3, base_ch), VideoEncoderBlock(base_ch, base_ch * 2), ) self.enc_z nn.Conv3d(base_ch * 2, latent_dim * 2, kernel_size1) self.decoder nn.Sequential( VideoDecoderBlock(latent_dim, base_ch * 2), VideoDecoderBlock(base_ch * 2, base_ch), ) self.out_conv nn.Conv3d(base_ch, 3, kernel_size3, padding1) def encode(self, x): features self.encoder(x) stats self.enc_z(features) mu, log_var stats.chunk(2, dim1) log_var torch.clamp(log_var, -20.0, 4.0) return mu, log_var def reparameterize(self, mu, log_var): std torch.exp(0.5 * log_var) eps torch.randn_like(std) return mu eps * std def decode(self, z): z self.decoder(z) return self.out_conv(z) def forward(self, x): mu, log_var self.encode(x) z self.reparameterize(mu, log_var) recon self.decode(z) return recon, mu, log_var, z if __name__ __main__: video torch.randn(2, 3, 32, 64, 64) vae ProbeVideoVAE() recon, mu, log_var, z vae(video) print(input :, video.shape) print(z :, z.shape) print(recon :, recon.shape)这段代码的关键点有三个。第一encoder 使用了两次步长为 2 的 3D 卷积因此时间维和空间维都会被除以 4。输入[2,3,32,64,64]输出的 latent 是[2,8,8,16,16]这正是观察后续生成条件的起点。第二enc_z输出通道数是latent_dim * 2一半是均值一半是对数方差这是 VAE 的经典做法。做 Diffusers 风格的 VAE 时经常看到类似结构只是实现细节和 normalization 位置不同。第三decoder 使用ConvTranspose3d每组上采样倍数也是 2所以中间 latent 能被还原回输入大小。如果修改了 encoder 的下采样层数decoder 层数必须同步修改。3.4 训练脚本要点损失项、超参和监控量探针实验不需要训练到完全收敛但损失函数要写对。标准 VAE 训练用一个最小脚本就能跑通import torch import torch.nn.functional as F def vae_loss(x, recon, mu, log_var, kl_weight1e-6): recon_loss F.mse_loss(recon, x) kl -0.5 * torch.sum( 1 log_var - mu.pow(2) - log_var.exp() ) kl kl / x.shape[0] return recon_loss kl_weight * kl, recon_loss, kl optimizer torch.optim.AdamW(vae.parameters(), lr1e-4) for step in range(200): optimizer.zero_grad() recon, mu, log_var, z vae(video_batch) loss, recon_loss, kl vae_loss(video_batch, recon, mu, log_var) loss.backward() optimizer.step() if step % 20 0: print( fstep {step:03d} | loss {loss.item():.4f} | frecon {recon_loss.item():.4f} | kl {kl.item():.4f} )实际复现中 KL 权重不同效果差异会很大。探针实验用1e-6是为了保留更多重建信息这是因为我们更关心 latent 统计量而不是压缩效率。若训练时发现 KL 项过小导致 latent 方差明显偏向某几个 channel就要调高权重或者对 log_var 增加约束范围。这里要提醒一点用随机张量跑这个脚本只能确认前向和反向逻辑可以通过不能说明 latent 质量。要观察真实差异至少准备好 10 段以上内容不同的真实视频片段再训练几十个 step。4. 四步检查判断一个 Video Latent 能否交给 Diffusion4.1 第一步输入输出 shape 和时间对齐拿到任何 Video VAE 权重后第一步不是直接训练扩散模型而是先用一张动态测试输入确认 shape 和时间对齐关系。只需要记录输入输出结构video torch.randn(1, 3, 32, 64, 64) with torch.no_grad(): recon, mu, log_var, z vae(video) print(latent temporal size:, z.shape[2]) print(recon temporal size :, recon.shape[2])时间对齐尤其容易被忽略。假设输入是 32 帧latent 时间维是 8decoder 还原成 32 帧这只说明形状对。但 latent 第 5 帧是否对应输入视频的某个时间区间需要单独验证。常见的排查方法是构造一个亮度只在最后一帧变化的视频。如果 decoder 重建结果在最后一帧变化前就开始模糊说明 decoder 使用了未来信息或者时间 padding 配置不对。这个问题在离线压缩时不明显但在生成和插帧场景里会造成未来信息泄漏。4.2 第二步重建误差与帧间差异是否稳定评估 latent 是否适合生成不能只看整段视频的 MSE。应该在帧间差异层面做检查def temporal_diff(video_tensor): return ( video_tensor[:, :, 1:] - video_tensor[:, :, :-1] ).abs().mean() orig_diff temporal_diff(video) recon_diff temporal_diff(recon) ratio recon_diff / (orig_diff 1e-8) print(forig frame diff : {orig_diff.item():.6f}) print(frecon frame diff : {recon_diff.item():.6f}) print(frecon/orig ratio : {ratio.item():.4f})如果重建结果帧间差异明显小于原始视频说明 latent 丢失了运动细节模型可能把前后帧平均到同一个 latent 里生成运动时会倾向于缓慢、平滑甚至产生“慢动作感”。如果 reconstruction 的帧间差异大于原始视频则要检查是否出现闪烁、纹理跳变或解码不稳定。这种时间平滑度指标不需要特别精确只要变化趋势符合预期即可。它和 PSNR 一起看能快速识别出“单帧漂亮但视频抖动”的 VAE。4.3 第三步latent 统计量有没有长出危险信号对 latent 的每个 channel 做均值和标准差统计。可以用下面代码# z shape: [B, D, T, H, W] B, D, T, H, W z.shape z_perm z.permute(0, 2, 3, 4, 1).reshape(-1, D) channel_mean z_perm.mean(dim0) channel_std z_perm.std(dim0) print(channel mean:) print(channel_mean) print(channel std:) print(channel_std)不同项目对统计值有不同的理想区间但危险信号通常比较一致某个 channel 标准差接近 0说明这个 channel 没学到信息可能是表达冗余或死通道。全部 channel 均值都远离 0说明 latent 整体偏向某一个固定偏移扩散模型需要先学习抵消这个偏移。latent 标准差过大或过小意味着 additive noise 的尺度需要重新配置直接影响扩散模型的噪声调度。若接入扩散模型前发现这些问题最有效的处理是重新审视 VAE 的输出 normalization 方式。很多实现会对 latent 做逐通道标准化把均值拉到接近 0、标准差固定到合理范围而不是直接拿原始 encoder 输出训练扩散模型。4.4 第四步接一个轻量扩散头做生成端到端验证前几步都是在间接推断 latent 是否适合生成。真正可靠的做法是固定 VAE 权重在其 latent 空间接一个轻量扩散模型做生成验证。这个扩散模型不需要很大可能只要几层 Temporal Attention目标是验证是否能在 latent 上训练出一个能还原训练视频分布的生成器。训练完成后从随机噪声开始采样一遍 latent再通过 decoder 解码成视频。看两类结果采样出的视频是否能保持基本语义对象。连续多轮采样是否出现剧烈构图变化或颜色漂移。如果 reconstruction 指标很好但随机采样结果完全不合理说明 latent 和扩散先验之间的 gap 很大。这种情况下换一个更大的 diffusion backbone 不一定能解决更可能需要回到 VAE 的 latent 统计和正则化方案上。5. 复现视频 latent 方案时最容易踩的工程坑5.1 Conv3d 和 ConvTranspose3d 的形状不匹配现象是训练脚本前向时报错通常是 shape mismatchExpected input batch_size to match target batch_size, or input_channels to match target_channels原因是 Video VAE 的 encoder 和 decoder 下采样层数不一致。比如 encoder 对时间维进行了 4 倍下采样decoder 只上采样了 2 倍输出时间长度不匹配或者输入帧数是奇数两次 stride2 卷积后latent 时间长度不是理想的T/4。检查方式是在模型 forward 中打印每一层输出形状。建议事先约定输入视频帧数为 4 的倍数比如 16、32、64这样时间维总是能被整除。空间分辨率也尽量取 2 的幂次或 16 的倍数避免 decoder 上采样带来的尺寸抖动。5.2 时间维度的 padding 方向因果与双向不是可选项如果代码里直接使用nn.Conv3d且 padding 参数为(1,1,1)框架默认会在时间维前后各补一帧这是双向卷积。它适合离线压缩但不适合自回归或流式生成。要改成因果卷积在时间维上需要在参数前追加零来实现只补过去帧。一个简单写法是def causal_conv3d(x, conv): x F.pad(x, (1, 1, 1, 1, 0, 0)) # only pad time before return conv(x)注意 PyTorch padding 参数从最后维开始数这里(1,1,1,1,0,0)分别表示最后维W前后各 1、倒数第二维H前后各 1、倒数第三维T不补未来。如果写成F.pad(x, (0,0,0,0,1,0))得到的字段含义和期望可能完全不同。5.3 训练时的高斯统计与推理不一致Video VAE 中如果大量使用 BatchNorm 或 GroupNorm训练和推理时的统计行为可能不同。BatchNorm 在训练时使用当前 batch 的统计量推理时使用 running mean 和 running variance。当 batch 太小、样本视频内容差距过大时训练统计量不稳定推理时重建结果可能出现整体颜色偏移尤其体现在视频后段。如果复现仓库发现训练过程 loss 正常但推理结果波动明显先检查model.eval()是否被正确调用再检查 normalization 层的统计量。不要轻易用训练模式来做最终指标测评那会低估真实推理场景下的错误并且可能在生成时掩盖问题。5.4 显存优化不能靠降低帧率解决一切很多人在复现视频生成项目时遇到显存不足第一反应是把帧数从 32 降到 8。这个做法在跑通流程时很好用但会掩盖 Video VAE 在长时序上的问题。当帧数降低之后模型看不到长距离运动容易误判时间下采样倍率是否合理。更稳的方式是采用以下组合开启梯度检查点gradient checkpointing。使用混合精度训练。把视频裁剪到较小空间分辨率跑通再逐步恢复。减少 batch size 而不是盲目降低时间维。如果最终目标是生成长期运动实验一定要保留一个长视频测试集不能只在短片段上调好所有参数。5.5 数据标注阶段调用大模型服务报 HTTP 400 的排查视频 latent 相关项目通常还需要为训练视频生成文本描述或辅助标题。很多数据管线会用开源指令模型或国内大模型 API 做自动描述。一个常见报错是auxiliary title generation failed: http 400: errorHTTP 400 的本质是服务端认为请求不合法而不是模型推理失败。原因集中在几个方向请求体里的messages格式不符合 OpenAI 兼容规范。system内容为空或类型不是字符串。Prompt 超过模型上下文长度。传入了模型不支持的超参比如某些模型不接受过高的temperature。接口路径写错或模型名称和服务端实际部署名称不一致。排查顺序比较简单先把调用方从业务代码里拆出来用 curl 或 Postman 直接请求服务端看返回 detail。如果是 prompt 超长就做截断如果 JSON 字段类型不对就检查序列化过程。实际项目里最容易解决也最容易忽视的是空 prompt 和错误模型名。例如在本地部署基于 Hermes 这类指令微调模型或使用兼容 OpenAI 格式的 DeepSeek API 时很多工具库会额外注入默认 system prompt。如果注入后的 prompt 长度超过了模型支持上限服务端返回的就是 400。遇到这种情况优先看返回 body 中的具体错误而不是反复重启任务。注意调试 400 错误时不要先怀疑网络层而要先还原请求体。服务端给出的 detail 信息通常已经指明了问题字段。6. 视频生成项目中 Latent 方案选型与落地清单6.1 不是所有视频生成任务都需要重训 Video VAEV-RAE 这类工作的重要意义在于挑战“图像 VAE 直接扩展到视频”的惯性思路。但对大多数业务团队来说直接从零训练一个高质量 Video VAE 成本仍然很高。更合理的技术路线是把 Video VAE 当作独立组件定位如果目标是快速做视频生成 demo优先复用开源预训练权重。如果目标是发布视频生成产品再把 latent 设计纳入可控训练计划。如果目标是做视频编辑或运动迁移需要重点关注 latent 是否把内容和运动拆开。重训前先用预训练权重把下游 diffusion 链路跑通再逐步替换 VAE往往能更快定位问题出在编码器还是扩散模型。6.2 Latent 设计速查表下面的表格可用于方案选型不是绝对真理但能帮助快速缩小范围使用场景适合的 Latent 取向关注点图像生成扩展为短视频空间大压缩时间小压缩首帧一致性、短时运动长视频生成latent 时间维度需要更小跨度流式生成、因果卷积视频编辑内容和运动分通道或分组特征编辑、语义对齐数字人/说话头身份特征稳定口型运动敏感局部运动编码压缩任务高压缩率、高重建 PSNR时间漂移、bandwidth可控生成latent 支持语义条件注入条件融合方式这里的关键不是选压缩率最大的方案而是要让 latent 结构和你最终要做的是“生成”还是“压缩”保持一致。6.3 进入生产环境前要做的检查清单在把 Video VAE 作为生成基础模块发布前建议逐项自查确认 latent 输入视频的归一化范围RGB 顺序和原始数据一致。确认时间维下采样倍数、空间下采样倍数和 latent 通道数记录在配置文件中。确认模型训练和推理的 dropout 状态、normalization 状态一致。确认 decoder 是否使用未来帧信息生成场景中是否允许。确认 latent 统计量的分布已记录并设置过阈值报警。确认文本描述或数据标注服务的错误请求有日志回捞能拿到服务端 detail。确认短片段和长视频分别准备验证集避免只测短片段。确认 GPU 显存分配和梯度 checkpoint 采用相同配置。很多模型在离线评估里 PSNR 不错一到产品环境做随机生成就出问题。最常见原因是生产环境只验证了 reconstruction 分支没有验证从随机噪声到 latent 的完整生成分支。
返回列表