背景:传统的VAE没法对时序信息进行编码。对时间信息建模有两种方式,1. 三维卷积(B,C,F,H,W)2.temporal layer(B,F,HWC)
在latte的实验中表明,类似patch的Conv3D其实并不好对时间信息编码,甚至效果不如逐帧对空间信息编码而不对时序信息编码。一个猜想是,这样的Conv3D实际上对时序信息压缩了,这个压缩是有损的。这样有损的压缩导致进一步后续temporal attention效果不好,因为attention可能依赖更多的query→key ,而不压缩下最大的attention score在压缩下和attention score低的帧糅合在一起了。另一方面,对于每个patch,假如没有帧位置信息嵌入,那么一个局部就丧失帧位置信息。
Causal CNN 怎么解决上面的问题呢?每一帧关注其之前的一部分帧,而不关注往后的帧。我认为这是某种类似时间信息嵌入的思想。
直接看Causal CNN的具体实现:
假设输入为[B,C,F,H,W],重点关注F的变化
假如使用上面提到的patch化的Conv3D,那么F上的Stride就是每个patch的长度L(等于这个维度上的kernel size),F→F//L,有损。
如果F上的Stride是1,用滑动窗口来直观感受,会发现对于卷积后的F’上的某一帧i,由F上的[i-kernel//2,i+kernel//2]得到,不符合时序逻辑(?)。输出的型状发生变化。
考虑一个先验条件,则第一帧只能看到自己,那么就可以将第一帧重复kernel size-1次,就可以将[1,1,…,1]作为第一个输出[1],[1,1,…,1,2]作为第二个输出[2],以此类推,型状保持不变。
值得一提的是,假设有n个Causal CNN,对于第i个输出,它能关注到n*(kernel size - 1) + 1个原序列帧,且距离越近,卷积次数越多。这样的设计能够在兼顾局域性质和全局性质。
一个猜想:这样的压缩是无损的(可以从压缩后的得到压缩前的)

北大Open-Sora Causal video VAE v1.0.0,重建后有运动模糊,正在改进中。