“Sora的出现不是偶然,而是经过长期积累、反复试错及用户反馈的必然。”
OpenAI尝试过递归网络、生成对抗网络、自回归Transformer及扩散模型。最终诞生了Diffusion Transformer。其充分利用了大语言模型Token的好处,让像素也能够被预测(Patches)。Sora的诞生不亚于2023年ChatGPT的出现,因为我们的世界是一个五彩斑斓的图像和视频组成。Sora通过社区和生态让大模型更进一步贴近于终端用户。
你能手撕Sora的Diffusion Transformer (DiT)算法吗?✍️
如果你看懂了的话就【点个赞】吧。
OpenAI 的 Sora 是基于 William Peebles 和 Saining Xie 在 2023 年开发的 Diffusion Transformer (DiT)。
DiT 如何运作?我们来一起揭秘吧!
-- 目标 --
Sora是由文本提示和一系列扩散步骤生成视频。
-- 实现过程 --
[1] 输入
↳ 视频
↳ 提示:“sora is sky”
↳ 扩散步骤:t = 3
[2] 视频 → patch
↳ 将所有帧中的所有像素划分为 4 个时空patch
[3] 视觉编码器: 像素 🟨 → 潜在特征向量 🟩
↳ 将patch与权重和偏差相乘,接着使用ReLU激活
↳ 得到的结果即为每个patch的潜在特征向量
↳ 目的是将维度从 4 (2x2x1) 减小到 2 (2x1)。
↳ 在这篇文章里,维度从 196,608 (256x256x3) 减小到了 4096 (32x32x4)。
[4] ⬛ 增加噪音
↳ 根据扩散时间步长 t 对噪声进行采样。通常,t 越大,噪声越小。
↳ 将采样噪声添加到潜在特征以获得潜在噪声。
↳ 目标是有意地向视频添加噪声,并要求模型猜测该噪声是什么。
↳ 这种做法类似于通过故意删除句子中的单词并让模型猜测删除的单词是什么来训练语言模型。
[5-7] 🟪 通过自适应层规范进行调节
[5] 编码调节
↳ 将“sora is sky”编码为文本嵌入向量 [0,1,-1]。
↳ 将 t = 3 也编码为二进制向量 [1,1]。
↳ 将两个向量连接成 5 维列向量。
[6] 估算尺度和平移
↳ 将得到的组合向量用权重和偏差进行计算。
↳ 目标是估计尺度 [2,-1] 和平移 [-1,5]。
↳ 将结果复制到 (X) 和 (+)
[7] 应用尺度和平移
↳ 按照 [2,-1] 缩放潜在噪声。
↳ 接着将其偏移 [-1, 5]。
↳ 这里得到的结果即为“调节过”的潜在噪声。
[8-10] Transformer
[8] 自注意力机制
↳ 将调节过的潜在噪声输入 Query-Key 函数以获得自注意力矩阵。
↳ 为了简单起见,省略了value
[9] 注意力池化
↳ 将调节过的潜在噪声乘以自注意力矩阵。
↳ 得到的结果是注意力加权过后的特征。
[10] 点式前馈网络
↳ 将注意力加权特征乘以权重和偏差
↳ 得到的结果是预测噪声
🏋️ ♂️ 训练
[11]
↳ 通过预测噪声和采样噪声(真实值)之间的差值来计算 MSE 损失梯度。
↳ 使用损失梯度启动反向传播以更新所有可学习参数(红色边框)
↳ 注意视觉编码器和解码器的参数被冻结(蓝色边框)
🎨 生成(示例)
[12] 降噪
↳ 从潜在噪声中减去预测噪声,得到无噪声的潜在向量
[13] 视觉解码器:潜在向量🟩→像素 🟨
↳ 将patch与权重和偏差相乘,接着使用ReLU激活
[14] patch→视频
↳ 将patch重新排列成一系列视频帧。
视频生成中最重要的一个步骤就是——通过当前时间的patch去预测下一个时间的spacetime patch。
这个推测的结果是隐藏空间(latent space),最终的当前帧画面是通过decoder对于推测出的隐藏空间(latent space)解码来得到的。这种做法最大的好处是可以兼容所有的数据素材,所有的帧画面都是不同大小的spacetime patch。
所以整个生成任务的核心不过是——通过spacetime patch和大语言模型的生成能力构成在时间轴上连续的隐空间 (latent space),然后通过单帧画面的decoder来构造出空间上连续的画面。
关于OpenCSG
开放传神(OpenCSG)成立于2023年,是一家致力于大模型生态社区建设,汇集人工智能行业上下游企业链共同为大模型在垂直行业的应用提供解决方案和工具平台的公司。目前OpenCSG已获联想、国信数千万元的天使轮融资。
官网:OpenCSG