在 NLP 中,把 x 看做一个句子里的一个词语,y 是这个词语的上下文词语,那么这里的 f,便是 NLP 中经常出现的『语言模型』(language model),这个模型的目的,就是判断 (x,y) 这个样本,是否符合自然语言的法则。
Word2vec 正是来源于这个思想,但它的最终目的,不是要把 f 训练得多么完美,而是只关心模型训练完后的副产物——模型参数(这里特指神经网络的权重),并将这些参数,作为输入 x 的某种向量化的表示,这个向量便叫做——词向量。
如果是用一个词语作为输入,来预测它周围的上下文,那这个模型叫做『Skip-gram 模型』而如果是拿一个词语的上下文作为输入,来预测这个词语本身,则是 『CBOW 模型』
y 是 x 的上下文,所以 y 只取上下文里一个词语的时候,语言模型就变成:
用当前词 x 预测它的下一个词 y
使用one-hot作为 x 的一个原始输入形式。所谓 本质上是用一个只含一个 1、其他都是 0 的向量来唯一表示词语。
Skip-gram 的网络结构了,x 就是上面提到的 one-hot encoder 形式的输入,y 是在这 V 个词上输出的概率,我们希望跟真实的 y 的 one-hot encoder 一样。

首先说明一点:隐层的激活函数其实是线性的,相当于没做任何处理,我们要训练这个神经网络,用反向传播算法,本质上是链式求导。当模型训练完后,最后得到的其实是神经网络的权重。
比如现在输入一个 x 的 one-hot encoder: [1,0,0,…,0],则在输入层到隐含层的权重里,只有对应 1 这个位置的权重被激活,这些权重的个数,跟隐含层节点数是一致的,从而这些权重组成一个向量 vx 来表示x,而因为每个词语的 one-hot encoder 里面 1 的位置是不同的,所以,这个向量 vx 就可以用来唯一表示 x。
输出 y 也是用 V 个节点表示的,对应V个词语,可以把输出节点置成 [1,0,0,…,0],但是激活的是隐含层到输出层的权重,这些权重的个数,跟隐含层一样,也可以组成一个向量 vy,跟上面提到的 vx 维度一样,而这两种词向量 vx 和 vy,正是 Mikolov 在论文里所提到的,『输入向量』和『输出向量』,一般我们用『输入向量』
注:词向量的维度(与隐含层节点数一致)一般情况下要远远小于词语总数 V 的大小,所以 Word2vec 本质上是一种降维操作——把词语从 one-hot encoder 形式的表示降维到 Word2vec 形式的表示。
上面讨论的是最简单情形,即 y 只有一个词,当 y 有多个词时,网络结构如下:

可以看成是 单个x->单个y 模型的并联,cost function 是单个 cost function 的累加(取log之后)