text-units-and-representations.md · 可读全文
这里保留原文的中文、公式标记、代码和链接。可直接交给 Agent 读取,也可选取下方原文复制。此入口返回 HTML;原始 .md / .py 文件仍保留,完整候选包同时包含 UTF-8 原件。
# 同一句话怎样成为分析对象与模型输入
课堂接续:[T01](https://codingai-lec05.pages.dev/classroom/T01.html?step=b0) · [T02](https://codingai-lec05.pages.dev/classroom/T02.html?step=b0) · [T03](https://codingai-lec05.pages.dev/classroom/T03.html?step=b0) · [T04](https://codingai-lec05.pages.dev/classroom/T04.html?step=b0) · [T05](https://codingai-lec05.pages.dev/classroom/T05.html?step=b0) · [T07](https://codingai-lec05.pages.dev/classroom/T07.html?step=b0) · [T08](https://codingai-lec05.pages.dev/classroom/T08.html?step=b0)。连续读本:[第1章](https://codingai-lec05.pages.dev/lecture.html#chapter-1);本主题提供独立定义、例子、代码与来源。
同一件事可以有不止一种合适译法。“我昨天给了他一本书。”可以译为 `I gave him a book yesterday.`,也可以把时间放在开头:`Yesterday, I gave him a book.`。下面固定第一种,目的是沿同一对象追踪计算,不是把其他通顺译法判错。选择的目标序列为 `I/gave/him/a/book/yesterday/./EOS`。句号属于文本,EOS表示这一生成结束;BOS则是开始输入的约定。
词典替换能给出一个**人为构造的教学草稿**:`I yesterday give he one book.`。这不是任何翻译产品的实测输出,而且“了”和“本”还没有得到合理处理。草稿把一部分词义找到了,却没有解决接收者形式、事件时间、数量短语与语序。要补上这些决定,需要分析词在这一次表达中的作用。
本讲选择九个单位 `我/昨天/给/了/他/一/本/书/。`。这套切分服务于解释;“给了”“一本”也可以在另一个切分系统中成组,不能把本课九格冒充某个真实 tokenizer 的唯一输出。词性分析问每个单位在这里属于什么类别:我、他是代词,给是动词,书是名词,昨天是时间表达,一是数词,本是量词,了在此分析中是助词,句号是标点。词性、句中角色与依存关系是不同层面的标签。
“本”不能只靠字形决定。“本书介绍……”中的本可表示“这本”;“一本书”中的本与数词一、名词书共同形成数量短语,承担量词作用。这次局部上下文已经足以区分两义。词典提供候选,语境帮助选择,不需要先声称必须理解整个人生故事才能确定每一个词。

角色分析则问谁做了什么:给出者是我,接收者是他,交付物是一本书,时间是昨天。简化成分树把整个句子展开为主语、时间和动词短语,再把动词短语中的动词、宾语成分和名词短语“一本书”分开。树中的“宾语成分”是句法标记,角色图中的“接收者”是语义角色,两者不混作同一类节点。括起“一本书”表示它在这里共同承担交付物,不等于“一、本、书”三个单位从此永远不可分。这是一棵为说明关系而选择的教学分析树,没有宣称来自实际 parser 或唯一标准答案。

实体抽取又是另一项任务。若 schema 只允许 `PER / ORG / LOC`,原句中的我和他不是具名的人名 span,昨天也不属于允许的三类;因此可以返回空集合。代词在语义上指向人,不意味着要标成 PER,更不能凭空补出书名。为了看清有名字时会怎样,另作明确赋值:这一次设“我=张明、他=李华”,把句子改写为“张明昨天给了李华一本书。”,才能在新句中返回 `张明:PER`、`李华:PER`。这不是从原句推断出的姓名。完成该独立示范后,翻译主线仍使用原句。

NER帮助系统定位和保留专名,却没有单独决定谁给谁;反过来,将我和他译成 I 和 him 也不要求知道其真实姓名。面向固定字段的字典、规则或学习式抽取器都可以有价值。它们要在同一文本、同一 schema、相同边界规则下比较误检与漏检;[模型目标主题的具体抽取一节](https://codingai-lec05.pages.dev/course/knowledge/model-objectives.html#model-objectives-s06)保留现代 GLiNER/GLiNER2 的完整证据,不能从一项受限任务推断所有小模型普遍更可靠。
回到实际翻译决定。接收者“他”在这里要用宾格 him;give 变成 gave 结合了昨天以及本句已完成的事件理解,不能推广为每一个“了”都必须译过去时。“一/本/书”可合成 a book,若语境特别强调数量,则 one book 也可能合适。英语把 yesterday 放到句末或句首都能保留时间;把中文位置原样照搬不是唯一选择。这里的结构分析帮助作出决定,但规则也要面对歧义、例外和新领域。

统计短语翻译进一步利用平行语料学习局部对应与重排,目标语言单语语料提供流畅性评分,搜索把候选组合起来。翻译特征、重排特征和语言模型可以共同评分;语言模型是其中一个组件,不能独自知道中文接收者是谁。传统统计方法已经从数据学习,神经方法的转折并不是第一次使用数据,而是让表示与计算更多共享。若“给他”“给她”和未见的新组合各自只有稀少计数,怎样把相邻经验用于新情况,就成为下一步的问题。
从这句明确的翻译任务出发,模型还需要可共享的输入表示。下面混排姓名消息、BPE四轮合并与英语共现语料是分别定义的独立样本,不与九单位主例共用tokenizer或实验成绩。
[阅读本主题](https://codingai-lec05.pages.dev/course/knowledge/text-units-and-representations.html) · [返回实验](https://deepnote.com/workspace/ise3309jingao-5ba66b0a-4283-4f5a-ae06-3f68d3201e99/project/Fall-26-Lecture-05-841ec8e7-e352-4840-b628-d3742b03d6d0/notebook/LAB-01-ec403d28cc2c400ba661cd270588669f?utm_content=ec403d28cc2c400ba661cd270588669f&utm_source=openai&utm_medium=mcp&utm_campaign=openaimcp&utm_term=get_notebook) · [与Agent共读全文](https://codingai-lec05.pages.dev/course/knowledge/text-units-and-representations.md.read.html)
读本:[ CLS 01 · 序列目标与共享状态 ](https://deepnote.com/workspace/ise3309jingao-5ba66b0a-4283-4f5a-ae06-3f68d3201e99/project/Fall-26-Lecture-05-841ec8e7-e352-4840-b628-d3742b03d6d0/notebook/CLS-01-b1c8e2fd764441e8820b808fc40ec3cb?utm_content=b1c8e2fd764441e8820b808fc40ec3cb&utm_source=openai&utm_medium=mcp&utm_campaign=openaimcp&utm_term=get_notebook),查找“同一句话怎样成为分析对象与模型输入”;实验中查找“A · 邻居变多,bank 的表示会怎样变?”。
<span id="text-units-and-representations-s01"></span>
## 先看进入模型的对象

当前九单位按所选词表获得ID。整数大小不是语义距离;one-hot不表达相似关系,查表的embedding行才是可训练参数。以下混排消息展示另一种真实会遇到的接口问题。
下面是三种**手工约定**,并非某个商业 tokenizer 的输出。我们保留大小写,标点单独计数,表内空格只显示边界。
|规则|部分实际切分|会遇到的代价|
|---|---|---|
|按词,人工给定中文词界|慕容芷岚 / 在 / micro-brewery / 做 / 了 / QK-normalization / 实验 / 。|若姓名或复合词不在词表,用UNK会合并不同实体;词界本身需要规则|
|按Unicode字符|慕 / 容 / 芷 / 岚 / 在 / 空格 / m / i / c / r / o / - / b / r / e / w / e / r / y …|词表较小,序列较长;字母/汉字不是同一信息单位|
|教学子词,预先给定片段表|慕容 / 芷 / 岚 / 在 / micro / - / brew / ery / 做 / 了 / Q / K / - / normal / ization / 实验 / 。|未见整体可组合;片段越碎,占用的位置越多;仍须定义未见字符如何回退|
每个片段查词表变成ID,再查embedding矩阵的对应行。ID的数值大小不表示词义远近。BOS表示开始的约定,EOS是模型需要预测的结束事件,PAD只是把不同长度凑成矩形;它们不必都在每种模型里以同一种方式出现。这里的词界、空格处理也不是自然法则。
“芷”和“岚”都在词表,只保证模型能接收这两个符号;不保证它知道慕容芷岚是谁。同样,能把一个新药名拆开,不等于掌握药物知识。先把**编码覆盖**和**事实理解**分开,后面读视觉与长文档时会再次用到这个区分。
<span id="text-units-and-representations-s02"></span>
## 一次足够小的 BPE 学习
只为看清算法,另造小词频表:`low:3, lower:2, new:1`。每个词从字符加词尾符号 `</w>` 开始,合并不跨词界;相邻对计数乘词频;同频按符号对的字典序选先者。我们只学习四次合并。
|轮次|当前最高频对(加权计数)|采用规则|low / lower / new 的符号序列|
|---|---|---|---|
|初始|`l,o=5;o,w=5;w,</w>=4`|`尚无`|`l o w </w> / l o w e r </w> / n e w </w>`|
|1|`l,o 与 o,w 同为5`|`l+o→lo`|`lo w </w> / lo w e r </w> / n e w </w>`|
|2|`lo,w=5`|`lo+w→low`|`low </w> / low e r </w> / n e w </w>`|
|3|`low,</w>=3`|`low+</w>→low</w>`|`low</w> / low e r </w> / n e w </w>`|
|4|`e,r;low,e;r,</w>同为2`|`e+r→er`|`low</w> / low er </w> / n e w </w>`|
训练到此停止,四条规则有固定次序。使用时不再根据当前句子重新数频率。未见的 `newer` 从 `n e w e r </w>` 出发,前三条不能用,第四条得到 `n e w er </w>`;它没有忽然获得一个“newer”词条。`lower` 仍是 `low er </w>`,因为四轮里没有学到把它们全部合并的规则。
把测试词加入词频表再学习合并,是改变tokenizer,不是应用原tokenizer。回到混排句:字符级BPE若训练字符表没有“岚”,仍需要UNK、补充字符或字节回退规则。原始NMT的字符BPE与现代byte-level系统不能不加区分地混称“永远没有未知词”。
<span id="text-units-and-representations-s03"></span>
## 切分会改变你怎样比较模型
若同一条消息在切分A下有10个预测token,在B下有20个,两个模型即使对完整字符串给出相同的概率 `exp(-10)`,按token平均的NLL分别是1和0.5,PPL分别为2.718和1.649。B的PPL更低,并不能据此判定它更懂这条消息;这里改变了分母。跨tokenizer比较需要明确同一文本、编码可逆性、特殊符号和长度单位,可报告每字节负对数似然等一致单位;不能把同词表内的PPL排名直接搬过来。
同样,4096个位置不是4096个词。模板、标点、子词碎片、BOS和输出预留都可能占位置。一个人名在两种语言中被拆成不同片数,也会改变同一窗口能容纳的内容。去长文档路径时,先数**实际送入**的ID,再讨论记忆。
<span id="text-units-and-representations-s04"></span>
## 查表相同,为什么后来的 bank 不同
读 `She deposited money at the bank.` 和 `She sat on the bank of the river.`。静态查表阶段两个bank得到同一行向量。窗口网络把它与邻近词拼接,RNN把它与前一状态组合,self-attention让它读取同句其他位置;这些后续函数的输入不同,输出自然可以不同。模型不需要在每次出现bank时偷偷改写词表。
静态向量仍有价值:在稀疏词频下共享统计、作为下游初始化、检查局部词语关系。但“bank的最近邻看起来合理”不能替代实体识别或翻译评价。一个很少见的姓名可以没有好近邻,却被上下文中的称谓和语法正确识别为人名;反过来,漂亮的二维投影可能隐藏任务需要的细小差异。
<span id="text-units-and-representations-s05"></span>
## 用邻近词制造训练样本:word2vec
先把“书”变成词表 ID,再查一张可学习表的对应行。ID只标身份;one-hot中两个不同单位的点积都是0,不会自动把书和册排得比书和昨天更近。Embedding行的数值由训练改变,维度并没有预先叫“知识”“物品”或“时间”。
在九单位句中,若窗口半径为1,以书为中心可得到“书→本”和“书→。”这样的中心—上下文训练对。Skip-gram为这两个角色保留**两张独立参数表**:中心表 $E_{\mathrm{in}}$ 的书行是 $v_{书}$,上下文表 $E_{\mathrm{out}}$ 的本行是 $u_{本}$;即使同一个词在两表中出现,也不是强制同一行数值。
|表|索引对象|本次取得的向量|用途|
|---|---|---|---|
|中心表 $E_{\mathrm{in}}$|中心词ID:书|$v_{书}$|表达本次中心|
|上下文表 $E_{\mathrm{out}}$|候选上下文ID:本及词表其他项|$u_{本}$、$u_w$|逐候选计算兼容分数|
先算 $s_w=u_w^\top v_{书}$,再沿上下文词表 softmax 得到 $p(w\mid 书)$,真实邻词本对应损失 $-\log p(本\mid 书)$。误差会同时回到中心表和上下文表。这里只由一个局部共现对演示训练接口;学到可用的统计关系需要许多文本与训练,单句不能授予一整套词义。

Word2vec可以先学词向量供别的任务使用,也可以完全不用它,直接由翻译损失学习 embedding。预训练是可选路径,不是每个神经翻译器的必经工序。固定向量提供共享起点;如何结合这一次的顺序与关系仍需后续网络。把“我给他”和“他给我”的词向量简单平均,两者结果相同,却丢掉了谁给谁;这使保留序列次序成为具体需要。以下英语窗口和完整公式是额外的独立例子,样本与主线九单位不混用。
<span id="read-R04"></span>
如果还没有 NER 标签,能否从原始文本学表示?Skip-gram 把出现位置本身变成监督信号。在“She deposited money at the bank .”中,以 money 为中心、半径为 2,可形成中心—上下文对 $(\text{money},\text{She})$、$(\text{money},\text{deposited})$、$(\text{money},\text{at})$、$(\text{money},\text{the})$。窗口移到 bank,样本对也随之改变。半径、是否区分左右、是否降低高频词采样率,都会改变被学习的统计关系。
为每个中心词设向量 $v_c$,为每个上下文词设向量 $u_o$。完整 softmax 模型与一对样本的负对数似然为
$$p(o\mid c)=\frac{\exp(u_o^\top v_c)}{\sum_{w=1}^{V}\exp(u_w^\top v_c)},\qquad
\ell(c,o)=-u_o^\top v_c+\log\sum_w\exp(u_w^\top v_c).$$
点积给出兼容性,指数变成正数,分母使所有上下文候选的概率和为 1。最小化语料中样本对的总损失,会提高观察到的上下文的相对概率,但不意味着每一次更新都提高 top-1 准确率。一个中心向量的梯度为
$$\frac{\partial\ell}{\partial v_c}=\sum_w p(w\mid c)u_w-u_o.$$
它比较模型当前按概率汇总的上下文向量与真实上下文向量。词表很大时,每一对样本都遍历整个分母昂贵,negative sampling 改用一个正例和 $K$ 个从噪声分布抽出的负例:
$$\ell_{\mathrm{NS}}=-\log\sigma(u_o^\top v_c)-\sum_{j=1}^{K}\log\sigma(-u_{n_j}^\top v_c).$$
正例希望点积变大,负例希望点积变小。Mikolov 等采用的一种噪声分布与词频的 $3/4$ 次方成正比。这是在区分真实共现对与采样对,并非仍然精确计算完整 softmax;单个 sigmoid 也不能直接当成规范化的 $p(o\mid c)$。抽到的负例不等于语言世界中永不相关的词。CBOW 则反过来,用窗口表示预测中心词。目标和采样细节见 [Mikolov 等,2013,§2](https://arxiv.org/abs/1310.4546)。
<span id="text-units-and-representations-s06"></span>
## 共现、SVD 与 GloVe 怎样连接
另一条路线先数出共现矩阵 $C$:第 $i$ 行是中心词,第 $j$ 列是上下文,$C_{ij}$ 是按指定窗口累计的次数。直接用这一整行表示词,维度很高,而且常见词容易支配距离。可以先用关联强度重标定,例如
$$\operatorname{PMI}(i,j)=\log\frac{P(i,j)}{P(i)P(j)},\qquad
\operatorname{PPMI}(i,j)=\max(0,\operatorname{PMI}(i,j)).$$
这里的概率必须来自同一种共现计数口径。PMI 比较“实际一起出现”与“按边缘频率独立出现”的比值;稀有词偶然共现也可能产生大值,所以低频处理仍然重要。对重标定矩阵 $M$ 做截断 SVD,$M\approx U_d\Sigma_dV_d^\top$,可取 $U_d\Sigma_d$ 或 $U_d\Sigma_d^{1/2}$ 作为低维表示。这两种选择对应不同的几何约定,应在比较中注明。
GloVe 也使用全局共现统计,却直接学习能拟合对数计数的向量和偏置:
$$J=\sum_{i,j:C_{ij}>0}f(C_{ij})\bigl(w_i^\top\widetilde w_j+b_i+\widetilde b_j-\log C_{ij}\bigr)^2.$$
权重函数 $f$ 调节罕见与高频共现对的影响;常用分段形式在阈值以下为 $(C_{ij}/x_{\max})^\alpha$,以上为 1。零计数不能直接取对数,因此求和与实现需相符。它与 Skip-gram 都从词的分布环境学习结构,但一个显式拟合汇总后的计数,另一个通常从局部样本对优化。见 [Pennington 等,GloVe,§2](https://aclanthology.org/D14-1162/)。Levy 与 Goldberg 进一步说明,在特定噪声分布和优化假设下,SGNS 可联系到移位 PMI 的分解;这不意味着有限维、实际优化后的 SGNS 总与一次 SVD 完全相同:[Neural Word Embedding as Implicit Matrix Factorization](https://papers.neurips.cc/paper_files/paper/2014/hash/b78666971ceae55a8e87efb7cbfd9ad4-Abstract.html)。
<span id="read-R05"></span>
表示有没有用,要回到用途。余弦相似度、词类比和人工词对相似评分适合检查局部结构;NER、分类或翻译中的性能才直接回答下游任务问题。必须固定语料、切分、维度、训练预算和评价数据,才能解释哪项设计造成变化。相似向量也可能同时反映语义、主题、词频或语料偏差。一个词类比做对,不能证明模型理解了所有相关关系。
<span id="text-units-and-representations-s07"></span>
## 回到一对可检查的训练对象
若把 `bank` 当中心、`money` 当真实窗口邻词,SGNS正对是(bank,money),噪声分布抽到的(tree,river等)应理解为与**同一中心bank组成的候选对**,不是给整句话贴“错误句子”标签。负例可能语义相关;3/4幂只相对提高较少见词的采样份额,不让它们必然比高频词多。
每对的目标是提高 `log σ(u_moneyᵀv_bank)` 并提高负对的 `log σ(-u_negᵀv_bank)`;它不是全词表归一化的下一词分布,不能拿单个sigmoid直接算语言模型PPL。共现方法则先累计窗口次数,再选择重建或加权拟合目标。改变LAB01 A的窗口时,先找一条改变了的共现计数,再看近邻是否跟着变化。若近邻没变,可能是这次新增计数不够,也可能是低秩投影掩盖了变化;检查原矩阵与投影可以区分二者。
来源:讲义第1章;M03–M06;CS224n word vectors物理7–43、neuralnets10–19。[Sennrich等2016 §3.2/Algorithm1](https://aclanthology.org/P16-1162.pdf)支持学习/应用分离;本节四轮词频表是教学构造。[Mikolov等2013 §2.2](https://arxiv.org/html/1310.4546v1)、[GloVe2014 §3](https://aclanthology.org/D14-1162.pdf)说明目标。
<span id="text-units-and-representations-r71-4b70acf1"></span>
## 从词表接口回到具体抽取
对“昨天,小李把《机器学习》交给小王。”,schema若规定人物/书名,输出span就是小李、小王与机器学习。切分决定这些边界怎样映射到token;上下文化表示帮助判断类型,任务头与监督才决定输出。只要tokenizer接收了全部字符,就不等于模型已经识别实体。固定词典、受训标注模型和开放生成接口应在同一文本及字段约束下比较。
<span id="text-units-and-representations-s08"></span>
## 相邻知识与复核资源
[把预测、训练与评价摊在同一张样本表上](https://codingai-lec05.pages.dev/course/knowledge/objectives-and-evaluation.html)
[全部主题](https://codingai-lec05.pages.dev/course/knowledge/index.html) · [关键结果JSON](https://codingai-lec05.pages.dev/course/knowledge/data/learning-paths.json) · [只读诊断源码](https://codingai-lec05.pages.dev/course/knowledge/code/learning_paths.py.read.html) · [Seq2Seq完整实现](https://codingai-lec05.pages.dev/course/knowledge/code/seq2seq.py.read.html) · [视觉机制实现](https://codingai-lec05.pages.dev/course/knowledge/code/mechanisms.py.read.html) · [TinyDecoder与cache实现](https://codingai-lec05.pages.dev/course/knowledge/code/legacy_numpy.py.read.html)