Sora能力边界探索
- 最大支持60秒高清视频生成,以及基于已有短视频的前后扩展,同时保持人物/场景的高度一致性
- 如奶茶般丝滑过渡的视频融合能力
- 同一场景的多角度/镜头的生成能力
- 具有动态摄像机运动的视频。随着摄像机的移动和旋转,人和其
他场景元素在三维空间中一致地移动 - 支持任意分辨率,宽高比的视频输出
- Sora对物理规律的理解仍然十分有限
Sora能力总结
- Text-to-video: 文生视频
- Image-to-video: 图生视频
- Video-to-video: 改变源视频风格or场景
- Extending video in time: 视频拓展(前后双向)
- Create seamless loops: Tiled videos that seem like they never end
- Image generation: 图片生成 (size最高达到 2048 x 2048)
- Generate video in any format: From 1920 x 1080 to 1080 x 1920 视频输出比例自定义
- Simulate virtual worlds: 链接虚拟世界,游戏视频场景生成
- Create a video: 长达60s的视频并保持人物、场景一致性
Sora模型训练流程
Video generation models as world simulators
https://openai.com/research/video-generation-models-as-world-simulators
模型训练流程
模型训练:扩散模型 DDPM
模型训练:基于扩散模型的主干 U-Net
- U-Net 网络模型结构把模型规模限定;
- SD/SDXL 作为经典网络只公布了推理和微调;
- 国内主要基于 SD/SDXL 进行二次创作;
Sora关键技术拆解
einops是一个用于操作张量的库,它的出现可以替代我们平时使用的reshape、view、transpose和
permute等操作
einops支持numpy、pytorch、tensorflow等
y = x.transpose(0, 2, 3, 1) 等同
y = rearrange(x, ‘b c h w -> b h w c’)
self.gkv = nn.Linear(self.embed dim, self.head size * self.n heads * 3,bias=False
self.scale=self.head size **-0.5
self.register buffer(
"tril',
torch.tril(torch.ones(self.seg len,self.seg len))
self.attn dropout =nn.Dropout(0.)
def forward(self,x):
b,t,c=x.shape
# q,k,v shape individually: batch size x seg len x embed dim
# we know that gk t=gxkt, where g=bxtxhead dim, k t=bxhead timxt
q,k,v=self.qkv(x).chunk(3,dim=-1)
q=rearrange(q,'bt(h n)->bnt h',n=self.n heads)# h= head size
k=rearrange(v,'b t(h n)->bnth',n=self.n heads)
v=rearrange(v,'bt(hn)->bnth',n=self.n heads)
qkt=einsum(q,k,'b n tl h, bn t2 h->bn tl t2')* self.scale
weights=qk t.masked fill(m==0,float('-inf'))weights=F.softmax(weights,dim=-1)
weights =self.attn dropout(weights)
attention =weights @ v# batch xn heads x seg len x head size
attention=rearrange(attention,'bnth->bt(n h)')
return attention
patches = rearrange(im,'c (h pl)(w p2)->(h w)c pl p2',pl=patch size,p2=patch size)
patches.shape
# torch.Size([196,3,16,16])
figure =plt.figure(figsize=(5,5))
for i in range(patches.size(0)):
img =patchesli].permute(1,2,0)
fiqure.add subplot(14,14,i+1)
plt.axis('off')
plt.imshow(img)
plt.show()
- ViT 尝试将标准 Transformer 结构直接应用于图
像; - 图像被划分为多个 patch后,将二维 patch 转换为一维向量作为 Transformer 的输入;
技术报告分析
Diffusion Transformer,= VAE encoder + ViT + DDPM + VAE
DiT 利用 transformer 结构探索新的扩散模型,成功用 transformer 替换 U-Net 主干
- 例如输入一张256x256x3的图片,经过Encoder后得到对应的latent
- 推理时输入32x32x4的噪声,得到32x32x4的latent
- 结合当前的 step t , 输入label y , 经过N个Dit Block通过 MLP 进行输出
- 得到输出的噪声以及对应的协方差矩阵
- 经过T个step采样,得到32x32x4的降噪后的latent
- 在训练时,需要使得去躁后的latent和第一步得到的latent尽可能一致
网络结构:Diffusion Transformer,DiT
- DiT 首先将将每个 patch 空间表示Latent 输入到第一层网络,以此将空间输入转换为 tokens 序列。
- 将标准基于 ViT 的 Patch 和Position Embedding 应用于所有输入token,最后将输入 token 由Transformer 处理。
- DiT 还会处理额外信息,e.g. 时间步长、类别标签、文本语义等
网络结构: DALLE 2
- 将文本提示输入文本编码器,该训练过的编码器便将文本提示映射到表示空间;
- 先验模型将文本编码映射到图像编码,图像编码捕获文本编码中的语义信息;
- 图像解码模型随机生成一幅从视觉上表现该语义信息的图像;
技术总结
- Scaling Law:模型规模的增大对视频生成质量的提升具有明确意义,从而很好地解决视
频一致性、连续性等问题; - Data Engine:数据工程很重要,如何设计视频的输入(e.g. 是否截断、长宽比、像素
优化等)、patches 的输入方式、文本描述和文本图像对质量;
AI Infra:AI 系统(AI 框架、AI 编译器、AI 芯片、大模型)工程化能力是很大的技术
壁垒,决定了 Scaling 的规模。 - LLM:LLM 大语言模型仍然是核心,多模态(文生图、图生文)都需要文本语义去牵引和
约束生成的内容,CLIP/BLIP/GLIP 等关联模型会持续提升能力;
学习资源
DataWhale社区Sora学习资源:
https://datawhaler.feishu.cn/wiki/RKrCw5YY1iNXDHkeYA5cOF4qnkb#KljXdPfWJo62zwxdzYIc7djgnlf
学习视频:
https://www.bilibili.com/video/BV1wm411f7gf/?spm_id_from=333.1350.jump_directly&vd_source=299ce227a965167d79f374c15b2fddf5