想象你认识一位顶尖的写实画家,他能在几分钟内根据几句文字描述画出一张令人惊叹的静态图画。但如果你请他画一本连环画,或者一部动画片的连续分镜,他就犯难了——因为他的头脑里只有“单张画面”的概念,没有“时间”这个维度。AnimateDiff 要做的事情,就是给这位画家配上一副神奇的“时间眼镜”:戴上之后,他不仅能画出一张精美的图,还能让画面里的人物自然地动起来,连续画出十几帧连贯的动作。更妙的是,这副时间眼镜完全不会改变画家原本的绘画功底,只是在观察方式上多了一层“时间感”。本文将从扩散模型的基础讲起,带你拆解这副时间眼镜的构造——它如何建模帧与帧之间的关系、如何被训练、又如何支撑起“文本生成视频”的完整流程。读懂 AnimateDiff,你就抓住了“图生视频”技术路线中最关键的钥匙。
对 AI 从业者而言,AnimateDiff 展示了“冻结大模型骨干 + 训练轻量时序模块”这一极具复用价值的范式,是理解视频生成从实验室走向工程化的必修课。
可视化演示
动态演示AnimateDiff动画扩的核心机制,通过概览/流程/对比/趋势四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
AnimateDiff动画扩:Anim AnimateDiff动画扩散 AnimateDiff运动模块 核心机制可视化 AnimateDiff动画扩整体架构与关键组件
扩散模型基础
想象这位画家出道时,他的训练方式非常特别:老师先在他干净的作品上用力喷洒墨点,直到画面变成一片雪花噪点,然后让他凭记忆一步步把墨点擦掉、把画面复原。擦得越多,他就越理解“一幅好画的本质”是什么样的。AI 圈的扩散模型,就是这样训练出来的“擦墨点专家”——只不过墨点换成了高斯噪声,画布换成了像素张量。
扩散模型分两个阶段:前向加噪(往图像上叠加越来越多的噪声)和反向去噪(用神经网络一步步预测并去除噪声)。训练时,模型拿到“被污染到某个程度”的图像和时间戳,任务是预测刚才被加进去的噪声。这个“噪声预测专家”的骨干网络叫 UNet,是一种擅长保留图像细节的编码器-解码器结构,它输出预测噪声后,与真实噪声做均方误差比较来更新参数。
1. 采样干净样本:从真实图像库中随机抽取一张作为目标,相当于画家的标准答案。
2. 采样随机噪声:从标准正态分布中抽一个与图像同尺寸的随机噪声。
3. 采样时间步:从 1 到 T 中均匀抽取,控制污染程度,越小越接近原图。
4. 前向加噪合成:按加权系数把干净图和噪声混合成“污染图”。
5. UNet 预测噪声:网络读取污染图、时间步和文本条件,输出对噪声的估计。
6. 均方误差更新:让预测噪声逼近真实噪声,误差越小去噪越准。
当这位“擦墨点专家”修炼到家后,给他一句文字描述,他就能从纯噪声开始逐步擦出精美画面——这就是大家熟知的文生图。然而他只会单张,不懂“连续动作”。这正是 AnimateDiff 登场的原因:给他配一副时间眼镜。
AnimateDiff架构
既然画家单帧功夫已经炉火纯青,我们不会把他送去动画学院重新学画画——那样既费钱又可能丢掉老本事。最好的办法,是定制一副“时间眼镜”架在他的眼睛上:眼镜不影响原有画技,只负责告诉他:“上一格画面里手已经抬到这儿了,这一格你该再抬高一点。”AnimateDiff 的训练思路就是如此。
AnimateDiff 使用一个预训练好的图像扩散模型(如 Stable Diffusion)作为骨干,把它的 UNet 参数全部冻结,然后在 UNet 的多个分辨率层级之间插入轻量级“运动模块”(Motion Module)。运动模块只处理时序信息,不管单帧风格。训练阶段只更新这些新插入的模块,大大节省算力。
运动模块以残差方式叠加到原特征上。为了让训练初期“戴上眼镜像没戴一样”,作者对运动模块的最终输出做零初始化——一开始它输出零,随着训练逐步学会输出“运动增量”。
1. 特征输入:UNet 第 i 层输出的特征,此时多帧堆叠在一起,等待时序加工。
2. 归一化:把特征拉回标准尺度,让运动模块看到稳定、干净的输入。
3. 运动模块计算:第 j 个运动模块根据“当前去噪阶段” t 决定要加多少时序修正。
4. 残差相加:原始特征保持不变,模块只补充“变化量”,避免破坏图像模型的能力。
5. 零初始化约束:训练初期修正量约等于零,保证起步阶段不冲击原画质量。
一副好的时间眼镜应当“戴上像没戴一样”——刚戴上时,画家看到的画面和以前几乎相同;随着训练积累,眼镜才开始提示“该往哪个方向动”。这就是 AnimateDiff 的精妙之处:不重学作画,只补上时间感。
时序注意力机制
如果你把普通眼镜换成一副“VR 头显”,它会同时把前后几帧的影像叠加展示。画家只有把当前画面与前后画面串起来对比,才能判断“这一格该画什么”。时间眼镜的镜片上布满了“记忆丝线”,把当前帧与过去、未来的帧连接起来——这正是时序注意力(Temporal Attention)在做的事。
运动模块采用“先空间后时间”的设计:每个图像特征先经过空间自注意力处理画面内部结构,再经过时序注意力处理帧间一致性。时序注意力的计算方式与 Transformer 自注意力几乎相同,区别只在于把“注意力作用的维度”从空间换成了时间。具体做法是把视频帧的帧数维度与 token 数维度交换,让注意力在“同一空间位置、不同帧”之间进行。
假设一段视频有 F 帧,每帧特征有 H×W 个空间 token。把形状重排后,Q 来自当前帧,K 和 V 来自所有帧,从而学到“这个像素在时间上如何变化”。
1. 查询生成:把当前帧的特征映射成查询向量,表示“我在找什么”。
2. 键值生成:把所有帧的特征映射成键和值,表示“我是什么”以及“我能提供什么”。
3. 点积相似度:逐对计算当前帧与每一帧的匹配分数。
4. 缩放稳定:除以特征维度的平方根,防止分数过大导致梯度异常。
5. softmax 归一:把分数转成和为 1 的权重,突出最相关的帧。
6. 加权融合:按权重把各帧值向量混合,输出“去噪时该匀过来多少信息”。
“记忆丝线”把不同时刻的画面像胶卷一样叠在一起,让画家画当前格时能“看见”前一格和后一格。这也解释了 AnimateDiff 为什么能生成连贯运动:每一帧都在参考邻居,而不是孤立作画。
运动强度控制
时间眼镜的镜腿处有一个旋钮,标注着“动作灵敏度”。拧到 1 档,画面里的人物只是微微眨眼;拧到 10 档,人物能大步流星地奔跑。观众想要多大的动作幅度,完全由导演说了算——AnimateDiff 把这个旋钮做成了可调参数。
这个旋钮的学名叫“运动尺度(motion scale)”,实现的关键在训练阶段的“随机丢弃”策略:训练时随机把运动模块“关掉”,让画家偶尔摘掉眼镜作画。这样一来,模型既会画“静止张”(丢弃时),也会画“动态张”(启用时)。推理时把两者的预测结果相减,差值就是“运动带来的改变量”,再乘上一个系数来调节强度。
1. 无运动预测:让模型按普通图扩散的方式预测噪声,相当于摘掉眼镜。
2. 有运动预测:保留运动模块,模型给出带运动趋势的噪声预测。
3. 运动差分:两者相减,得到纯粹的“运动增量”。
4. 尺度缩放:用 s_m 控制增量放大的倍数。
5. 合成引导:回到无运动预测并加上缩放后的增量,得出最终去噪方向。
导演想要“平静的水面”时把旋钮归零,想要“波涛汹涌”时拧到最大。这个看似简单的方法,让 AnimateDiff 成为可控的动画生成器——同样的文本、同样的画面,旋钮不同,故事节奏完全不同。
训练数据构建
眼镜再精巧,也离不开“看过的素材”。要让画家理解“人物走路”与“人物挥手”的区别,得给他看大量真实的动作影像。时间眼镜的“阅历”就来自训练数据——一个高质量的短视频素材库。
AnimateDiff 需要成对的数据:文本描述 + 短视频片段。训练时,从长视频中随机裁剪出固定长度的连续帧片段(比如 16 帧),并为每个片段标注一句全局文本描述。现有视频字幕质量参差不齐,所以论文常借助图像-文本模型自动生成描述,保证“画面—动作—文本”三者对齐。
设某条视频有连续帧 X₀, X₁, X₂……,训练片段长度为 N 帧、滑动步长为 s,则第 n 个片段从第 n·s 帧开始连续取 N 帧。这样一条长视频可以衍生出大量片段,大幅扩充样本量。
1. 视频帧定义:Xₖ 表示视频中第 k 帧的像素图像。
2. 片段长度:N 决定运动模块一次能看到的时间跨度。
3. 滑动步长:相邻片段起点相隔 s 帧,控制样本之间的重叠程度。
4. 片段构造:从 n·s 开始连续取 N 帧,得到第 n 个训练片段。
素材库越丰富,眼镜的阅历越广。但 AnimateDiff 只训练运动模块而不是全模型,所以就算素材库不小,训练成本也远低于端到端视频模型——这是它能流行的关键原因。
文生视频流程
画家戴上时间眼镜、储备了动作素材后,正式开工就像一间动画工作室:编剧写出剧本(文本提示词),故事导演解读画面与情绪(文本编码),分镜师画出第一格(初始噪声),时间眼镜确保后续每格都连贯(逐帧去噪),最后剪辑师把各段拼成影片(帧序列输出)。
推理流程继承 Stable Diffusion 的采样方式,但把“单张图像”换成“一批帧”。输入文本经过 CLIP 文本编码器(把文字变成语义向量的模块)得到条件向量;然后采样一个形状为 [帧数,通道,高,宽] 的初始噪声张量;每个去噪步里,UNet 同时处理这批帧,运动模块在帧间交换信息,使各帧协同演化。
每一步的预测噪声同时受文本条件、运动条件引导,相当于在视频帧的联合分布中逐步走向目标。用条件生成概率表示:
1. 当前噪声态:z_t 是所有帧拼在一起的噪声张量,代表生成进度。
2. 文本条件:用 CLIP 把提示词编码成语义向量 y,注入生成过程。
3. 运动条件:m 表示是否启用运动模块以及强度,控制动态程度。
4. 均值预测:UNet 给出下一步去噪的方向,相当于“该往哪个画面走”。
5. 方差预设:Σ_t 是随 t 变化的噪声方差,保证采样多样性。
6. 采样更新:从正态分布中抽取 z_{t-1},完成一步去噪。
从“雨夜霓虹下,穿红裙子的女人回头微笑”到 16 帧连贯动画,工作室全体成员各司其职:文本给出意境,去噪绘出细节,时间眼镜把细节串成故事。这就是 AnimateDiff 文生视频的完整魅力。
贡献与局限
时间眼镜推出后,很多画家抢着试用。有人夸它省时省力、作品还能动起来;也有人抱怨:戴上眼镜画人脸特写时,五官偶尔“变形走样”;画高分辨率广告大片时,画质又撑不住。这就是 AnimateDiff 这款“眼镜”的贡献与局限。
贡献方面:第一,训练成本低——只训练运动模块,基础图像模型参数不动,用少量视频数据就能让 Stable Diffusion 型号的模型升级成动画模型;第二,即插即用——同一运动模块可以适配到不同版本的图模型上;第三,可控性强——通过运动尺度旋钮精细调节动作幅度。
局限方面:概念漂移是最大痛点——运动模块训练时看的大多是“人物”类视频,遇到非人物题材时会下意识把人物运动先验强加进去,导致画面扭曲;分辨率受限——运动模块在 256×256 级别训练,直接生成高清视频会暴露训练分布之外的伪影;时间长度有限——单次推理帧数固定,长视频需分段生成,容易累积误差。评估视频生成质量通常用 FVD 指标:
1. 特征提取:用预训练视频识别网络把真实视频和生成视频编码成特征。
2. 均值向量:每组视频特征的平均向量,反映整体风格。
3. 协方差矩阵:特征分布的离散程度,反映运动多样性与细节。
4. 均值距离:两组平均特征的平方距离,衡量内容差异。
5. 分布重叠项:迹运算刻画两个协方差的匹配程度,数值越小分布越接近。
眼镜帮画师解决了“动起来”的难题,却也有看不清的角落:人脸、非人物、超高清、超长视频。但 AnimateDiff 用“轻量拓展”的思路给 AIGC 打开了一扇门——让旧模型低成本升级为新模态,这已成为后续无数视频生成方法的重要基石。
AI 应用场景
动画分镜快速预演
阶段:创意构思与预可视化
解决的问题:传统动画分镜需要逐帧手绘或完成 3D 建模绑定,一个 5 秒镜头要耗费数天;AI 用 AnimateDiff 几分钟就能产出动态分镜,导演可以快速验证运镜与节奏,再交给精修团队细化,大幅降低沟通成本与返工率。
具体案例:动画工作室把“猫在雨夜屋顶奔跑”的文本输入 AnimateDiff,生成 16 帧预演片段。导演看完立即调整运动尺度参数,让猫的奔跑更轻盈,再进入正式制作。
电商商品动态广告生成
阶段:内容生产与广告物料生成
解决的问题:电商广告需要“产品 + 动态效果”组合,传统拍摄成本高、排期长,静态图又缺乏吸引力;AnimateDiff 可以给商品图注入自然运动,让广告“动起来”。
具体案例:品牌方用 Stable Diffusion 生成咖啡杯主图,再用 AnimateDiff 生成“杯口缓缓冒出热气、奶泡轻微晃动”的动态帧,配以一致的文本提示,一键产出多套动态素材用于信息流投放。
短视频模板规模化开发
阶段:模板加工与批量化内容生成
解决的问题:短视频平台的模板需要大量风格统一的动态背板,纯人工制作无法规模复制;AnimateDiff 的即插即用特性让同一运动模块接入多个风格化图模型,批量产出“同动作、不同画风”的模板。
具体案例:MCN 机构将同一训练好的运动模块装入漫画风、水彩风、像素风三个图模型,生成同一段挥手动作的三种画风模板视频,分别投放到不同达人账号。
Python 演示
import mathimport torchimport torch.nn as nn class TemporalAttention(nn.Module): """时序注意力:对同一空间位置的所有帧做注意力,让帧间交换运动信息""" def __init__(self, dim, num_heads=4): super().__init__() self.num_heads = num_heads self.scale = (dim // num_heads) ** -0.5 self.q_proj = nn.Linear(dim, dim) self.k_proj = nn.Linear(dim, dim) self.v_proj = nn.Linear(dim, dim) self.out_proj = nn.Linear(dim, dim) def forward(self, x): # x: [batch, frames, tokens, dim] b, f, n, d = x.shape x = x.permute(0, 2, 1, 3) # [b, tokens, frames, dim] q = self.q_proj(x).view(b, n, f, self.num_heads, -1).permute(0, 1, 3, 2, 4) k = self.k_proj(x).view(b, n, f, self.num_heads, -1).permute(0, 1, 3, 2, 4) v = self.v_proj(x).view(b, n, f, self.num_heads, -1).permute(0, 1, 3, 2, 4) attn = torch.einsum('bnhtd,bnhsd->bnhts', q, k) * self.scale attn = torch.softmax(attn, dim=-1) out = torch.einsum('bnhts,bnhsd->bnhtd', attn, v) out = out.permute(0, 1, 3, 2, 4).reshape(b, n, f, d).permute(0, 2, 1, 3) return self.out_proj(out) class MotionBlock(nn.Module): """运动模块:LayerNorm + 时序注意力 + 残差连接""" def __init__(self, dim): super().__init__() self.norm = nn.LayerNorm(dim) self.attn = TemporalAttention(dim) def forward(self, x): return x + self.attn(self.norm(x)) class MiniAnimateDiff(nn.Module): """玩具版 AnimateDiff:一层卷积模拟图像UNet + 运动模块""" def __init__(self, in_channels=3, dim=32, num_frames=8): super().__init__() self.proj_in = nn.Conv2d(in_channels, dim, 3, padding=1) self.proj_out = nn.Conv2d(dim, in_channels, 3, padding=1) self.motion = MotionBlock(dim) def forward(self, video, t): # video: [batch, frames, channels, H, W] b, f, c, h, w = video.shape x = video.reshape(b * f, c, h, w) x = self.proj_in(x).reshape(b, f, -1, h, w) x = x.permute(0, 1, 3, 4, 2).reshape(b, f, h * w, -1) x = self.motion(x) x = x.reshape(b, f, h, w, -1).permute(0, 1, 4, 2, 3) x = x.reshape(b * f, -1, h, w) return self.proj_out(x).reshape(b, f, c, h, w) def add_noise(video, t): """前向加噪:按时间步 t 将噪声以余弦系数混入视频帧""" noise = torch.randn_like(video) alpha = math.cos(t * math.pi / 2) noisy = alpha * video + math.sqrt(1 - alpha * alpha) * noise return noisy, noise def inference(model, text_cond=1.0, steps=20): """简化版反向去噪:固定起点噪声,逐步逼近干净视频""" z = torch.randn(1, 8, 3, 32, 32) for t in torch.linspace(1.0, 0.05, steps): with torch.no_grad(): pred = model(z, t.item()) z = z - 0.05 * pred * text_cond return z if __name__ == '__main__': torch.manual_seed(42) model = MiniAnimateDiff(num_frames=8) video = torch.randn(1, 8, 3, 32, 32) noisy, noise = add_noise(video, 0.6) print('原始视频:', video.shape) print('加噪视频:', noisy.shape) out = inference(model) print('去噪输出:', out.shape) mae = (out - video).abs().mean().item() print('像素MAE: %.4f' % mae)
x = x.permute(0, 2, 1, 3)把维度从 [帧,token] 交换为 [token, 帧],让“帧”成为注意力要扫描的序列,对应正文中“把时间维度暴露给注意力”。attn = torch.softmax(attn, dim=-1)把帧间相似度分数归一化成权重,对应注意力公式中的 softmax。return x + self.attn(self.norm(x))残差连接,运动模块只补充增量,不破坏原始特征。self.motion = MotionBlock(dim)在图像骨干中插入运动模块,对应 AnimateDiff 在 UNet 中插入 Motion Module。x = self.proj_in(x).reshape(b, f, -1, h, w)卷积先逐帧提取空间特征,模拟“图像模型负责单帧画质”。alpha = math.cos(t * math.pi / 2)时间步 t 越接近 0,保留的原始信号越多,体现前向加噪规律。z = z - 0.05 * pred * text_cond简化去噪更新,text_cond 相当于文本引导强度。torch.einsum('bnhtd,bnhsd->bnhts', q, k)计算帧间注意力分数矩阵,是时序注意力的核心运算。
常见误区
误区初学者容易以为 AnimateDiff 像 Sora 那样,用海量视频端到端训练一个视频生成大模型,所以它是“另一个视频大模型”。
正解实际上 AnimateDiff 是“图像扩散模型的时序扩展插件”。它冻结了 Stable Diffusion 的全部参数,只额外训练轻量级运动模块,训练数据量和算力开销远小于端到端视频模型。把它理解为“给静态画家戴一顶时间头盔”更准确——基础作画能力来自图模型,运动能力来自小模块。
为何常见:论文标题带有“Animate“且效果是视频,容易被直觉归类为”视频生成大模型”;再加上运动模块参数量远小于图模型,更让人困惑。
误区以为 AnimateDiff 和早期“先生成帧再插帧”技术一样,先逐帧生成图片,最后用拼接软件合成视频。
正解AnimateDiff 在生成时就是“多帧联合去噪”:一次采样同时维护 F 帧的噪声张量,运动模块让每帧在去噪时看到其他帧的信息。帧与帧从第一步去噪起就互相影响,而非事后拼接,因此运动一致性远好于逐帧生成。
为何常见:图像生成先入为主,容易带来“画完一张再画一张”的思维定式;而“联合去噪”涉及并行张量操作,概念上更难建立。
误区以为想让人物动作更剧烈,只需在提示词里写“快跑、剧烈运动”等词,或者完全无法控制运动幅度。
正解AnimateDiff 提出的是运动尺度参数,通过随机丢弃加负向引导实现精确控制。提示词影响语义内容(在跑什么),运动尺度影响动作幅度(跑多快),两者互补。一个管内容,一个管节奏。
为何常见:文生图/文生视频的一致性体验让人习惯“用词控制一切”,而忽略了生成过程本身带有可调超参(CFG、运动尺度)。
误区以为插入运动模块后,模型生成的单帧“画质”也会变好,属于全面升级版。
正解运动模块只负责跨帧信息流,不增加单帧细节。由于训练数据多为网络短视频且分辨率有限,AnimateDiff 在某些题材(如人脸特写、非人物主体)上的单帧画质反而可能比原始图模型更不稳定,这就是论文提到的概念漂移。
为何常见:效果演示常把运动模块生成的帧展示得很有冲击力,容易让观者以为“动态等于更高质量”,忽略了评估指标实际关注的是时序一致性而非单帧清晰度。
面试题
Q1. AnimateDiff 的核心设计思想是什么?
- A.从零训练完整视频扩散模型
- B.图像模型加时序运动模块← 正确答案
- C.逐帧生成图片后拼接视频
- D.用对抗网络替换扩散网络
答案:B。AnimateDiff 的关键是“冻结图像模型 + 插入运动模块”,让成熟的文生图模型获得时序能力。A 是端到端视频模型的思路;C 是早期逐帧合成方案;D 与扩散模型无关。
Q2. AnimateDiff 训练时冻结了哪个部分?
- A.运动模块网络全部参数
- B.文本编码器全部参数
- C.基础图像扩散模型参数← 正确答案
- D.视频解码器的全部参数
答案:C。训练只更新运动模块,基础图像扩散模型(如 Stable Diffusion 的 UNet)参数全部冻结,这是减少算力开销的关键。A 恰好说反了;B 文本编码器虽也可冻结但题目问的是设计重点;D 中 AnimateDiff 没有单独的视频解码器。
Q3. AnimateDiff 生成视频时用什么机制保证帧间连贯?
- A.光流追踪与后处理插帧
- B.前后帧强制像素完全一致
- C.时序注意力跨帧交换信息← 正确答案
- D.使用 LSTM 逐帧循环预测
答案:C。运动模块内的时序注意力让每帧在去噪时参考其他帧,实现帧间信息共享。A 是传统视频处理方案;B 强制一致会丢失运动;D 循环网络不是 AnimateDiff 采用的方式。
Q4. 时序注意力与空间注意力的本质区别是什么?
- A.时序注意力参数更多所以更强
- B.时序注意力在帧维度计算关联← 正确答案
- C.空间注意力不适用于视频任务
- D.时序注意力不需要键值矩阵
答案:B。时序注意力把“帧”当作注意力作用的序列维度,计算同一空间位置在不同帧之间的关联;空间注意力则在单帧内部计算。A 参数量不是本质区别;C 表述错误,空间注意力在视频中依然有用;D 时序注意力同样需要 Q、K、V 矩阵。
Q5. AnimateDiff 中“随机丢弃运动模块”的目的是什么?
- A.降低视频训练的计算开销
- B.防止运动模块在数据上过拟合
- C.让模型兼具静止与运动的生成← 正确答案
- D.使多卡并行训练过程更稳定
答案:C。随机丢弃让模型既能生成无运动的图像,也能生成有运动的视频,推理时对两者做负向引导即可调节运动强度。A 计算开销的降低不是目的;B 过拟合不是主要动机;D 与多卡并行无关。
Q6. 运动尺度参数 s_m 的作用是什么?
- A.控制文本提示词的语义强度
- B.控制生成视频的帧间动作幅度← 正确答案
- C.控制视频的总时长长短
- D.控制训练时的学习率大小
答案:B。运动尺度通过放大“有运动预测与无运动预测的差值”来控制动作剧烈程度,是 AnimateDiff 的“灵敏度旋钮”。A 是提示词权重的职责;C 帧数由训练设置决定;D 是优化器参数,与推理无关。
Q7. AnimateDiff 训练数据中“连续帧采样”的作用是什么?
- A.确保每个片段包含完整动作过程← 正确答案
- B.将单张图像增广为多视角视图
- C.压缩视频数据以降低存储成本
- D.让生成帧与真实帧逐像素对齐
答案:A。滑动窗口连续帧采样保证每个片段都是真实拍摄中的一小段连续动作,运动模块才能学到自然的时序变化。B 与视角增广无关;C 数据压缩不是采样的目的;D 生成帧与真实帧本就不同,不存在逐像素对齐。
Q8. 以下哪些关于 AnimateDiff 运动模块的说法是正确的?
- A.它以残差方式插入 UNet 各层← 正确答案
- B.其输出层采用零初始化训练← 正确答案
- C.它替换了原有的注意力模块
- D.它只在推理时参与计算
答案:AB。A 对,运动模块残差叠加在 UNet 特征上;B 对,零初始化保证训练初期不破坏图像模型;C 错,运动模块是新增模块而非替换原有注意力;D 错,训练时它同样参与前向与反向传播。
Q9. AnimateDiff 生成视频出现“概念漂移”可能是由什么引起的?
- A.训练数据里人物运动样本占主流← 正确答案
- B.运动模块放大了特定类别的先验← 正确答案
- C.文本编码器对提示词理解错误
- D.分辨率超过运动模块训练范围← 正确答案
答案:ABD。概念漂移源于运动模块在偏斜分布(如大量人物视频)上训练,导致它把主流类别的运动先验强加到一切内容上;分辨率超出训练范围会触发训练分布外伪影。C 属于文本理解问题,不属于运动模块特有的概念漂移。
Q10. 关于 AnimateDiff 的即插即用特性,下列哪些描述正确?
- A.同运动模块可用于不同版本图模型← 正确答案
- B.运动模块与解码器联合重新训练
- C.图模型升级时无需改动运动模块← 正确答案
- D.运动模块强依赖特定的图模型权重
答案:AC。AnimateDiff 运动模块训练在冻结图模型上,具备一定迁移性,同一模块可适配不同版本的 Stable Diffusion,图模型升级时无需重新训练运动模块。B 错在“联合重新训练”;D 错在“强依赖”,设计初衷就是弱依赖以便迁移。