词向量算法如何计算词语间相似度?为何提取其网络隐藏层输出?
嘿,这两个问题问到点子上了——词向量可是现代NLP的基石,咱们一步步拆解清楚:
1. 词向量算法如何实现词语之间的相似度计算?
本质上,词向量是把每个词映射到一个高维的稠密数值向量里——你可以把每个词看成高维空间里的一个点,词语的相似度就是这些点在空间里的「靠近程度」,常用的计算方式有两种:
- 余弦相似度:这是最常用的方法,它计算的是两个向量之间夹角的余弦值。如果两个词语语义相近(比如「猫」和「狗」),它们的向量方向几乎一致,夹角很小,余弦值就接近1;如果完全不相关(比如「猫」和「桌子」),夹角接近90度,余弦值就趋近于0。公式很直观:
cosine_similarity(a, b) = (a · b) / (||a|| * ||b||)
其中a · b是向量点积,||a||和||b||是两个向量的L2范数。 - 欧氏距离:计算的是两个向量在空间里的直线距离,距离越小说明词语越相似。不过它对向量的长度比较敏感,而向量长度不一定和语义相关,所以在文本领域的使用率不如余弦相似度,但某些场景下依然适用。
补充一句:像Word2Vec这类算法,在训练时就会主动把语义相近的词放在空间里的相近位置,所以这些相似度指标其实是在反映模型学到的空间排布。
2. 词向量网络架构中提取隐藏层输出的直觉原理与原因
咱们拿最经典的Word2Vec框架来举例,这样理解起来最清晰:
先快速过一下Word2Vec的基本结构:
- 输入层:喂入的是词语的独热编码向量——如果词汇表有1万个词,这个向量就有1万维,只有目标词对应的位置是1,其余全是0。这种向量是稀疏的,完全没有语义信息,只是个唯一标识而已。
- 隐藏层:这是一个维度远低于输入层的稠密层(比如100-300维)。输入层到隐藏层的权重矩阵其实就是一张「词向量 lookup 表」——当独热输入乘以这个权重矩阵时,本质上就是把目标词对应的权重行取出来,这一行就是咱们要的词向量。
- 输出层:负责预测上下文词语(Skip-gram模式)或者根据上下文预测目标词(CBOW模式),用softmax输出概率分布。
那为什么选隐藏层的输出,而不是输入或输出层?
- 输入层没用:独热编码只是个身份ID,完全不包含任何语义关联信息,根本没法用来表示词语的含义。
- 输出层太局限:输出层的结果是和训练任务绑定的(比如预测邻居词的概率),它只针对特定任务,没法捕捉词语通用的语义本质。
- 隐藏层是「语义压缩器」:这就是核心直觉:训练时,模型会学习把那些出现在相似语境里的词,映射到隐藏层空间里的相近位置。比如「猫」和「狗」经常出现在「养了一只XX」「带XX去看兽医」这类语境里,模型就会调整权重,让它们的隐藏层向量靠得很近。隐藏层把稀疏无意义的独热向量,压缩成了一个稠密向量,这个向量浓缩了模型学到的所有和该词语相关的语境模式——相当于把这个词出现过的所有上下文,提炼成了一份紧凑的「语义摘要」,能体现它和其他词的语义关联。
换个角度想:隐藏层就是模型存储「词语关系知识」的地方,提取这里的向量,就是把模型学到的语义知识抽出来,用于其他任务(比如文本分类、聚类、相似度匹配等等)。
内容的提问来源于stack exchange,提问作者Usman Ihsan




