特征工程-3-词嵌入模型-word2vec
Word2Vec
谷歌2013年提出的Word2Vec是目前最常用的词嵌入模型之一。Word2Vec实际是一种浅层的神经网络模型,它有两种网络结构,分别是CBOW(Continues Bag of Words)和Skip-gram。
CBOW的目标是根据上下文出现的词语来预测当前词的生成概率,如下图(a)所示;而Skip-gram是根据当前词来预测上下文中各词的生成概率,如下图(b)所示。
![截屏2022-06-20 19.27.51](https://tva1.sinaimg.cn/large/e6c9d24egy1h3exnjzm1ej20oq0e6mxt.jpg)
其中 $w(t) $ 是当前所关注的词,\(w(t−2)\)、\(w(t−1)\)、\(w(t+1)\)、\(w(t+2)\) 是上下文中出现的词。假设有一个句子“There is an apple on the table”作为训练样本,所以图中设定的前后滑动窗口大小均设为2。CBOW的输入为(is, an, on, the),输出为apple。而Skip-gram的输入为apple,输出为(is, an, on, the)。
CBOW和Skip-gram都可以表示成由输入层(Input)、映射层(Projection)和输出层(Output)组成的神经网络。
输入层中的每个词由独热编码方式表示,即所有词均表示成一个N维向量,其中N为词汇表中单词的总数。在向量中,每个词都将与之对应的维度置为1,其余维度的值均设为0。
在映射层(又称隐含层)中,\(K\) 个隐含单元(Hidden Units)的取值可以由 \(N\) 维输入向量以及连接输入和隐含单元之间的 \(N×K\) 维权重矩阵计算得到。在CBOW中,还需要将各个输入词所计算出的隐含单元求和。
同理,输出层向量的值可以通过隐含层向量(\(K\) 维),以及以及连接隐含层和输出层之间的 \(K×N\) 维权重矩阵计算得到。输出层也是一个 \(N\) 维向量,每维与词汇表中的一个单词相对应。最后,对输出层向量应用Softmax激活函数,可以计算出每个单词的生成概率。Softmax激活函数的定义为:
其中 \(x\) 代表N维的原始输出向量,\(x_n\) 为在原始输出向量中,与单词 \(w_n\) 所对应维度的取值。
接下来的任务就是训练神经网络的权重,使得语料库中所有单词的整体生成概率最大化。从输入层到隐含层需要一个维度为 \(N×K\) 的权重矩阵,从隐含层到输出层又需要一个维度为 \(K×N\) 的权重矩阵,学习权重可以用反向传播算法实现,每次迭代时将权重沿梯度更优的方向进行一小步更新。但是由于Softmax激活函数中存在归一化项的缘故,推导出来的迭代公式需要对词汇表中的所有单词进行遍历,使得每次迭代过程非常缓慢,由此产生了Hierarchical Softmax和Negative Sampling两种改进方法。
CBOW
-
输入层:上下文单词的One-Hot编码词向量,\(V\) 为词汇表单词个数,\(C\) 为上下文单词个数。还使用上面 \(C=4\),所以模型的输入是(is,an,on,the)4个单词的One-Hot编码词向量。
2、初始化一个权重矩阵 \(W_{V \times N}\) ,然后用所有输入的One-Hot编码词向量左乘该矩阵,得到维数为N的向量\(w_1, w_2, w_3, ..., w_c\) ,这里的 \(N\) 由自己根据任务需要设置。
3、将所得的向量
相加求平均作为隐藏层向量 \(h\)。
4、初始化另一个权重矩阵 \(W^{\prime}_{N \times V}\) ,用隐藏层向量 \(h\) 左乘 \(W^{'}_{N \times V}\) ,再经激活函数处理得到 \(V\) 维的向量 \(y\),\(y\) 的每一个元素代表相对应的每个单词的概率分布。
5、\(y\) 中概率最大的元素所指示的单词为预测出的中间词(target word)与true label的One-Hot编码词向量做比较,误差越小越好(根据误差更新两个权重矩阵)。
在训练前需要定义好损失函数(一般为交叉熵代价函数),采用梯度下降算法更新 \(W\) 和 \(W^{'}\)。训练完毕后,输入层的每个单词与矩阵 \(W\) 相乘得到的向量的就是分布式表示的词向量(Word embedding)。
Skip-Gram
- 首先我们选定句子中间的一个词作为我们的输入词,例如我们选取“apple”作为 input word;
- 有了input word以后,我们再定义一个叫做 skip_window 的参数,它代表着我们从当前 input word 的一侧(左边或右边)选取词的数量。如果我们设置skip_window=2,那么我们最终获得窗口中的词(包括input word在内)就是[‘is’, ’an’, ’apple’, ’on’, ’the’ ]。skip_window=2代表着选取 input word 左侧2个词和右侧2个词进入我们的窗口,所以整个窗口大小 \(span=2\times2=4\) 。另一个参数叫 num_skips,它代表着我们从整个窗口中选取多少个不同的词作为我们的output word,当skip_window=2,num_skips=2时,我们将会得到两组 (input word, output word) 形式的训练数据,即 ('apple', 'an'),('apple', 'one')。
- 神经网络基于这些训练数据中每对单词出现的次数习得统计结果,并输出一个概率分布,这个概率分布代表着到我们词典中每个词有多大可能性跟 input word 同时出现;
- 通过梯度下降和反向传播更新矩阵 \(W\);
- \(W\) 中的行向量即为每个单词的 Word embedding 表示