约 45 分钟 · 综合运用前十章的方法

怎么用这一章: 建议先遮住解答,自己写出每道题的特征表示、核心公式和待统计的中间量,再对照解析核对每一步。每道题末尾的“复核要点”总结了最容易算错的分母、维度或数据边界。

例1 同一个查询,原始词频与 TF-IDF 为何排出不同顺序

题目。 语料库有 3 篇文档:D1 cat eats fish、D2 cat likes milk、D3 dog eats fish;查询为 q=q= cat fish。分别用原始词频向量和未平滑 idf⁡(t)=ln⁡(N/dft)\operatorname{idf}(t)=\ln(N/df_t) 的 TF-IDF 向量计算余弦相似度,解释为什么 D2 与 D3 的先后顺序发生了变化。

解: 按字典序固定词表为 cat, dog, eats, fish, likes, milk(共 6 个词)。

1. 原始词频余弦 查询向量为 qcount=(1,0,0,1,0,0)q_{\text{count}}=(1,0,0,1,0,0),模长 ∥qcount∥2=12+12=2\lVert q_{\text{count}}\rVert_2=\sqrt{1^2+1^2}=\sqrt2。三篇文档各含 3 个互不相同的词,模长均为 3\sqrt3。

  • D1 同时命中 cat 和 fish,内积为 22;
  • D2 只命中 cat,D3 只命中 fish,内积均为 11。

因此:

cos⁡(q,D1)=223=26≈0.8165,cos⁡(q,D2)=cos⁡(q,D3)=16≈0.4082.\cos(q,D_1)=\frac{2}{\sqrt2\sqrt3}=\frac{2}{\sqrt6}\approx0.8165,\qquad \cos(q,D_2)=\cos(q,D_3)=\frac{1}{\sqrt6}\approx0.4082.

在原始词频下,D2 与 D3 并列第二。

2. TF-IDF 余弦 统计文档频率:df(cat)=df(eats)=df(fish)=2df(\text{cat})=df(\text{eats})=df(\text{fish})=2,这三词的 IDF 为 a=ln⁡(3/2)=ln⁡1.5≈0.4055a=\ln(3/2)=\ln 1.5\approx0.4055;而 dog, likes, milk 只在 1 篇文档出现,IDF 为 b=ln⁡(3/1)=ln⁡3≈1.0986b=\ln(3/1)=\ln 3\approx1.0986。

查询中两个词的 IDF 都是 aa,故 ∥q∥2=a2+a2=2 a\lVert q\rVert_2=\sqrt{a^2+a^2}=\sqrt2\,a。

  • D1 的三个词 IDF 全是 aa,模长 3 a\sqrt3\,a,内积 2a22a^2,余弦保持 2a26 a2=2/3≈0.8165\dfrac{2a^2}{\sqrt6\,a^2}=\sqrt{2/3}\approx0.8165。
  • D2 含 1 个常见词(cat)和 2 个稀有词(likes, milk),模长为 a2+2b2\sqrt{a^2+2b^2},D3 含 2 个常见词(eats, fish)和 1 个稀有词(dog),模长为 2a2+b2\sqrt{2a^2+b^2}:
cos⁡(q,D2)=a2(2 a)a2+2b2=a2a2+2b2≈0.1786,\cos(q,D_2)=\frac{a^2}{(\sqrt2\,a)\sqrt{a^2+2b^2}}=\frac{a}{\sqrt2\sqrt{a^2+2b^2}}\approx0.1786,
cos⁡(q,D3)=a2(2 a)2a2+b2=a22a2+b2≈0.2314.\cos(q,D_3)=\frac{a^2}{(\sqrt2\,a)\sqrt{2a^2+b^2}}=\frac{a}{\sqrt2\sqrt{2a^2+b^2}}\approx0.2314.

排序变为 D1 > D3 > D2。虽然 D2 和 D3 与查询匹配的分子都是 a2a^2,但 D2 含有两个高 IDF 的未匹配稀有词,拉大了分母模长 ∥D2∥2\lVert D_2\rVert_2,从而拉低了余弦相似度。

