本文由罗周杨原创,转载请注明作者和出处。未经允许,不得用于商业用途
学习word2vec的skip-gram实现,除了skip-gram模型还有CBOW模型。
Skip-gram模式是根据中间词,预测前后词,CBOW模型刚好相反,根据前后的词,预测中间词。
那么什么是中间词呢?什么样的词才叫做前后词呢?
首先,我们需要定义一个窗口大小,在窗口里面的词,我们才有中间词和前后词的定义。一般这个窗口大小在5-10之间。
举个例子,我们设置窗口大小(window size)为2:
|The|quick|brown|fox|jump|
那么,brown
就是我们的中间词,The
、quick
、fox
、jump
就是前后词。
我们知道,word2vec实际上就是一个神经网络(后面会解释),那么这样的数据,我们是以什么样的格式用来训练的呢?
看一张图,你就明白了:
可以看到,我们总是以中间词放在第一个位置,然后跟着我们的前后相邻词。可以看到,每一对词都是一个输入和一个输出组成的数据对(X,Y)。其中,X是feature,Y是label。
所以,我们训练模型之前,需要根据语料,整理出所有的像上面这样的输入数据用来训练。
word2vec是一个神经网络
word2vec是一个简单的神经网络,有以下几个层组成:
- 1个输入层
- 1个隐藏层
- 1个输出层
输入层输入的就是上面我们说的数据对的数字表示,输出到隐藏层。
隐藏层的神经网络单元的数量,其实就是我们所说的embedding size,只有为什么,我们后面简单计算一下就知道。需要注意的是,我们的隐藏层后面不需要使用激活函数。
输出层,我们使用softmax操作,得到每一个预测结果的概率。
这里有一张图,能够表示这个网络:
输入层
现在问题来了,刚刚我们说,输入层的输入是我们之前准备的数据对的数字表示,那么我们该如何用数字表示文本数据呢?
好像随便一种方式都可以用来表示我们的文本啊。
看上图,我们发现,它的输入使用的是one-hot编码。什么是ont-hot编码呢?如图所示,假设有n个词,则每一个词可以用一个n维的向量来表示,这个n维向量只有一个位置是1,其余位置都是0。
那么为什么要用这样的编码来表示呢?答案后面揭晓。
隐藏层
隐藏层的神经单元数量,代表着每一个词用向量表示的维度大小。假设我们的hidden_size取300,也就是我们的隐藏层有300个神经元,那么对于每一个词,我们的向量表示就是一个 1∗N 1 ∗ N 的向量。
有多少个词,就有多少个这样的向量!
所以对于输入层和隐藏层之间的权值矩阵 W