Transformer 通关秘籍10:词向量运算:queen=king-man+wowem
经过前面的介绍,相信你搞懂了词嵌入向量所代表的是单词在高维空间的特征表示了。
在学习词嵌入向量的过程中,一个最著名的理解词嵌入向量在高维数学空间的例子,莫过于实现 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 https://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 model
filename = '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库:https://github.com/piskvorky/gensim/tree/develop
- 词向量实现:https://machinelearningmastery.com/develop-word-embeddings-python-gensim/
- GoogleNews预训练模型下载:https://drive.usercontent.google.com/download?id=0B7XkCwpI5KDYNlNUTTlSS21pQmM&export=download&authuser=0
- 数学上解释 queen = king - Man + Woman 的原理:https://p.migdal.pl/blog/2017/01/ king - Man - Woman - queen -why