复核要点

查询向量必须沿用文档库统计出的那套词表和 IDF,不能拿查询单独重算一份 IDF。

例2 HMM 词性标注:Viterbi 最优路径与前向总概率

题目。 对双词句子 time flies 做词性标注,状态集合为 {N,V}\{N,V\}。已知起始概率 π=(0.6,0.4)\pi=(0.6,0.4),转移矩阵 A=(0.30.70.80.2)A=\begin{pmatrix}0.3&0.7\\0.8&0.2\end{pmatrix}(行依次为从 N、从 V 出发),发射概率 time 在 (N,V)(N,V) 下为 (0.5,0.1)(0.5,0.1),flies 在 (N,V)(N,V) 下为 (0.1,0.6)(0.1,0.6)。求最可能的词性序列,以及该路径在给定句子下的条件概率 P(t∗∣w1:2)P(t^*\mid w_{1:2})。

解: 1. Viterbi 动态规划求最优路径 第一步(位置 1,time):

δ1(N)=0.6×0.5=0.3,δ1(V)=0.4×0.1=0.04.\delta_1(N)=0.6\times0.5=0.3,\qquad \delta_1(V)=0.4\times0.1=0.04.

第二步(位置 2,flies):

δ2(N)=max⁡(0.3×0.3, 0.04×0.8)×0.1=max⁡(0.09, 0.032)×0.1=0.009(ψ2(N)=N),\delta_2(N)=\max(0.3\times0.3,\ 0.04\times0.8)\times0.1=\max(0.09,\ 0.032)\times0.1=0.009\quad(\psi_2(N)=N),
δ2(V)=max⁡(0.3×0.7, 0.04×0.2)×0.6=max⁡(0.21, 0.008)×0.6=0.126(ψ2(V)=N).\delta_2(V)=\max(0.3\times0.7,\ 0.04\times0.2)\times0.6=\max(0.21,\ 0.008)\times0.6=0.126\quad(\psi_2(V)=N).

因为 δ2(V)=0.126>δ2(N)=0.009\delta_2(V)=0.126>\delta_2(N)=0.009,终点选 VV,沿回溯指针 ψ2(V)=N\psi_2(V)=N 恢复出最优路径为 N → V,其联合概率为 P(N→V,w1:2)=0.126P(N\to V, w_{1:2})=0.126。

2. 前向算法求句子总似然与路径后验 把第二步里的 max⁡\max 换成求和:

α2(N)=(0.09+0.032)×0.1=0.0122,α2(V)=(0.21+0.008)×0.6=0.1308.\alpha_2(N)=(0.09+0.032)\times0.1=0.0122,\qquad \alpha_2(V)=(0.21+0.008)\times0.6=0.1308.

观察序列的总概率为 P(w1:2)=α2(N)+α2(V)=0.0122+0.1308=0.143P(w_{1:2})=\alpha_2(N)+\alpha_2(V)=0.0122+0.1308=0.143。因此,最优路径的条件概率为:

P(N→V∣w1:2)=0.1260.143≈0.8811.P(N\to V\mid w_{1:2})=\frac{0.126}{0.143}\approx0.8811.

复核要点

四条可能路径的联合概率分别为 0.0090.009(N→N)、0.1260.126(N→V)、0.00320.0032(V→N)、0.00480.0048(V→V),四者相加正好等于前向求和结果 0.1430.143。

例3 重复词如何影响多项式朴素贝叶斯的后验概率

题目。 正面训练文档为 good movie、good fun,负面训练文档为 bad movie、bad boring。采用拉普拉斯加一平滑(α=1\alpha=1),求测试文档 good good movie 的预测类别与归一化正面后验概率;若推断时将测试文档中每个词的计数截断为至多 1(即按 good movie 计),结果会怎样变?

