看到“把文本变成向量(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
- 从数据自身结构造出监督信号,不依赖人工标注