系列文章目录

第一章 1:同义词词典和基于计数方法语料库预处理

第一章 2:基于计数方法的分布式表示和假设,共现矩阵,向量相似度

第一章 3:基于计数方法的改进以及总结

第二章 1:word2vec

第二章 2:word2vec和CBOW模型的初步实现

第二章 3:CBOW模型的完整实现


文章目录

目录

系列文章目录

文章目录

前言

一、简单的word2vec

1.CBOW模型的定义及其解释

2.CBOW模型的实现过程

二、CBOW模型的学习

1.引入

三、word2vec的权重和分布式表示

总结



前言

上一节我们学习了基于推理的方法,并基于代码讨论了神经网络中单词的处理方法,至此准备工作就完成了,现在是时候实现word2vec了。(如果忘了或者没康过,可以看我前几次发的文章)


一、简单的word2vec

上一节我们学习了基于推理的方法,并基于代码讨论了神经网络中单词 的处理方法,至此准备工作就完成了,现在是时候实现word2vec了。

我们要做的事情是将神经网络嵌入到下图所示的模型中。这里,我们 使用由原版word2vec提出的名为continuous bag-of-words(CBOW)的 模型作为神经网络。

1.CBOW模型的定义及其解释

CBOW模型是根据上下文预测目标词的神经网络(“目标词”是指中间的单词,它周围的单词是“上下文”)。通过训练这个CBOW模型,使其能尽可能地进行正确的预测,我们可以获得单词的分布式表示。

CBOW模型的输入是上下文。这个上下文用['you', 'goodbye']这样的单词列表表示。我们将其转换为one-hot表示,以便CBOW模型可以进行处理。在此基础上,CBOW模型的网络可以画成下图这样:

上图是CBOW模型的网络。它有两个输入层,经过中间层到达输出层。这里,从输入层到中间层的变换由相同的全连接层(权重为Win)完成, 从中间层到输出层神经元的变换由另一个全连接层(权重为Wout)完成。(这里,因为我们对上下文只考虑了两个单词,所以输入层有两个。 如果对上下文考虑N个单词,则输入层会有N个。)

现在,我们注意一下上图的中间层。此时,中间层的神经元是各个输入层经全连接层变换后得到的值的“平均”。就上面的例子而言,经全连接层变换后,第1个输入层转化为h1,第2个输入层转化为h2,那么中间层的神经元是\frac{1}{2} (h_{1}+h_{2})

最后是图中的输出层,这个输出层有7个神经元。这里重要的是, 这些神经元对应于各个单词。输出层的神经元是各个单词的得分,它的值越大,说明对应单词的出现概率就越高。得分是指在被解释为概率之前的值, 对这些得分应用Softmax函数(如果忘了此函数可以搜一下),就可以得到概率。

从输入层到中间层的变换由全连接层(权重是Win)完成。此时,全连接层的权重Win是一个7×3的矩阵。提前剧透一下,这个权重就是我们要的单词的分布式表示:如下:

权重Win的各行保存着各个单词的分布式表示。通过 反复学习,不断更新各个单词的分布式表示,以正确地从上下文预测出应当 出现的单词。令人惊讶的是,如此获得的向量很好地对单词含义进行了编码。这就是word2vec的全貌。

中间层的神经元数量比输入层少这一点很重要。中间层需要将预测单词所需的信息压缩保存,从而产生密集的向量表示。这时,中间层被写入了我们人类无法解读的代码,这相当于“编码”工作。而 从中间层的信息获得期望结果的过程则称为“解码”。这一过程将被编码的信息复原为我们可以理解的形式。

2.CBOW模型的实现过程

到目前为止,我们从神经元视角图示了CBOW模型。下面,我们从层 视角图示CBOW模型。这样一来,这个神经网络的结构如图:

如上图,CBOW模型一开始有两个MatMul层,这两个层的输出被加在一起。然后,对这个相加后得到的值乘以0.5求平均,可以得到中间层的神经元。最后,将另一个MatMul层应用于中间层的神经元,输出得分。

我们来实现CBOW模型的推理(即求得分的过程),具体实现如下所示:

import numpy as np

# MatMul:矩阵乘法而已
class MatMul:
    def __init__(self, W):
        self.params = [W]
        self.grads = [np.zeros_like(W)]
        self.x = None

    def forward(self, x):
        W, = self.params
        out = np.dot(x, W)
        self.x = x
        return out

    def backward(self, dout):
        W, = self.params
        dx = np.dot(dout, W.T)
        dW = np.dot(self.x.T, dout)
        self.grads[0][...] = dW
        return dx


