CogVideo与CogVideoX模型结构

发布时间:2026/6/25 20:58:34
CogVideo与CogVideoX模型结构 PixelCNN要追溯VQ-VAE的思想就不得不谈到自回归模型。可以说VQ-VAE做生成模型的思路源于PixelRNN、PixelCNN之类的自回归模型这类模型留意到我们要生成的图像实际上是离散的而不是连续的。以cifar10的图像为例它是32×32大小的3通道图像换言之它是一个32×32×3的矩阵矩阵的每个元素是0255的任意一个整数这样一来我们可以将它看成是一个长度为32×32×33072的句子而词表的大小是256从而用语言模型的方法来逐像素地、递归地生成一张图片传入前面的所有像素来预测下一个像素这就是所谓的自回归方法其中每一个都是256分类问题只不过所依赖的条件有所不同。VQ-VAE针对自回归模型的固有毛病VQ-VAE提出的解决方案是先降维然后再对编码向量用PixelCNN建模。降维离散化因为PixelCNN生成的离散序列你想用PixelCNN建模编码向量那就意味着编码向量也是离散的才行。而我们常见的降维手段比如自编码器生成的编码向量都是连续性变量无法直接生成离散变量。同时生成离散型变量往往还意味着存在梯度消失的问题。最邻近重构在VQ-VAE中一张n×n×3的图片x先被传入一个encoder中得到连续的编码向量z这里的z是一个大小为d的向量。另外VQ-VAE还维护一个Embedding层我们也可以称为编码表记为这里每个都是一个大小为d的向量。接着VQ-VAE通过最邻近搜索将z映射为这K个向量之一我们可以将z对应的编码表向量记为我们认为才是最后的编码结果。最后将传入一个decoder希望重构原图。整个流程是最邻近这样一来因为是编码表E中的向量之一所以它实际上就等价于这K个整数之一因此这整个流程相当于将整张图片编码为一个整数。当然上述过程是比较简化的如果只编码为一个向量重构时难免失真而且泛化性难以得到保证。所以实际编码时直接用多层卷积将x编码为m×m个大小为d的向量也就是说z的总大小为m×m×d它依然保留着位置结构然后每个向量都用前述方法映射为编码表中的一个就得到一个同样大小的然后再用它来重构。这样一来也等价于一个m×m的整数矩阵这就实现了离散型编码。自行设计梯度我们知道如果是普通的自编码器直接用下述loss进行训练即可但是在VQ-VAE中我们用来重构的是而不是z那么似乎应该用这个loss才对但问题是的构建过程包含了argmin这个操作是没梯度的所以如果用第二个loss的话我们没法更新encoder。换言之我们的目标其实是最小但是却不好优化而容易优化但却不是我们的优化目标。VQ-VAE使用了一个很精巧也很直接的方法称为Straight-Through Estimator你也可以称之为直通估计。Straight-Through的思想很简单就是前向传播的时候可以用想要的变量哪怕不可导而反向传播的时候用你自己为它所设计的梯度。根据这个思想我们设计的目标函数是其中sg是stop gradient的意思就是不要它的梯度。这样一来前向传播计算求loss的时候就直接等价于然后反向传播求梯度的时候由于不提供梯度所以它也等价于这个就允许我们对encoder进行优化了。维护编码表要注意根据VQ-VAE的最邻近搜索的设计我们应该期望和z是很接近的事实上编码表E的每个向量类似各个z的聚类中心出现但事实上未必如此即使和都很小也不意味着和z差别很小即不意味着。所以为了让和z更接近我们可以直接地将加入到loss中除此之外还可以做得更仔细一些。由于编码表相对是比较自由的而z要尽力保证重构效果所以我们应当尽量让去靠近z而不是让z去靠近而因为的梯度等于对的梯度加上对z的梯度所以我们将它等价地分解为第一项相等于固定z让靠近z第二项则反过来固定让z靠近。注意这个等价是对于反向传播求梯度来说的对于前向传播求loss它是原来的两倍。根据我们刚才的讨论我们希望让去靠近z多于让z去靠近所以可以调一下最终的loss比例其中在原论文中使用的是。拟合编码分布经过上述一大通设计之后我们终于将图片编码为m×m的整数矩阵了由于这个m×m的矩阵一定程度上也保留了原来输入图片的位置信息所以我们可以用自回归模型比如PixelCNN来对编码矩阵进行拟合即建模先验分布。通过PixelCNN得到编码分布后就可以随机生成一个新的编码矩阵然后通过编码表E映射为3维的实数矩阵行×列×编码维度最后经过decoder得到一张图片。CogVideoCogVideo 是基于大规模预训练 Transformer 进行视频生成的工作也是近期推出的 CogVideoX 的前身。相比于文生图任务文生视频的主要难点在于两个方面首先是数据更加稀缺视频-文本配对数据比较少其次是视频多了时序信息。本模型基于文生图模型 CogView2 进行训练在训练时使用了 5.4 M 视频-文本对数据。在训练时文本条件是通过 in context learning也就是将文本 token 直接拼接在图像 token 序列前方的方式实现的。除此之外还引入了多帧率层次化训练的训练策略通过调整帧率来动态地调整视频的长度。在生成时首先生成关键帧然后用一个插值模型生成中间帧。多帧率层次化训练CogVideo 也采用了比较常见的方式用 VQVAE 将视频序列转换为离散的 token 序列再使用 transformer 对 token 序列进行学习。在训练时token 序列的长度是固定的也就是总共包含对应于 5 帧的 token 序列。不过和通常的方法不同的是这里虽然序列的长度是固定的但是实际上对应的视频的长度是可变的。具体来说CogVideo 在序列开始的时候加入了一个表示帧率的 tokenFrame Rate。虽然论文原文直接把这个称为frame rate不过这个和实际上视频的帧率感觉还是有一点区别的。这个表示的是在这个序列的 5 帧中每两帧之间相隔的视频中帧的数量。这样对于比较长的视频可以设置两帧之间相隔较多帧反之亦然。有了这个设定无论训练视频多长都可以用固定的序列长度表示可以实现对变长视频的处理。这样做主要有两点好处首先是可以处理变长视频防止因对视频进行截断导致与文字之间的不对齐现象其次是在一般的视频中相邻帧一般比较类似如果直接对原始数据进行学习容易让模型学到直接 copy 上一帧的 shortcut导致模型退化。不过这样训练之后的模型生成的两帧之间也会比较跳跃因此需要用一个额外的插帧模型对生成的关键帧进行插帧。在生成阶段首先依然是需要生成最开始的五个关键帧在生成关键帧后CogVideo 采用了一种递归的插帧方式。具体来说就是在现有帧的基础上将帧率减半然后在每两帧之间再用自回归的方式生成一帧这样每次生成之后序列的长度就会变成原来的 2 倍。但因为整体的 token 序列长度不变所以每次需要拆成两半插帧两次除此之外CogVideo 还使用了 CogLM 的双向注意力机制不同于 GPT 等只有单向注意力的模型引入双向注意力可以使生成过程关注前后文的信息。双通道注意力相比于图像生成模型视频生成模型需要关注时序信息。为此CogVideo 直接在文生图模型 CogView2 上进行改进因为后者已经能比较好地处理文本-图像的信息所以可以作为视频生成模型的预训练。为了使模型能够比较好地处理时序信息CogVideo 在原有的 attention 的基础上又加入了一个 3D attention如下图所示。图中的 Attention-base 就是原来的 CogView2 自带的 attention其是以图像作为单位进行处理可以理解为每次计算 attention 都是在图像内部做主要关注的是图像级别的生成。而 Attention-plus 则是 3D 注意力在进行 attention 计算的时候有多帧的内容都参与计算这样可以关注时序信息。对于 Attention-plus 的选择原文使用了两种选择即 3D local attention 和 3D Swin attention。两个通道的 attention 加权求和后作为双通道注意力的整体输出。