解: 词表大小 ∣V∣=5\lvert V\rvert=5,正负两类先验均为 P(+)=P(−)=1/2P(+)=P(-)=1/2,两类总词元数均为 N+=N−=4N_+=N_-=4,平滑分母均为 4+5=94+5=9。查第7章第 3 节表可得:

P(good∣+)=39,P(movie∣+)=29;P(good∣−)=19,P(movie∣−)=29.P(\text{good}\mid +)=\frac39,\quad P(\text{movie}\mid +)=\frac29;\qquad P(\text{good}\mid -)=\frac19,\quad P(\text{movie}\mid -)=\frac29.

对 good good movie(good 出现 2 次):

s+=12(39)229=181,s−=12(19)229=1729.s_+=\frac12\left(\frac39\right)^2\frac29=\frac1{81},\qquad s_-=\frac12\left(\frac19\right)^2\frac29=\frac1{729}.

两类得分之比为 s+:s−=9:1s_+:s_-=9:1,归一化正面后验概率为 99+1=0.9\dfrac{9}{9+1}=0.9。

若将测试文档中重复词的词频截为 1(相当于输入 good movie),得分之比变为 3:13:1,正面后验降为 33+1=0.75\dfrac{3}{3+1}=0.75。需要注意:仅在测试时把词频截成 0/1 仍在使用多项式模型的条件概率;真正的 Bernoulli 朴素贝叶斯在训练阶段就按文档数统计平滑概率,并且会把词表中未出现词的 (1−P(w∣c))(1-P(w\mid c)) 一并乘入似然。

复核要点

多项式模型加一平滑的分母是 Nc+∣V∣=4+5=9N_c+\lvert V\rvert=4+5=9,切勿算成类别文档数加词表大小。

例4 分类指标计算与非对称业务错误代价

题目。 一个二分类工单预警模型在 20 条测试工单上的混淆矩阵为:TP=8, FN=2, FP=4, TN=6TP=8,\ FN=2,\ FP=4,\ TN=6。(a) 求准确率(Accuracy)、精确率(Precision)、召回率(Recall)和 F1F_1;(b) 若每次误报(FP)耗费人工核查成本 1 单位,每次漏报(FN)造成业务损失 5 单位,求当前测试集上的总错误成本与单样本平均成本。

解: (a) 总样本数 N=8+2+4+6=20N=8+2+4+6=20:

Accuracy⁡=8+620=0.7,P=88+4=23,R=88+2=0.8,\operatorname{Accuracy}=\frac{8+6}{20}=0.7,\qquad P=\frac{8}{8+4}=\frac23,\qquad R=\frac{8}{8+2}=0.8,
F1=2PRP+R=2×82×8+4+2=1622=811≈0.7273.F_1=\frac{2PR}{P+R}=\frac{2\times8}{2\times8+4+2}=\frac{16}{22}=\frac8{11}\approx0.7273.

(b) 总错误成本为

Cost=1×FP+5×FN=1×4+5×2=14,\text{Cost}=1\times FP+5\times FN=1\times4+5\times2=14,

平均每条工单的错误成本为 14/20=0.714/20=0.7 成本单位(这里数值上与 Accuracy 都是 0.70.7 只是巧合,量纲完全不同)。如果换一个把阈值调高的模型,使 FP=0, FN=5FP=0,\ FN=5,虽然 Accuracy 升至 15/20=0.7515/20=0.75,但总错误成本会飙升到 5×5=255\times5=25。因此漏报代价高昂的场景不能只看 Accuracy,而应根据验证集上的代价或指定召回率来选定分类阈值。

复核要点

先核对混淆矩阵是“行真实、列预测”还是相反,避免把 FP(真实负、预测正)与 FN(真实正、预测负)的代价系数乘反。

例5 同一对候选句与参考句的 BLEU-2、ROUGE-L 和 METEOR

题目。 参考句为 a cat sits on the mat,候选句为 a cat is on the mat(按空格分词,均含 6 个词)。求:(a) 等权重、未平滑的 BLEU-2;(b) ROUGE-L 的 F1F_1 分数;(c) 仅按精确词形对齐、采用第4章参数(α=0.9, γ=0.5, β=3\alpha=0.9,\ \gamma=0.5,\ \beta=3)的 METEOR 分数。

