Embedding,直译是词嵌入、嵌入层。
计算机无法直接处理一个单词或者一个汉字,需要把一个token转化成计算机可以识别的向量,这也就是Embedding过程。
最简单的embedding操作就是one hot vector,但one hot vector有一个弊端就是没有考虑词语前后之间的关系。
假设,中文有10个字 “星 巴 克 喜 欢 瑞 幸 的 朋 友”,用0-9表示为一句话:
也可以表示为:
还可以表示为:
“星巴克喜欢瑞幸的朋友”"的one-hot编码为:
"瑞幸喜欢星巴克的朋友"的one-hot编码为:
从上图可知,每个字都对应唯一的one-hot编码。one-hot编码计算简单,只需要把1对应位置的数相乘求和即可。
比如:一本书有100W字,常用的简体繁体字有10W,那么这本书可以表示为100wx10w的矩阵。这明显存在缺点:矩阵过于稀疏,过度占用资源。one-hot存在维度灾难。
比如:虽然这本书有100W字,但有99W字是重复的,只有1W字是完全不重复的,那100Wx10W的矩阵,浪费了99Wx10W的存储空间。
为了解决矩阵稀疏表示的问题,引入了Embedding。
Embedding就是用一个低维稠密的向量表示一个对象,这里的对象可以是一个词(Word2vec),也可以是一个物品(Item2vec),亦或是网络关系中的节点(Graph Embedding)。Embedding向量能够表达对象的某些特征,两个向量之间的距离反映了对象之间的相似性。简单的说,Embedding就是把一个东西映射到一个向量X。如果这个东西很像,那么得到的向量x1和x2的欧式距离很小。
举例说明:
Word Embedding
,把单词w映射到向量x。如果两个单词的意思相近,比如bike和bicycle,那么它们映射后得到的两个词向量x1和x2的欧式距离很小。User Embedding
,把用户ID映射到向量x。推荐系统中,需要用一个向量表示一个用户,如果两个用户的行为习惯接近,那么他们对应的向量x1和x2的欧式距离很小。Graph Embedding
,把图中的每个节点映射成一个向量x。如果图中两个节点接近,比如它们的最短路很小,那么它们embed得到的向量x1和x2的欧式距离很小。多模态里的embedding
,就是直接把两个向量通过全连接变成一个。Neural Networks, Manifolds, and Topology
Embedding(嵌入)是拓扑学里的专业术语,在深度学习领域经常和Manifold(流形)搭配使用。
举几个例子来说明,比如三维空间的球面是一个二维流形嵌入在三维空间(2D manifold embedding in 3D space)。之所以说它是一个二维流形,是因为球面上的任意一个点只需要用一个二维的经纬度来表达就可以了。又比如,一个二维空间的旋转矩阵是2x2的矩阵,只需要一个角度就能表达,这就是一个一维流形嵌入在2x2矩阵空间。
在深度学习领域,最初的切入点是 Manifold Hypothesis(流形假设)。流形假设是指:“自然的原始数据是低维的流形嵌入于(embedded in)原始数据所在的高维空间”。那么深度学习的任务就是把高维原始数据(图像、句子)映射到低维流形,使得高维的原始数据被映射到低维流形之后变得可分,而这个映射就是Embedding(嵌入)。比如,Word Embedding,就是把单词组成的句子映射到一个表征向量。
Embedding的本质是信息的聚合和解耦,也就是信息的再表达。如下图所示,前一个是1x4的高维embedding,分别表示猫、狗、花、草四种属性值,后一个是1x2的低维embedding,分别表示动物、植物两种属性值。从高维embedding降维成低维embedding是信息的聚合,猫狗聚合成动物,花草聚合成植物;从低维embedding升维成高维embedding是信息的结构,动物解耦成猫狗,植物解耦成花草。
其他二维embedding聚合的例子,比如CNN对图像进行降采样得到的feature map,是embedding;解耦的例子,GAN生成的图像是embedding。N维同理。
假设,一个2x6的矩阵,乘上一个6x3的矩阵,变成一个2x3的矩阵。
(
1
0
0
0
0
0
0
1
0
0
0
0
)
[
w
11
w
12
w
13
w
21
w
22
w
23
w
31
w
32
w
33
w
41
w
42
w
43
w
51
w
52
w
53
w
61
w
52
w
53
]
=
(
a
11
a
12
a
13
a
21
a
22
a
23
)
=
(
a
11
a
12
a
13
a
21
a
22
a
23
)
(100000010000
A ∗ B = C A *B=C A∗B=C
在上述公式中,一个12个元素的A矩阵变成C中6个元素的矩阵,直观上大小缩小了一半。
假设一个100Wx10W的矩阵,乘上一个10Wx20的矩阵,可以把它降到100Wx20的矩阵,降低10w/20=5000倍。
总结:在某种程度上,Embedding层实现了降维的作用,降维的原理是根据矩阵乘法。
如上图所示,如果在10米开外找出3处不同,是很困难的事情,目测也可能完成。但是让你在一米外,发现水壶的背景不同。然后再走近半米,又发现小姑娘头上的小花夹子不一致。再走近20厘米,又发现花盆中黄色小花不同。
无限靠近并不代表认知度就高。比如,在距离屏幕1厘米远的地方找茬,这是不可能的。低维的数据可能包含的特征信息是非常笼统的,需要不停地拉近拉远来改变我们的感受,让我们对这幅图有不同的观察点,找出图中的“找茬”。由此可见,距离的远近会影响我们的观察效果。
Embedding的另一个作用体现了:对低维数据进行升维时,可以把一些其他特征放大,或者把笼统的特征给分开。
Embedding是一直在学习优化的,使得整个拉近拉远的过程慢慢形成一个良好的观察点。比如,来回靠近和远离屏幕,发现45厘米是最佳观测点,这个距离能5s内把3个不同点找出来。