词向量的性质与局限
「国王−男人+女人≈女王」为何成立?又为什么一个词只能有一个向量?
用词向量找近义词
训练好词向量后,最直接的用法是找出「最像」的词,做法是用之前学过的 余弦相似度 ,给定一个词,去和词表里所有词逐一比较, 取相似度最高的几个,就是它的 最近邻 。
数值为示意。语义相近的词排在前面,这正是 one-hot 做不到、而词向量能做到的事。
词向量里藏着「方向」
词向量之间还能做 加减法 ,而且结果有意义。 最著名的一个例子是:
把「国王」的向量减去「男人」、再加上「女人」,得到的新向量, 竟然 非常接近 「女王」的向量。类似地:
下面亲手试一试。用三个下拉框拼出「A − B + C」,工具会对词向量做这笔算术, 再列出与结果向量余弦相似度最高的几个词:
多换几种组合就会发现,有的式子第 1 名正中目标,有的却只是「勉强接近」, 第 1 名和第 2 名的相似度往往只差一点点,这正好说明线性类比是一个大致成立的统计现象,不是精确运算。
为什么会有这种规律
在解释之前,先补一层几何直觉。学习词嵌入时,我们把每个词向量看作平面上的一个点, 「离得近」表示语义相近。现在更进一步,从一个点指向另一个点可以画一个 箭头 。 两个词向量相减,得到的就是这样一个箭头 : 就是从「男人」指向「国王」的那个箭头。它本身不是某个词,而是一个 带方向的差向量 , 记录着「从『男人』走到『国王』,要朝哪个方向、走多远」。
为什么这两个箭头会近似平行?一个直观的解释是,在「根据上下文做预测」这个训练任务的长期驱动下, 词与词之间一些 稳定的语义关系 会被编码成向量空间里 方向大致相同的差向量 。「男人→国王」和「女人→女王」共享同一种「普通人→君主」的关系, 于是这两个差向量大致指向同一个方向;「性别」「首都与国家」也是类似的稳定关系。
正因为关系被编码成了方向, 用向量加减去「平移」这个关系 才会近似成立。 把差向量 加到「女人」上,相当于把这个箭头原样搬到「女人」的位置、再沿着它走一步。 点击上图的按钮就能看到,落点离「女王」很近,但并不重合,这正是 的几何含义,也再次印证了那个 约等号 。
这只是一个帮助理解的直观说明, 不要求严格证明 。 学界对这种线性类比的确切成因尚无干净统一的结论,知道「它大致成立、且来自方向上的规律」即可,不必深究。
绕不开的缺陷:词向量是「静态」的
word2vec 这类词向量有一个根本局限,它是 静态 的: 训练完成后, 每个词永远只对应同一个固定向量 , 无论这个词出现在什么句子里。
这个限制在 一词多义 上表现得最明显:
同一个词,在不同语境里意思 截然不同 , 却被迫共享 同一个 词向量。静态词向量没有任何办法区分这两种含义, 它在「看到这个词」时就已经定下了向量,根本没机会参考上下文。
出路:让向量随上下文变化
问题的根源清楚了,好的表示不该是「一个词一个固定向量」, 而应当 随上下文变化 :同一个词出现在不同句子里, 给出 不同的向量 ,这样才能区分「水果的苹果」和「公司的苹果」。 这种表示叫 上下文相关(contextual) 的表示。
如何让一个词的向量「读懂」它所在的整句话?这需要能够建模序列、 在词与词之间传递信息的模型,这正是 RNN、Transformer 等后续模型要解决的核心问题。
回顾:文本是怎样变成向量的
到这里,「把离散的文字变成神经网络能处理的、带语义的数字」这条完整路线就走通了:
文字最终变成了一串 稠密、带语义 的向量,可以送进神经网络。 而下一步,是让这些向量真正「读懂上下文」,这正是序列建模要解决的问题。