解: (a) BLEU-2

  • 1-gram:候选句 6 个词中 a, cat, on, the, mat 共 5 个匹配,截断后精确率 p1=5/6p_1=5/6;
  • 2-gram:候选句共 5 个二元组,其中 a cat、on the、the mat 3 个匹配,p2=3/5p_2=3/5;
  • 候选长度 c=6c=6 等于参考长度 r=6r=6,简短惩罚 BP=1BP=1。
BLEU⁡2=1×exp⁡(12ln⁡56+12ln⁡35)=56×35=12≈0.7071.\operatorname{BLEU}_2=1\times\exp\left(\frac12\ln\frac56+\frac12\ln\frac35\right)=\sqrt{\frac56\times\frac35}=\sqrt{\frac12}\approx0.7071.

(b) ROUGE-L 最长公共子序列(LCS)为 a cat on the mat,长度 LCS⁡=5\operatorname{LCS}=5。因此

PL=56,RL=56,F1,L=56≈0.8333.P_L=\frac56,\qquad R_L=\frac56,\qquad F_{1,L}=\frac56\approx0.8333.

(c) METEOR 精确匹配词数 m=5m=5,所以 P=5/6, R=5/6P=5/6,\ R=5/6,调和均值 Fmean=10PRR+9P=56F_{\text{mean}}=\dfrac{10PR}{R+9P}=\dfrac56。 5 个匹配词在两句中分成 a cat 和 on the mat 两个连续块(chunks=2\text{chunks}=2),片段惩罚与最终得分为:

penalty=0.5×(25)3=0.032,METEOR⁡=56×(1−0.032)=56×0.968≈0.8067.\text{penalty}=0.5\times\left(\frac25\right)^3=0.032,\qquad \operatorname{METEOR}=\frac56\times(1-0.032)=\frac56\times0.968\approx0.8067.

复核要点

METEOR 片段惩罚里的分母是匹配词数 m=5m=5,不是整句总长度 66;BLEU 遇到候选句重复词时必须按参考句中的最大出现次数做截断。

例6 非负矩阵分解(NMF)的矩阵维度与解的非唯一性

题目。 设 3 篇文档、4 个词构成的文档—词矩阵为

X=(201002012211).X=\begin{pmatrix}2&0&1&0\\0&2&0&1\\2&2&1&1\end{pmatrix}.

求一组秩 k=2k=2 的精确非负分解 X=WHX=WH,指明 W,HW,H 的尺寸与含义,并说明该分解为何不唯一。

解: 观察到第 3 行恰好等于第 1 行与第 2 行之和,因此可直接取前两行作为两个主题基向量:

W=(100111)∈R+3×2,H=(20100201)∈R+2×4.W=\begin{pmatrix}1&0\\0&1\\1&1\end{pmatrix}\in\mathbb R_+^{3\times2},\qquad H=\begin{pmatrix}2&0&1&0\\0&2&0&1\end{pmatrix}\in\mathbb R_+^{2\times4}.

验证乘积 WH=XWH=X 完全成立。其中 HH 的每一行代表一个主题在 4 个词上的非负权重,而 WW 的第 3 行 (1,1)(1,1) 表示第 3 篇文档由主题 1 和主题 2 各取 1 份叠加而成。

非唯一性: 对任意正对角矩阵 D=diag⁡(d1,d2)D=\operatorname{diag}(d_1,d_2)(d1,d2>0d_1,d_2>0),令 W′=WDW'=WD、H′=D−1HH'=D^{-1}H,例如把 WW 第一列乘 2、同时把 HH 第一行除以 2,仍有 W′H′=WH=XW'H'=WH=X;此外,将 WW 的两列与 HH 的两行同时对调(置换主题编号),乘积也完全不变。

复核要点

