Word2Vec

183 阅读3分钟

这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战


我们之前讲过如何得到word embedding的E矩阵的一种方法。使用的是神经网络进行了训练。我们当然要知道那个方法进行训练,计算复杂度非常大。所以有没有更简便的方法呢。

Word2Vec有两种训练模式:

  • CBOW(Continuous Bag-of-Words Model)
  • Skip-gram (Continuous Skip-gram Model)

本文讲的是skip-grams1

绝大多数词向量学习模型本质上都是在建立词与其上下文之间的联系。CBOW模型使用上下文窗口中词的集合作为条件输入预测目标词,简单理解就是从头到尾依次计算。Skip-gram模型在此基础之上作了进一步的简化,使用每个词作为独立的上下文对目标词进行预测。


基本模型

在skip-gram模型中我们要建立一个监督学习模型。

在这里我们需要选定一个上下文词汇(Content)和一个目标词汇(Target)。

模型过程:

one-hotEword embedding e→softmax→y^\hat y

  • 首先我们要从词汇的one-hot向量oo入手。
  • 我们可以得到一个word embedding矩阵EE
  • 将word embedding矩阵和one-hot向量相乘得到word embedding向量ee
  • 这样结果送入softmax中。
  • 得到最终结果y^\hat y

其中softmax 的计算公式为:

p(tc)=eθtecj=110000eθjecp(t \mid c)=\frac{e^{\theta_{t}^{\top} e_{c}}}{\sum_{j=1}^{10000}e^{\theta_{j}^{\top} e_{c}}}

看着softmax的计算公式,我们就应该知道它的分母计算量是很大的。我们这个例子词汇表只有1万。计算量已经很恐怖了。如果那些词汇表的规模为100万呢。

  • θt\theta_{t}是与输出t有关的参数,即某个输出词汇t和标签相符的概率是多少。
  • 没有加偏置项。

损失函数使用的是负对数自然估计。

L(y^,y)=n=110000yilogy^\mathcal{L}(\hat{y}, y)=-\sum_{n=1}^{10000} y_{i} \log \hat y

softmax之后输出的是一个10000维度的向量。结果是所有可能目标词汇的概率。

优化这个模型比我们之前讲的优化那个神经网络会简单很多很多。

解决softmax计算量大

p(tc)=eθtecj=110000eθjecp(t \mid c)=\frac{e^{\theta_{t}^{\top} e_{c}}}{\sum_{j=1}^{10000}e^{\theta_{j}^{\top} e_{c}}}

看着softmax的计算公式,我们就应该知道它的分母计算量是很大的。我们这个例子词汇表只有1万。计算量已经很恐怖了。如果那些词汇表的规模为100万呢。

有一个方法是对其进行平均拆分。可以考虑一下二分查找。他不会一下子告诉你最后这个结果是在1万个单词中的哪一个位置。而是分层的告诉你。

比如第一层告诉你,他在后5000个之中。第二层告诉你,他在前7500个之中。然后第三层再逐层告诉你。(图左)

另一个方法是按频率进行统计。

可以考虑一下哈曼树那种。水平比较高的更接近根节点。当然也有的是使用力学持平比较低的,更接近于根节点。(图右)

image.png


  1. [1301.3781] Efficient Estimation of Word Representations in Vector Space (arxiv.org)