Skip to content

GanMaoyuan/CLIP

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 

Repository files navigation

1个批次(Batch)由 个小批次(Minibatch)组成,1个小批次由 个样本(Example)组成。
Batch包含训练数据集的全部样本,所包含样本的数量可能很多(例如超过 的4亿);
Minibatch包含训练数据集的部分样本,所包含样本的数量相比之下往往较少(例如等于 的32768)。
在训练数据集规模庞大(即样本总数很多)的情况下,每处理1个Minibatch就更新1次模型参数,而非处理整个Batch之后才唯一一次更新模型参数。
在训练模式中所说的“批次”,很多时候默认指的是仅包含部分样本的Minibatch,而非包含全部样本的Batch。




训练模式

1、图像

1个小批次由 个样本组成,1个样本由1张图像与1段针对该图像的描述性文本组成。

提取图像特征

针对 个样本中的 张图像所对应的张量数据 分别为Image、Number、Height、Width、Channel的缩写,分别意为“图像”、“数量”、“高”、“宽”、“通道”),用1个图像编码器(例如Vision Transformer的编码器)进行处理,产出 为feature的缩写,意为“特征”)。
该过程可表示为 I_f = image_encoder(I)
的某行向量 包含相应图像的语义信息(例如“该图像展示了一辆停在路边的汽车”)。
总之,每张图像的数据形式都从仅仅包含像素信息(由 个通道维度值共同表征)的 ,经图像编码器变换为包含语义信息(由 个图像特征维度值共同表征)的

投影到嵌入空间

右乘 为image的缩写),再让得到的 的每行向量分别进行L2归一化:
假设某行各数值分别为 ,那么该行各数值所组成的向量 的L2范数(向量模长)即为

对该行进行L2归一化就是让该行各数值除以 ,变换为

变换后的该行向量的L2范数等于1。
由此,得到 为embedding的缩写,意为“嵌入”)。
该过程可表示为 I_e = L2_normalize(np.dot(I_f, W_i), axis=1)

2、文本

提取文本特征

针对 个样本中的 段文本所对应的张量数据 分别为Text、Length的缩写,分别意为“文本”、“长度”),用1个文本编码器(例如Transformer的编码器)进行处理,产出
该过程可表示为 T_f = text_encoder(T)
的某行向量 包含相应文本的语义信息(例如“一辆停在路边的汽车”这段文本的字面含义)。
总之,每段文本的数据形式都从仅仅包含词元索引号的 ,经文本编码器变换为包含语义信息(由 个文本特征维度值共同表征)的

投影到嵌入空间

右乘 为text的缩写),再让得到的 的每行向量分别进行L2归一化。
由此,得到
该过程可表示为 T_e = L2_normalize(np.dot(T_f, W_t), axis=1)

3、计算余弦相似度

右乘 ,再让得到的 乘以一个数。
这个数以e为底数、以t为幂指数,即 ,其中 是一个可训练参数, 用于动态调整(每行或每列)数值分布的平滑度或尖锐度( 较小时分布较平滑, 较大时分布较尖锐)。这种做法的目的在于控制数值范围,维护训练稳定性,同时保持数值之间的相对大小关系不变。
该过程可表示为 logits = np.dot(I_e, T_e.T) * np.exp(t)
如果直接乘 ,而非指数化的、恒为正的 ,那么有可能变为负数的 会让得出的logits也成为负数,而这种情况是需要避免的。
根据

可知:一对向量的余弦相似度运算,等同于这对向量在L2归一化之后的内积运算。
对于

它们都尚未经过L2归一化,与经过了L2归一化的

