之前文章我们知道了利用Word Embedding对词进行编码的好处,这篇文章我们就来看看Word2Vec中的Skip-Gram。它的作用就是通过无监督学习来将一个词进行编码。所以它的名字叫做Word to Vector,简称Word2Vec。

Word2Vec

Word2Vec得到词向量的方法是通过建立一个神经网络学习任务。通过训练这个神经网络,然后得到一个神经网络模型。但是我们并不指望用这个神经网络的输出来进行预测,我们用的是这个网络的隐藏层参数。虽然我们不理解这个隐藏层参数,但是它肯定代表了输入的一些信息。是对输入的encoding。我们用来训练这个神经网络的任务也叫作“Fake Task”。

Word2Vec 主要有两种模型Skip-Gram和CBOW两种。Skip-Gram是给你一个词,通过预测它周围词的概率得到一个神经网络模型。CBOW是用一句话里选定单词周围的词预测选定单词来得到一个神经网络模型。

这里我们只看Skip-Gram模型。

Skip-Gram

Skip-Gram是从一句话里选取一个词,然后用这个词预测它周围的词。比如我们选取的话是:
“The dog barked at the mailman”
1. 我们选取一个词,比如我们选取的词是“at”。
2. 我们需要定义选取词要预测的范围skip_window,比如skip_window=2。这意味着我们要让“at”这个单词预测在它前边的“dog”,“barked”以及在它后边的“the”,“mailman”。
3. 然后我们就生成了这样的一组训练集合(inputWord,outputWord): (“at”,”dog”),(“at”,”barked”),(“at”,”the”),(“at”,”mailnam”)
4. 用一个神经网络进行训练,对于每一个训练记录,比如(“at”,”dog”)输入是“at”这个单词的ont-hot encoding。输出是所有在词典里单词的概率。我们期望只有“dog”的概率为1,其他单词为0。这是一个多分类问题我们可以用softmax来作为输出层。

我们详细看一下整个过程:

训练样本的生成

神经网络结构


神经网络的输入层是一个单词的one-hot encoding向量。加入字典元素为10000个单词,one-hot encoding的输入向量是一个1×10000的向量。

神经网络的隐藏层的神经元个数决定了你最终通过skip-gram encoding后的词向量的维数。比如300个隐藏层神经元。那么隐藏层的参数就有10000×300个。其中每一行代表一个词的skip-gram encoding后的词向量。一个词在字典里的index就是在这个隐藏层参数矩阵的行的index。为什么呢?
我们可以通过下图来解释,为了简单,我们的字典只有5个词,因此输入的一个单词就是1×5的向量。我们打算用skip-gram 把这个词encoding 到 1×3的向量。则隐藏层有5×3的参数:

经过隐藏层的转化后,原来的1×10000的one-hot encoding的词向量被转化为一个1×300的向量,然后我们通过softmax层,把它转化为一个1×10000的输出向量,其中输出向量每个元素代表它是对应index在字典里对应单词的概率。概率和为1。然后我们可以用交叉熵代价函数来进行反向传播对网络进行训练。

为什么可以work

你可以这么理解,“电脑” 和“计算机” 他们在你的词典里肯定不一样。但是在一句话里出现在它们两个词周围的词肯定大多数情况向一样。为了让“电脑”和“计算机”能预测出同样的“附近词”,所以他们在隐藏层的参数就要比较接近。所以他们的encoding就会大概一致。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

%d 博主赞过: