为什么clip模型生成的文本嵌入或图像嵌入是768×n

问题描述 投票:0回答:2

当我想了解剪辑过程时,我很困惑为什么是 768,如何在 77 × 768 中嵌入文本,我知道 77 是 token 的 max_length,它通过 tokenizer 传输字符。但我真的不知道明白如何让一段文字变成768

https://huggingface.co/docs/transformers/model_doc/clip 中,它描述了 hidden_size (int,可选,默认为 768)——编码器层和池化器层的维度。 如下所示 768 但不知道为什么是768,或者哪里可以找到维度改成768的源码

deep-learning clip
2个回答
1
投票

768来自CLIP使用的ViT嵌入。在 ViT 中,它将 224 * 224 像素的输入图像转换为 16 * 16 像素大小的补丁。因此,当您嵌入(展平并使用 MLP)大小为 16 * 16 * 3 (RGB) = 768 的补丁时。对于文本编码器,为了匹配图像的嵌入,它们也使用 768 来计算成对的CLIP 中的相似性。


0
投票

图像和文本编码器都依赖于内部每个令牌的嵌入,尽管令牌对于文本和图像编码器意味着不同的东西。 CLIP 是使用“图像补丁令牌嵌入”趋势的一部分。

这就是 77x768 - 它是每个令牌的嵌入。

在文本编码器中,文本被标记为一系列整数,每个整数代表一系列唯一的字符。然后通过学习的令牌嵌入将其直接转换为 768 维的令牌嵌入 - 每个可能的词汇令牌都有一些直接表示。

对于图像编码器,图像被分成 77 个小块,每个小块接收自己的编码。他们通过步长等于补丁大小的卷积层进行补丁切割,这样它们就不会重叠。这些补丁并不直接存在于输入数据中,而是卷积层将其“切割”,然后学习每个补丁的表示(这是每个补丁的嵌入)。

在这两个编码器中,嵌入都与位置嵌入混合,位置嵌入表示令牌或补丁在输入序列中的来源。

现在它们都是 77x768。 77 个文本标记制成嵌入,或 77 个图像块制成嵌入。那么它是如何最终变成768的呢?预测。模型的视觉和图像编码部分都有一个形状的投影向量(变压器宽度 x 嵌入尺寸),由于矩阵乘法,该向量将矩阵从 77x768 变为 1x768。这里的变压器宽度意味着变压器可以处理多大的输入,在本例中为 77。

完成乘法后,两者的输出均为 1x768,这就是他们训练模型的方式 - 通过确保图像的 1x768 嵌入和文本图像对的文本的 1x768 嵌入紧密结合在一起。

图像投影 - https://github.com/openai/CLIP/blob/main/clip/model.py#L221

文本投影 - https://github.com/openai/CLIP/blob/main/clip/model.py#L294

简而言之,视觉变换器和文本嵌入中的 77x768 通过将其与大小为 77x768 的投影向量进行矩阵相乘而变为 1x768,该投影向量是与模型的其余部分一起学习的。

请注意,我并没有与上面的矩阵中哪个轴具有确切的尺寸保持一致(例如,从技术上讲,77x768 不能与 77x768 相乘 - 必须转置一个) - 但我想传达的是,这就是这个最后的乘法将其减少到一维。对于那些不了解线性代数和矩阵知识的读者来说,矩阵乘法与普通乘法有很大不同。

Transformers 中的一些实现将此投影层称为“池化层”,在输出中,最终投影的输出称为“池化器输出”,但原始实现将其称为投影层,所以这就是我所说的这里。无论哪种方式,功能都是一样的。

© www.soinside.com 2019 - 2024. All rights reserved.