0

Words as Vectors

这篇博客是iksnic的博客Words as Vectors的翻译,部分翻译有做改动,如有翻译不当的地方,请在评论区提出。下面是译文。

向量空间模型是信息检索中非常有名的模型,该模型中每个文档被当做是一个向量。向量中的元素表示对应的单词在文档中的权重或重要程度,利用余弦相似度可以计算两个文档之间的相似度。

虽然使用向量来表示单词的方法已经出现了一段时间,但是把单词映射到向量的词嵌套技术已经兴起。其中Tomáš Mikolov的 Word2vec算法影响很大,该算法使用大量文本来产生低(原文是high,但是我举得词嵌套的矩阵的维度相对词典的维度来说是低维度)维度(50-300)来表示单词以及在获得没有借助外部标注下获得单词与单词之间的关系。这种表示方法也获取了语言的规律,比如它通过向量操作vec(‘Paris’) – vec(‘France’) + vec(‘Italy’)产生一个向量来近似表示vec(‘Rome’)

如下图所示,word2vec算法使用单隐藏层的全连接神经网络,如下图所示。隐藏层的神经元是线性神经元,而输入层的神经元的数量和训练数据的单词的数量一致。隐藏层的大小与最后词向量的维度一致,输出层的维度和输入层维度一致。因此,假设需要学习的词向量包含$V$个单词以及每个词向量有$N$维,从输入层到隐藏层之间的权重可以用$V \times N$的权重矩阵$WI$表示,其中每一行表示一个单词,同样从隐藏层到输出层的权重矩阵是一个$N \times V$的矩阵$WO$,其中每一列表示词典中的一个单词。网络的输入使用one-hot encoding表示,也即在输入向量中只有对应的单词是$1$其他的都是$0$。

word2vec的网络结构

为了更好理解word2vec的算法细节,以下面的训练语料为例:

该语料有$8$个单词,将这些单词按照字母表顺序排序好之后,每个单词可以用它们的索引来表示。对于这个例子,我们的神经网络有$8$个输入神经元以及$8$个输出神经元。假设隐藏层有3个神经元,那么矩阵$WI$与$WO$的权重分别是$8 \times 3$以及$3 \times 8$。在训练开始之前,我们随机初始化这两个权重矩阵。为了更好的说明问题,我们假设$WI$和$WO$的初始值为

WI矩阵

WO矩阵

假设我们要学习单词$cat$和$climbed$之间的关系,也就是说当单词$cat$输入到神经网络中的时候,神经网络应该输出单词$climbed$对应的概率应该比其他的单词要高。在词嵌套(word embedding)技术中,单词$cat$是context,单词$climbed$是target。因此,输入应该$X$应该是[0 1 0 0 0 0 0 0]t。注意只有第二个元素是$1$表示输入单词$cat$。给定target是$climbed$,那么 target输出应该是[0 0 0 1 0 0 0 0 ]t.(在理想情况下我们希望这样,但是实际上这是理想目标,而我们训练的神经网络就是为了逼近这个目标,最后得到的了权重矩阵)。

当输入单词是$cat$的时候,隐藏层的输出为

\begin{equation}
H^t= X^t \cdot W \cdot I = \begin{bmatrix}-0.490796 & -0.229903 & 0.065460 \end{bmatrix}
\end{equation}

预料之中的是,由于one-hot encoding,隐藏层的输出$H$是矩阵$WI$的第二行权重。因此,隐藏层的输出是权重矩阵$WI$对应单词索引行。那么输出层的结果是:

\begin{equation}
H^t \cdot W \cdot O = \\
\begin{bmatrix}
.100934&-.309331&-.122361&-.151399&.143463&-.051262&-.079686&.112928
\end{bmatrix}
\end{equation}

由于我们的目标是在输出层产生单词的概率,也就是  Pr(wordk|wordcontext) for k = 1, V,这些概率反应了与输入层单词的下一个单词的关系,我们需要对输出层求和加至$1$。这里使用softmax函数计算概率。因此,可以通过下面的公式计算第$k$个神经元的输出,其中$activation(n)$表示输出层的第n个神经元的激活函数值。

\begin{equation}
y_k = Pr(word_k | word_{context}) = \frac{\exp(activiatin(k))}{\sum_{n=1}^{V}\exp(activiation(n))}
\end{equation}

因此,语料中的8个词的概率是:

0.143073   0.094925   0.114441   0.111166   0.149289   0.122874   0.119431   0.144800

上面加粗的结果就是target第单词$climbed$的概率。给定target向量[0 0 0 1 0 0 0 0 ]t,输出层的误差很容易通过减去target向量的概率向量得到。一旦误差确定,可以通过反向传播算法更新权重矩阵$WO$和$WI$的值。因此,可以利用不同的context-target单词对进行训练。本质上,这就是word2vec算法学习单词之间关系的以及产生语料库中单词的向量表示的过程。

Continuous Bag of Words (CBOW) 模型

上面的介绍主要针对学习单词与单词之间的关系。在CBOW(Continuous Bag of Words)模型中,context有多个词而target为一个单词。比如,我们可以使用$cat$和$tree$作为context,然后把$climbed$作为target。这需要修改神经网络的架构,如下图所示,输入层有$C$个输入,而且每个输入与隐藏层相连,在隐藏层,对$C$个输入求和之后需要除以$C$,得到输出层的输入。

CBOW神经网络结构

基于上面给定的$C$个context单词,每个单词使用one-hot encoding进行编码,隐藏层的输出是context单词的输入的平均值。输出层同上,训练的过程同上。

Skip-Gram模型

Skip-gram模型的网络翻转targetcontext单词的使用。其中,target单词作为输入,隐藏层保持不变,输出层复制(replicated)与context单词数相同的倍数,因此有$C$个输出层。比如,把$cat$和$tree$作为context,把$climbed$作为target单词,输入向量是[0 0 0 1 0 0 0 0 ]t,两个输出向量[0 1 0 0 0 0 0 0] t 和 [0 0 0 0 0 0 0 1 ]t 分别作为context向量(原文是target,但是个人认为应该是context)。在输出层,有多少个输出向量就有多少个概率向量。每个输出层的误差向量产生的方法与上面讨论的一致,然后,所有的输出向量的误差向量需要求和然后通过反向传播调整权重。这保证了在训练的过程中,每个输出层的权重矩阵$WO$是相等的。

在上文中,我简单介绍了word2vec算法。在实际应用中,为了在合理的时间内训练,有很多其他的细节需要考虑。基于此,也许有人会问下面的问题:

问:还有其他产生单词的向量表示的方法吗?
答:有,我将会在接下来的博文中介绍
问:把单词作为向量的用途和优势是什么?
答:同样,在我即将发布的博文中会介绍

goingmyway

我是一只野生程序猿,我关注机器学习,神经网络,深度学习,增强学习,人工智能,Python,C/C++,Linux

发表评论

电子邮件地址不会被公开。 必填项已用*标注