Word2Vec过程详解(极易理解)

163 阅读6分钟

word2vec过程详解

本文将对文章word2vec Parameter Learning Explained ——Xin Rong进行解读

摘要

​ word2vec是一种词嵌入模型,对单词进行one-hot编码得到的序列数据训练,得到dd维空间上的词向量,从而得到降维的效果。word2vec核心思想是根据多类分类任务构建模型,而词嵌入只是其中的一个副产物。word2vec包含两个模型,分别为CBOW(Continuous Bag-of-Word Model)和SG(skip-gram Model)。两种模型的思路一样,但损失函数稍微有点不一样。在看本文前,需要的前提知识:

  • 了解一些经典的机器学习流程。
  • 了解损失函数和梯度下降法的含义。
  • 了解one-hot编码。
  • 了解多分类任务,softmax交叉熵损失的意义。
  • 了解稀疏概念。
  • 了解条件概率。

​ 一个机器学习模型的构建流程关键在于:

  • 定义输入数据的类型。
  • 定义计算过程。
  • 定义损失函数。
  • 定义参数更新方法。

1 Continuous Bag-of-Word Model

​ CBOW模型是基于上下文对中心词进行预测,首先基于one-hot编码对单词进行数据化,再投入到模型训练,得到的模型参数为降维后的词向量。

符号说明
VV词典单词数
NN隐藏元个数(降维维度dd)

1.1 One-word context

​ 我们先讨论一个单词的任务。一个单词的任务主要思想是:降维后的词向量需要保持单词在词典中的位置信息。首先我们贴上一张过程图,随后对图的过程进行详解。 image-20221016184614987.png

Step1、定义输入模型的数据(one-hot编码)

​ 给定一个单词x\mathbf{x}=“真香”,假设词典中单词数为VV个,假设x\mathbf{x}位于词典中第二个词,则根据one-hot编码可得,x=[0,1,0,0,,0]\mathbf{x}=[0,1,0,0,\cdots,0],第二个位置编码为1,其他为0。目的是将XX进行降维。

Step2、前向计算,定义两个将向量进行"稠密化"的矩阵。

​ 第一次计算:定义Input\rightarrowHidden的矩阵WW,定义WW矩阵维度为V×NV\times N

h=WTx=W(k,)T:=vwIT\mathbf{h}=\mathbf{W}^{T} \mathbf{x}=\mathbf{W}_{(k,)}^{T}:=\mathbf{v}_{w_{I}}^{T}

​ 其中vwIT\mathbf{v}_{w_{I}}^{T}定义为降维后的单词向量,原文的意思是“is the vector representation of input word”,为了更直观的看出计算过程,将以"真香"为例,计算过程如下:

h=WTx=[w11w12w1Nw21w22w2NwV1wV2wVN]T[010]=[w11w21wV1w12w22wV2w1Nw2NwVN][010]=[w21w22w2N]h=W^T\mathbf{x}=\left[ \begin{matrix} w_{11}& w_{12}& \cdots& w_{1N}\\ w_{21}& w_{22}& \cdots& w_{2N}\\ \vdots& \vdots& \ddots& \vdots\\ w_{V1}& w_{V2}& \cdots& w_{VN}\\ \end{matrix} \right] ^T\left[ \begin{array}{c} 0\\ 1\\ \vdots\\ 0\\ \end{array} \right] =\left[ \begin{matrix} w_{11}& w_{21}& \cdots& w_{V1}\\ w_{12}& w_{22}& \cdots& w_{V2}\\ \vdots& \vdots& \ddots& \vdots\\ w_{1N}& w_{2N}& \cdots& w_{VN}\\ \end{matrix} \right] \left[ \begin{array}{c} 0\\ 1\\ \vdots\\ 0\\ \end{array} \right] =\left[ \begin{array}{c} w_{21}\\ w_{22}\\ \vdots\\ w_{2N}\\ \end{array} \right]

​ 即:

hT=vwI=[w21w22w2N]h^T=\mathbf{v}_{w_{I}}=\left[ \begin{matrix} w_{21}& w_{22}& \cdots& w_{2N}\\ \end{matrix} \right]

​ 第二步计算:定义Hidden\rightarrowOutput的矩阵WW',定义WW'矩阵维度为N×VN\times V该矩阵的意义是将hh映射为和一开始输入one-hot变量一样长度为VV的向量进行输出,从而可以定义交叉熵损失函数。将以"真香"为例,计算过程为:

u=WTh=[w11w12w1Vw21w22w2VwN1wN2wNV]T[w21w22w2N]=[w11w21wN1w12w22wN2w1Vw2VwNV][w21w22w2N]=[k=1Nw2kwk1k=1Nw2kwk2k=1Nw2kwkN]V×1=[u1u2uV]u=W'^Th=\left[ \begin{matrix} w_{11}'& w_{12}'& \cdots& w_{1V}'\\ w_{21}'& w_{22}'& \cdots& w_{2V}'\\ \vdots& \vdots& \ddots& \vdots\\ w_{N1}'& w_{N2}'& \cdots& w_{NV}'\\ \end{matrix} \right] ^T\left[ \begin{array}{c} w_{21}\\ w_{22}\\ \vdots\\ w_{2N}\\ \end{array} \right] =\left[ \begin{matrix} w_{11}'& w_{21}'& \cdots& w_{N1}'\\ w_{12}'& w_{22}'& \cdots& w_{N2}'\\ \vdots& \vdots& \ddots& \vdots\\ w_{1V}'& w_{2V}'& \cdots& w_{NV}'\\ \end{matrix} \right] \left[ \begin{array}{c} w_{21}\\ w_{22}\\ \vdots\\ w_{2N}\\ \end{array} \right] =\left[ \begin{array}{c} \sum\limits_{k=1}^N{w_{2k}w_{k1}'}\\ \sum\limits_{k=1}^N{w_{2k}w_{k2}'}\\ \vdots\\ \sum\limits_{k=1}^N{w_{2k}w_{kN}'}\\ \end{array} \right] _{V\times 1}=\left[ \begin{array}{c} u_1\\ u_2\\ \vdots\\ u_V\\ \end{array} \right]

​ 化简上式,即为:

uj=vwjThu_{j}=\mathbf{v}_{w_{j}}^{\prime T} \mathbf{h}

​ 其中vwj\mathbf{v}_{w_{j}}WW'的第jj

​ 第三步计算:定义Output的激活函数softmax。注意我们的任务是一个分类任务,而不是一个词嵌入任务,因此我们需要将第二步计算得到的uju_j进行softmax映射,得到总和为1的数值,定义得到的最终输出为:(此处需要了解softmax交叉熵损失函数具体参考简单的交叉熵损失函数,你真的懂了吗? - 知乎 (zhihu.com))

p(wjwI)=yj=exp(uj)j=1Vexp(uj)(1)p\left(w_{j} \mid w_{I}\right)=y_{j}=\frac{\exp \left(u_{j}\right)}{\sum_{j^{\prime}=1}^{V} \exp \left(u_{j^{\prime}}\right)} \tag{1}

​ (注意此处是一个单词的模型)还是以"真香"为例,我们输入x\mathbf{x}=“真香”,x=[0,1,0,0,,0]\mathbf{x}=[0,1,0,0,\cdots,0]

  • 从图中可以看出,输出层有VVyy值,根据多分类任务的思想,我们取最大的yjy_j,输出结果则为成功分类到第jj类。
  • 因此word2vec构建的模型可以看作是VV类分类任务(VV是词典中的单词数)。
  • 为了保持降维后的词向量是拥有在词典中的位置信息的,因此word2vec模型的目标是最大化y2y_2(因为"真香"位于第二个位置)。

​ 那么有人就可能问了,输入一个词,构建一个模型分类识别出是这个词,那不是多此一举吗?

​ 答:并不是多此一举,word2vec的目标产物并不是最终层的输出,而是模型的副产物,中间隐藏层WV×NW_{V\times N}WN×VW_{N\times V}',如输入”真香“,训练得到的对应模型参数W后,我们可以计算

WTxW^T\mathbf{x}

​ 从而查询“真香"对应的词向量为

hT=vwI=[w21w22w2N]h^T=\mathbf{v}_{w_{I}}=\left[ \begin{matrix} w_{21}& w_{22}& \cdots& w_{2N}\\\end{matrix} \right]

Step3、损失函数,从上述我们可以知道word2vec模型实际是一个分类任务,首先我们将公式(1)进行转化,带入uju_j的实际值,得到:

p(wjwI)=exp(vwjTvwI)j=1Vexp(vwjTvwI)p\left(w_{j} \mid w_{I}\right)=\frac{\exp \left(\mathbf{v}_{w_{j}}^{\prime}{ }^{T} \mathbf{v}_{w_{I}}\right)}{\sum_{j^{\prime}=1}^{V} \exp \left(\mathbf{v}_{w_{j^{\prime}}}{ }^{T} \mathbf{v}_{w_{I}}\right)}

​ 定义损失函数EE为:

maxp(wOwI)=maxyj=maxlogyj=ujlogj=1Vexp(uj):=E,\begin{aligned} \max p\left(w_{O} \mid w_{I}\right) &=\max y_{j^{*}} \\ &=\max \log y_{j^{*}} \\ &=u_{j^{*}}-\log \sum_{j^{\prime}=1}^{V} \exp \left(u_{j^{\prime}}\right):=-E, \end{aligned}

​ 其中jj^{*}为输入词在词典的真实位置,如真香的位置是2,因此j=2j^{*}=2,从损失函数的定义可以看出,以真香为例,我们想要最大化y2y_2

Step4、方向传播参数更新:word2vec模型采用梯度下降法进行参数更新,由于本文是对word2vec的过程详解,主导过程的详解,因此将不详细进行推导,有兴趣的同学可以去看原文。

1.2 Multi-word context

