很多人第一次看到「嵌入」「向量」这两个词,是在搭知识库或者翻训练代码的时候:明明输入是一句话,输出却是一串小数。这串数是怎么来的、训练时它又怎么被改,往往是卡住的第一个点。这篇不讲公式推导,只按数据流走一遍:从 token 到查表、到前向、到损失、到更新,每一步告诉你算的是什么、去哪儿看真实规格。
很多人第一次看到「嵌入」「向量」这两个词,是在搭知识库或者翻训练代码的时候:明明输入是一句话,输出却是一串小数。这串数怎么来的、训练时它又被怎么改,往往是卡住的第一个点。
这篇不讲公式推导,只按数据流走一遍:从 token 到查表、到前向、到损失、到更新,每一步告诉你算的是什么、能去哪儿核对真实规格。看的过程中建议对照站内模型资料库,别按记忆里的参数估。
先有编号,才谈得上向量
文本进模型之前会先被切成 token,每个 token 在词表里对应一个整数编号。这一步没有数学,就是查表。很多人以为「算向量」是某种连续运算,其实第一跳是离散的:拿到编号,再去一张大表里取第 N 行。
- 切词器决定怎么切:同一个句子,不同分词器切出来的 token 数量和编号都可能不一样
- 编号是词表里的位置索引,不是词频、不是哈希值的某种连续量
- 想核对词表量级和向量维度,去站内模型资料库对应模型的参数页看,不要按印象里的数字估
- 编号只在同一个词表版本内有效,换模型或换词表版本,同一句话的编号可能整体错位
查表拿到的向量是什么
那张大表叫嵌入矩阵,行数是词表量级,列数是隐藏维度。训练开始时里面是随机小数,所以第一次取到的向量基本没意义。「可训练」的意思是反向传播会改动表里的数,模型学到的语义很大一部分就存在这张表里。
| 概念 | 怎么理解 | 核对方式 |
|---|---|---|
| 嵌入矩阵 | 行对应 token 编号,列对应隐藏维度 | 站内模型资料库参数页看维度口径 |
| 初始值 | 随机小数,训练前无语义 | 新手最容易误以为一开始就有含义 |
| 同一个 token | 在任何句子里取到的初始向量都一样 | 位置信息是后面加的,不是查表给的 |
| 可训练 | 梯度会落到被命中的行上 | 不被命中的行这一轮不动 |
判断标准很简单:如果你看到「同一个词在不同句子里初始向量不同」,那多半不是查表结果,而是已经过了若干层之后的表示。想验证,就在小样本上只跑取表这一步,不往上走。
向量在训练循环里怎么被改
取出的向量往上走,经过注意力和前馈网络,得到对下一个 token 的预测分布。把预测和真实下一个 token 做对比算出损失,这一步决定「差多少」;反向传播再算出每个参数的梯度,嵌入表里被用到的那几行才被更新。
- 前向输入编号序列,逐层算出预测分布,确认输出维度与词表量级对得上
- 算损失拿预测分布和真实下一个 token 比对,得到标量损失,看它是否在正常下降
- 反向从损失往回算梯度,重点确认梯度是否落到嵌入表对应行上,而不是整表一起动
- 更新只更新被命中的那几行,没被用到的行这一轮不动,这就是稀疏更新的由来
这里容易踩的坑是把「每步都更新整张表」当成常识。实际上一个批次里只覆盖了一部分 token,所以很多行在这一轮梯度为零。判断标准:如果你的实现里每轮嵌入表整表都在变,先查梯度掩码或者优化器作用范围是不是设错了。
推理时不算向量,只是取出来用
训练结束嵌入表就固定了,推理阶段同一个 token 每次取到的向量完全一致。所以才会有「模型见过什么就只懂什么」的说法:表里没有的 token,或者没被充分训练的行,取出来的向量意义很弱。
- 想改语义又不重训,常见做法是换嵌入模型或补微调,服务商对照去站内微调页面看当时的选项
- 判断某个词表现差,先查它在词表里是否被切成了多个碎片,碎片多往往表示它训得不充分
- 同一套流程在预训练和微调上口径不同,别把两边的超参直接套用
- 数值对不上时先怀疑数据管线,不要先动模型结构
自己动手核对的顺序
与其读十页原理,不如拿一个小样本把整条链走通。关键是先确认你看的是嵌入模型的输出向量,还是模型内部的隐藏状态,这两者维度口径不同,混着比一定对不上。
| 排查顺序 | 看什么 | 常见错位 |
|---|---|---|
| 切词 | token 数量和编号 | 分词器版本不一致 |
| 查编号 | 编号是否落在词表范围内 | 词表换了没同步 |
| 查表 | 取到的向量维度 | 维度口径理解错 |
| 看梯度 | 被命中的行是否在变 | 整表一起动 |
| 对结果 | 同一 token 是否稳定 | 把隐藏状态当嵌入用 |
什么情况下这套顺序不适用:如果你做的是端到端黑盒调用、完全不碰训练代码,那核对重点应该放在输入输出维度和分词器一致性上,不必追梯度。反过来,如果你在排查训练不收敛,那切词和查编号只是前置检查,重点要落到损失和梯度上。
向量不是凭空算出来的,是查出来的,再被梯度一点点改出来的。下一步想知道你手上那个模型真实的词表量级和向量维度,以及不同服务商的嵌入规格差异,去站内模型资料库按参数页核对当时的数字,比记数字靠谱。→
常见问题
向量的维度是越大越好吗?
不是。维度高能装下更多区分信息,但嵌入表占用和算量跟着涨,小语料上更容易训不充分。判断标准是任务能不能区分开,而不是数字大小。具体模型给出的维度去 /models 或 /embeddings 页面核对,别照搬别人的配置。
一句话里每个词的向量是独立的吗?
查表那一刻是独立的,同一个词在不同句子里取到的初始向量相同。真正带上上下文含义,是后面注意力层把整句信息混合之后的结果。所以看到「同一个词向量不一样」时,先分清你说的是嵌入层输出还是中间层输出。
不训练能不能直接拿到可用的向量?
可以。现成嵌入模型开箱就能编码,做检索、聚类够用,省掉训练这一步。代价是它不理解你的领域叫法,垂直场景下效果会打折。要不要自己训,建议先拿现成模型在 /models/deploy 里跑一遍真实数据的对照再决定。