为什么NLP中需要词嵌入 word embeddings(学习心得)
NLP 中一个关键理念就是词嵌入。这是语言表示的一种方式。让机器理解词语的对应关系。
我们的词表,比如有 10000 个词,如果我们都是用 one-hot vector 来表示
比如两个 one-hot vector,分别是 man 和 woman
比如 Man 这个单词,在 5391 处是 1,其他位置都是 0
Woman,在 9853 处是 1,其他位置为 0
这种方法把每个词孤立起来了。算法对相关词的泛化能力 generalize the cross words 不强
这是因为任何两个 one-hot vector 的内积为 0。也就是两者无关。
任意两个 vector 之间的距离都一样!所以每个词都是不相关的。
这样的结果就是,算法觉得吃苹果和吃橘子没有关系。而事实上“苹果”和“橘子”具有某种相关性,而算法如果能学习到这种相关性,就能提高泛化能力。
这里设置多个维度,每个维度设置为 -1~1 的区间,以参数的大小来衡量极性。
这里假设我们设置了 300 个不同的衡量维度,即每个单词对应一个 300 维的向量
这个时候我们获得的“苹果”“橘子”的向量就不一样了,两个向量会有相关性
比如某些属性上,颜色不太一样,但是水果属性都很高,食物属性等大多数属性都非常类似
当算法理解到什么是苹果的时候,很容易理解橘子是什么,即获得了更好的泛化效果
这就能够比 one-hot vector 更好地表示不同的单词
- 但是我们最终获得的属性,并不会像这里的例子一样好解释,因为是机器自己学到的
有趣的是,可以把 300 维的向量内嵌到一个二位空间里面,以便于 visualize
常用的算法叫做 t-SNE 算法,来自于 Laurens van der Maaten 和 Geoff Hinton 的论文
我们会发现有聚类效果,比如都是人的会靠的比较近,都是数字的在一堆,水果在另一堆
把词在高维空间中表示,这个过程就叫做 embeddings 嵌入,这就好比把每一个单词拿出来,嵌入到一个 300 维/或更高维度的空间里面