Word2Vec中的CBOW模型训练原理详细解析
1. CBOW模型概述
CBOW模型的训练目标是利用一个单词周围的上下文单词来预测该单词本身。具体来说,给定当前单词的上下文单词,通过训练神经网络来最大化当前单词出现在这些上下文单词中的概率。
2. 模型结构
CBOW模型的结构如下:
- 输入层:输入为上下文单词的one-hot编码表示。
- 隐藏层:对输入的上下文单词向量进行平均,得到上下文向量。
- 输出层:通过一个 softmax 层预测当前单词的概率分布。
3. 符号定义
假设有一个词汇表,大小为 V V V,表示为 W = { w 1 , w 2 , . . . , w V } W = \{w_1, w_2, ..., w_V\} W={w1,w2,...,wV}。对于每个单词 w i w_i wi,定义以下符号:
- x ( i ) x^{(i)} x(i): 输入的one-hot编码向量,维度为 V × 1 V \times 1 V×1,仅在第 i i i 个位置为1,其余为0。
- v i v_i vi: 输入词向量,维度为 N × 1 N \times 1 N×1,即嵌入层的参数。
- u i u_i ui: 输出词向量,维度为 N × 1 N \times 1 N×1,即 softmax 层的参数。
4. 模型训练流程
假设当前单词为 w o w_o wo,其上下文窗口大小为 C C C,则上下文单词序列为 w o − C , w o − C + 1 , . . . , w o − 1 , w o + 1 , . . . , w o + C w_{o-C}, w_{o-C+1}, ..., w_{o-1}, w_{o+1}, ..., w_{o+C} wo−C,wo−C+1,...,wo−1,wo+1,...,wo+C。
4.1 输入表示
将上下文单词的one-hot编码向量拼接起来,表示为:
X = [ x ( o − C ) , x ( o − C + 1 ) , . . . , x ( o − 1 ) , x ( o + 1 ) , . . . , x ( o + C ) ] X = [x^{(o-C)}, x^{(o-C+1)}, ..., x^{(o-1)}, x^{(o+1)}, ..., x^{(o+C)}] X=[x(o−C),x(o−C+1),...,x(o−1),x(o+1),...,x(o+C)]
4.2 隐藏层表示
CBOW模型对上下文单词的向量表示进行平均,得到上下文向量 h h h:
h = 1 2 C ∑ c = 1 C ( v o − c + v o + c ) h = \frac{1}{2C} \sum_{c=1}^{C} (v_{o-c} + v_{o+c}) h=2C1c=1∑C(vo−c+vo+c)
其中, v o − c v_{o-c} vo−c 和 v o + c v_{o+c} vo+c 分别表示上下文单词 w o − c w_{o-c} wo−c 和 w o + c w_{o+c} wo+c 的输入词向量。
4.3 输出层表示
通过 softmax 层计算当前单词 w o w_o wo 出现的概率:
P ( w o ∣ c o n t e x t ) = exp ( u o T h ) ∑ k = 1 V exp ( u k T h ) P(w_o | context) = \frac{\exp(u_o^T h)}{\sum_{k=1}^{V} \exp(u_k^T h)} P(wo∣context)=∑k=1Vexp(ukTh)exp(uoTh)
其中, u o u_o uo 为当前单词 w o w_o wo 的输出词向量。
4.4 损失函数
定义损失函数为负对数似然函数:
L = − log P ( w o ∣ c o n t e x t ) = − u o T h + log ∑ k = 1 V exp ( u k T h ) L = -\log P(w_o | context) = -u_o^T h + \log \sum_{k=1}^{V} \exp(u_k^T h) L=−logP(wo∣context)=−uoTh+logk=1∑Vexp(ukTh)
目标是通过梯度下降算法最小化损失函数 L L L。
5. 模型训练
通过反向传播算法计算损失函数 L L L 对模型参数 v i v_i vi 和 u i u_i ui 的梯度,并更新参数:
v i ← v i − η ∂ L ∂ v i v_i \leftarrow v_i - \eta \frac{\partial L}{\partial v_i} vi←vi−η∂vi∂L
u i ← u i − η ∂ L ∂ u i u_i \leftarrow u_i - \eta \frac{\partial L}{\partial u_i} ui←ui−η∂ui∂L
其中, η \eta η 为学习率。
5.1 梯度计算
首先计算输出层的梯度:
∂ L ∂ u o = h − x o \frac{\partial L}{\partial u_o} = h - x_o ∂uo∂L=h−xo
∂ L ∂ u k = h ⋅ exp ( u k T h ) ∑ j = 1 V exp ( u j T h ) ( k ≠ o ) \frac{\partial L}{\partial u_k} = h \cdot \frac{\exp(u_k^T h)}{\sum_{j=1}^{V} \exp(u_j^T h)} \quad (k \neq o) ∂uk∂L=h⋅∑j=1Vexp(ujTh)exp(ukTh)(k=o)
其中, x o x_o xo 为当前单词 w o w_o wo 的one-hot编码向量。
然后计算隐藏层的梯度:
∂ L ∂ h = ∑ k = 1 V u k ⋅ ∂ L ∂ u k \frac{\partial L}{\partial h} = \sum_{k=1}^{V} u_k \cdot \frac{\partial L}{\partial u_k} ∂h∂L=k=1∑Vuk⋅∂uk∂L
最后计算输入层的梯度:
∂ L ∂ v i = 1 2 C ⋅ ∂ L ∂ h ( i = o − C , o − C + 1 , . . . , o − 1 , o + 1 , . . . , o + C ) \frac{\partial L}{\partial v_i} = \frac{1}{2C} \cdot \frac{\partial L}{\partial h} \quad (i = o-C, o-C+1, ..., o-1, o+1, ..., o+C) ∂vi∂L=2C1⋅∂h∂L(i=o−C,o−C+1,...,o−1,o+1,...,o+C)
6. 词向量获取
训练完成后,输入词向量 v i v_i vi 即为单词 w i w_i wi 的分布式表示。
7.总结
总而言之,CBOW是采取拿多个训练一个的思想。比如,现在有一串文本text = "abcdeadebcdae...",统计出里面只有[a,b,c,d,e]这五个独一无二的'字'。想要训练'字'与'字'之间的关联(比如"吃"和"饭"这两个词有关联,有时"睡觉"和"午休"这两个词可以相近表示,想要实现这个,就可以使用CBOW方法来实现。)