公司要招聘一名“语言理解专员”——这个职位不是人,而是 AI 模型里的词向量。HR 老张收到的简历上,每位候选人都写着“精通语义理解”,但他知道,光看简历无从判断谁真的靠谱。于是老张设计了两套考核:笔试,直接考候选人的词汇知识和逻辑推理,不问出身;试用期,把候选人扔进真实业务里,看文本分类、信息抽取这些实际任务能不能扛下来。在 NLP 世界,这两套考核正是词向量评估的两大流派——内在评估与外在评估。内在评估用词相似度、词类比直接“考”向量本身;外在评估则把向量送进下游任务看“实战表现”。这篇文章将带你从头到尾走一遍老张的招聘流程,搞懂两种评估方式如何运作、各有什么优劣势,以及实践中如何组合使用,让你在模型选型时不再拍脑袋。

岗位关联

掌握内在与外在双轨评估法,你就能像资深 HR 一样快速识别词向量的真实水平,为 NLP 项目选型提供科学依据,少走弯路。

目录
  1. 可视化演示
  2. 认识评估标尺
  3. 内在评估逻辑
  4. 词相似度任务
  5. 词类比任务
  6. 外在评估方法
  7. 优缺点对照
  8. 组合评估实践
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示递归函数factorial(5)的调用栈 push/pop 过程,包括递进调用、基线条件和回归展开三个阶段的动态演示。

本节配有交互动效(进入视口后自动加载,约 3KB)。

递归调用阶段 紫色为等待返回的栈帧 红色为基线条件帧 绿色为已完成计算的帧 f(n)=n*f(n-1) 递归通过调用栈逐层压入,到达基线后逐层弹出并计算返回值。

认识评估标尺

招聘专员老张第一天上岗,面前堆着厚厚一摞候选人简历。他明白,招人不能凭眼缘,得先有一套统一的标尺:没尺子,既没法横向比较候选人,也没法复盘自己是不是看走了眼。词向量评估的道理一模一样——模型训练完,总不能凭“感觉它挺聪明”就上线,必须用标准化的测量方法回答三个问题:向量到底编码了语义没有?比别的候选向量好在哪里?换到真实任务里还行不行?

按照考核方式的不同,评估被分成内在评估与外在评估两大类。内在评估直接对向量做“体检”,用词相似度、词类比这类任务当场打分,不经过任何下游模型,相当于笔试直接考候选人本人。外在评估则把向量接进文本分类、命名实体识别等真实下游任务,用任务表现间接反映向量质量,相当于试用期看实际产出。

两条路线共享同一个底层工具:余弦相似度。在向量空间里,每个词是一根从原点射出的箭,两个词的语义距离可以用箭与箭之间的夹角衡量,夹角越小越相似。几乎所有内在评估的打分,都建立在这把“量角器”之上。

有了这把量角器,老张的笔试正式开工。他设计了第一道题:“词汇亲近度问答”,测测候选人对词与词之间关系的感知——这正是下一节的词相似度任务。

CosSim(a⃗,b⃗)=a⃗⋅b⃗∥a⃗∥2⋅∥b⃗∥2=cos⁡θa⃗,b⃗\displaystyle \text{CosSim}(\vec{a}, \vec{b}) = \frac{\vec{a} \cdot \vec{b}}{\|\vec{a}\|_2 \cdot \|\vec{b}\|_2} = \cos \theta_{\vec{a}, \vec{b}}
通俗说明:两个词的向量在空间中就像两根从原点射出的箭,余弦相似度就是测量这两根箭夹角大小的“量角器”,夹角越小越相似。
  1. 分子点积把两个向量逐维相乘再求和,得到方向一致性的原始度量。
    a⃗⋅b⃗=∑i=1daibi\displaystyle \vec{a} \cdot \vec{b} = \sum_{i=1}^{d} a_i b_i
  2. 分母范数分别求两个向量的 L2 长度,用于归一化。
    ∥a⃗∥2=∑i=1dai2\displaystyle \|\vec{a}\|_2 = \sqrt{\sum_{i=1}^{d} a_i^2}
  3. 合并为余弦点积除以长度乘积,得到夹角余弦值,范围落在 [-1, 1]。
    cos⁡θa⃗,b⃗=a⃗⋅b⃗∥a⃗∥2⋅∥b⃗∥2\displaystyle \cos \theta_{\vec{a},\vec{b}} = \frac{\vec{a} \cdot \vec{b}}{\|\vec{a}\|_2 \cdot \|\vec{b}\|_2}

