用一个最小可计算的例子,把 CBOW(Continuous Bag of Words)的前向计算、softmax、损失与反向传播的直觉一次讲清楚。

一、问题设定
我们用一个极小的例子来理解 CBOW 的核心思想:根据上下文词 ["the", "sat"],预测中心词 "cat"。
-
示例句子(窗口大小 = 1):
the cat sat- 目标词(Target):
cat - 上下文词(Context):
[the, sat]
- 目标词(Target):
-
词表(Vocabulary):
["the", "cat", "sat"]-
词表大小∣V∣=3|V| = 3∣V∣=3
-
后面的所有 one-hot 向量、嵌入矩阵和输出概率,都会基于这个词表展开。
-
二、计算过程
2.1 Step1: 上下文词的独热(One-Hot)表示
按照词表顺序 [the, cat, sat]:
| Word | Index | One-hot |
|---|---|---|
| the | 0 | [1,0,0][1, 0, 0][1,0,0] |
| cat | 1 | [0,1,0][0, 1, 0][0,1,0] |
| sat | 2 | [0,0,1][0, 0, 1][0,0,1] |
上下文是 [the, sat],因此我们得到两个 one-hot 向量。
- vthe=[1,0,0]\mathbf{v}_{\text{the}}= [1,0,0]vthe=[1,0,0]
- vsat=[0,0,1]\mathbf{v}_{\text{sat}}= [0,0,1]vsat=[0,0,1]
2.2 Step2: 上下文向量求平均(CBOW 的核心)
CBOW 不关心顺序,只关心**“袋子里的词”**。
(1) 求和
$$
\begin{aligned}
\mathbf{v}{\text{[the, sat]}} &= \mathbf{v}{\text{the}} + \mathbf{v}_{\text{sat}} \
&= [1, 0, 0] + [0, 0, 1] \
&= [1,0,1]
\end{aligned}
$$
(2) 取平均(2 个上下文词)
v=12v[the, sat]=[12,0,12] \mathbf{v} = \frac{1}{2} \mathbf{v}_{\text{[the, sat]}} = [\frac{1}{2}, 0, \frac{1}{2}] v=21v[the, sat]=[21,0,21]
这个向量表示:当前上下文中,the 和 sat 各占一半。
2.3 Step3: 嵌入矩阵(Embedding Matrix)
设嵌入维度为d=2d = 2d=2,随机初始化嵌入矩阵 Win∈R∣V∣×d\mathbf{W}_{\text{in}} \in \mathbb{R}^{|V|×d}Win∈R∣V∣×d:
Win=[0.10.20.00.50.30.8]
\mathbf{W}_{\text{in}} = \begin{bmatrix}
0.1 & 0.2 \\
0.0 & 0.5 \\
0.3 & 0.8
\end{bmatrix}
Win=0.10.00.30.20.50.8
| Word | Dim1 | Dim2 |
|---|---|---|
| the | 0.1 | 0.2 |
| cat | 0.0 | 0.5 |
| sat | 0.3 | 0.8 |
每一行对应一个词的 embedding向量。
2.4 Step4: 计算上下文嵌入向量
用 平均后的 one-hot 向量 乘以嵌入矩阵:
h=WinTv=[0.10.00.30.20.50.8][0.500.5]=[0.20.5]
\begin{aligned}
\mathbf{h} &= \mathbf{W}^T_{\text{in}} \mathbf{v} \\
&=\begin{bmatrix}
0.1 & 0.0 & 0.3 \\
0.2 & 0.5 & 0.8
\end{bmatrix}
\begin{bmatrix}
0.5 \\
0 \\
0.5
\end{bmatrix} \\
&= \begin{bmatrix}
0.2 \\
0.5
\end{bmatrix}
\end{aligned}
h=WinTv=[0.10.20.00.50.30.8]0.500.5=[0.20.5]
这一步本质上是:把上下文词的 embedding 做平均。
2.5 Step5: 输出权重矩阵
输出矩阵 Wout∈Rd×∣V∣\mathbf{W}_{\text{out}} \in \mathbb{R}^{d×|V|}Wout∈Rd×∣V∣(随机初始化):
Wout=[0.20.10.30.40.60.5]
\mathbf{W}_{\text{out}} = \begin{bmatrix}
0.2 & 0.1 & 0.3 \\
0.4 & 0.6 & 0.5
\end{bmatrix}
Wout=[0.20.40.10.60.30.5]
| the | cat | sat | |
|---|---|---|---|
| dim1 | 0.2 | 0.1 | 0.3 |
| dim2 | 0.4 | 0.6 | 0.5 |
2.6 Step 6:计算每个词的打分(Logits)
WoutTh=[0.20.40.10.60.30.5][0.20.5]=[0.240.320.31] \begin{aligned} \mathbf{W}_{\text{out}}^T \mathbf{h} &= \begin{bmatrix} 0.2 & 0.4 \\ 0.1 & 0.6 \\ 0.3 & 0.5 \end{bmatrix} \begin{bmatrix} 0.2 \\ 0.5 \end{bmatrix} \\ &= \begin{bmatrix} 0.24 \\ 0.32 \\ 0.31 \end{bmatrix} \end{aligned} WoutTh=0.20.10.30.40.60.5[0.20.5]=0.240.320.31
2.7 Step 7:Softmax 转换为概率
(1) 指数计算
exp(0.24)=1.271exp(0.32)=1.377exp(0.31)=1.363 \text{exp}(0.24) = 1.271 \\ \text{exp}(0.32) = 1.377 \\ \text{exp}(0.31) = 1.363 exp(0.24)=1.271exp(0.32)=1.377exp(0.31)=1.363
(2) 求和
1.271+1.377+1.363=4.011 1.271 + 1.377 + 1.363 = 4.011 1.271+1.377+1.363=4.011
(3) Softmax概率计算
| Word | Probability |
|---|---|
| the | 1.2714.011≈0.317\frac{1.271}{4.011} \approx 0.3174.0111.271≈0.317 |
| cat | 1.3774.011≈0.343\frac{1.377}{4.011} \approx 0.3434.0111.377≈0.343 |
| sat | 1.3634.011≈0.340\frac{1.363}{4.011} \approx 0.3404.0111.363≈0.340 |
模型当前最看好的是 cat,但信心还不够高。
2.8 Step8: 损失函数(交叉熵)
在得到预测概率之后,CBOW 通过交叉熵损失来衡量当前预测的好坏。
(1) 损失计算
目标词是 cat,其预测概率为 0.343:
L=−log(P(cat∣[the,sat]))=−log(0.343)≈1.07
\mathcal{L} = -\log(P(\text{cat}|\text{[the,sat]}))=-\log(0.343) \approx 1.07
L=−log(P(cat∣[the,sat]))=−log(0.343)≈1.07
这个损失并不仅仅是一个数字,它同时也是一个信号,告诉模型:“这次预测哪里做得不够好,下一次该往哪个方向调整。”
(2) 损失的直觉
- 如果P(cat∣[the, sat])=1P(\text{cat}|\text{[the, sat]}) = 1P(cat∣[the, sat])=1 → L=0\mathcal{L} = 0L=0完美预测)
- 如果P(cat∣[the, sat])=0P(\text{cat}|\text{[the, sat]}) = 0P(cat∣[the, sat])=0 → L→∞\mathcal{L} \to \infinL→∞(极差)
- 当前是 中等置信度 → 中等损失
2.9 Step9: 反向传播
为了改进模型,本轮训练将根据损失函数对参数进行更新,使模型在相同上下文下 提高对目标词 "cat" 的预测概率,同时降低其他词的预测概率。
(1) Softmax输出层的梯度
- 在 CBOW 中,输出层首先计算每个词的打分(logits):
z=WoutTh \mathbf{z} = \mathbf{W}_{\text{out}}^T \mathbf{h} z=WoutTh
其中,h\mathbf{h}h为上下文embedding向量,WoutT\mathbf{W}^T_{\text{out}}WoutT为输出权重矩阵,ziz_izi表示词表中第iii个词的得分。
经过softmax后,得到预测概率pip_ipi,因为目标词采用onehot表示,我们记为yiy_iyi。
- 对于 softmax + 交叉熵损失,其对 logits 的梯度为:
∂L∂zi=pi−yi \frac{\partial \mathcal{L}}{\partial z_i} = p_i - y_i ∂zi∂L=pi−yi
这里:pip_ipi是模型对第iii个词的预测概率,yiy_iyi是真实标签(目标词对应位置为 1,其余为 0)
该公式直接反映了预测与真实标签之间的偏差。
-
计算每个词的梯度
Word pip_ipi yiy_iyi Gradient: pi−yip_i-y_ipi−yi the 0.317 0 0.317 cat 0.343 1 -0.657 sat 0.340 0 0.340
(2) 梯度的含义
-
对
cat:梯度为 负 ,下次应该提高它的得分 -
对
the / sat:梯度为 正 ,下次应该降低它们的得分可以将该梯度理解为:预测偏大的词被压低,预测偏小的词被拉高。
(3) 更新权重
该梯度首先用于更新输出权重矩阵Wout\mathbf{W}_{\text{out}}Wout,随后继续向前传播至上下文向量h\mathbf{h}h,并最终更新输入嵌入矩阵中上下文词(the、sat)对应的词向量。
目标词 "cat" 的输入嵌入在本轮 CBOW 更新中不会被更新,因为它并未参与上下文向量的构造。
三、总结
通过这个完整的 CBOW 示例,我们从一次最小的训练过程出发,串联起了模型学习语义的全过程。

在前向传播阶段,CBOW 将上下文词映射为词向量,并对其取平均,形成一个上下文语义表示;随后通过输出层和 softmax,计算每个词作为中心词的预测概率。
在反向传播阶段,交叉熵损失刻画了模型预测与真实目标词之间的偏差。这一偏差通过梯度的形式传回模型参数,使目标词的得分被提升,非目标词的得分被抑制。
需要注意的是,在 CBOW 中,真正被直接更新的是上下文词的词向量以及输出层的权重,而不是目标词本身的输入词向量。这意味着模型并不是孤立地“记住某个词”,而是在不断调整:哪些上下文组合,应该更容易指向哪个中心词。
当这样的更新在大规模语料上反复进行时,具有相似上下文的词,其词向量会在嵌入空间中逐渐靠近;语义不同的词,则会自然分离。 这正是词向量能够捕捉语义相似性与语义结构的根本原因。
&spm=1001.2101.3001.5002&articleId=157730266&d=1&t=3&u=5f1c148a7de04bc6a96240661647dae8)
8518

被折叠的 条评论
为什么被折叠?



