key idea:给定中间的词,预测上下文。
具体来说,我们选择一个句子的中心词作为输入,选取周围的词作为目标值(每次选取一个,组成词对),所以我们的训练数据格式如下(center,nearby)。
我们网络的输出是一个向量,通过计算输出向量与目标值的交叉熵损失,从而调整网络权重。举个栗子,当我们输入‘Soviet’,我们的网络输出‘Union’或者‘Russia’等词。而不是输出‘watermelon’。
1 准备数据
首先我们需要把把训练数据准备成特定格式。下面这个例子是'The quick brown fox jumps over the lazy dog',我们选取窗口为2。这个蓝色高亮的部分是中心词。
神经网络就会从这些词对中学习内在的规律,相对于(Soviet,watermelon)这种词对来说,(Soviet,Union)词对出现的概率会更大。因此当我们的神经网络训练结束之后,当我们输入Soviet,输出Union的概率比输出watermelon的概率更高。
2 模型细节
首先,我们注意到我们并不能词的字符串形式的表示直接作为神经网络的输入。所以我们需要把字符形式的表示转换为向量的形式。为了完整这个转换,我们先建立一个词典(假设词典包含10000个不同的词)。那我们输入为Soviet就可以表示为一个10000维的向量,在Soviet那一维为1,其他维都为0。输出也是一个10000维的向量。下面是这个网络的结构。
我们注意到上面这个网络的隐藏层并没有用到激活函数,输出层用了Softmax激活函数。我们输入一个one-hot变量进入网络,输出一个同等维度的向量分布。
3 隐藏层
当我们神经网络训练完成,我们已经学到了隐藏层的参数矩阵,是一个10000*300的矩阵。其实这个参数矩阵就是一个WordVector 查询字典。
所以我们最终的目的就是学习这个隐藏层的参数矩阵,而输出层的参数矩阵会被我们抛弃。
我们回过头来,我们的输入是一个one-hot向量,通过查询这个Word Vector字典,我们可以得到每一个词的向量化表示。如下图所示。
我们可以这样说,这个模型的隐藏层实际上就是一个查表操作,隐藏层的输出其实就是模型输入的word vector表示。