多模态学习可以看作是深度学习的一个细分领域,利用不同类型的神经网络来处理不同模态(如图像、文本、音频等)的数据。多模态任务大体可以分为理解和生成两大类,生成任务又分为文生图和图生文。
后台回复abh获取视频和原版英文。
CLIP是入门多模态的最佳选择,后续多模态模型基本上都延续了它的思想:分别用图像编码器和文本编码器将图像和文本编码到一个共享的特征空间中,然后通过多模态融合方法将配对的图像文本特征向量拉进。
[CLIP] 手书动画 ✍️
[1] 给定
↳ 一个包含3个文本-图像对的小批量数据(OpenAI 使用了4亿个文本-图像对来训练其原始CLIP模型)。
处理第一个对:"big table"
[2] 🟪 文本 → 2个向量(3维向量)
↳ 使用word2vec查找词嵌入向量。(word2vec可以使用Google提供的预训练模型)
[3] 🟩 图像 → 2个向量(4维向量)
↳ 将图像分成两个块。
↳ 将每个块展平
[4] 处理其他对
↳ 重复步骤 [2]-[3]
[5] 🟪 文本编码器 & 🟩 图像编码器(红框内的编码器参数通过训练得到)
↳ 将输入向量编码为特征向量
↳ 在这里,两个编码器都是简单的单层感知器(线性 + ReLU)
↳ 实际中,编码器通常是Transformer模型。
[6] 🟪 🟩 均值池化: 2 → 1 个向量
↳ 通过对列进行平均,将2个特征向量平均为一个向量
↳ 目标是用一个向量来表示每个图像或文本
[7] 🟪 🟩 -> 🟨 投影(投影矩阵通过训练得到)
↳ 注意,编码器输出的文本和图像特征向量维度不同(3维向量 vs. 4维向量)。
↳ 使用线性层将图像和文本向量投影到一个2D共享嵌入空间。
🏋️ 对比预训练 🏋️
[8] 准备矩阵乘法
↳ 复制文本向量(T1,T2,T3)
↳ 复制图像向量的转置(I1,I2,I3)
↳ 它们都位于2D共享嵌入空间中。
[9] 🟦 矩阵乘法
↳ 将T和I矩阵相乘。
↳ 这相当于计算每对图像和文本向量之间的点积。
↳ 目的是使用点积来估计图像-文本对之间的相似度。
[10] 🟦 Softmax: e^x
↳ 将e提升为每个单元格中的数的幂
↳ 为简化手动计算,我们将e^□ 近似为3^□。
[11] 🟦 Softmax: ∑
↳ 为 🟩 图像→🟪 文本 求每行之和
↳ 为 🟪 文本→ 🟩 图像 求每列之和
[12] 🟦 Softmax: 1 / 总和
↳ 将每个元素除以列总和,以获得 🟪 文本→🟩 图像 的相似度矩阵
↳ 将每个元素除以行总和,以获得 🟩 图像→🟪 文本 的相似度矩阵
[13] 🟥 损失梯度
↳ 相似度矩阵的“目标”是单位矩阵。
↳ 为什么?如果I和T来自同一个对(i=j),我们希望最高值为1,否则为0。
↳ 使用简单的[相似度 - 目标]公式来计算双向梯度。
↳ 为什么这么简单?因为当Softmax和交叉熵损失一起使用时,数学计算会神奇地如此简化。
↳ 这些梯度启动了反向传播过程,以更新编码器和投影层的权重和偏置(红色边框)。
CLIP简单的融合方法使其非常适合检索任务,而不适合生成任务,后续的一些模型为了提升融合效果,常采用Transformer编码器作为融合模块,为了具备图生文本的能力,后续模型也都增加了Transformer解码器;或者为了提升效率,则干脆直接使用训练好的大模型作为编解码器,然后使用一个适配器作为衔接。
多模态模型:
[Autoencoder(AE)]手书动画✍️
图生文和文生图虽然都是生成类型任务,但模型架构和思想却有很大不同,与CLIP一样,AE也是学习文生图的最佳选择。
自编码器用于学习数据的低维表示,常用于图像压缩、降维、去噪等任务;但由于缺乏控制变量,所以不太适合用于文生图,但它为后续变分自编码器(VAE)奠定了基础。
-- 网络架构 --
编码器
解码器
-- 步骤详解 --
[1] 给定
↳ 四个训练样本 X1, X2, X3, X4
[2] 自动
↳ 将训练样本复制为目标 (Y'),目标就是训练样本本身。
↳ 目的是训练网络重构训练样本。
[3] 编码器: 第1层 + ReLU
↳ 将输入与权重和偏置相乘
↳ 应用ReLU,将负值划掉 (-1 -> 0)
[4] 编码器: 第2层 + ReLU
↳ 将特征与权重和偏置相乘
↳ 应用ReLU,将负值划掉 (-1 -> 0)
↳ 这一层通常被称为"bottleneck",因为它的输出(绿色)的特征维度(2)比输入特征(4)少得多。
[5] 解码器: 第1层 + ReLU
↳ 将特征与权重和偏置相乘
↳ 应用ReLU,划掉负值。这里没有负值需要划掉。
[6] 解码器: 第2层
↳ 将特征与权重和偏置相乘
↳ 输出(Y)是解码器尝试从降维到2D的表示(绿色)重构训练样本。
[7] 损失梯度和反向传播
↳ 计算输出(Y)和目标(Y')之间的均方误差(MSE)损失的梯度。
↳ 公式是 2 * (Y - Y')
↳ 首先我们计算 输出(Y) - 目标(Y')
↳ 然后我们将每个元素乘以2
↳ 这些梯度启动反向传播过程,用于更新权重和偏置。
[Variant Autoencoder(VAE)] 手书动画✍️
变分自编码器(VAE)扩展了自编码器(AE)的概念。自编码器将输入映射到固定的隐变量表示,而变分自编码器则将输入映射到隐变量的概率分布。通过从这个概率分布中进行采样,VAE能够生成多样化的新数据样本,而不仅仅是重建输入数据。这种方法使得VAE在生成任务中表现得更加灵活和有效。
[1] 给定:
↳ 三个训练样本 X1, X2, X3
↳ 将训练样本复制成目标。
↳ 目的是训练网络来重建这些训练样本。
[2] 编码器:第一层 + ReLU
↳ 将输入与权重和偏置相乘
↳ 应用 ReLU,将负值去除(-1 -> 0)
[3] 编码器:均值和方差
↳ 将特征与两组权重和偏置相乘
↳ 🟩 第一组预测潜在分布的均值 (𝜇)
↳ 🟪 第二组预测潜在分布的标准差 (𝜎)
[4] 重参数化技巧:随机偏移
↳ 从均值为0、方差为1的正态分布中抽取随机变量 ε。
↳ 目的是随机选择一个偏移值,使其偏离均值。
↳ 将标准差值与 ε 值相乘。
↳ 目的是根据标准差来缩放偏移值。
[5] 重参数化技巧:均值 + 偏移
↳ 将抽样得到的偏移值加到预测的均值上
↳ 结果是新的参数或特征 🟨,作为解码器的输入。
[6] 解码器:第一层 + ReLU
↳ 将输入特征与权重和偏置相乘
↳ 应用 ReLU,去除负值。此处,-4 被去除。
[7] 解码器:第二层
↳ 将特征与权重和偏置相乘
↳ 输出是解码器尝试从 𝜇 和 𝜎 描述的重参数化分布中重建输入数据 X。
[8]-[10] KL散度损失
[8] 损失梯度:均值 𝜇
↳ 我们希望 𝜇 接近 0。
↳ 一些叫做 SGVB 的数学计算简化了损失梯度的计算,使其直接为 𝜇
[9,10] 损失梯度:标准差 𝜎
↳ 我们希望 𝜎 接近 1。
↳ 一些数学计算简化了计算,使其为 𝜎 - (1/ 𝜎)
[11] 重建损失
↳ 我们希望重建的数据 Y(深 🟧)与输入数据 X 相同。
↳ 一些涉及均方误差的数学计算简化为 Y - X。
VAE中比较难理解的是它的训练过程有两个损失,一个是图像重构损失,重构损失衡量模型生成的数据与输入数据之间的差异,通常使用MSE;另一个是KL散度损失,用于衡量VAE中隐变量的近似后验分布与先验分布(通常是标准正态分布)之间的差异,通过减小该损失,以鼓励隐变量的分布接近先验分布,使得模型的潜在空间具有良好的连续性和生成能力。
[GAN] 手书动画 ✍️
生成对抗网络(GAN)是一种生成模型,通过两个神经网络——生成器和判别器——相互对抗,生成与真实数据相似的新样本。
原始的GAN通过随机噪声控制生成图像的多样性,后续不同版本的GAN丰富了控制变量的类型,例如,标签、文本、图像等等。
目标:从2维噪声生成逼真的4维数据。
[1] 给定
↳ 4个2维的噪声向量(N)
↳ 4个4维的真实数据向量(X)
[2] 🟩 生成器:第一层
↳ 将噪声向量与权重和偏置相乘,以获得新的特征向量
[3] 🟩 生成器:ReLU
↳ 应用ReLU激活函数,其效果是抑制负值。在此练习中,-1 和 -2 被划掉并设为0。
[4] 🟩 生成器:第二层
↳ 将特征向量与权重和偏置相乘,以获得新的特征向量。
↳ 应用了ReLU函数,但由于每个值都是正数,因此没有效果。
↳ 这些新的特征向量就是由这个简单的两层生成器网络生成的“伪”数据(F)。
[5] 🟦 判别器:第一层
↳ 将伪数据(F)和真实数据(X)都输入到第一层线性层
↳ 将F和X与权重和偏置相乘,以获得新的特征向量。
↳ 应用了ReLU函数,但由于每个值都是正数,因此没有效果。
[6] 🟦 判别器:第二层
↳ 将特征向量与一组权重和偏置相乘,以获得新的特征。
↳ 预期效果是将每个数据向量的特征减少到仅一个特征值。
[7] 🟦 判别器:Sigmoid σ
↳ 使用Sigmoid函数将特征(Z)转换为概率值(Y)
↳ 1表示判别器100%确信数据是真实的。
↳ 0表示判别器100%确信数据是伪造的。
[8] 🏋️ 训练:🟦 判别器
↳ 通过简单的Y - YD公式计算判别器的损失梯度。为什么这么简单?因为当我们同时使用Sigmoid和二元交叉熵损失时,数学计算会神奇地简化为这个公式。
↳ YD 是判别器的目标预测。判别器必须学习预测4个伪数据(F)为0,4个真实数据(X)为1。YD=[0,0,0,0,1,1,1,1]。
↳ 请注意,判别器的损失涉及伪数据和真实数据。
↳ 计算出损失梯度后,我们可以启动反向传播过程,以更新判别器的权重和偏置(蓝色边框)。
[9] 🏋️ 训练:🟩 生成器
↳ 通过简单的Y - YG公式计算生成器的损失梯度。
↳ YG 是生成器的目标预测。生成器必须欺骗判别器,使其预测4个伪数据(F)为1。YG=[1,1,1,1]。
↳ 请注意,生成器的损失只涉及伪数据。
↳ 计算出损失梯度后,我们可以启动反向传播过程,以更新生成器的权重和偏置(绿色边框)。
对于文生图任务,目前最常用的是Diffusion扩散模型,前面介绍了VAE和GAN,那么它们各自有什么优缺点呢?
GAN生成图像质量高但训练不稳定,VAE生成稳定但图像质量较低,Diffusion生成质量优异但速度较慢。
[SORA] 手书动画 ✍️
OpenAI 的 #SORA 在今年早些时候宣布时风靡网络。Sora 背后的技术是由 William Peebles 和 Shining Xie 开发的扩散Transformer (DiT)。
DiT 是如何工作的?
𝗚𝗼𝗮𝗹: 基于文本提示和一系列扩散步骤生成视频
[1] 给定
↳ 视频
↳ 提示词: "sora is sky"
↳ 扩散步骤: t = 3
[2] 视频 → 补丁
↳ 将所有帧中的所有像素划分为4个时空补丁
[3] 视觉编码器:像素 🟨 → 潜在特征 🟩
↳ 将补丁与权重和偏置相乘,然后经过 ReLU 激活函数
↳ 每个补丁得到一个潜在特征向量
↳ 目的是将维度从 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]。
↳ 将这两个向量连接成一个5D列向量。
[6] 估计缩放/平移
↳ 将组合向量与权重和偏置相乘
↳ 目的是估计缩放 [2,-1] 和平移 [-1,5]。
↳ 将结果复制到 (X) 和 (+)
[7] 应用缩放/平移
↳ 将有噪声的潜在特征按 [2,-1] 缩放
↳ 将缩放后的有噪声潜在特征按 [-1, 5] 平移
↳ 结果是“条件化”的有噪声潜在特征。
[8-10] Transformer
[8] 自注意力
↳ 将条件化的有噪声潜在特征输入到 Query-Key 函数中以获得自注意力矩阵
↳ 省略了 Value 以简化操作
[9] 注意力池化
↳ 将条件化的有噪声潜在特征与自注意力矩阵相乘
↳ 结果是加权的注意力特征
[10] 点积前馈网络
↳ 将注意力加权特征与权重和偏置相乘
↳ 结果是预测的噪声
🏋️♂️ 𝗧𝗿𝗮𝗶𝗻 训练
[11]
↳ 通过计算预测噪声与采样噪声(真实值)之间的 MSE 损失梯度。
↳ 使用损失梯度启动反向传播,以更新所有可学习的参数(红色边框)。
↳ 注意,视觉编码器和解码器的参数是冻结的(蓝色边框)。
🎨 𝗚𝗲𝗻𝗲𝗿𝗮𝘁𝗲 (𝗦𝗮𝗺𝗽𝗹𝗲) 生成(采样)
[12] 去噪
↳ 从有噪声的潜在特征中减去预测噪声,以获得无噪声的潜在特征。
[13] 视觉解码器:潜在特征 🟩 → 像素 🟨
↳ 将补丁与权重和偏置相乘,然后经过 ReLU 激活函数
[14] 补丁 → 视频
↳ 将补丁重新排列成一系列视频帧。
推荐阅读:
GPT-4o热潮来袭:探索图生文本的奥秘(多模态大模型系列之一)