【NLP学习其3.5】词嵌入的特性,为什么词之间会有联系?
词嵌入的特性
现在你有了一堆嵌入向量,我们可以开始学习他们之间的特性了
前情提要:https://www.cnblogs.com/DAYceng/p/14962528.html
先把各向量重新命名便于区分
Man对应e_man①
Woman对应e_woman②
King对应e_king③
Queen对应e_queen④
现在用e_man减e_woman
①-②≈[-2,0,0,...]
用e_king减e_queen
③-④≈[-2,0,0,...]
由此可见,Man和Woman的差异主要体现在性别(gender)上,King和Queen也是如此
那么,当系统被问及“Man之于Woman等价于King之于什么?”时,它自然的会用嵌入向量相减,从而推断出问题的答案,即:Man之于Woman等价于King之于Queen
如何在算法上实现上述特性?答案是”计算距离“
如图所示,所求的e_?可以表示为:e_king-e_man+e_woman
那我现在只需要找出一个单词的嵌入向量,假设为e_w,使得这个e_w与e_king-e_man+e_woman最相似即可
用函数表示也就是Sim(e_w,e_king-e_man+e_woman)取最大值就满足条件
那么,这个Sim()是什么函数呢?
这个Sim()一般会是余弦相似度、欧氏距离等相似算法(在代码中以函数方式提供使用),具体不再展开
嵌入矩阵(Embedding Matrix)
有了词嵌入这么强大的东西,那我们怎么去用它呢?
一般来说我们会以嵌入矩阵(Embedding Matrix)的形式来利用词嵌入,就像下面这个
这是一个500 X 10000大小的嵌入矩阵,里面存的全是一些嵌入值,命名为E矩阵
可以看到,每列我标出了对应的单词,说白了这个矩阵其实就是由一万个嵌入向量拼接成的
现在我们需要使用One-Hot 了
假设我们有一个One-Hot编码的向量O_7426,它是一个10000行1列的矩阵
我们用O_7426与E相乘,即E * O_7426
由线性代数的知识我们可以知道,E(500 X 10000) * O_7426(10000 X 1)的结果是一个大小为500 X 1的矩阵,用e_w表示
嗯?500 X 1
这不就是E矩阵中的一个列吗?换句话说这个结果就是对应着某个词的嵌入向量
假设E*O_7426的结果是上图中框起来的部分,那么我们可以得出以下结论:
因为E * O_7426 = e_w
而e_w与"EA"所在列的值相等
所以
O_7426是对“EA”的独热编码 #EA是第7426个词
e_w = e_ea
因此原式可写成:E * O_7426 = e_7426或者E * O_ea = e_ea
由上述我们还可以进一步推广,任何与E矩阵,也就是嵌入矩阵相乘的One-Hot编码向量,最后会定位到编码对应的词的词嵌入,或者说嵌入向量,进而得出某个词。