​ 本节我们将讨论多个单词的模型。在1.1节中,我们讨论了一个单词的模型,在一个单词模型中,word2vec只使用了单词在词典的位置信息。由于一个单词不可能是独立出现的,而是随着句子出现的,因此我们还可以利用单词在句子中的位置:即上下文。如将对句子"螺蛳粉真香啊"进行训练,首先对句子进行分词,分为"螺蛳粉",”真香“,”啊",我们假设"螺蛳粉"在词典的第1个位置,“啊”在第3个位置(这样假设是为了我写one-hot编码得到的向量)。同样,我们先贴一张过程图。

image-20221016201257570.png

Step1、定义输入模型的数据(one-hot编码)

  • "螺蛳粉":x1=[1,0,0,0,,0]\mathbf{x_1}=[1,0,0,0,\cdots,0]
  • ”真香“:x2=[0,1,0,0,,0]\mathbf{x_2}=[0,1,0,0,\cdots,0]
  • ”啊":x3=[0,0,1,0,,0]\mathbf{x_3}=[0,0,1,0,\cdots,0]

和一个单词模型(输入和输出目标一样),不一样的是:模型目标为输入x1\mathbf{x_1},x3\mathbf{x_3},预测中心词x2\mathbf{x_2}

Step2、和一个单词模型的Step1大致一样,不同的是在隐藏层中,我们将对得到的值进行平均化操作

h=12WT(x1+x3)=12(vw1+vw3)T\begin{aligned} \mathbf{h}&=\frac{1}{2}\mathbf{W}^T\left( \mathbf{x}_1+\mathbf{x}_3 \right)\\ &=\frac{1}{2}\left( \mathbf{v}_{w_1}+\mathbf{v}_{w_3} \right) ^T\\ \end{aligned}

Step3、由于是分类"真香",因而和一个单词模型的损失函数一样,目标是让y2y_2值最大化

E=logp(wOwI,1,,wI,C)=uj+logj=1Vexp(uj)=vwOTh+logj=1Vexp(vwjTh)\begin{aligned} E &=-\log p\left(w_{O} \mid w_{I, 1}, \cdots, w_{I, C}\right) \\ &=-u_{j^{*}}+\log \sum_{j^{\prime}=1}^{V} \exp \left(u_{j^{\prime}}\right) \\ &=-\mathbf{v}_{w_{O}}^{\prime}{ }^{T} \cdot \mathbf{h}+\log \sum_{j^{\prime}=1}^{V} \exp \left(\mathbf{v}_{w_{j}}^{\prime}{ }^{T} \cdot \mathbf{h}\right) \end{aligned}

Step4、同样为反向传播,梯度下降法。

2 Skip-Gram Model

​ Skip-Gram Model 的思想是利用中心词预测上下文,具体操作是对损失函数进行修改。同样以句子"螺蛳粉真香啊"举例,首先对句子进行分词,分为"螺蛳粉",”真香“,”啊"。我要预测出”真香“的上下文,即预测出”螺蛳粉“,”啊“。

​ 因此模型修改为模型目标为输入中心词x2\mathbf{x_2},预测上下文x1\mathbf{x_1},x3\mathbf{x_3},根据one-hot编码信息,和下图对应的位置,我们需要对y11y_{11}y23y_{23}最大化(因为y1,jy_{1,j}对应的是x1\mathbf{x_1}y2,jy_{2,j}对应的是x3\mathbf{x_3})。

​ 其他过程类似,对应的损失函数修改为:

E=logp(wO,1,wO,2,,wO,CwI)=logc=1Cexp(uc,jc)j=1Vexp(uj)=c=1Cujc+Clogj=1Vexp(uj)\begin{aligned} E &=-\log p\left(w_{O, 1}, w_{O, 2}, \cdots, w_{O, C} \mid w_{I}\right) \\ &=-\log \prod_{c=1}^{C} \frac{\exp \left(u_{c, j_{c}^{*}}\right)}{\sum_{j^{\prime}=1}^{V} \exp \left(u_{j^{\prime}}\right)} \\ &=-\sum_{c=1}^{C} u_{j_{c}^{*}}+C \cdot \log \sum_{j^{\prime}=1}^{V} \exp \left(u_{j^{\prime}}\right) \end{aligned}

image-20221016202519644.png

存在的缺陷

  • word2vec模型的参数量很大,如22万个词的词典,降维设定为256256维,则WW矩阵将有20000×25620000×256
  • 损失函数计算量过大,因为word2vec实际上是一个分类任务,如果是22万个词的词典,将对应22万类的分类模型,计算Softmax中的j=1Vexp(vwjTvwI)\sum_{j^{\prime}=1}^{V} \exp \left(\mathbf{v}_{w_{j^{\prime}}}{ }^{T} \mathbf{v}_{w_{I}}\right)将变得十分困难。

​ 目前word2vec采用的两种加速方法:Hierarchical Softmax,Negative Sampling。均是解决Softmax中的问题,有兴趣的同学自行了解。