Word2vec(CBOW和Skip-Gram)原理理解及模型训练过程推理

本文深入介绍了Word2vec的CBOW和Skip-Gram模型,探讨了词的分布式表示和训练过程,包括前向传播、反向传播与权重更新,阐述了这两种模型如何通过上下文预测目标词,以获取具有语义信息的词向量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

word2vec理解

学习nlp最先了解的概念应该就是词嵌入(word embedding)吧,Word2vec是一种有效的词嵌入的方法,采用了两种模型(CBOW与skip-gram模型)与两种优化方法(负采样与层次softmax方法)的组合。现在使用Word2vec获得词的向量表达,并将其应用于各种nlp任务中已经非常常见。
由于我们要用计算机来完成各种自然语言理解的任务,而对于计算机来说,人类世界的各种语言文字符号,它根本就不认识,它只能理解数字化的对象,所以需要将自然语言“翻译”成计算机能理解的形式。

One-hot Representation

比较简单的“翻译”方式是One-hot Representation,即词的独热表示。这种词表示方法是将每个词表示成一个向量,向量的长度等于语料中所有词的个数,向量中该单词位置的元素是1,其他位置的元素都是0。比如一个语料中有两个句子,“易烊千玺喜欢我”,“我喜欢李现”,那么这个语料中每个词的独热词表示如下:
“易烊千玺”表示为:[1 0 0 0]
“喜欢”表示为:[0 1 0 0]
“我”表示为:[0 0 1 0]
“李现”表示为:[0 0 0 1]
每个词都是茫茫0海中的一个1,(哈哈哈哈这句话是从别的博客中看到的,笑死)。
One-hot Representation这种将一个词转化成一个高维稀疏向量的表示方式比较简单,但缺点也很明显。一个缺陷就是容易造成维度灾难,如果语料中有五万个词,那么每个词向量就是五万维,然而平时用来训练的语料词语数都很多,数量成千上万很常见。另一个缺陷是这种方法无法表示词之间的相关性,每个词之间都是独立的,不包含语义信息无法反映出词语在语义层面的含义。

distributed representation

另外一种“翻译”方式是distributed representation,即词的分布式表达。通过训练,将每个词映射成一个维度固定的向量,这个向量的维度可以自己设定,所以它就不会那么长了。另外由于在训练的过程中考虑了词语的上下文,所以这种方式可以将词语表达成带有语义信息的低维稠密向量。这个“翻译”的过程就是‘词嵌入(word embedding)’。Word2vec就是一种有效的词嵌入的方法。
Word2vec这种词嵌入的方法在训练的过程中考虑了词语的上下文,就是在目标词(x)和目标词的上下文(y)之间建立一个语言模型f(x)=y,对这个语言模型进行训练,从而实现根据上下文的词得到目标词或根据目标词得到其上下文的词。可以说一个词由其上下文的词表示,而相似的词往往拥有相似的上下文语境,所以相似的词用这种方式得到的词向量也相似。
Word2vec用神经网络的方式来建立上下文和目标词之间的语言模型,当神经网络训练结束后,其隐藏层的权重就是我们要的每个词的词向量。所以word2vec是一个通过训练神经网络得到语言模型的任务,只不过这个任务是个幌子,我们实际要的是这个过程中产生的副产物即隐藏层权重,用这个副产物作为每个词的词向量,将获得的词向量送入下游nlp任务中进行应用才是最终目的。

刚刚说了word2vec包括两个模型和两个用来优化模型trick,下面先说两个模型。

CBOW

CBOW模型理解

CBOW模型根据某个中心词前后A个连续的词,来计算该中心词出现的概率,即用上下文预测目标词。模型结构简易示意图如下:
在这里插入图片描述
模型有三层,输入层,隐藏层(又叫投影层),输出层。上图模型的window=2,即在中心词前后各选两个连续的词作为其上下文。输入层的w(t-2),w(t-1),w(t+1),w(t+2)是中心词w(t)的上下文。

