本文受 Jay Alammar 2019年在 QCon 做的演讲启发,纯纯的致敬!

Embedding 中文是嵌入,一种把对象 (object) 映射 (map) 为实数域向量 (vector) 的技术。

看不懂?我们来举个性格嵌入 (personality embedding) 的例子。

1

场景:斯蒂文的新工作面试到了最后一轮,拿到 offer 基本已定,只需要完成一个性格测试,从不同维度上给自己在 0 到 100 的范围打分。

embed设置样式 embeddable_embed设置样式

2

embed设置样式 embeddable_神经网络_02

斯蒂文认为自己比较外向,给自己在「外向-内向」的维度上在打了 20 分。注意 0 分是极度外向,100 分是极度内向。

标准化得分使其在 -1 和 1 之间,得到的分数是 -0.4。解下列方程即可。

    20/(100 - 0) = x/(1 - (-1))

这样斯蒂文在「外向-内向」维度由一个实数 -0.4 来表示,该维度可看成是描述斯蒂文性格的一个特征。

3

embed设置样式 embeddable_相似度_03

人是复杂的动物,一个特征不可能完全描述人的性格,斯蒂文在第二个特征上给自己打分为 0.8 (按同样的方法,先在 0~100 之间得分,再标准化)。

现在斯蒂文的性格可以由 [-0.4, 0.8] 二维向量来表示。

4

embed设置样式 embeddable_词向量_04

如果现在斯蒂文放鸽子不去这个公司,公司想找一个和斯蒂文性格类似的求职者。

根据他们在前两个特征上的得分,公司应该用谁来代替斯蒂文?

5

embed设置样式 embeddable_embed设置样式_05

公司应该选这个女生,因为比起另外那个男生,她的性格和斯蒂文的性格更接近。

这里向量相似度是用余弦距离来计算,其值范围在 -1 到 1 之间,值越大 (1) 越相似,值越小 (-1) 越相反。对数学感兴趣的小孩 embed设置样式 embeddable_词向量_06 可以参考计算余弦距离的公式。

embed设置样式 embeddable_相似度_07

下图看三个人完整的性格测试得分,这种把性格转换成 4 维向量的技术可称为性格嵌入 (personality embedding)。

计算性格相似度后,还是会用这位女生来替代放鸽子的斯蒂文。

embed设置样式 embeddable_词向量_08



总结:我们可以将人和事物 (所有东西) 表示为代数向量,而计算机很容易能计算出这些向量之间的相似程度。

6

性格嵌入讲完后,让我们来看看大名鼎鼎的词嵌入 (word embedding)。类比:

  • 性格嵌入是将性格转换成向量的技术
  • 词嵌入是将转换成向量的技术

词嵌入的技术本帖当然不谈,要不小孩就看不懂了 (当然比性格嵌入的技术复杂)。先看看词嵌入的结果向量,以 King 举例。

embed设置样式 embeddable_神经网络_09

单词 King 由 50 个实数来表示,即用一个 50 维的向量能代表单词 King。

其他单词也可以用不同的 50 维的向量来表示 (具体维度大小根据实际问题来决定,常用的是 300 维度,这里用 50 维来举例)。

为了后文能快速找出不同词之间的同义,我们来可视化 50 维向量,比如蓝色代表负值 (越深越负),红色代表正值 (越深越正)。

如果两个向量在很多维度上的颜色相同,那么这两个向量相似。

接下来让我们看看单词 King, Man 和 Woman 的向量可视化。

embed设置样式 embeddable_相似度_10

不难看出,Man 和 Woman 之间相似度比起它们和 King 之间相似度更高。

7

接下来,我们看更多词向量可视化的例子。

人 vs 水

embed设置样式 embeddable_相似度_11

从上图两点值得注意:

  1. 黄色五角星对应的栏:女人、女孩、男孩、男人、国王和皇后是深蓝色,水是浅蓝色,该栏对应的特征可能是有无生命
  2. 红色五角星对应的栏:所有事物都是深红色,该栏对应的特征可能是名词

女 (男) 人 vs 女 (男) 孩

embed设置样式 embeddable_相似度_12

女人和女孩非常相似 (都是女性),男人和男孩也非常相似 (都是男性),而且两对词的相似点也很多重叠 (用黄色五角星标注了),可能显示着「成年人和未成年人」的关系。

女孩 vs 男孩

embed设置样式 embeddable_相似度_13

女孩和男孩非常相似,但是他们的相似处和女人和男人的相似处不太一样,可能就是「成年人和未成年人」的区别。

国王 vs 皇后

embed设置样式 embeddable_相似度_14

国王和皇后非常相似,但是它们的相似处 (用黄色五角星标注了) 在 (女人,男人)、(女孩,男孩) 这些「词对」中没有体现。该特征应该是有皇家色彩 embed设置样式 embeddable_相似度_15

embed设置样式 embeddable_神经网络_16

让人惊艳的东西来了,词嵌入或词向量可以发掘出词与词的类比关系。我们可以在词向量上做加法和减法,最后得到一些有趣的结果。最有名的结果是

    国王 - 男人 + 女人 = 皇后

小孩可以忽略下面一段:

用 Python Gensim 库可以得到上面结果:

embed设置样式 embeddable_词向量_17

皇后的概率最高,记住机器不是人,永远是以概率的形式给出结果。

重新调整上面公式可以得到不同表达式

  1. 国王 - 男人 = 皇后 - 女人
  2. 国王 - 皇后 = 男人 - 女人

1 式抽象出皇家的词向量,2 式抽象出男性减去女性的词向量。

词向量的类比关系应用还有很多,比如

    中国 - 北京 = 法国 - 巴黎

    do - did = go - went

等等。

总结

在自然语言处理 (Natural Language Processing, NLP) 中,词嵌入把词转换成实数向量,从 word 转到 vector,因此大家都也把词嵌入称为 word2vec,用到的技术就是神经网络。

在推荐系统 (Recommender System, RS) 中,物品嵌入把推荐的物品转换成实数向量,item2vec。

图神经网络 (Graph Neural Network, GNN) 存在很多通路,将各个节点连成一条线,这些连线蕴含着节点之间的相互关系,就如同句子中各个词语的关系一样,这样我们也可以用节点嵌入的方法把节点 node 转成向量 vector,node2vec。

万物皆嵌入

everything2vec