这篇文章是我的笔记分享,内容主要来自吴恩达老师的深度学习课程。^[AI中国官网-全球领先的线上AI教育、实践平台 (deeplearningai.net)]
Word2Vec有两种训练模式。
- CBOW(Continuous Bag-of-Words Model)
- Skip-gram (Continuous Skip-gram Model)
本文讲的是skip-grams^[[1301.3781] Efficient Estimation of Word Representations in Vector Space (arxiv.org)]。
我们之前讲过如何得到word embedding的E矩阵的一种方法。使用的是神经网络进行了训练。我们当然要知道那个方法进行训练,计算复杂度非常大。所以有没有更简便的方法呢。
基本模型
在skip-gram模型中我们要建立一个监督学习模型。
在这里我们需要选定一个上下文词汇(Content)和一个目标词汇(Target)。
模型过程:
one-hot
→E
→word embedding e
→softmax→$\hat y$
- 首先我们要从词汇的one-hot向量$o$入手。
- 我们可以得到一个word embedding矩阵$E$。
- 将word embedding矩阵和one-hot向量相乘得到word embedding向量$e$。
- 这样结果送入softmax中。
- 得到最终结果$\hat y$
其中softmax 的计算公式为:
$$
p(t \mid c)=\frac{e^{\theta{t}^{\top} e{c}}}{\sum{j=1}^{10000}e^{\theta{j}^{\top} e_{c}}}
$$
- $\theta_{t}$是与输出t有关的参数,即某个输出词汇t和标签相符的概率是多少。
- 没有加偏置项。
损失函数使用的是负对数自然估计。
$$
\mathcal{L}(\hat{y}, y)=-\sum{n=1}^{10000} y{i} \log \hat y
$$
softmax之后输出的是一个10000维度的向量。结果是所有可能目标词汇的概率。
优化这个模型比我们之前讲的优化那个神经网络会简单很多很多。
解决softmax计算量大
$$
p(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个之中。然后第三层再逐层告诉你。
另一个方法是按频率进行统计。
可以考虑一下哈曼树那种。水平比较高的更接近根节点。当然也有的是使用力学持平比较低的,更接近于根节点。