内在评估逻辑

笔试的第一步是确定“考什么、怎么判”。老张没有去查候选人上过哪所名校(对应词向量来自哪个知名模型),而是把候选人本人请进考场:给你一对词,凭直觉说说它们亲不亲近。判卷标准也不是老张自己拍脑袋,而是参考专家组事先给出的标准答案——谁能答得更贴近专家共识,谁就得分高。

技术对应:内在评估直接在词向量上构造测试集,测试集由人工标注的金标准构成。机器用余弦相似度等公式给每个词对打一个预测分,然后用统计相关性把“机器打分序列”与“人类打分序列”对齐比较:两者越同步,说明向量内部蕴含的语义与人类认知越吻合,向量质量越高。

常用的相关性指标有两个:皮尔森相关假设线性关系、适合数值分布较规整的数据;斯皮尔曼等级相关只关心排序,更稳健。选择哪一个,取决于你对“打分尺度公平性”的假设。无论选哪个,内在评估都有一个共同特征:它测的是词向量对语义关系的直接编码能力,一旦向量被接进复杂模型,内在高分并不能保证下游表现随之优秀。

老张在批改记录上写下一行备注:笔试的优点立竿见影——便宜、标准、当场出结果;但它的视野只停留在“知识存量”,考得好不等于能干活。带着这份谨慎,他继续出题。

ρ=∑i=1n(pi−pˉ)(gi−gˉ)∑i=1n(pi−pˉ)2⋅∑i=1n(gi−gˉ)2\displaystyle \rho = \frac{\sum_{i=1}^{n}(p_i - \bar{p})(g_i - \bar{g})}{\sqrt{\sum_{i=1}^{n}(p_i - \bar{p})^2} \cdot \sqrt{\sum_{i=1}^{n}(g_i - \bar{g})^2}}
通俗说明:把机器打分和人工打分看作两列数据,皮尔森相关衡量它们“一起升高、一起降低”的同步程度,取值在 -1 到 1 之间。
  1. 分子协方差对每对打分减去各自均值后相乘求和,体现同步升降。
    Cov(p,g)=∑i=1n(pi−pˉ)(gi−gˉ)\displaystyle \text{Cov}(p, g) = \sum_{i=1}^{n}(p_i - \bar{p})(g_i - \bar{g})
  2. 分母波动乘积两个标准差相乘作为归一化因子。
    σp⋅σg=∑i=1n(pi−pˉ)2⋅∑i=1n(gi−gˉ)2\displaystyle \sigma_p \cdot \sigma_g = \sqrt{\sum_{i=1}^{n}(p_i - \bar{p})^2} \cdot \sqrt{\sum_{i=1}^{n}(g_i - \bar{g})^2}
  3. 合成系数协方差除以波动乘积,得到无量纲的线性相关性。
    ρ=Cov(p,g)σp σg\displaystyle \rho = \frac{\text{Cov}(p, g)}{\sigma_p \, \sigma_g}

词相似度任务

第一道笔试题是“词汇亲近度问答”。老张给出几组词对:(猫,狗)、(国王,女王)、(猫,汽车),请候选人分别打一个 0 到 10 的亲近分。专家组事先给好了参考分:猫和狗 8 分,国王和女王 5 分,猫和汽车 1 分。阅卷时,老张并不要求分数完全相等,而是看排序是否一致——毕竟有的人下手松、有的人手下紧,但“猫狗亲近、猫车疏远”的相对感觉应该一致。

技术对应:这就是词相似度评估(word similarity)。标准流程分三步:选一个公开数据集(如 WordSim-353、SimLex-999),其中每个词对都带有人工评分的金标准;用余弦相似度计算每个词对在向量空间中的相似度,得到机器分;用斯皮尔曼等级相关计算机器分与人工分的排序一致性,作为最终得分。

斯皮尔曼相关把两组分数各自转成排名,再对排名做皮尔森相关。它不要求打分分布近似正态,也不在乎分数的绝对尺度,只看相对顺序——恰好契合“亲近分”这种主观打分场景,因此成为词相似度任务最常用的指标。需要记住:这里评估的不是某个词对单独答得对不对,而是整组词对的排序跟人类的排序像不像。

老张快速扫完亲近度答卷,一批“对语义关系毫无感觉”的候选人当场出局。但他心里明白,光测亲近感还不够——语言能力还包括逻辑推理。于是,第二道题“关系类比推理”紧接着下发。