接下来根据下图,走一遍CBOW的流程,推导一下各层矩阵维度的变化。
在这里插入图片描述
原始语料词库(corpus)中有V个单词。滑动窗口window选为A,那总共选取的上下文词个数C=2A.
1.在输入层,输入的是多个上下文单词的one-hot。
(维度:因为corpus中有V个单词,所以每个单词的one-hot的维度1*V,那么在输入层输入的就是C个1*V的向量,所以在输入层,数据维度为C*V)
2.设定最终获得的词向量的维度为N,初始化输入层与隐藏层之间的权重矩阵w,w维度为V*N。上下文单词的one-hot(C*V)与网络的输入权重矩阵w(V*N)相乘,得到C个1*N的向量。把它们求和再平均,得到隐藏层向量h,维度为1*N.
h = 1 C ( x 1 + x 2 + . . . + x c ) ⋅ w h = \frac{1}{C}({x_1} + {x_2} + ... + {x_c}) \cdot w h=C1(x1+x2+...+xc)w
3.初始化隐藏层与输出层之间的权重矩阵 w , {w^,} w,,维度为N*V。
4.隐藏层向量h(1*N)与 w ′ {w\prime} w(N*V)相乘,得到1*V的向量u, u = h ⋅ w ′ u = h \cdot w\prime u=hw。为了方便概率表示,将向量u经过softmax,此时向量softmax(u)的每一维代表语料中的一个单词。向量softmax(u)概率最大的位置所代表的单词为模型预测出的中间词。
5.上一步输出的1*V向量与groud truth中的one hot比较。训练的目的是最大化实际中心词出现的概率,基于此定义损失函数,通过最小化损失函数,采用梯度下降算法更新W和W’。当网络收敛则训练完成,此时矩阵W就是我们想要的词向量。如果我们想要知道语料中某个词的向量表示,就用这个词的one-hot乘以权重矩阵w,得到1*N的向量,这个向量就是我们要找的这个词的向量表示。

因为词的one-hot表示中只有一个位置是1,其余都是0,那么与w相乘后,得到的是w中的某一列向量。由于每个词语的 one-hot里面 1 的位置是不同的,所以不同词的one-hot与w相乘,得到的词向量是w中的不同的列向量。所以可见,权重矩阵中的每一列向量都能对应的、唯一的表示corpus中的每一个词。所以要的词向量就是神经网络输入层与隐藏层之间的权重矩阵。

CBOW模型参数训练过程

这里推导的是更一般的情况,即输入的上下文词不止一个的情况。

前向传播:

输入: x (上下文的one-hot)
Input-hidden权重矩阵: w
隐藏层: 当输入的上下文词有多个时,CBOW在计算隐藏层输出时,并不是直接复制输入上下文的词的输入向量,而是取输入的C个上下文词的向量的均值。
h = 1 C w ⊤ ( x 1 + x 2 + . . . + x c ) = 1 C ( v W , I 1 + v W , I 2 + . . . + v W , I c ) ⊤ h = \frac{1}{C}{w^ \top }({x_1} + {x_2} + ... + {x_c}) = \frac{1}{C}{({v_{W,I1}} + {v_{W,I2}} + ... + {v_{W,Ic}})^ \top } h=C1w(x1+x2+...+xc)=C1(vW,I1+vW,I2+...+vW,Ic)
Hidden-output权重矩阵: w’
输出层每个节点的输入: u j = h ⋅ w ′ = v ′ w j ⊤ h {u_j} = h \cdot w\prime = v{\prime _w}{_j^ \top }{\text{h}} uj=hw=vwjh,其中 v ′ w j v{\prime _w}_j vwj是矩阵w’的第j列向量
输出层每个节点的输出: 就是用softmax获得的词表中每个单词为中心词的概率,
p ( w j ∣ w I 1 , w I 2 , . . . w I C ) = y j = exp ⁡ ( u j ) ∑ j ′ = 1 v exp ⁡ ( u j ′ ) p({w_j}|{w_{I1,}}{w_{I2,}}...{w_{IC}}) = {y_j} = \frac{ {\exp ({u_j})}}{ {\sum\limits_{j\prime = 1}^{\text{v}} {\exp ({u_{j\prime }})} }} p(wjwI1,wI2,...wIC)=yj=j=1vexp(uj)exp(uj)
由模型输出的真实中心词的概率为: p ( w O ∣ w I 1 , w I 2 , . . . w I C ) p({w_O}|{w_{I1,}}{w_{I2,}}...{w_{IC}}) p(wOwI1,wI2,...wIC)
我们训练的目的就是使这个概率最大。
max ⁡ p ( w O ∣ w I 1 , w I 2 , . . . w I C ) = max ⁡ log ⁡ p ( w O ∣ w I 1 , w I 2 , . . . w I C ) = max ⁡ log ⁡ exp ⁡ ( u j ∗ ) ∑ j ′ = 1 v exp ⁡ ( u j ′ ) = max ⁡ ( u j ∗ − log ⁡ ∑ j ′ = 1 v exp ⁡ ( u j ′ ) ) \begin{array}{l} \max p({w_O}|{w_{I1,}}{w_{I2,}}...{w_{IC}})\\ {\rm{ = }}\max \log p({w_O}|{w_{I1,}}{w_{I2,}}...{w_{IC}})\\ = \max \log \frac{ {\exp ({u_{ {j^*}}})}}{ {\sum\limits_{_{j\prime } = 1}^{\rm{v}} {\exp ({u_{j\prime }})} }} = \max ({u_{ {j^*}}} - \log \sum\limits_{_{j\prime } = 1}^{\rm{v}} {\exp ({u_{j\prime }})} ) \end{array} maxp(wOwI1,wI2,...wIC)=maxlogp(wOwI1,wI2,...wIC)=maxlog

评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值