特征工程-3-词嵌入模型-word2vec

Word2Vec


谷歌2013年提出的Word2Vec是目前最常用的词嵌入模型之一。Word2Vec实际是一种浅层的神经网络模型,它有两种网络结构,分别是CBOW(Continues Bag of Words)和Skip-gram。

CBOW的目标是根据上下文出现的词语来预测当前词的生成概率,如下图(a)所示;而Skip-gram是根据当前词来预测上下文中各词的生成概率,如下图(b)所示。

截屏2022-06-20 19.27.51

其中 w(t) 是当前所关注的词,w(t2)w(t1)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)组成的神经网络。

img

输入层中的每个词由独热编码方式表示,即所有词均表示成一个N维向量,其中N为词汇表中单词的总数。在向量中,每个词都将与之对应的维度置为1,其余维度的值均设为0。

在映射层(又称隐含层)中,K 个隐含单元(Hidden Units)的取值可以由 N 维输入向量以及连接输入和隐含单元之间的 N×K 维权重矩阵计算得到。在CBOW中,还需要将各个输入词所计算出的隐含单元求和。

同理,输出层向量的值可以通过隐含层向量(K 维),以及以及连接隐含层和输出层之间的 K×N 维权重矩阵计算得到。输出层也是一个 N 维向量,每维与词汇表中的一个单词相对应。最后,对输出层向量应用Softmax激活函数,可以计算出每个单词的生成概率。Softmax激活函数的定义为:

P(y=wn|x)=exnk=1Nexk

其中 x 代表N维的原始输出向量,xn 为在原始输出向量中,与单词 wn 所对应维度的取值。

接下来的任务就是训练神经网络的权重,使得语料库中所有单词的整体生成概率最大化。从输入层到隐含层需要一个维度为 N×K 的权重矩阵,从隐含层到输出层又需要一个维度为 K×N 的权重矩阵,学习权重可以用反向传播算法实现,每次迭代时将权重沿梯度更优的方向进行一小步更新。但是由于Softmax激活函数中存在归一化项的缘故,推导出来的迭代公式需要对词汇表中的所有单词进行遍历,使得每次迭代过程非常缓慢,由此产生了Hierarchical Softmax和Negative Sampling两种改进方法。

CBOW

img

  1. 输入层:上下文单词的One-Hot编码词向量,V 为词汇表单词个数,C 为上下文单词个数。还使用上面 C=4,所以模型的输入是(is,an,on,the)4个单词的One-Hot编码词向量。

    2、初始化一个权重矩阵 WV×N ,然后用所有输入的One-Hot编码词向量左乘该矩阵,得到维数为N的向量w1,w2,w3,...,wc ,这里的 N 由自己根据任务需要设置。

    3、将所得的向量 [公式] 相加求平均作为隐藏层向量 h

    4、初始化另一个权重矩阵 WN×V ,用隐藏层向量 h 左乘 WN×V ,再经激活函数处理得到 V 维的向量 yy 的每一个元素代表相对应的每个单词的概率分布。

    5、y 中概率最大的元素所指示的单词为预测出的中间词(target word)与true label的One-Hot编码词向量做比较,误差越小越好(根据误差更新两个权重矩阵)。

    在训练前需要定义好损失函数(一般为交叉熵代价函数),采用梯度下降算法更新 WW。训练完毕后,输入层的每个单词与矩阵 W 相乘得到的向量的就是分布式表示的词向量(Word embedding)。

Skip-Gram

img

  1. 首先我们选定句子中间的一个词作为我们的输入词,例如我们选取“apple”作为 input word;
  2. 有了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×2=4 。另一个参数叫 num_skips,它代表着我们从整个窗口中选取多少个不同的词作为我们的output word,当skip_window=2,num_skips=2时,我们将会得到两组 (input word, output word) 形式的训练数据,即 ('apple', 'an'),('apple', 'one')。
  3. 神经网络基于这些训练数据中每对单词出现的次数习得统计结果,并输出一个概率分布,这个概率分布代表着到我们词典中每个词有多大可能性跟 input word 同时出现;
  4. 通过梯度下降和反向传播更新矩阵 W
  5. W 中的行向量即为每个单词的 Word embedding 表示
posted @   huggingAha  阅读(337)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示