经过前面的介绍,相信你搞懂了词嵌入向量所代表的是单词在高维空间的特征表示了。在学习词嵌入向量的过程中,一个最著名的理解词嵌入向量在高维数学空间的例子,莫过于实现 queen = king - Man + Woman 的数学运算了。本节将从这个例子出发,揭示词向量背后的隐藏含义,并在最后附上通过GoogleVec的预训练模型来实现上述词向量运算的Python代码。本文在撰写时参考了很多国外的优秀博客,参考链接在文章最后。
这里有一个全程一站式的 Transformer 讲解和实战辅导,带你从零手写一个可对话的大模型,点击链接查看详情从零手写大模型实战
queen = king - Man + Woman 示例
下面展示的单词“ king ”的词嵌入向量(该向量是在 Wikipedia 数据集上使用 GolVe训练得到的)。[ 0.50451 , 0.68607 , -0.59517 , -0.022801, 0.60046 , -0.13498 , -0.08813 , 0.47377 , -0.61798 , -0.31012 , -0.076666, 1.493 , -0.034189, -0.98173 , 0.68229 , 0.81722 , -0.51874 , -0.31503 , -0.55809 , 0.66421 , 0.1961 , -0.13495 , -0.11476 , -0.30344 , 0.41177 , -2.223 , -1.0756 , -1.0783 , -0.34354 , 0.33505 , 1.9927 , -0.04234 , -0.64319 , 0.71125 , 0.49159 , 0.16754 , 0.34344 , -0.25663 , -0.8523 , 0.1661 , 0.40102 , 1.1685 , -1.0137 , -0.21585 , -0.15155 , 0.78321 , -0.91241 , -1.6106 , -0.64426 , -0.51042 ]该向量共 50 个数字,单从数字来看,我们并不能看到太多的东西,但是我们用另一种方法来把这些数字进行可视化展示。方法如下:每个数字如果接近 2,则为红色,如果接近0则为白色,如果接近-2则为绿色。有很多方法可以实现类似的可视化,这里略过,直接看将词向量可视化之后的结果。
接下来,我们忽略上图中的数字,仅关注颜色,并且将一些我们认为含义相近的单词(这里选择了 Man 和 Woman )的可视化结果一起展示:
从上图,你是不是能发现一些端倪:Woman 和 Man 在颜色分布上,比 Woman 和 king 更加接近。我们继续分析,继续放一些更加有关联的单词的可视化结果。
上面放了: queen , king , Man , Woman , boy , girl , water (无关)的可视化结果。我们逐个分析一下:
- 在中间有一条非常明显的红线,从上到下一直贯穿,这条线代表的数字可能代表了一些信息(但是我们不知道是什么信息。)你可以看到, Woman 和 girl 在很多地方颜色很相似,这一点在 Man 和 boy 的对比上也可以看出来。boy 和 girl 也有一些相似的地方,但是和 Woman 以及 Man 相比,又有一些不一致的地方,这些不一致或许说明代表的是“成人”信息。在最下面增加了 water 单词的可视化,可以看到在上面有一条蓝色的线从上到下贯穿,一直到 water 则停止消失了,这条蓝色的线或许代表的是“人类”这种信息。queen 和 king 的对比中,有一些相似但与其他不一致的地方,这些有可能代表了“皇室”的信息。总之,经过上面的分析,我们可以看出,有相似特征的单词在某些数字(可视化后的颜色)上也会存在相似之处,但并非完全一致。这代表了 token 与 token 之间仅仅在某些维度上是相似的,在其他维度上并不一致,比如“性别”、“皇室”等维度。Python 实现这个公式为了更好的理解这个现象,我们使用 Python 来进行更加深入的探索。我们使用 Gensim 库以及一个预训练好的模型(包含了 token 以及词嵌入向量)来完成。Gensim 库是一个可以用于主题建模和文档相似性检索的开源 Python 库,特别适用于处理大规模文本数据。可以通过以下命令安装:pip3 install --upgrade gensim -i pypi.tuna.tsinghua.edu.cn/simple安装完之后,前往这个网站下载预训练好的GoogleNews模型。GoogleNews 模型包含了 token 及其关联的词向量的文件,是在 Google 的新闻数据集(约 1000 亿词)上进行训练的;它包含了 300 万个单词和短语,每个词向量的维度是 300 维(300个数字)。该模型大概 1.5G 大小,比较大,下载会花费较长时间。下载完成后,解压该模型文件,解压后大概 3.7G,为一个 bin 文件。使用如下代码进行测试:
from gensim.models import KeyedVectors# load the google word2vec modelfilename = 'GoogleNews-vectors-negative300.bin'model = KeyedVectors.load_word2vec_format(filename, binary=True)# calculate: ( king - Man ) + Woman = ?result = model.most_similar(positive=[' Woman ', ' king '], negative=[' Man '], topn=1)print(result)
上述代码的打印结果为:
[(' queen ', 0.7118193507194519)]
说明在词向量的高维数学空间中,通过计算 king - Man + Woman ,得到的结果是 queen 。注意: 上述 queen 结果是通过 model.most_similar 函数得到的,也即是词嵌入空间中与 king - Man + Woman 的结果最接近的 token 是 queen ,并非严格的相等,而是近似。上述代码中展示的近似度为0.7,是通过两个词向量的余弦相似度计算得到的,余弦相似度在之前几节介绍过,如果不记得了可以返回去再复习一下。当然,你也可以尝试计算 father - Man + Woman = mother 等逻辑。本文代码可以在这里获得。参考:
- gensim库:github.com/piskvorky/g…词向量实现:machinelearningmastery.com/develop-wor…GoogleNews预训练模型下载:drive.usercontent.google.com/download?id…数学上解释 queen = king - Man + Woman 的原理:p.migdal.pl/blog/2017/0… king - Man - Woman - queen -why
我创建了一个《小而精的AI学习圈》知识星球,星球上有几十万字原创高质量的技术专栏分享,同时你也可以在星球向我提问。点击这里,我们星球见! >>>
点击这里查看所有 AI 技术专栏