苹果公司发布了新手机。

我把苹果削皮以后吃了。

两句话都有“苹果”。one-hot 只能给它们同一个固定向量;能看到 context 的模型则会根据周围的“公司、手机”或“削皮、吃”算出不同表示。

差别来自训练目标。只统计出现次数会丢掉词序,预测周围的词会保留共现关系,预测下一个 token 则要求模型利用更长的上下文。损失函数反复修改参数,最后留下对当前任务有用的信息。

one-hotone-shot 不是一回事

one-hot 中文常译为独热编码。假设词表只有“苹果、香蕉、手机、公司”四个词,它们可以写成:

苹果 = [1, 0, 0, 0]
香蕉 = [0, 1, 0, 0]
手机 = [0, 0, 1, 0]
公司 = [0, 0, 0, 1]

每个向量只负责回答“我是谁”。“苹果”和“香蕉”的距离,与“苹果”和“公司”的距离相同,向量里没有类别、用法和语境。词表如果有五万个词,每个向量就有五万维,其中只有一个位置是 1,其余全是 0

one-shot 则是提示方式:给模型一个示例,再让它完成新任务。它不是 GPT 之前的一代词语表示方法。zero-shotone-shotfew-shot 能力是在大模型的上下文学习中被广泛讨论的,和这里的 one-hot 只有拼写相近。

先数词,再寻找隐藏的方向

词袋模型留下频率,丢掉顺序

Bag of Words 按词表统计一句话中每个词出现的次数:

“我喜欢苹果” = [我: 1, 喜欢: 1, 苹果: 1, 香蕉: 0]
“苹果喜欢我” = [我: 1, 喜欢: 1, 苹果: 1, 香蕉: 0]

这两个向量完全相同。它适合判断文档里有哪些词,却分不清谁喜欢谁。TF-IDF 又降低了“的”“是”这类高频词的权重,突出一篇文档中更有辨识度的词,但它仍然只数出现次数。

LSA 从共现矩阵中压缩主题

如果“银行、贷款、利率”经常一起出现,“医生、病人、药物”经常一起出现,词—文档矩阵里会留下两团不同的共现模式。1990 年发表的 Latent Semantic Analysis 使用矩阵分解,把维度很高的稀疏矩阵压到较低维空间。

压缩后的每一维不一定能被清楚命名,但会共同表达某些潜在主题。即使两篇文章没有使用完全相同的词,只要它们落在相近的主题方向上,也可能被判断为相似。

矩阵分解会给每个词和文档一个低维位置,但这个位置仍来自整张统计矩阵,难以处理词序和具体上下文。“苹果”依然只有一个固定位置。

神经语言模型把向量放进预测任务

2003 年的神经概率语言模型已经采用了后来很熟悉的办法:先把词映射成稠密向量,再根据前面几个词预测下一个词,词向量和预测网络一起通过反向传播训练。

词向量是预测网络里的可训练参数。每次下一个词预测错误,反向传播都会同时更新嵌入表和预测网络。固定窗口限制了能使用的上下文,对完整词表计算输出概率的成本也很高。

Word2Vec 改变了训练题目

2013 年的 Word2Vec 没有发明词向量。它用浅层网络、负采样或分层 Softmax 降低计算成本,把训练扩展到大规模语料。Skip-gram 根据中心词预测周围的词,CBOW 则根据周围的词预测中心词。

Skip-gram 为例,训练语料里有一句:

猫 喜欢 吃 鱼

当中心词是“吃”,窗口中的“喜欢”和“鱼”与它组成正样本对。训练会提高中心词向量与上下文词向量的点积,同时降低它与随机负样本,例如“火车”“利率”的点积。

两套嵌入表刚开始都是随机数。每次预测错误,梯度都会同时修改中心词和上下文词的向量。猫和狗经常与“喂养、宠物、可爱、兽医”共现,受到的更新方向会反复重合;猫和利率很少共享上下文,受到的更新也不同。相似位置来自大量样本累积的梯度,没有人工为“猫”和“狗”指定坐标。

可以把训练想成调整一张没有坐标名的座位表:正样本拉近,负样本推远。反复几亿次后,宠物、金融和城市等区域才逐渐显出来。

为什么会有 king - man + woman ≈ queen

词向量不仅形成邻近关系,一些词对的差值还会近似平行:

king - man ≈ queen - woman
Paris - France ≈ Beijing - China

“国王”和“王后”都靠近王室、宫殿、统治等上下文,“男人”和“女人”的用法差异又在许多词对中重复出现。当类似差异在大量上下文中反复影响梯度时,词对之间会留下近似的向量位移。

这不是模型内部存在一根可以命名为“性别”的精确坐标轴,也不是每组类比都成立。结果会受语料、词频、训练目标和社会偏见影响。Word2Vec 学到的是用法分布,不能保证学到词典定义,更不能保证事实正确。

静态词向量仍然分不清两个“苹果”