NMF 只要求元素非负,不要求行和为 1;若为方便展示而对 HH 的行做归一化,记得把对应缩放因子同步乘到 WW 的列上。

例7 K-Means 一步迭代与模糊 C 均值(FCM)隶属度对比

题目。 (a) 一维点集为 {0,2,8,10}\{0,2,8,10\},取 K=2K=2、初始中心 μ1=0, μ2=8\mu_1=0,\ \mu_2=8,完成一轮 K-Means 的指派与中心更新,计算更新前后的平方误差和 JJ;(b) 若在 FCM 中取模糊指数 m=2m=2、当前中心为 μ1=0, μ2=10\mu_1=0,\ \mu_2=10,求点 x=2x=2 对两个簇的隶属度。

解: (a) K-Means

  • 指派:0,20,2 离 00 更近,归入簇 1;8,108,10 离 88 更近,归入簇 2。此时 Jold=(0−0)2+(2−0)2+(8−8)2+(10−8)2=8J_{\text{old}}=(0-0)^2+(2-0)^2+(8-8)^2+(10-8)^2=8。
  • 更新中心:μ1new=(0+2)/2=1\mu_1^{\text{new}}=(0+2)/2=1,μ2new=(8+10)/2=9\mu_2^{\text{new}}=(8+10)/2=9。
  • 更新后平方误差和:Jnew=(0−1)2+(2−1)2+(8−9)2+(10−9)2=4<8J_{\text{new}}=(0-1)^2+(2-1)^2+(8-9)^2+(10-9)^2=4<8。

(b) FCM 隶属度 点 x=2x=2 到 μ1=0\mu_1=0 和 μ2=10\mu_2=10 的距离分别为 d1=2, d2=8d_1=2,\ d_2=8。当 m=2m=2 时指数 2/(m−1)=22/(m-1)=2:

u1=1(2/2)2+(2/8)2=11+1/16=1617,u2=1(8/2)2+(8/8)2=116+1=117.u_1=\frac{1}{(2/2)^2+(2/8)^2}=\frac{1}{1+1/16}=\frac{16}{17},\qquad u_2=\frac{1}{(8/2)^2+(8/8)^2}=\frac{1}{16+1}=\frac{1}{17}.

复核要点

K-Means 给每个样本赋 0/1 硬指派,中心是簇内样本的算术平均;FCM 给每个样本赋连续隶属度 uik∈[0,1]u_{ik}\in[0,1],中心是全体样本按 uikmu_{ik}^m 加权的均值。

例8 LSTM 前向状态更新与 Adam 参数更新的层次区分

题目。 (a) 一维 LSTM 在某时间步的旧细胞状态为 ct−1=0.5c_{t-1}=0.5,门与候选值为 ft=0.8, it=0.25, gt=0.4, ot=0.6f_t=0.8,\ i_t=0.25,\ g_t=0.4,\ o_t=0.6,求新细胞状态 ctc_t 与隐藏输出 hth_t;(b) 某标量模型参数初始值 θ0=2\theta_0=2,使用 Adam(β1=0.9, β2=0.999, η=0.1\beta_1=0.9,\ \beta_2=0.999,\ \eta=0.1,忽略 ϵ\epsilon)训练,第一步梯度 g1=2g_1=2,求更新后的参数 θ1\theta_1。

解: (a) LSTM 前向更新(样本序列内部的状态传递)

ct=ftct−1+itgt=0.8×0.5+0.25×0.4=0.5,ht=ottanh⁡(ct)=0.6×tanh⁡(0.5)≈0.2773.c_t=f_tc_{t-1}+i_tg_t=0.8\times0.5+0.25\times0.4=0.5,\qquad h_t=o_t\tanh(c_t)=0.6\times\tanh(0.5)\approx0.2773.

(b) Adam 第一步更新(跨训练步的模型参数优化) 初始动量 m0=v0=0m_0=v_0=0:

m1=(1−0.9)×2=0.2,v1=(1−0.999)×22=0.004,m_1=(1-0.9)\times2=0.2,\qquad v_1=(1-0.999)\times2^2=0.004,

