Word Embedding(字嵌入):把一个单词转化为向量表示。
最经典的做法是使用one-hot表示法。向量中只有一个1,其余全是0.字典有多少单词,向量就有多少维。它的特点是单词之间没有关联。
但是显然单词之间是有联系的,所以我们可以把单词之间相关联的一些特性量化并组合成向量。这样做的优点是可以缩小向量的维度。并且当数据集较小的时候,如果某个单词在训练集中没有出现过,但是我们仍然可以根据出现过的和它关联度较高的单词进行预测。这里通常结合迁移训练。
那么怎么计算具体向量呢?这个过程是无监督的,有两种思路。
1.Count based
它的思想是如果两个单词经常一起出现,那么认为他们是有联系的。
E.g. Glove Vector:
2. Prediction based
它的思想是训练一个神经网络,根据句子中上一个单词预测下一个单词。网络的输入是one-hot编码的单词向量,输出是下一个单词是字典中所有单词的概率。我们把第一层隐藏层的z值(未激活的值)取出来,就是这个单词的字向量(感觉和迁移训练有点像)。前向传播时形式上就是单词的one-hot编码向量乘以一个参数矩阵,就得出了这个单词的word embedding。经验表明这里的神经网络不需要deep。
一个神经网络预测下一个单词的准确性越高,就表明隐藏层抽取出的特征越具有代表性。但是通常只考虑前面一个单词是不足以准确预测下一个词汇的,一般会考虑前面n个词汇。具体做法是把n个one-hot向量合成一个向量作为输入,并且n个向量使用相同的参数矩阵。
为什么要使用相同的参数矩阵?因为我们的目的是输入一个ont-hot向量,乘以一个参数矩阵,输出一个抽取出的特征向量。如果使用不同的参数矩阵就没办法做到这一点。还可以这样理解,使用相同的参数矩阵可以保证每个单词抽取出的每一维代表的特征是相同的,使用不同的参数矩阵抽取出的特征是不同的。这样只要输入足够多的句子,就可以得到每个单词不同的word embedding。RNN不具有以上特性,所以这里不适用RNN。
以下的式子可以确保w1和w2在训练过程中永远都是相同的。
个人感觉这里也可以把前面n个单词作为一个batch进行训练。
Prediction based还有许多变形。
(1)CBOW
使用两边的单词来预测中间的单词。
(2)Skip-gram
使用中间的单词预测两边的单词。