c0 = np.array([[1, 0, 0, 0, 0, 0, 0]])
c1 = np.array([[0, 1, 0, 0, 0, 0, 0]])

W_in = np.random.randn(7, 3)
W_out = np.random.randn(3, 7)

# 生成层
in_layer0 = Matmul(W_in)
in_layer1 = Matmul(W_in)
out_layer = Matmul(W_out)

# 正向传播
h0 = in_layer0_forward(c0)
h1 = in_layer1_forward(c1)
h = 0.5 * (h0 + h1)
s = out_layer.forward(h)


这里,我们首先将必要的权重(W_in和W_out)初始化。然后,生成与 上下文单词数量等量(这里是两个)的处理输入层的MatMul层,输出侧仅 生成一个MatMul层。需要注意的是,输入侧的MatMul层共享权重W_in。 之后,输入侧的MatMul层(in_layer0和in_layer1)调用forward() 方法,计算中间数据,并通过输出侧的MatMul层(out_layer)计算各个 单词的得分。

以上就是CBOW模型的推理过程。这里我们见到的CBOW模型是没 有使用激活函数的简单的网络结构。除了多个输入层共享权重外,并没有什么难点。接下来,我们继续看一下CBOW模型的学习。

二、CBOW模型的学习

1.引入

到目前为止,我们介绍的CBOW模型在输出层输出了各个单词的得分。 通过对这些得分应用Softmax函数,可以获得概率(如下图)。这个概率表示哪个单词会出现在给定的上下文(周围单词)中间。

在上图所示的例子中,上下文是you和goodbye,正确解标签(神经网络应该预测出的单词)是say。这时,如果网络具有“良好的权重”, 那么在表示概率的神经元中,对应正确解的神经元的得分应该更高。 CBOW模型的学习就是调整权重,以使预测准确。其结果是,权重 Win(确切地说是Win和Wout两者)学习到蕴含单词出现模式的向量。根据过去的实验,CBOW模型(和skip-gram模型)得到的单词的分布式表示,特别是使用维基百科等大规模语料库学习到的单词的分布式表示,在单词的含义和语法上符合我们直觉的案例有很多。

现在,我们来考虑一下上述神经网络的学习。其实很简单,这里我们处 理的模型是一个进行多类别分类的神经网络。因此,对其进行学习只是使用 一下Softmax函数和交叉熵误差。首先,使用Softmax函数将得分转化为 概率,再求这些概率和监督标签之间的交叉熵误差,并将其作为损失进行学 习,这一过程可以用下图表示。

如上图所示,只需向上一节介绍的进行推理的CBOW模型加上 Softmax 层和 Cross Entropy Error 层,就可以得到损失。这就是CBOW模型计算损失的流程,对应于神经网络的正向传播。

虽然图3-13中使用了Softmax层和Cross Entropy Error层,但是我 们将这两个层实现为了一个Softmax with Loss层。因此,我们接下来要实现的网络实际上如下图所示。

三、word2vec的权重和分布式表示

如前所述,word2vec中使用的网络有两个权重,分别是输入侧的全连 接层的权重(Win)和输出侧的全连接层的权重(Wout)。一般而言,输入 侧的权重Win 的每一行对应于各个单词的分布式表示。另外,输出侧的权 重Wout也同样保存了对单词含义进行了编码的向量。只是,如下图所 示,输出侧的权重在列方向上保存了各个单词的分布式表示。

那么,我们最终应该使用哪个权重作为单词的分布式表示呢?这里有三个选项。

A. 只使用输入侧的权重

B. 只使用输出侧的权重

C. 同时使用两个权重

方案A和方案B只使用其中一个权重。而在采用方案C的情况下,根据如何组合这两个权重,存在多种方式,其中一个方式就是简单地将这两个权重相加。 就word2vec(特别是skip-gram 模型)而言,最受欢迎的是方案A。 许多研究中也都仅使用输入侧的权重Win作为最终的单词的分布式表示。 遵循这一思路,我们也使用Win作为单词的分布式表示。


总结

好了,今天讲的主要是CBOW模型,你收货了多少?一遍当然有很大可能还是看不懂(我看了三遍才懂了一点),多看几遍,多敲代码,你一定会理解的!相信自己。虽然这节的内容似乎有一些小多,但是我觉得咱们必须要理解,才能为诸如大模型之类的算法打基础!

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