偏差校正后:

m^1=0.21−0.91=2,v^1=0.0041−0.9991=4,\widehat m_1=\frac{0.2}{1-0.9^1}=2,\qquad \widehat v_1=\frac{0.004}{1-0.999^1}=4,

参数更新:

θ1=θ0−ηm^1v^1=2−0.1×24=1.9.\theta_1=\theta_0-\eta\frac{\widehat m_1}{\sqrt{\widehat v_1}}=2-0.1\times\frac{2}{\sqrt4}=1.9.

这两组滑动更新处在不同层次:LSTM 的 (ct,ht)(c_t,h_t) 是在单条句子前向传播时按词元位置更新的激活状态,推断时同样按步递推;Adam 的 (mt,vt)(m_t,v_t) 是在训练阶段按 batch 统计梯度历史来更新模型权重 θ\theta,推断时权重与优化器状态均不再变化。

复核要点

LSTM 算 hth_t 时别漏掉对 ctc_t 先取 tanh⁡\tanh;Adam 算第一步更新时别漏掉分母开方 v^1\sqrt{\widehat v_1} 和偏差校正。

例9 设计无数据泄漏的文本分类评估与分组验证方案

题目。 现有 1000 条标注文本,计划在 6 组 TF-IDF + 线性 SVM 超参数配置中选优并报告泛化性能,要求留出 20% 样本作为最终测试集、其余做 5 折交叉验证。(a) 写出完整实验步骤与模型训练次数;(b) 若这 1000 条样本是由 120 篇长报告切分成的段落,划分方案应如何修改?

解: (a) 独立样本的标准流程

  1. 锁存测试集:按分层抽样先切出 200 条作为最终测试集,在超参数选定前绝不读取测试集词频或评估分数。
  2. 折内独立拟合:将剩余 800 条开发集分为 5 折(每折 160 条)。对每一种超参数配置、在每一折验证中,仅用当前 640 条训练折拟合分词词表、IDF 权重和线性 SVM,再转换并预测对应的 160 条验证折。
  3. 选优与重训:6 组配置 ×\times 5 折共执行 3030 次训练。按预定的验证集平均指标(如 macro-F1)选出最佳配置后,在全部 800 条开发集上重新拟合一次 TF-IDF + SVM(第 31 次训练)。
  4. 单次最终测试:用这第 31 次训出的模型转换并预测 200 条测试集,报告测试集混淆矩阵、分类指标与典型错误样本。

(b) 长报告切片数据的分组隔离 来自同一篇长报告的多个段落共享专有名词、行文句式和背景上下文,若随机分折,同一篇报告的段落会同时落入训练折和验证折,造成近重复泄漏(验证分数虚高)。此时无论是第一步切测试集,还是第二步做 5 折交叉验证,都必须按原始报告 ID 做分组划分(Group Split / GroupKFold),确保同一篇报告切出的所有段落要么全在训练集、要么全在验证/测试集。

复核要点

即使预处理只用到无标签文本(如统计 IDF 或训练 SVD),只要把验证集/测试集混进去一起统计,就已经发生了特征泄漏。

总结:做完文本建模与手算题后的四步自检

  1. 查数据边界:测试集是否彻底隔离?词表、IDF、降维矩阵是否在训练折内部拟合?双向模型是否误用了未来时刻的词元?
  2. 查矩阵与表格方向:文档—词矩阵是 D×VD\times V 还是 V×DV\times D?混淆矩阵是“行真实、列预测”还是相反?
  3. 查归一化与分母:朴素贝叶斯平滑分母用的是词元总数 Nc+α∣V∣N_c+\alpha\lvert V\rvert 还是文档数?METEOR 惩罚分母用的是匹配词数 mm 吗?Adam 做了偏差校正和分母开方吗?
  4. 查数值合理性:概率分布各项之和是否等于 1?余弦相似度是否落在 [−1,1][-1,1]?K-Means 更新一步后目标函数 JJ 是否单调不增?