关于CLIP模型768维嵌入的疑问及相关源码位置咨询
关于CLIP模型嵌入维度的问题解答
一、如何得到77×768的文本嵌入?
文本到77×768嵌入的转换流程清晰可追溯:
- 首先,CLIP的Tokenizer会把输入文本转换成长度固定为77的token序列(对应
max_length=77,强制包含开头的<|startoftext|>和结尾的<|endoftext|>特殊token,长度不足77的部分用<|endoftext|>填充补全)。 - 接着,这些token会进入CLIP的文本嵌入层(TextEmbeddings),每个token通过嵌入矩阵映射为768维向量——这就是维度转换的核心环节:嵌入层本质是一个尺寸为
vocab_size × hidden_size的查找表(默认vocab_size为49408,hidden_size为768),每个token的索引对应矩阵中的一行,也就是768维的向量。 - 最后加上位置编码(Position Embedding)后,输入到文本Transformer编码器,编码器输出的每一层结果都是77×768的张量,这就是最终的文本嵌入序列。
二、为什么嵌入维度设置为768?
768是Transformer架构中隐藏层维度的典型经验值,选择它的原因主要有两点:
- 平衡模型容量与计算效率:更大的维度能捕捉更丰富的特征,但会带来指数级增长的显存占用和计算开销;768在两者之间取了工程上的最优解,既保证了模型的表达能力,又不会让训练和推理成本过高。
- 实验验证的结果:CLIP论文作者在模型迭代过程中,通过大量对比实验验证了该维度的有效性,最终将其作为默认参数固定下来。
三、维度转换的源码位置
在HuggingFace Transformers库中,维度转换的核心逻辑集中在transformers/models/clip/modeling_clip.py文件里:
- 文本侧的维度转换在
CLIPTextEmbeddings类中,核心是token_embedding这个Embedding层,定义代码如下:
self.token_embedding = nn.Embedding(config.vocab_size, config.hidden_size)
- 图像侧的维度转换在
CLIPVisionEmbeddings类中,通过卷积层将图像分块后映射到768维,核心代码为:
self.patch_embedding = nn.Conv2d(in_channels=config.num_channels, out_channels=config.hidden_size, kernel_size=config.patch_size, stride=config.patch_size, bias=False)
内容的提问来源于stack exchange,提问作者ohhiohhi W
相关产品推荐
相关产品推荐