Word2Vec 和 2014 年的 GloVe 为每个词保存一个固定向量。无论“苹果”指水果还是公司,查表得到的都是同一串数字。训练上下文决定了这个向量,实际使用时的上下文却不会再改变它。

句子迫使模型记住顺序

RNN 把读过的内容压进一个状态

Recurrent Neural Network 按顺序读词。读到第 个词时,它把当前词向量 和上一步状态 合成新的状态:

“狗咬人”和“人咬狗”会产生不同状态,因为输入顺序不同。最后一个状态可以当作句子的摘要,再用于分类、翻译或预测下一个词。LSTMGRU 加入门控,缓解普通 RNN 在长序列中遗忘早期信息的问题。

这个设计有两个实际限制。所有历史都要穿过同一条状态链,句子很长时,开头的信息容易变淡;第 步必须等待第 步完成,训练难以充分并行。

2014 年前后的早期 Seq2Seq 翻译还常把整句压进一个固定长度向量。让一串数字同时保存人物、动作、修饰语和长距离关系,句子一长就容易丢信息。

Attention 允许解码器回头找原文

2014 年的神经机器翻译引入了 Attention。翻译“我昨天在银行办理了贷款”时,生成 loan 的那一步不必只依赖最后一个句子摘要。模型计算当前解码状态与每个源词状态的匹配分数,把分数归一化成权重,再对源词状态做加权求和。

生成不同词时,模型可以读取原句的不同位置。句子不再被迫塞进一个固定向量,词与词之间的关系也开始在当前任务、当前步骤里动态计算。

不过,最初的 Attention 仍附着在 RNN 上。词要依次读入,顺序链条还在。

Transformer 让每个词直接查看上下文

2017 年提出的 Transformer 去掉了循环状态,用 Self-Attention 直接建立序列内所有位置的关系。

输入先有身份和位置

文本先被 Tokenizer 切成 token。一个 token 可能是词、词的一部分、标点或空格组合。每个 token 编号经过嵌入表得到初始向量,再加入位置信息:

初始嵌入仍像 Word2Vec 一样来自查表。同一个“苹果”查到的 token 向量相同,叠加位置信息后,两个位置的输入已经不同;后续层的 Self-Attention 再算出由上下文造成的词义差异。

QKV 计算当前关系

每个位置的向量会经过三组可训练矩阵,生成 QueryKeyValue

某个词的 Query 与其他词的 Key 做点积,得到匹配分数:

可以把 Query 理解为“我现在要找什么”,Key 是“我能以什么身份被找到”,Value 是“找到我以后应该取走的信息”。这只是帮助阅读公式的比喻,具体关系由训练学习,不由程序员预先命名。

在“苹果公司发布了新手机”中,“苹果”的注意力可能从“公司、发布、手机”取回更多信息;在“我把苹果削皮以后吃了”中,它会从“削皮、吃”取回不同信息。经过多层 Self-Attention 和前馈网络以后,两个“苹果”的隐藏向量不再相同。

Multi-Head Attention 同时使用多组投影矩阵。不同头可以捕捉不同关系,例如局部搭配、指代、语法依赖或更长距离的联系,但不能假定某个头永久、纯粹地负责某一种人类概念。

Transformer 的输出也不是一个句子向量,而是每个位置各有一个上下文化向量。后续任务可以读取某个特殊位置、对所有位置做池化,或者继续利用整组向量。

BERTGPT 选择了不同的训练视角

Transformer 是架构,BERTGPT 是用这种架构组织出来的模型家族。两者都让词根据上下文改变表示,训练目标和可见范围不同。

ELMo 先让词向量随句子变化

2018 年的 ELMo 使用双向语言模型生成上下文化表示。同一个词进入不同句子后,会得到不同向量。它仍基于双向 LSTM,但输出已经不再是词表中的固定向量。

BERT 根据左右两边补空缺

2018 年的 BERT 使用 Transformer Encoder。预训练时遮住一部分 token,让模型根据左右上下文恢复它们:

我把苹果削皮以后 [MASK] 了。
苹果公司发布了新 [MASK]。

为了补出“吃”和“手机”,模型需要区分两个“苹果”,识别局部搭配和句子关系。这种双向读取很适合分类、抽取和阅读理解。

句向量任务常读取 [CLS] 位置或对所有 token 向量做池化,但原始 BERT 的训练目标没有直接要求整句相似时向量也相近。Sentence-BERT 等模型又使用句对和对比学习训练:相关句子被拉近,不相关句子被推远。向量数据库里用于检索的 Embedding,通常属于这条“把整段内容压成一个可比较向量”的分支。最近邻具体怎样计算,见 vector-database。从语言模型底座到对比预训练、领域微调的过程,见 保险推品中的语义匹配:从产品池复用到领域微调

GPT 只看左侧,逐个预测后续 token

GPT 使用仅解码器结构,也就是 decoder-only Transformer。因果掩码让某个位置只能看到自身及左侧内容:

