同一句话怎样成为分析对象与模型输入
课堂接续:T01 · T02 · T03 · T04 · T05 · T07 · T08。连续读本:第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、相同边界规则下比较误检与漏检;模型目标主题的具体抽取一节保留现代 GLiNER/GLiNER2 的完整证据,不能从一项受限任务推断所有小模型普遍更可靠。
回到实际翻译决定。接收者“他”在这里要用宾格 him;give 变成 gave 结合了昨天以及本句已完成的事件理解,不能推广为每一个“了”都必须译过去时。“一/本/书”可合成 a book,若语境特别强调数量,则 one book 也可能合适。英语把 yesterday 放到句末或句首都能保留时间;把中文位置原样照搬不是唯一选择。这里的结构分析帮助作出决定,但规则也要面对歧义、例外和新领域。
统计短语翻译进一步利用平行语料学习局部对应与重排,目标语言单语语料提供流畅性评分,搜索把候选组合起来。翻译特征、重排特征和语言模型可以共同评分;语言模型是其中一个组件,不能独自知道中文接收者是谁。传统统计方法已经从数据学习,神经方法的转折并不是第一次使用数据,而是让表示与计算更多共享。若“给他”“给她”和未见的新组合各自只有稀少计数,怎样把相邻经验用于新情况,就成为下一步的问题。
从这句明确的翻译任务出发,模型还需要可共享的输入表示。下面混排姓名消息、BPE四轮合并与英语共现语料是分别定义的独立样本,不与九单位主例共用tokenizer或实验成绩。
阅读本主题 · 返回实验 · 与Agent共读全文
读本: CLS 01 · 序列目标与共享状态 ,查找“同一句话怎样成为分析对象与模型输入”;实验中查找“A · 邻居变多,bank 的表示会怎样变?”。
先看进入模型的对象
当前九单位按所选词表获得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只是把不同长度凑成矩形;它们不必都在每种模型里以同一种方式出现。这里的词界、空格处理也不是自然法则。
“芷”和“岚”都在词表,只保证模型能接收这两个符号;不保证它知道慕容芷岚是谁。同样,能把一个新药名拆开,不等于掌握药物知识。先把编码覆盖和事实理解分开,后面读视觉与长文档时会再次用到这个区分。
一次足够小的 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系统不能不加区分地混称“永远没有未知词”。
切分会改变你怎样比较模型
若同一条消息在切分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,再讨论记忆。
查表相同,为什么后来的 bank 不同
读 She deposited money at the bank. 和 She sat on the bank of the river.。静态查表阶段两个bank得到同一行向量。窗口网络把它与邻近词拼接,RNN把它与前一状态组合,self-attention让它读取同句其他位置;这些后续函数的输入不同,输出自然可以不同。模型不需要在每次出现bank时偷偷改写词表。
静态向量仍有价值:在稀疏词频下共享统计、作为下游初始化、检查局部词语关系。但“bank的最近邻看起来合理”不能替代实体识别或翻译评价。一个很少见的姓名可以没有好近邻,却被上下文中的称谓和语法正确识别为人名;反过来,漂亮的二维投影可能隐藏任务需要的细小差异。
用邻近词制造训练样本: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。预训练是可选路径,不是每个神经翻译器的必经工序。固定向量提供共享起点;如何结合这一次的顺序与关系仍需后续网络。把“我给他”和“他给我”的词向量简单平均,两者结果相同,却丢掉了谁给谁;这使保留序列次序成为具体需要。以下英语窗口和完整公式是额外的独立例子,样本与主线九单位不混用。
如果还没有 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。
共现、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。Levy 与 Goldberg 进一步说明,在特定噪声分布和优化假设下,SGNS 可联系到移位 PMI 的分解;这不意味着有限维、实际优化后的 SGNS 总与一次 SVD 完全相同:Neural Word Embedding as Implicit Matrix Factorization。
表示有没有用,要回到用途。余弦相似度、词类比和人工词对相似评分适合检查局部结构;NER、分类或翻译中的性能才直接回答下游任务问题。必须固定语料、切分、维度、训练预算和评价数据,才能解释哪项设计造成变化。相似向量也可能同时反映语义、主题、词频或语料偏差。一个词类比做对,不能证明模型理解了所有相关关系。
回到一对可检查的训练对象
若把 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支持学习/应用分离;本节四轮词频表是教学构造。Mikolov等2013 §2.2、GloVe2014 §3说明目标。
从词表接口回到具体抽取
对“昨天,小李把《机器学习》交给小王。”,schema若规定人物/书名,输出span就是小李、小王与机器学习。切分决定这些边界怎样映射到token;上下文化表示帮助判断类型,任务头与监督才决定输出。只要tokenizer接收了全部字符,就不等于模型已经识别实体。固定词典、受训标注模型和开放生成接口应在同一文本及字段约束下比较。
相邻知识与复核资源
全部主题 · 关键结果JSON · 只读诊断源码 · Seq2Seq完整实现 · 视觉机制实现 · TinyDecoder与cache实现