National Taiwan University (NTU)李宏毅老师的《Machine Learning》
<https://www.coursera.org/learn/ntumlone-mathematicalfoundations>
的学习笔记,因此在全文对视频出现的内容多次引用。初出茅庐,学艺不精,有不足之处还望大家不吝赐教。

  欢迎大家在评论区多多留言互动~~~~

1. 为什么要使用词嵌入(Word Embedding)

  在词嵌入之前往往采用 1-of-N Encoding 的方法,如下图所示




这种方法主要有两个
缺点,首先这种表示是正交的,但是正是由于正交性使得具有相似属性的词之间的关系变得微弱;其次这种编码方式使得码字很长,比如说一共有10万个单词,那么就需要一个长度为10万的串进行编码。

  为了克服这样的缺点,采用了词嵌入(Word Embedding)的方法。这种方法将词映射到高维之中(但是维数仍比 1-of-N Encoding
低很多),相似的单词会聚集在一起,而不同的单词会分开;每个坐标轴可以看作是区分这些单词的一种属性,比如说在上图中,横坐标可以认为是生物与其他的区别,纵坐标可以认为是会动和不会动的区别。

2. 为什么词嵌入(Word Embedding)是无监督学习

  因为在进行学习的过程中,我们只知道输入的是词的一种编码,输出的是词的另一种编码,但是并不知道具体应该是怎样的一种编码,所以是无监督学习。
  有的人可能想可以通过自编码的方式实现词嵌入,但是如果你得输入是 1-of-N Encoding 的话,是基本上不可以采用这样的方法处理的
,因为输入的向量都是无关的,很难通过自编码的过程提取出什么有用的信息。

3. 词嵌入(Word Embedding)的两种方式

  词嵌入(Word Embedding)主要有基于统计(Count based )和基于预测(Perdition based)的两种方法。

3.1 基于统计(Count based )

  这种方法的主要思路如下图所示





两词向量共同出现的频率比较高的话,那么这两个词向量也应该比较相似。所以两个词向量的点积应该与它们公共出现的次数成正比,这个于上节课讲的矩阵分解就很像了。具体可以参见
Glove Vector:http://nlp.stanford.edu/projects/glove/
<http://nlp.stanford.edu/projects/glove/>

3.2 基于预测(Perdition based)

  最原始的想法是如下图所示的方法




在这里神经网络的输入是前一个单词 wi−1wi−1 的词向量( 1-of-N Encoding )形式,经过神将网络他的输出应该是下一个可能出现的单词 wiw
i 是某一个词的几率,因为是 1-of-N Encoding 形式,所以输出的每一维代表是某一个次的概率。然后取第一层的权值输入 zz 作为词向量。

  在实际使用中,往往找的不仅仅是一个词与下一个词之间的关系,而是通过前面一堆词推出后面的一个词,在训练的过程中有类似于权值共享的行为,如下图所示





其中我们可以看到位于相同位置的输入神经元有着相同的权值(在途中用相同颜色的线表示出来),这样做的原因主要保证两点,首先在要保证对于在同一批输入的同一个单词具有同样的编码(即相同的权重);其次权值共享可以减少模型中参数的个数。

  那么如何保证在训练的过程中它们具有相同的权重呢?如下图所示





在梯度更新的过程中,首相对共享的参数设置相同的初始值,其次在更新的过程中不仅仅要减去自己对应的梯度,还应该减去另一个相同位置神经元的梯度,保证两个参数之间的更新过程是相同的。

  除了可以根据之前的词推出后面的词,还可以根据两边的词推出中间的词,或者从中间的词推出两边的词




在这里虽然用了神经网络,但是并没有用deep learning,而只是用了一层的 linear hidden
layer,主要是因为过去虽然有用过deep的方法,但是很难训练,并且实际上用一层就可以达到的效果为什么一定要用deep的方法呢。

  通过实验我们可以看到,词向量之间是有一定的对应关系的,比如说国家与首都有着较好的对应关系,动词的三态有着较为稳定的三角关系。




PS:感谢网友 @mabowen110 指出我忘记加上了博客的来源,十分感谢~