输入:我 把 苹果 削皮 以后
目标:吃

一段训练文本会提供许多预测题。看到“我”预测“把”,看到“我把”预测“苹果”,继续看到更长前缀并预测下一个 token。损失函数会惩罚正确答案概率过低,梯度再修改嵌入、注意力和前馈网络中的参数。

只预测下一个 token 看起来很窄,语料却迫使模型处理许多隐藏变量。要补全人名,需要记住人物;要续写代码,需要追踪变量和语法;要完成论证,需要维持前文的概念关系。模型没有收到一张单独的“语义表”,而是在压低预测误差时,把有用的规律分散进隐藏状态和参数。

下一个 token 的损失只检查模型给正确答案分配的概率,不直接验证事实、因果和现实行动。模型可能生成流畅的错误,也可能复制训练数据中的偏见。

从预训练模型到上下文学习

2018 年的 GPT-1 展示了先用语言模型目标预训练,再针对下游任务微调的路线。2019 年的 GPT-2 扩大模型和数据规模,观察到模型只靠文本提示也能完成部分任务。2020 年的 GPT-3 进一步展示了 zero-shotone-shotfew-shot 的上下文学习能力:参数不更新,任务描述和示例直接写进输入,模型沿着其中的模式继续生成。

GPT 不会自然产生一根可直接用于句子检索的固定向量。它的上下文信息分布在各层、各位置的隐藏状态和下一个 token 的概率分布中。若业务需要做相似度检索,还要选择专门的 Embedding 模型,把整句压缩成固定长度向量。

从固定编号到上下文化状态

代表时间阶段词怎样表示句子怎样表示关系怎样产生当时解决不了什么
one-hot词表中的唯一位置独热向量序列没有学习关系相似词同样遥远
Bag of Words / TF-IDF词频和权重稀疏计数向量共享词越多越相似丢失词序和上下文
1990LSA低维潜在向量文档的潜在主题向量来自全局共现矩阵难处理词序和一词多义
2003神经概率语言模型可训练稠密向量固定窗口中的词向量预测下一个词上下文窗口短,计算昂贵
2013—2014Word2Vec / GloVe稠密静态词向量聚合词向量相似上下文带来相似位置同一个词始终只有一个向量
2014 前后RNN / LSTM词向量按顺序累积的隐藏状态关系沿状态链传递长距离遗忘,难并行
2014Attention上下文化状态按当前步骤读取源序列动态匹配和加权求和早期方案仍依赖循环网络
2017Transformer每一层都会更新的 token 向量一组上下文化向量Self-Attention 直接计算位置关系计算量随序列长度快速增长
2018BERT双向上下文化向量[CLS]、池化或句向量微调根据左右上下文恢复遮挡内容不直接生成连续文本;原始模型不专为句子检索训练
2018—2020GPT-1GPT-3只利用左侧上下文的动态向量分布在各位置和层中的生成状态预测下一个 token流畅不保证事实正确

Word2Vec 使用负采样时,损失函数检查中心词能否区分真实上下文和负样本;BERT 检查被遮住的 tokenGPT 检查下一个 token。换一份语料、一个目标或一种负样本,参数更新的方向会改变,最后得到的向量空间也会改变。

从语言扩展到其他模态时,问题没有消失

文本可以被切成离散 token,图像可以切成 patch,机器人的感知和动作轨迹也可以量化成序列。Sora 一类视频生成模型会先把视频压缩为时空表示,再由 Diffusion Transformer 处理这些表示。语音原本是连续波形,若直接按 48 kHz 采样率处理,一秒就有四万八千个采样点,因此通常也要经过编码器压缩或离散化。

统一成序列以后,Transformer 的矩阵计算可以复用,训练问题却不完全相同。文本的下一个词不确定时,模型还能对有限词表给出概率分布;视频下一帧包含大量无法确定的纹理和物体细节,直接预测像素会把容量花在不可预测的信息上。

JEPA 选择在抽象表示空间中预测目标,不去复原输入空间的每个细节。它是一类训练架构,可以在内部使用 Transformer,并不是一种与 Transformer 对立的网络层。目标表示和损失函数仍会决定模型保留哪些信息。

所以向量为什么能够表示语义

可以从“猫喜欢吃鱼”中的一个中心词开始:

  1. 向量最初是随机数,没有天然语义。
  2. 训练目标要求中心词预测上下文,预测错误就通过梯度调整向量。
  3. 经常共享上下文的词收到相似更新,逐渐靠近;反复出现的关系可能形成近似方向。
  4. Word2Vec 得到的是静态词向量,Transformer 则在每次输入时通过 Self-Attention 重新计算上下文化向量。
  5. 相似度检索再用余弦相似度、点积或欧氏距离比较固定向量;模型训练和最近邻搜索是前后两件事。

向量只忠实于训练数据、训练目标和比较方式。它可以稳定表达某些统计关系,不过不会对“语义正确”作出数学保证。

参考