ρs=1−6∑i=1ndi2n(n2−1)\displaystyle \rho_s = 1 - \frac{6 \sum_{i=1}^{n} d_i^2}{n(n^2 - 1)}
通俗说明:把两组分数各自排名,看排名是否一致;d 是每个词对在两组排名中的名次差。完全一致时等于 1。
  1. 排名转换将两组打分各自转为名次,得到 rank(p) 与 rank(g)。
    di=rank(pi)−rank(gi)\displaystyle d_i = \text{rank}(p_i) - \text{rank}(g_i)
  2. 名次差平方和全部名次差平方后求和,放大偏差。
    ∑i=1ndi2\displaystyle \sum_{i=1}^{n} d_i^2
  3. 归一项除以 n(n²-1) 并乘 6,把结果压缩到标准区间。
    6n(n2−1)\displaystyle \frac{6}{n(n^2 - 1)}
  4. 补全相关用 1 减去该值,得到排名一致性指标。
    ρs=1−6∑i=1ndi2n(n2−1)\displaystyle \rho_s = 1 - \frac{6 \sum_{i=1}^{n} d_i^2}{n(n^2 - 1)}

词类比任务

第二道笔试是逻辑推理:“国王之于男人,就像女王之于____?”候选人不需要背答案,而要抓住“国王→男人”背后隐藏的关系——去除男性性别、保留王室身份——再把这层关系迁移到“女王”身上。真正懂语言的人(和向量)应该能推出:空处是“女人”。

技术对应:这就是词类比评估(word analogy),最经典的例子是 king - man + woman ≈ queen。它检验词向量的“算术性质”:如果向量空间正确编码了语义,那么同类关系对应的向量差应当大致相等。具体流程是:对测试集中的每个类比问题,用向量加减构造预测向量,再在词表中找与预测向量余弦相似度最高的词,命中目标词即为答对。

常用数据集包括 Google Analogy(分语义类比与语法类比两大类)和 BATS(更细粒度)。最终指标是命中率(accuracy):命中次数除以总题数。评测要警惕两类陷阱:一是候选词表里恰好只有目标词“沾边”,命中纯属侥幸;二是高频词天然容易被选中,导致评估虚高。因此报告命中率时通常要说明词表与过滤策略。

两道笔试下来,老张对候选人的内在功底有了清晰画像。可他还留着一丝疑虑:笔试高分的人,到了真实岗位能扛住业务吗?有没有“高分低能”的风险?他决定,把通过笔试的候选人全部送进试用期——用真实任务见真章。

w⃗queen≈w⃗king−w⃗man+w⃗woman\displaystyle \vec{w}_{\text{queen}} \approx \vec{w}_{\text{king}} - \vec{w}_{\text{man}} + \vec{w}_{\text{woman}}
通俗说明:把“国王”向量减去“男人”向量得到“去性别化的王室”这个方向,再往“女人”上加上这个方向,期望落在“女王”附近。
  1. 关系方向提取国王向量减男人向量,得到“去除男性特征”的语义方向。
    d⃗=w⃗king−w⃗man\displaystyle \vec{d} = \vec{w}_{\text{king}} - \vec{w}_{\text{man}}
  2. 关系迁移把这个方向加到“女人”向量上,得到预测位置。
    v⃗pred=w⃗woman+d⃗\displaystyle \vec{v}_{\text{pred}} = \vec{w}_{\text{woman}} + \vec{d}
  3. 约等目标期望预测位置落在“女王”附近。
    v⃗pred≈w⃗queen\displaystyle \vec{v}_{\text{pred}} \approx \vec{w}_{\text{queen}}
  4. 最近邻判定在词表中搜索与预测向量余弦最接近的词作为答案。
    w^=arg⁡max⁡w∈V CosSim(v⃗pred,w⃗)\displaystyle \hat{w} = \arg\max_{w \in V} \, \text{CosSim}(\vec{v}_{\text{pred}}, \vec{w})
  5. 命中率汇总命中目标词记 1,除以总题数得到最终指标。
    Accanalogy=1N∑i=1NI(w^i=wi∗)\displaystyle \text{Acc}_{\text{analogy}} = \frac{1}{N} \sum_{i=1}^{N} \mathbb{I}(\hat{w}_i = w_i^{*})

外在评估方法

试用期没有试卷,只有任务。老张把候选人安排到客服中心:把顾客留言自动归入投诉、咨询、退款等类别;再派到法务部:从合同里抽取公司名、日期、金额等关键实体。这些活儿干得好不好,直接决定候选人能否转正——毕竟公司真正要的不是考试机器,而是生产力。

技术对应:外在评估(extrinsic evaluation)把词向量作为下游 NLP 模型的输入特征,通过下游任务性能间接衡量词向量质量。常见任务包括文本分类、情感分析、命名实体识别(NER)、文本相似度、机器翻译等。流程是:固定词向量(或允许微调),训练下游模型,在标准测试集上报告准确率、F1、AUC 等指标。

外在评估是典型的“黑盒验收”:它不关心向量内部长什么样,只关心最终任务指标。优点显而易见——信息量最大、贴近真实场景、业务方买账;缺点同样突出——每个任务都要训练模型,时间和算力成本高;结果高度依赖任务与模型结构;一旦指标不理想,很难分辨是词向量的锅还是下游模型的锅。

试用期结束,老张发现一个反直觉的事实:有位笔试成绩平平的候选人,试用期却异常能干;反之也有人笔试惊艳、上手就垮。他陷入沉思:笔试和试用期,到底哪个更能代表真实水平?深夜复盘时,他画出了一张对照表。

Acc=1N∑i=1NI(y^i=yi)\displaystyle \text{Acc} = \frac{1}{N} \sum_{i=1}^{N} \mathbb{I}(\hat{y}_i = y_i)
通俗说明:总共 N 个测试样本,预测对的个数占比。正确预测计 1,错误计 0,求平均。
  1. 指示函数预测标签等于真实标签时计 1,否则计 0。
    I(y^i=yi)\displaystyle \mathbb{I}(\hat{y}_i = y_i)
  2. 正确数求和把全部测试样本的正确判定累加。
    ∑i=1NI(y^i=yi)\displaystyle \sum_{i=1}^{N} \mathbb{I}(\hat{y}_i = y_i)
  3. 归一化比例除以样本总数,得到 0 到 1 的正确率。
    Acc=正确数N\displaystyle \text{Acc} = \frac{\text{正确数}}{N}
  4. F1 扩展类别不平衡时,用精确率与召回率的调和平均替代。
    F1=2PRP+R\displaystyle \text{F1} = \frac{2PR}{P + R}

优缺点对照

老张把两种考核的利弊摊在桌面上,像摆开一张体检报告。笔试的优点一条条列出来:标准化出题、成本几乎为零、当场出分、可以精确复现——某个候选人到底输在词汇量还是逻辑上,看单项得分一目了然。但笔试的雷区也在:标准答案来自“一般场景”,一旦岗位特殊,笔试高分可能毫无意义——高分低能屡见不鲜。

技术对应:内在评估的优势集中在“快、省、透”——在预训练向量上几分钟即可完成,无需训练任何下游模型,还能精确定位语义缺陷的类型。局限是它测的是“静态语义编码”,与下游任务表现的相关系数并不总是很高:一个在相似度上接近满分的向量,在文本分类上可能表现平平。

外在评估则走另一极端:只看真实任务表现,信息量最大、最有说服力。但代价是:每换一个任务就要训练一套下游模型;结果依赖任务选择和模型结构;反馈链路长,出了问题难以归因。学术界实证发现,内在分数与外在表现的相关系数通常中等偏弱——这正是“笔试”与“试用期”之间的鸿沟。

老张在对照表末尾写了一行字:笔试管海选,试用管终选,两者不是替代关系,而是上下游关系。他决定把两套方法组装成一条流水线——这正是最后一节要讲的组合评估实践。

rio=corr(Scoreintrinsic,Accextrinsic)\displaystyle r_{io} = \mathrm{corr}\big(\text{Score}_{\text{intrinsic}}, \text{Acc}_{\text{extrinsic}}\big)
通俗说明:r 接近 1 表示“内在考得好、外在表现也好”;r 明显偏低,说明两套考核的结果脱节,出现高分低能或低分高能。
  1. 两组数据来源同一批词向量的内在得分与外在准确率。
    Sin={s1,…,sm},Aout={a1,…,am}\displaystyle S_{\text{in}} = \{s_1, \dots, s_m\}, \quad A_{\text{out}} = \{a_1, \dots, a_m\}
  2. 相关计算求两组数据的皮尔森相关,衡量同步程度。
    rio=Cov(Sin,Aout)σSin σAout\displaystyle r_{io} = \frac{\text{Cov}(S_{\text{in}}, A_{\text{out}})}{\sigma_{S_{\text{in}}} \, \sigma_{A_{\text{out}}}}
  3. 解读分界接近 1 表示内外一致,明显偏低说明两者脱节。
    rio→1 内外一致;rio≪1 高分低能或低分高能\displaystyle r_{io} \to 1 \text{ 内外一致} \quad ; \quad r_{io} \ll 1 \text{ 高分低能或低分高能}

组合评估实践

老张打磨出一套标准的招聘 SOP:第一轮笔试海选,把明显不合格的候选人快速筛掉,成本低、速度快;第二轮试用期终选,对通过笔试的少数候选人做真实任务检验。岗位不同,权重也灵活调整——招语义词典编纂员,笔试比重上调;招一线客服,试用期表现才是硬通货。

技术对应:工程实践中的组合评估遵循同样的“漏斗逻辑”。第一步,用内在评估(词相似度 + 词类比)在多个候选词向量上快速筛查,剔除语义质量明显不达标的选项——这一步几乎没有计算成本。第二步,对通过筛查的少数候选向量,在下游任务上做端到端对比,用真实指标做最终决策。筛选比例和权重可以根据预算灵活设置。

几个实践要点值得记住:测试集必须与目标领域匹配——金融语料训出的向量,拿医疗领域词对评估就失去了意义;类比任务的词表要过滤掉目标词与高频干扰词;外在对比时要固定下游模型结构,保证控制变量;最终结论最好看多任务平均,而不是被单一指标绑架。科学选型的本质,是把“我觉得行”变成“数据显示行”。

如今的老张,再也不会为“哪个词向量更好”失眠。每份评估报告都清楚地写着笔试成绩、试用期表现和综合结论。词向量评估的终极意义就在这里:让模型选型从玄学变成科学——这正是每一位 NLP 工程师都该练就的基本功。

Eval=α⋅Norm(Sin)+β⋅Norm(Aout),α+β=1\displaystyle \text{Eval} = \alpha \cdot \text{Norm}(S_{\text{in}}) + \beta \cdot \text{Norm}(A_{\text{out}}), \quad \alpha + \beta = 1
通俗说明:把内在、外在得分分别归一化到相同量纲,再按权重加权,得到最终选型分数。
  1. 归一化把不同量纲的分数压到 0 到 1。
    Norm(x)=x−xmin⁡xmax⁡−xmin⁡\displaystyle \text{Norm}(x) = \frac{x - x_{\min}}{x_{\max} - x_{\min}}
  2. 权重约束两路信号的权重之和为 1。
    α+β=1\displaystyle \alpha + \beta = 1
  3. 加权融合按权重合成最终评分。
    Eval=α⋅Sin∗+β⋅Aout∗\displaystyle \text{Eval} = \alpha \cdot S_{\text{in}}^{*} + \beta \cdot A_{\text{out}}^{*}
  4. 选型决策比较所有候选向量,取综合分最高者。
    v∗=arg⁡max⁡v∈V Eval(v)\displaystyle v^{*} = \arg\max_{v \in V} \, \text{Eval}(v)

AI 应用场景

预训练词向量选型(模型库对比筛查)

阶段:模型选型与评估

解决的问题:NLP 工程师手里有多个预训练词向量(Word2Vec、GloVe、fastText 的多个版本),每个都号称“擅长语义理解”。逐一下游训练对比既慢又贵。借鉴“笔试海选”的思路:先用词相似度与词类比内在测试快速筛查,把语义质量垫底的向量直接淘汰,只对幸存者做下游验证,把两周的选型工时压缩到三天。

具体案例:某金融舆情团队的候选词向量在公开相似度集上相关性相近,但金融领域词对(“涨停—上涨”)的内在测试拉开差距;结合新闻分类任务的最终对比,团队用两份报告完成了选型。

词向量更新回归测试(模型监控)

阶段:模型迭代与质量保障

解决的问题:词向量重训后不能确定质量是否回退,全量下游回归成本高。把词相似度与类比任务做成自动化测试套件,在 CI 流水线里每次更新后跑一遍,相关性跌破阈值自动阻断上线,还能定位退化类型是词汇覆盖不足还是关系推理变弱。

具体案例:推荐系统团队每月重训用户画像词向量,自动运行 SimLex-999 相关性与语法类比集测试,某次迭代类比命中率从 71% 跌到 62%,CI 拦截后定位到负采样参数改动,回滚后恢复。

研究论文全面评估(对比实验)

阶段:研究实验与评测

解决的问题:提出新词向量方法的论文需要在统一标准下公平对比。先内在后外在的组合报告既能展示“向量本身语义质量”,又能展示“实际任务可迁移性”,结论更有说服力。

具体案例:一篇关于增强领域词向量的论文,用 5 个内在数据集 + 3 个下游任务(情感分析、NER、句子相似度)交叉验证,实验表格同时报告 Spearman 相关与 F1,审稿人认可度明显提升。

Python 演示

python115 行
# -*- coding: utf-8 -*-"""Word vector evaluation demo: intrinsic + extrinsic tasks"""import math # 手工构造 6 个玩具词向量, 模拟训练好的词向量VEC = {    "king":  [0.90, 0.80, 0.10, 0.20],    "man":   [0.50, 0.20, 0.10, 0.80],    "woman": [0.50, 0.30, 0.90, 0.10],    "queen": [0.90, 0.70, 0.80, 0.20],    "cat":   [0.20, 0.10, 0.80, 0.90],    "dog":   [0.30, 0.20, 0.70, 0.80],}  def dot(a, b):    return sum(x * y for x, y in zip(a, b))  def norm(v):    return math.sqrt(dot(v, v))  def cos_sim(a, b):    da, db = norm(a), norm(b)    return dot(a, b) / (da * db) if da and db else 0.0  def vec_add(a, b):    return [a[i] + b[i] for i in range(len(a))]  def vec_sub(a, b):    return [a[i] - b[i] for i in range(len(a))]  def rank(vals):    order = sorted(range(len(vals)), key=lambda i: vals[i])    r = [0] * len(vals)    for pos, idx in enumerate(order):        r[idx] = pos + 1    return r  def spearman(xs, ys):    rx, ry = rank(xs), rank(ys)    n = len(xs)    mx, my = sum(rx) / n, sum(ry) / n    num = sum((rx[i] - mx) * (ry[i] - my) for i in range(n))    den = math.sqrt(sum((rx[i] - mx) ** 2 for i in range(n)) *                    sum((ry[i] - my) ** 2 for i in range(n)))    return num / den if den else 0.0  def nearest(query, vocab, exclude):    best_w, best_s = None, -1.0    for w, v in vocab.items():        if w in exclude:            continue        s = cos_sim(query, v)        if s > best_s:            best_w, best_s = w, s    return best_w  def eval_similarity():    pairs = [("cat", "dog"), ("king", "queen"), ("man", "woman"), ("cat", "king")]    gold = [8.0, 5.0, 7.0, 1.0]    pred = [cos_sim(VEC[a], VEC[b]) for a, b in pairs]    rho = spearman(gold, pred)    print("[词相似度] 预测分:", [round(p, 3) for p in pred])    print("[词相似度] 与人工打分斯皮尔曼相关: %.3f" % rho)    return rho  def eval_analogy():    query = vec_add(vec_sub(VEC["king"], VEC["man"]), VEC["woman"])    hit = nearest(query, VEC, {"king", "man", "woman"})    print("[词类比] 预测:", hit, "期望: queen", "命中" if hit == "queen" else "未命中")    return hit == "queen"  def eval_downstream():    train = {"king": "royal", "cat": "pet", "man": "human"}    test = {"queen": "royal", "dog": "pet", "woman": "human"}    centroids = {}    counts = {}    for w, label in train.items():        if label not in centroids:            centroids[label] = [0.0] * len(VEC[w])            counts[label] = 0        for i in range(len(VEC[w])):            centroids[label][i] += VEC[w][i]        counts[label] += 1    for label in centroids:        for i in range(len(centroids[label])):            centroids[label][i] /= counts[label]    correct = 0    for w, label in test.items():        guess = min(centroids, key=lambda k: -cos_sim(VEC[w], centroids[k]))        correct += (guess == label)    acc = correct / len(test)    print("[外在评估] 三分类准确率: %.3f" % acc)    return acc  def main():    print("=== 词向量双轨评估演示 ===")    eval_similarity()    eval_analogy()    eval_downstream()  if __name__ == "__main__":    main()
目的:用 6 个玩具词向量完整演示内在评估(词相似度 + 词类比)与外在评估(下游三分类)的流程,输出相关性、命中率与准确率三项指标。
  1. VEC = {...}手工构造玩具词向量,模拟训练好的向量,省去真实语料训练的开销
  2. return dot(a, b) / (da * db) if da and db else 0.0余弦相似度,即“量角器”,衡量两个向量方向的接近程度
  3. pred = [cos_sim(VEC[a], VEC[b]) for a, b in pairs]用余弦相似度给每对词打“亲近分”,得到机器打分序列
  4. rho = spearman(gold, pred)把机器打分与人工金标准做斯皮尔曼相关,检验排序一致性
  5. query = vec_add(vec_sub(VEC["king"], VEC["man"]), VEC["woman"])词类比的核心向量算术,把“国王—男人”方向迁移到“女人”上
  6. hit = nearest(query, VEC, {"king", "man", "woman"})在词表中找与预测向量最接近的词,命中目标词即答对
  7. centroids[label] = [0.0] * len(VEC[w])为每个下游类别初始化质心,模拟训练下游模型的参数
  8. guess = min(centroids, key=lambda k: -cos_sim(VEC[w], centroids[k]))最近质心分类:把测试词分给向量距离最近的类别
  9. acc = correct / len(test)计算下游任务准确率,作为外在评估的最终指标

常见误区

误区词向量在词相似度上拿了高分,我就大胆上线了,结果下游文本分类效果很差。我觉得内在分数是“硬指标”,分数高应该万事大吉。

正解内在评估测的是“静态语义编码”,与下游表现的相关系数通常中等偏弱。下游任务还受模型结构、训练数据、任务类型影响——就像笔试满分的候选人,试用期可能完全不能干活。内在评估适合当“筛子”,不适合当“定论”。

为何常见:因为内在评估直观、便宜,人天然倾向于把“分数高”等同于“能力强”,忽略了它只覆盖了语义质量的一个侧面。

误区词相似度任务很简单,把词对的向量余弦算出来,分数高就说明向量质量好,不用管别的。

正解评估的关键不是机器分本身有多高,而是机器分的排序与人工金标准排序有多一致。就像笔试题目本身不是答案,与标准答案的吻合度才是评分依据。一个向量的余弦分整体偏高但排序混乱,相关分照样很低。

为何常见:因为余弦相似度是显眼的“主角”,容易让人忽略“一致性比对”才是评估的灵魂。

误区我把 Word2Vec 算出的“猫—狗”余弦 0.9,和另一个模型的 0.7 直接比较,认为前者语义质量更高。

正解不同模型的向量空间分布、维度、训练数据都不同,余弦绝对值没有可比性。就像不同考试的满分不同,不能拿笔试总分直接比。评估应限定在同分布内部,先归一化或只用排序相关。

为何常见:因为数值直观、拿来即用,大家容易忽略“分布漂移”对绝对数值的污染。

误区词类比命中率接近满分,我觉得这个向量已经完美了,连调都不用调。

正解部分命中可能是“词表里本就没几个候选词”或“高频词天然占优”造成的巧合,而不是真正的语义推理能力。评估时要过滤目标词与高频干扰词,并结合多任务交叉验证,就像候选人碰巧考前押中题,不代表真实水平。

为何常见:因为命中率结果漂亮,人很容易被“高数字”说服,而忽略评估条件是否公平。

误区下游任务我都用准确率来比,哪个准确率高就选哪个词向量,简单省事。

正解类别不平衡时准确率会虚高(比如 99% 都判成多数类)。正确做法是结合 F1、AUC 等多指标,并在同类任务上取平均,同时固定下游模型结构保证控制变量。就像销售额高不代表利润高,要看多维财务指标。

为何常见:准确率是最“出镜率”高的指标,工程师容易图省事只看单一数字。

面试题

Q1. 下列哪些属于内在评估任务?

多选题 · easy

  • A.词相似度评估任务← 正确答案
  • B.词类比推理评估任务← 正确答案
  • C.文本分类评估任务
  • D.命名实体识别评估

答案:AB。内在评估直接考词向量本身的语义编码能力,词相似度(问“两词多亲近”)与词类比(问“关系推理”)都只依赖向量本身,属于“笔试”范畴。文本分类、NER 需要训练下游模型才能完成,属于外在评估的“试用期”任务。

Q2. king - man + woman ≈ queen 用于评估词向量的哪项能力?

单选题 · easy

  • A.词相似度编码能力
  • B.语义关系的迁移推理能力← 正确答案
  • C.文本分类泛化能力
  • D.实体识别的标注能力

答案:B。该式子用向量加减把“国王→男人”的关系迁移到“女人”上,考查词向量能否捕捉并泛化语义关系,属于词类比任务。词相似度只问两词的亲近程度,不需要关系迁移;文本分类、实体识别属于下游外在任务。

Q3. 词相似度任务中,衡量机器打分与人类打分一致性的常用指标是?

单选题 · easy

  • A.分类模型准确率
  • B.斯皮尔曼等级相关系数← 正确答案
  • C.交叉熵损失数值
  • D.语言模型困惑度

答案:B。词相似度评估的核心是“机器打分与人工金标准的排序一致性”,斯皮尔曼相关只看排名,正好匹配主观打分的场景。准确率、交叉熵、困惑度都是其他任务的指标,不属于相似度评估。

Q4. 余弦相似度的取值范围是?

单选题 · mid

  • A.取值在零到一之间
  • B.取值在负一到一之间← 正确答案
  • C.取值为非负的实数
  • D.取值范围无任何界限

答案:B。向量的夹角余弦在 -1 到 1 之间:完全同向为 1,完全反向为 -1,正交为 0。它是内在评估最常用的“量角器”,归一化的特性让它不受向量长度变化的影响。

Q5. 下列哪些属于外在评估的常见下游任务?

多选题 · mid

  • A.文本分类任务← 正确答案
  • B.词类比任务
  • C.命名实体识别任务← 正确答案
  • D.词相似度任务

答案:AC。外在评估把词向量送进下游模型,靠任务性能间接反映向量质量。文本分类、命名实体识别都需要训练下游模型,属于“试用期考核”;词相似度与词类比直接考向量本身,是内在评估。

Q6. 与外在评估相比,内在评估的明显优势是?

单选题 · mid

  • A.与实际业务结果完全一致
  • B.成本低速度快且易于定位问题← 正确答案
  • C.完全不受词表因素的影响
  • D.无需任何人工标注数据

答案:B。内在评估直接在向量上打分,无需训练下游模型,几分钟出结果,还能通过细分任务定位是相似度不足还是类比推理失败。外在评估真实但昂贵,且难以归因;内在评估也依赖人工金标准数据,并非“无标注”。

Q7. 词相似度评估中优先选用斯皮尔曼相关而非皮尔森相关,主要原因是?

单选题 · mid

  • A.计算速度要比皮尔森快很多
  • B.只看排名容忍非线性关系的偏差← 正确答案
  • C.不需要任何人工标注的分数
  • D.只能处理二分类的标签数据

答案:B。人工打分的尺度因人而异,有人手松有人手紧,但相对排序稳定。斯皮尔曼先把分数转排名再算相关,只关心顺序,不要求线性与正态,因而更稳健。它并未去掉人工标注,也不是为二分类设计的。

Q8. 关于内在评估与外在评估的关系,下列说法正确的有?

多选题 · hard

  • A.内在得分高则下游任务一定表现好
  • B.两种评估的结论可能并不一致← 正确答案
  • C.实践上宜先内在筛查再外在验证← 正确答案
  • D.外在评估成本一定低于内在评估

答案:BC。实证表明内在分数与下游表现的相关系数通常中等偏弱,二者结论可能脱节——所以实践中用内在评估快速海选、外在评估终选,组合使用。A 把相关性绝对化,D 与事实相反(外在评估通常成本更高)。

Q9. 词类比任务中,模型如何确定候选答案词?

单选题 · hard

  • A.从测试集中随机抽一个词作答
  • B.找与预测向量余弦相似度最高的词← 正确答案
  • C.选择整个词表中词频最高的词
  • D.选择与预测向量平均距离最近的词

答案:B。类比推理的核心是“预测向量落在目标词附近”,因此要在词表中检索与预测向量余弦相似度最高(方向最接近)的词作为答案。随机抽取、按词频或平均距离都不是语义关系检索的逻辑。

Q10. 组合评估时,为何要先对内在得分与外在准确率做归一化?

单选题 · extreme

  • A.让两路量纲不同的分数能加权比较← 正确答案
  • B.让所有分数都统一成百分制
  • C.为了消除人工标注的误差
  • D.为了提升下游任务的训练速度

答案:A。内在得分(如相关 0.7、0.8)与外在准确率(如 0.86、0.72)的取值范围和分布都不同,直接加权会让大数值主导结果。先归一化到 0-1 再按 α、β 加权,权重才有实际意义。归一化与消除标注误差、加速训练无关。