Word2Vec 如何获取词向量?如何评估该训练得到的词向量的好坏?
Word2Vec 如何获取词向量?如何评估该训练得到的词向量的好坏?
这道题考的是 Word2Vec 的核心原理和工程实践。面试官想看你能不能把"词向量怎么来、怎么判断好不好"这件事讲清楚。
我从四个方面来讲:
- 两种获取词向量的模型:CBOW 和 Skip-gram
- Skip-gram 的网络结构和负采样机制
- 词向量质量的评估方法
- 维度选择的实战经验
一、词向量获取的两条路径:CBOW 与 Skip-gram
先说个背景。Word2Vec 是 2013 年 Google 提出来的,核心思想就一句话:一个词的性格,由它周围的小伙伴决定。你平时跟哪些词一起出现,你的向量就跟它们相近。
它有两种训练方式:
CBOW:用上下文预测中心词。就像做语文的完形填空,给你"今天天气真___",让你填那个空。模型看到"今天"、"天气"、"真"这些词,去猜中间那个词。
Skip-gram:反过来,用中心词预测上下文。就像看图说话,给你一个词,让你说说它经常跟哪些词一起出现。模型看到"好",去猜它周围可能会出现什么词。
[配图1:CBOW 与 Skip-gram 模型对比示意图]
两者的区别:
- CBOW 用周围词预测中心词,每次看多个词,信息量大,训练快
- Skip-gram 用中心词预测周围词,每次看一个词,对生僻词更友好
- 但 Skip-gram 训练慢,因为一个词要猜很多个上下文
工程选择的话:数据量大、追求速度用 CBOW;生僻词多、追求精度用 Skip-gram。
二、Skip-gram 的神经网络结构与负采样
Skip-gram 是 Word2Vec 最常用的模型。它的结构就三层:
输入层:中心词的 one-hot 向量。比如词表有 10 万个词,"good"可能是第 3000 个,那输入就是 [0,0,0,...,1,...,0],只有一个位置是 1。
隐藏层:没有激活函数,就是一个线性变换。输入向量乘以一个权重矩阵,得到词向量。
输出层:预测周围词出现的概率。用的 softmax,意味着要对整个词表计算概率分布。
[配图2:Skip-gram 网络结构图,含三层神经元和负采样正负样本示意]
问题来了:softmax 要对 10 万个词算概率,每次迭代都要算一遍,超级慢。
负采样就是为了解决这个问题。
负采样的思想:不求精确的概率分布,而是把"预测上下文"这件事,变成一个二分类问题。
具体操作:
- 正样本:中心词和它真实的上下文词,比如 (good, great)
- 负样本:随机抽几个词,比如 (good, apple)、(good, run)
- 训练目标:让正样本对得分高,负样本对得分低
这样每次迭代只需要更新 k+1 个输出节点(k 个负样本加 1 个正样本),而不是整个词表的 10 万个。
[配图3:负采样正负样本示意]
这就是 Word2Vec 训练快的原因:用近似代替精确,用抽样代替全量。
三、词向量评估——内部评估与外部评估
词向量训练好了,怎么知道它好不好?
内部评估
内部评估直接在词向量空间里测,不用接到下游任务。
词类比任务(Analogy):这是 Word2Vec 最经典的内测方式。
比如:
- king : queen = man : ?
- 北京 : 中国 = 东京 : ?
如果你的词向量训练得好,"king - queen + man" 的向量结果应该接近 "queen",或者相似度最高的词就是正确答案。
[配图4:词类比任务示意]
余弦相似度:看语义相近的词,它们在向量空间里的夹角是不是足够小。
比如"苹果"和"水果"相似度高,"苹果"和"手机"在某些语境下相似度也不低。
外部评估
外部评估把词向量作为特征,用到实际任务里,看任务指标有没有提升。
常见的:
- 文本分类:把文本的词向量加权平均作为特征
- 命名实体识别(NER):作为输入特征
- 情感分析、语义匹配……
外部评估才是最终检验。内部评估再好,下游任务不行也是白搭。
内部 vs 外部的关系
类比一下:
- 内部评估:模拟考试。你在词向量的"考场"里测。
- 外部评估:高考。你把词向量当成学习能力,用到真实任务里。
理想情况是模拟考和高考成绩正相关。如果词向量内部评估很好,但下游任务效果差,可能是:
- 下游任务的数据分布跟训练语料差太远
- 词向量维度没调好
- 下游任务本身对词向量的依赖程度不高
四、维度选择的权衡与实战建议
词向量维度选多少合适?
先说结论:300 维是经验值,大多数场景下效果不错。
为什么是 300?
- 维度太低,欠拟合。词之间的语义差异被压缩没了,"猫"和"狗"跟"石头"差不多。
- 维度太高,过拟合。数据不够的情况下,模型会学到训练语料里的噪声。
- 300 处于偏差-方差的平衡点,不高不低,刚刚好。
[配图5:维度与性能关系示意图,展示偏差-方差权衡曲线及推荐维度区间]
实战经验:
小数据集别自己训词向量。如果你只有几千条标注数据,从头训练词向量往往效果很差。大规模语料预训练好的词向量,直接拿来用就行。
生僻词场景选 Skip-gram。Skip-gram 对低频词更友好,适合专业领域词汇多的任务。
分类任务可以用更低的维度。如果你只是做简单的文本分类,100-150 维就够了,没必要上 300。
面试怎么答
基础版(直接背):
Word2Vec 有两种获取词向量的方式:CBOW 用上下文预测中心词,适合大数据集;Skip-gram 用中心词预测上下文,对生僻词更友好。Skip-gram 的网络结构是三层网络(输入→隐藏→输出),负采样机制解决了大词表下 softmax 计算量大的问题,通过将多分类转为二分类来加速训练。词向量质量评估分内部评估和外部评估,内部评估主要用词类比任务(king:queen = actor:?)和余弦相似度,外部评估看词向量在下游任务(分类、NER)中的表现。
加分版(再加这些):
- GloVe 是另一种词向量方法,跟 Word2Vec 的区别是用了全局统计信息而不是局部上下文
- 维度选择涉及偏差-方差权衡,300 维是经验值,但不是死的,要根据任务调整
- 小数据集再训练词向量会降低性能,用预训练词向量效果更好
- 生僻词场景选 Skip-gram,追求速度选 CBOW
一句话总结
Word2Vec 通过 Skip-gram 或 CBOW 预测词上下文来学习词向量,词类比和相似度评估词向量质量,下游任务表现验证实际效果,维度选 300 左右是工程经验值。
