1. Word2Vec 概述
Word2vec
是用于表示语料库 C. Word2Vec (W2V) 中用于表示单词的分布式表示的模型的组合,它是一种接受文本语料库作为输入并输出每个单词的矢量表示的算法,如下图所示:
我们用于表示单词的向量称为 neural word embeddings
。有一件事描述了另一件事,尽管这两件事情完全不同。正如埃尔维斯·科斯特洛说的:"写音乐就像跳舞一样。“Word2vec 对单词"矢量化”,通过这样做,它使自然语言计算机可读 - 我们可以开始对单词执行强大的数学运算,以检测它们的相似性
。
因此,neural word embedding
表示一个带数字的单词。这是一个简单,但不太可能的翻译。Word2vec 类似于自动编码器,在矢量中对每个单词进行编码,而不是像受限的博尔茨曼机器那样,通过重建来训练输入词,word2vec
将单词与输入语料库中相邻的其他单词进行训练。
它通过两种方式之一,即使用上下文来预测目标词(称为连续字袋或 CBOW 的方法),或者使用单词来预测目标上下文(称为 skip-gram)。我们使用后一种方法,因为它在大型数据集上生成更准确的结果。
当分配给单词的要素矢量不能用于准确预测该单词的上下文时,将调整矢量的分量。语料库中每个单词的上下文都是教师发送错误信号以调整要素矢量。通过调整矢量中的数字,按上下文判断相似的词的向量被推近。在本教程中,我们将重点介绍 Skip-Gram 模型
,该模型与 CBOW
相比,将中心词视为上图中描述的输入,并预测上下文词。
2. 模型概述
我们知道,我们必须用一些词对来馈送一些奇怪的神经网络,但是我们不能只是使用实际字符作为输入,我们必须找到某种方法来表示这些单词的数学,以便网络可以处理它们。一种方法就是创建文本中所有单词的词汇表,然后将单词编码为词汇量相同维度的向量。每个维度都可以作为词汇作为单词来思考。因此,我们将有一个带所有零的向量和一个表示词汇中对应单词的 1。这种编码技术称为one-hot encoding
。考虑到我们的例子,如果我们有一个词汇,由单词"the",“快”,“棕色”,“狐狸”,“跳跃”,“超过”,“懒惰”,“狗”,单词"棕色"由这个向量表示:\0, 0, 1,0, 0“the”, “quick”, “brown”, “fox”, “jumps”, “over”, “the” “lazy”, “dog”, the word “brown” is represented by this vector: [ 0, 0, 1, 0, 0, 0 ,0 ,0 ,0 ]., 0,0,0,0 ,0,0+。
Skip-gram 模型采用文本组,并为每个单词创建一个热矢量。热向量是单词的向量表示,其中向量是词汇的大小(总唯一单词)。所有维度都设置为 0,但表示该时间点用作输入的单词的维度除外。下面是一个热向量的示例:
我们将表示一个输入词,如"蚂蚁"作为单热向量。此向量将包含 10,000 个分量(每个单词的单词对应),我们将在与单词"蚂蚁"对应的位置放置一个"1",在所有其他位置中放置 0。网络的输出是单个向量(也包含 10,000 个分量),包含,对于我们的词汇中每个单词,随机选择的附近单词的概率是该词汇。
在 word2vec 中,使用单词的分布式表示形式。以几百个维度(例如 1000)的矢量。每个单词都由这些元素的权重分布表示。因此,与向量中的元素和单词之间的一对一映射不同,单词的表示形式将分布在向量中的所有元素上,矢量中的每个元素都有助于定义许多单词。
如果我在假设的词矢量中标记维度(当然算法中没有此类预分配的标签),它可能看起来有点像:
Image for post
这样的向量以某种抽象的方式来表示一个词的"意义"。接下来我们将看到,只需检查一个大语料库,就有可能学习能够以令人惊讶的表现方式捕获单词之间关系的词向量。我们还可以使用向量作为神经网络的输入。由于我们的输入向量是一热的,因此将输入向量乘以权重矩阵W1等于简单地从W1 中选择一行。
Image for post
Image for post
从隐藏层到输出层,第二权重矩阵 W2 可用于计算词汇中每个单词的分数,而软矩阵可用于获取单词的后分布。跳过克模型与 CBOW 模型相反。它构造与焦点词作为单个输入向量,目标上下文词现在在输出层。隐藏图层的激活函数仅相当于从权重矩阵 W1(线性)复制相应的行,正如我们以前所看到的那样。在输出层,我们现在输出 C 多音分布,而不是只输出一个。训练目标是在输出层中的所有上下文单词中对求和的预测误差进行模仿。在我们的示例中,输入将是"学习",我们希望在输出层看到(“an”,“高效”,“方法”,“for”,“高”,“质量”,“分布式”,“矢量”)。
以下是我们神经网络的体系结构。
Image for post
在我们的示例中,我们将说,我们正在学习具有 300 个功能的字向量。因此,隐藏层将由一个权重矩阵表示,该矩阵包含 10,000 行(我们词汇中每个单词一个)和 300 列(每个隐藏神经元一列)。300 功能是 Google 在 Google 新闻数据集上训练的已发布模型中使用的功能(您可以从这里下载)。功能的数量是一个"超参数",您只需调整到应用程序(也就是说,尝试不同的值,看看什么会产生最佳结果)。
如果你看看这个权重矩阵的行,这些将是我们的词向量!
Image for post
因此,这一切的最终目标是学习这个隐藏的层重量矩阵 - 输出层,我们只是折腾,当我们完成!然后,1 x 300 字的"蚂蚁"向量被送入输出层。输出层是软最大回归分类器。具体地说,每个输出神经元都有一个权重向量,它根据隐藏层中的词向量相乘,然后它将函数 exp(x) 应用于结果。最后,为了让输出总和到 1,我们将其结果除以所有 10,000 个输出节点的结果之和。下面是计算"汽车"一词输出神经元的输出的图示。
Image for post
如果两个不同的词具有非常相似的"上下文"(即,它们周围可能出现哪些词),则我们的模型需要为这两个单词输出非常相似的结果。网络为这两个词输出类似上下文预测的一个方法是,如果词向量相似。因此,如果两个单词具有相似的上下文,那么我们的网络将激励学习这两个词的类似词向量!塔达!
输入的每个维度都穿过隐藏图层的每个节点。尺寸乘以导致其到隐藏图层的重量。由于输入是热向量,因此只有一个输入节点将具有非零值(即值 1)。这意味着对于一个单词,将只激活与值为 1 的输入节点关联的权重,如上图所示。
由于本例中的输入是热向量,因此只有一个输入节点具有非零值。这意味着只有连接到该输入节点的权重将在隐藏节点中激活。下面为词汇中的第二个单词描述了将考虑的权重示例:
词汇中第二个单词的矢量表示形式(如上图的神经网络所示)在隐藏层中激活后,如下所示:
Image for post
这些权重以随机值开始。然后对网络进行训练,以便调整权重以表示输入词。这是输出层变得重要的地方。现在,我们处于包含词矢量表示的隐藏层中,我们需要一种方法来确定我们预测一个单词适合特定上下文的准确情况。单词的上下文是它周围的窗口中的一组单词,如下所示:
Image for post
上图显示,星期五的上下文包括"猫"和"是"等字。神经网络的目的是预测"星期五"属于此上下文。
我们通过将通过隐藏层(即输入热向量 * 输入隐藏节点的权重)与上下文字的矢量表示(即上下文字 * 输入输出节点的上下文量量)相乘来激活输出图层。第一个上下文单词的输出图层的状态可以在下面可视化:
Image for post
以上乘法是每个单词到上下文词对完成的。然后,我们使用隐藏层和输出层生成的值计算单词属于一组上下文单词的概率。最后,我们应用随机梯度下降来更改权重的值,以便获得计算的概率更理想的值。
在梯度下降中,我们需要计算正在优化的函数的梯度,该点表示我们不断变化的权重。然后,渐变用于选择向局部最佳化前进的步进方向,如下图所示的最小化示例。
Image for post
权重将按最佳点的方向执行一步(在上面的示例中,在图中的最低点)。新值的计算方法是从当前权重值中减去按学习速率缩放的权重点派生函数。下一步是使用"后向",以调整多个图层之间的权重。在输出层末尾计算的误差通过应用链规则从输出层传递回隐藏层。渐变下降用于更新这两个图层之间的权重。然后在每个层调整错误,然后进一步发送回。下面是一个表示回传播的图表:
Image for post
3. 了解使用示例
Word2vec 使用单个隐藏层,完全连接神经网络,如下所示。隐藏层中的神经元都是线性神经元。输入层设置为具有与训练词汇中的单词一样多的神经元。隐藏图层大小设置为生成的字矢量的维维。输出层的大小与输入图层的大小相同。因此,如果学习词向量的词汇表由 V 字和 N 组成,则为单词矢量的维度,则对隐藏层连接的输入可以由大小 VxN 的矩阵 WI 表示,每行表示一个词汇。同样,从隐藏层到输出层的连接可以通过大小 NxV 的矩阵 WO 进行描述。在这种情况下,WO 矩阵的每一列表示给定词汇中的单词。
Image for post
对网络的输入使用"1 出-V"表示进行编码,这意味着只有一条输入线设置为 1,其余输入行设置为零。
假设我们有一个训练语料库,有以下句子:
“狗看见一只猫”,“狗追猫”,“猫爬了一棵树”
语料库词汇有八个单词。按字母顺序排序后,每个单词都可以由其索引引用。对于此示例,我们的神经网络将有八个输入神经元和八个输出神经元。让我们假设我们决定在隐藏层中使用三个神经元。这意味着 WI 和 WO 将分别是 8×3 和 3×8 矩阵。在训练开始之前,这些矩阵将初始化为小随机值,就像神经网络训练中通常一样。就图而言,让我们假设 WI 和 WO 将初始化为以下值:
Image for post
假设我们希望网络学习"猫"和"爬"字之间的关系。也就是说,当将"猫"输入网络时,网络应显示"爬"的概率很高。在词嵌入术语中,“猫"一词称为上下文词,“爬"字称为目标词。在这种情况下,输入向量X将为 +0 0 0 0 0 0 0 0=t。请注意,只有矢量的第二个分量为 1。这是因为输入词是"cat”,在语料库单词的排序列表中保持第二位。鉴于目标词为"爬”,目标向量将看起来像 +0 0 0 0 1 0 0 0 0 0 \t。使用表示"cat"的输入向量,隐藏层神经元的输出可以计算为:
Ht = XtWI = [-0.490796 -0.229903 0.065460]
隐藏神经元输出的矢量 H由于 1-V 表示而模仿 WI 矩阵第二行的权重,这不足为奇。因此,输入到隐藏层连接的功能基本上是将输入字向量复制到隐藏层。对隐藏到输出层执行类似的操作,输出层神经元的激活向量可以编写为
HtWO = [0.100934 -0.309331 -0.122361 -0.151399 0.143463 -0.051262 -0.079686 0.112928]
由于,目标是生成输出层中的单词的概率,Pr(wordk|单词上下文)为 k = 1,V,为了反映其下一个单词与输入时上下文单词的关系,我们需要输出层中的神经元输出总和添加到一个。Word2vec 通过使用 softmax 函数将输出层神经元的激活值转换为概率来实现此目的。因此,k-th神经元的输出由以下表达式计算,其中激活(n)表示第 n-th 输出层神经元的激活值:
参考
A simple Word2vec tutorial. In this tutorial we are going to… | by Zafar Ali | Medium