形成对比。
如果选择 logits = np.dot(I_no, T_no.T) * np.exp(t) ,由于 的运算仅仅是 对嵌入向量的内积运算,那么得出的 所包含的内容就仅仅是 个(经过平滑度调整后的)内积值,而非余弦相似度;
如果选择 logits = np.dot(I_e, T_e.T) * np.exp(t) ,由于 的运算其实是 对L2归一化之后的嵌入向量的内积运算,而这样的运算就是 对嵌入向量的余弦相似度运算,那么得出的 所包含的内容即为 个(经过平滑度调整后的)余弦相似度。
一对向量在L2归一化之后,它们的模长差异被消除,而它们的方向差异被保留下来,作为它们之间目前唯一的差异。
用该对向量的余弦相似度来表征方向差异的程度:
如果一对嵌入向量的余弦相似度较大,则说明它们在共享的嵌入空间中方向接近,也就意味着它们在共享的语义空间中语义相似(一对图像-文本的语义较为匹配);
如果一对嵌入向量的余弦相似度较小,则说明它们在共享的嵌入空间中方向差异较大,也就意味着它们在共享的语义空间中语义相似性较弱(一对图像-文本的语义匹配性较弱)。
倘若直接用内积值来表征一对嵌入向量的差异程度,那么在它们的内积值较大时,既可能说明它们在共享的嵌入空间中方向接近,也可能仅仅说明它们的模长很大,但同时它们在共享的嵌入空间中方向差异较大,并不接近。
单个向量的模长本身不包含另一个向量的任何信息,也不包含该对向量的交互性信息;
语义相似性这种交互性质的信息仅存在于该对向量在共享空间中的方向差异之中,而与某个向量的模长大小无关。
因此,嵌入向量内积值的大小并不能用于度量一对图像-文本的语义相似性,而嵌入向量余弦相似度的大小才能用于度量一对图像-文本的语义相似性。
后文将用“语义相似度”指代“余弦相似度”。

4、计算交叉熵损失

的第 行第 列元素为第 张图像与第 段文本的(经过平滑度调整后的)语义相似度
对于 矩阵,可将它的行号 视为“图像号”,列号 视为“文本号”。
行的全体 个数值组成第 张图像与全体 段文本的(经过平滑度调整后的)语义相似度分布,具体为
列的全体 个数值组成第 段文本与全体 张图像的(经过平滑度调整后的)语义相似度分布,具体为
由于 张图像与 段文本作为训练数据是一一对应的,因此:
对于第 张图像,它与第 段文本的语义相似度 在与全体 段文本的 个语义相似度中的占比将作为交叉熵损失计算的依据,占比越大损失值越小,占比越小损失值越大;
对于第 段文本,它与第 张图像的语义相似度 在与全体 张图像的 个语义相似度中的占比将作为交叉熵损失计算的依据,占比越大损失值越小,占比越小损失值越大。
第0张图像的标签是第0段文本,......,第N-1张图像的标签是第N-1段文本;
第0段文本的标签是第0张图像,......,第N-1段文本的标签是第N-1张图像。
对于第 张图像,其交叉熵损失为

对于全体 张图像,其交叉熵损失的平均值为

对于第 段文本,其交叉熵损失为

对于全体 段文本,其交叉熵损失的平均值为

对于包含 对图像-文本的1个Minibatch,其损失定义为前述两种交叉熵损失平均值的平均值,即

该过程可表示为:

labels = np.arange(N)
loss_i = cross_entropy_loss(logits, labels, axis=0)
loss_t = cross_entropy_loss(logits, labels, axis=1)
loss = (loss_i + loss_t) / 2

这样的训练模式称为“对比式语言-图像预训练”(Contrastive Language-Image Pre-training,CLIP)。




推理模式

对于某个包含 对图像-文本的测试数据集,将其 段文本预先用文本编码器进行处理,并将处理得到的 进行缓存。
任意选取测试数据集中的某张图像作为测试图像,将其用图像编码器进行处理,并让处理得到的 右乘 ,得到尚未经过平滑度调整的原始的语义相似度向量 ,再让 乘以 标量,就得到了经过平滑度调整的语义相似度向量
进行softmax变换,得到 。该向量中各分量的索引号与测试数据集中各文本的文本号一一对应,分量本身表示对应文本被选中为匹配文本的概率值。选取最大概率值的对应文本作为针对测试图像的匹配文本。
应注意,在训练模式下的1个包含 对图像-文本的Minibatch中,除开“选取最大概率值的对应文本作为针对测试图像的匹配文本”这一步以外,上述这种过程会被并行地展开 次——总共 张图像,模型针对每张图像都会在 段文本中预测与该图像最匹配的文本。模型在多个Minibatch的训练过程中将持续优化预测结果。
这就意味着,模型在推理模式下需要完成的任务与在训练模式下需要完成的任务是一致的,模型在推理模式下的行为与在训练模式下的行为是一致的,模型只需运用在先前的训练模式下经过充分优化的参数进行推理(即图像-文本的匹配),无需任何额外训练。为了做到这一点,训练数据集的庞大规模以及分布的广泛性必不可少。在原论文中,训练数据集由来源于互联网并经过一定处理的4亿对图像-文本组成。
这样的推理模式称为“零样本迁移”(Zero-Shot Transfer),意即不需要任何额外训练样本,直接将先前训练中获得的任务执行能力迁移到针对任意测试数据集的推理之中。
此外,缓存的 在多次图像-文本匹配推理任务中被重复使用。这就意味着,为了得到 而投入的计算成本实际上是被均摊到多次推理中的,推理的边际成本随推理次数的增加而降低。




提高推理模式中文本的质量

1、增加文本的信息量

多义性问腿

以英语单词crane为例,它既可能指建筑用的起重机(construction crane),也可能指一种名叫“鹤”的鸟类(flying crane)。倘若将单词crane直接作为一张展示鹤的图像与一张展示起重机的图像的共用文本,那么模型针对它们的图像-文本匹配推理将是失效的,不会产生有意义的匹配结果。

任务形式差异问题

训练数据集中的文本很少为仅仅一个单词,通常为具备完整上下文语义的句子。这就意味着,推理数据集中那些仅仅由一个单词组成的文本将构成导致推理-训练不一致(具体而言是推理与训练的任务形式不一致)的负面因素。推理-训练不一致会削弱推理时的性能。

以上两种问题的解决

以crane为例,将其分别扩展为"A photo of a crane, a type of construction equippment."以及"A photo of a crane, a type of bird.",作为两段不同的文本。
不局限于crane这个多义词,针对任务定制提示性文本的策略是通用的:
在以宠物图像为主的测试数据集中,使用"A photo of a {label object}, a type of pet."这一文本模板可收获良好效果;
在光学字符识别(Optical Character Recognition,OCR)任务测试数据集中,在文本中用引号把目标识别文字括起来这种做法可提升性能;
在以卫星图像为主的测试数据集中,使用"A satellite photo of a {label object}."这一文本模板的变体是有帮助的。
总之,应当根据任务特性,灵活定制提示性文本,以增加文本的信息量,帮助模型更好地执行图像-文本匹配推理任务。
这样的策略称为“提示工程”(Prompt Engineering)。

2、将多个文本进行集成

例如,针对1张图像,相应定制80段语义相关的文本,将这些文本分别用文本编码器进行处理,产出80个嵌入向量,即 ,随后对它们求平均值,即

仅对文本平均值向量 进行缓存。 个文本平均值向量所组成的 即为实际缓存对象。
后续过程与不采用该策略时的对应过程没有区别。
这样的策略称为“集成”(Ensembling),在多个测试数据集中均可用于提升性能。
应注意,集成的对象是嵌入向量 而非概率向量 。倘若将后者作为集成对象,单次推理的计算量就会翻80倍( 的内积运算以及后续运算,而非 与仅仅 的内积运算以及后续运算),而这是不可接受的。
唯有将嵌入向量作为集成对象,才能使采用该策略时的均摊推理成本仅仅略高于而非显著高于不采用该策略时的均摊推理成本。

About

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors