- 书上提供了skip-gram模型的代码实现,但是没有去讲解;这里我们自己来看看他提供的代码;
- 看代码的时候,尤其注意他和前面所说的CBOW模型在实现上的区别;
- 这里也提供了一份完整的副本:https://1drv.ms/u/s!AvF6gzVaw0cNjqFRa39YunPQdYGINQ?e=o8BLSu;
1 skip-gram模型的实现
1.1模型结构的实现
-
下图为skip-gram模型与CBOW模型在模型结构实现上的代码对比:
-
都是使用 w i n w_{in} win和 w o u t w_{out} wout作为输入侧和输出侧的权重矩阵;
-
skip-gram模型输入是中间的目标词,因此只需要一个输入层来处理一个单词即可
-
从前面讲述的skip-gram模型的网络结构来看(即下图),因为要预测的是上下文,所以输出侧多次使用了 w o u t w_{out} wout;但是在代码实现上,也只是构建了一个
out_layer
;可以不可以构建两个out_layer
(这两个out_layer
共享权重 w o u t w_{out} wout)呢?- 答案是可以的,这两种方式在前向计算时应该是没有区别的,效果一样;区别主要在于反向传播的时候
- 使用一个
out_layer
,由于后面计算损失还是要计算两次然后损失相加,因此反向传播时当计算完两个损失的分支之后,需要先累加两路分支的梯度,然后再经过out_layer
层的反向传播计算 w o u t w_{out} wout的梯度;即先累加损失分支的梯度,再求 w o u t w_{out} wout的梯度; - 使用两个
out_layer
,则每个损失反向传播结束后,分别进入各自的out_layer
层进行反向传播,得到各路分支对各自层的 w o u t w_{out} wout的梯度;此时就需要模仿CBOW模型在训练时的处理,即需要将共享权重的梯度进行整合,也即将这些梯度累加。
-
Skip-gram模型的损失计算层有两个(前提是上下文窗口大小为
1
),而CBOW模型的损失计算层只有一个,因为目标词就是它的预测目标; -
其余内容一样:梯度和参数的整理等
-
1.2前向传播的实现
-
两个模型的前向计算过程对比如下图所示:
- 注意此时Skip-gram模型的输入是
target
,即目标词;这与CBOW模型不同 - CBOW由于有两个输入层,因此两个输入层计算好之后需要相加再平均才能得到中间层的结果;而Skip-gram模型则是一步到位;
- 中间层到输入层一样,因为在代码实现上两者都是一个
out_layer
; - CBOW模型只需要计算一个损失即可;Skip-gram模型则使用了两次输出,分别与上下文单词计算了损失,并求和作为最终损失;
- 注意此时Skip-gram模型的输入是
1.3反向传播的实现
-
两个模型的反向传播计算过程对比如下图所示:
- CBOW模型只有一个损失层,所以反向传播只计算一次;而Skip-gram模型有两个损失计算层,所以计算了两个;且根据前向传播计算图,模型输出形成两路分支来计算两个损失,因此反向传播到这个分支处时,梯度需要累加;所以
out_layer
的输出侧的梯度是ds = dl1 + dl2
; - 之后的反向传播过程两个模型一样;
- CBOW模型只有一个损失层,所以反向传播只计算一次;而Skip-gram模型有两个损失计算层,所以计算了两个;且根据前向传播计算图,模型输出形成两路分支来计算两个损失,因此反向传播到这个分支处时,梯度需要累加;所以
2 skip-gram模型的计算与学习
-
实现skip-gram模型的前向计算的代码与CBOW相差无几,两者的对比如下:
-
skip-gram模型的训练和学习的实现:
-
这里没有专门去写这部分的代码,但是基本上都和CBOW模型的训练过程类似;
-
要说区别的话,其实就是少了一个梯度整合的过程,因为这里我们只用了一个输入层权重和输出层权重,不存在权重共享的情况;
-
3总结
- 目前学习到的CBOW模型和skip-gram模型都是基于推理的方法,说白了就是神经网络的方法;和书上一样,我们再来总结一下这两类方法;
- 基于计数的方法通过 对整个语料库的统计数据进行一次学习(其实就是统计了)来获得单词的分布式表示,而基于推理的方法是通过神经网络进行学习,这个学习除了学习到单词的分布式表示,其实还可以学习到一些模式;
- 因此,当语料库发生变化时,基于计数的方法的成本问题就出现了
- 而基于推理的方法, 可以通过mini-batch的学习,实现增量学习,进一步更新模型的参数,成本较低;
-----------以下是书上原话-------------
- 但是,不是说基于推理的方法就是优于基于计数的方法,实际上,有研究表明,就单词相似性的定量评价而言,基于推理的方法和基于计数的方法难分上下;
- 基于推理的方法和基于计数的方法存在关联性
- 具体地说,使用了 skip-gram 和下一章介绍的 Negative Sampling 的模型被证明与对整个语料库的共现矩阵(实际上会对矩阵进行一定的修改)进行特殊矩阵分解的方法具有相同的作用;即这两种方法在某些条件下是相通的,详见论文;
- GloVe方法融合了基于推理的方法和基于计数的方法。该方法的思想是,将整个语料库的统计数据的信息纳入损失函数,进行 mini-batch 学习。据此,这两个方法论成功地被融合在了一起。