看到“把文本变成向量(embedding)”,先别急着接受。一个数字列表怎么就有了意思?关键不在列表本身,而在训练时哪些东西被要求靠近、哪些需要分开。

从查表开始,但别停在查表

词表(vocabulary)里有 $V$ 个 token,每个用 $d$ 个数表示,embedding table 就是 $E\in\mathbb{R}^{V\times d}$。输入 ID 是 7,就取第 7 行。ID 只是地址,不是大小或距离;ID 7 和 8 不一定比 7 和 100 更相似。

这只是输入向量。经过 Transformer 后,同一个 token 会结合上下文得到不同的 hidden state。句子或图片的检索(retrieval)向量,还可能经过 pooling 和 projection。三者不要混为一谈:

flowchart TD
    A["Token ID"] --> B["查表得到输入 embedding"]
    B --> C["Transformer:结合上下文"]
    C --> D["每个位置的 hidden state"]
    D --> E["LM head:预测下一个 token"]
    D --> F["Pooling + projection:得到检索向量"]

Pooling 是取最后一个有效位置、做平均,还是用特殊 token,要看模型的训练方式。随手把一个生成模型各位置的 hidden state 取平均,不等于得到了好用的 embedding model。

点积到底比较了什么

先用一个自己能算的例子。查询向量 $q=(1,0)$,候选(candidate) $a=(2,2)$、$b=(1,0)$:

计算方式 $a$ 的分数 $b$ 的分数 谁更高
点积(inner product) $q^\top x$ 2 1 $a$
余弦相似度 $1/\sqrt{2}\approx0.707$ 1 $b$

两种答案都没有算错。点积同时受方向和长度影响;余弦先除掉长度,只比较夹角:

$$\operatorname{cos}(q,x)=\frac{q^\top x}{\lVert q\rVert_2\lVert x\rVert_2}.$$

把向量归一化到长度 1 后,点积就等于余弦。零向量没有方向,代进公式会除以 0,所以实现时要先规定怎么处理;配套代码遇到零向量会直接报错。

公式正确,直接照着写也可能算错。比如把两个向量都放大到 $10^{200}$ 的量级,先平方再求和可能溢出;缩到 $10^{-200}$ 又可能被误算成零。配套代码先分别除以各自最大的绝对值,再算余弦。这个正比例缩放不改变方向,也避免了中间平方过大或过小;真正的零向量仍然报错。

是不是都应该归一化? 不一定。长度可能携带训练任务学到的信号。该用哪一种,首先看训练分数和检索分数是否一致,而不是凭“余弦更高级”来选。

相似度不是概率

余弦 0.8 不表示“有 80% 的概率相关”。如果想在一组候选里做选择,可以把分数送进 softmax:

$$p_j=\frac{\exp(s_j/\tau)}{\sum_k\exp(s_k/\tau)},\qquad \tau>0.$$

固定分数时,较小的温度 $\tau$ 会让概率更集中,但不会改变排序。多放几个候选进分母,原候选的概率也会变。这是给定候选集合下的相对分配,不是经过校准(calibration)的现实世界置信度。

数值实现时,先减去最大 logit 再取指数;softmax 不变,却不容易溢出。去 CLIP 的交互实验拖一下温度:排名没变,概率和 loss 已经变了。

空间里的“近”是怎么学出来的

假设训练告诉模型:这张图片和这句描述是一对,另外几句作为候选。一个对比目标会提高正确配对的相对概率。梯度随后更新 encoder,让它产生更有利于这个目标的向量。对比学习(contrastive learning)的一个经典形式是 InfoNCE。

这也解释了为什么“语义相似”不是唯一标准:描述同一个物体、回答同一个问题、被同一个人喜欢,是不同的训练关系。数据和 loss 不同,学出的距离也会不同。图文对比训练的 CLIP 与自监督(self-supervised)的 DINO 在像素级任务上的差距,就是一个例子(见视觉基础模型);向量里的方向能否读成概念,见特征与叠加。

自己动手检查

配套的纯 Python 实验会计算点积、余弦、softmax 和双向对比 loss,不下载模型:

python 00-foundations/code/multimodal_math.py

先猜,再改脚本末尾的数字验证:把 $a$ 从 [2, 2] 改成 [20, 20],点积和余弦各会怎么变?给 SCORES[0] 的每个数都加 100,打印出的概率呢?

下一篇读 CLIP:不是把图片和文字混成一串输入,而是先让两个 encoder 学会在同一个空间里配对。

本页术语 7
词表 vocabulary
模型能输出的所有 token 的集合
检索 retrieval
从外部语料里找出相关内容
候选 candidate
召回阶段捞出来、等待精排挑选的内容
点积 inner product
两个向量对应分量相乘再求和,双塔的打分方式
校准 calibration
模型给出的置信度是否等于真实正确率
对比学习 contrastive learning
拉近正样本对、推开负样本对来学习表示
自监督 self-supervised
从数据自身结构造出监督信号,不依赖人工标注