Word2Vec 是什么?
Word2Vec 是一种将单词映射为固定长度稠密向量(词向量) 的神经网络模型。
它通过无监督学习从大规模语料中捕捉词的语义和句法信息,使语义相近的词在向量空间中距离较近(如 "king" 和 "queen")。
核心思想是:一个词的含义可以由其上下文来体现。
Word2Vec 有两种主要架构:
- CBOW (Continuous Bag-of-Words):用上下文词预测中心词。
- Skip-gram:用中心词预测上下文词(本文重点)。
Skip-gram 模型结构

Skip-gram 是一个三层神经网络:
- 输入层:中心词(one-hot 编码)
- 隐藏层:词嵌入(低维稠密向量)
- 输出层:softmax 多分类,预测上下文词训练目标:最大化给定中心词时,实际上下文词出现的概率。
具体例子
图例

设定
- 词表大小 V=5(词汇:the, cat, dog, mouse, bird)
- 嵌入维度 N=3
- 中心词 = "cat"(索引 1)
- 上下文词 = "dog"(索引 2)
输入层 → 隐藏层
输入向量 :"cat" 的 one-hot 表示(长度为 5,位置 1 为 1,其他为 0):
x = 0 1 0 0 0 x = \begin{bmatrix} 0 \\ 1 \\ 0 \\ 0 \\ 0 \end{bmatrix} x= 01000
这一步的作用是让模型能够处理离散的单词,将其转化为数值形式,以便后续矩阵运算。
权重矩阵 W 是 V×N 的矩阵,随机初始化(例如):
W = 0.2 0.1 0.5 0.3 0.6 0.8 0.9 0.4 0.2 0.7 0.1 0.3 0.5 0.2 0.4 W = \begin{bmatrix} 0.2 & 0.1 & 0.5 \\ 0.3 & 0.6 & 0.8 \\ 0.9 & 0.4 & 0.2 \\ 0.7 & 0.1 & 0.3 \\ 0.5 & 0.2 & 0.4 \end{bmatrix} W= 0.20.30.90.70.50.10.60.40.10.20.50.80.20.30.4
隐藏层 h 计算: h = W T ⋅ x h = W^T \cdot x h=WT⋅x。由于 x 是 one-hot,结果就是 W 的第 1 行(索引从 0 开始):
W T = 0.2 0.3 0.9 0.7 0.5 0.1 0.6 0.4 0.1 0.2 0.5 0.8 0.2 0.3 0.4 W^T = \begin{bmatrix} 0.2 & 0.3 & 0.9 & 0.7 & 0.5 \\ 0.1 & 0.6 & 0.4 & 0.1 & 0.2 \\ 0.5 & 0.8 & 0.2 & 0.3 & 0.4 \end{bmatrix} WT= 0.20.10.50.30.60.80.90.40.20.70.10.30.50.20.4 ,
h = W T ⋅ x = 0.2 ∗ 0 + 0.3 ∗ 1 + 0.9 ∗ 0 + 0.7 ∗ 0 + 0.5 ∗ 0 0.1 ∗ 0 + 0.6 ∗ 1 + 0.4 ∗ 0 + 0.1 ∗ 0 + 0.2 ∗ 0 0.5 ∗ 0 + 0.8 ∗ 1 + 0.2 ∗ 0 + 0.3 ∗ 0 + 0.4 ∗ 0 h = W^T \cdot x = \begin{bmatrix} 0.2 * 0 + 0.3 * 1 + 0.9 * 0 + 0.7 * 0 + 0.5 * 0 \\ 0.1 * 0 + 0.6 * 1 + 0.4 * 0 + 0.1 * 0 + 0.2 * 0 \\ 0.5 * 0 + 0.8 * 1 + 0.2 * 0 + 0.3 * 0 + 0.4 * 0 \end{bmatrix} h=WT⋅x= 0.2∗0+0.3∗1+0.9∗0+0.7∗0+0.5∗00.1∗0+0.6∗1+0.4∗0+0.1∗0+0.2∗00.5∗0+0.8∗1+0.2∗0+0.3∗0+0.4∗0
然后得到 h = 0.3 0.6 0.8 h = \begin{bmatrix} 0.3 & 0.6 & 0.8 \end{bmatrix} h=0.30.60.8, 这行的值就是"cat"的初始词向量。
隐藏层的作用是将高维稀疏的 one-hot 压缩为低维稠密的语义向量,同时为后续的上下文预测提供基础。
隐藏层 → 输出层
输出权重矩阵 W ′ W' W′ 是 N×V 矩阵(也随机初始化):
W ′ = 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 0.2 0.3 0.4 0.5 0.6 W' = \begin{bmatrix} 0.1 & 0.2 & 0.3 & 0.4 & 0.5 \\ 0.6 & 0.7 & 0.8 & 0.9 & 1.0 \\ 0.2 & 0.3 & 0.4 & 0.5 & 0.6 \end{bmatrix} W′= 0.10.60.20.20.70.30.30.80.40.40.90.50.51.00.6
输出得分 u = h ⋅ W ′ u = h \cdot W' u=h⋅W′(形状为 1×V):
u = 0.3 0.6 0.8 ⋅ 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 0.2 0.3 0.4 0.5 0.6 = 0.3 ∗ 0.1 + 0.6 ∗ 0.6 + 0.8 ∗ 0.2 0.3 ∗ 0.2 + 0.6 ∗ 0.7 + 0.8 ∗ 0.3 0.3 ∗ 0.3 + 0.6 ∗ 0.8 + 0.8 ∗ 0.4 0.3 ∗ 0.4 + 0.6 ∗ 0.9 + 0.8 ∗ 0.5 0.3 ∗ 0.5 + 0.6 ∗ 1.0 + 0.8 ∗ 0.6 T = 0.55 0.72 0.89 1.06 1.23 u = \begin{bmatrix} 0.3 & 0.6 & 0.8 \end{bmatrix} \cdot \begin{bmatrix} 0.1 & 0.2 & 0.3 & 0.4 & 0.5 \\ 0.6 & 0.7 & 0.8 & 0.9 & 1.0 \\ 0.2 & 0.3 & 0.4 & 0.5 & 0.6 \end{bmatrix} = \begin{bmatrix} 0.3 * 0.1 + 0.6 * 0.6 + 0.8 * 0.2 \\ 0.3 * 0.2 + 0.6 * 0.7 + 0.8 * 0.3 \\ 0.3 * 0.3 + 0.6 * 0.8 + 0.8 * 0.4 \\ 0.3 * 0.4 + 0.6 * 0.9 + 0.8 * 0.5 \\ 0.3 * 0.5 + 0.6 * 1.0 + 0.8 * 0.6 \end{bmatrix}^T = \begin{bmatrix} 0.55 & 0.72 & 0.89 & 1.06 & 1.23 \end{bmatrix} u=0.30.60.8⋅ 0.10.60.20.20.70.30.30.80.40.40.90.50.51.00.6 = 0.3∗0.1+0.6∗0.6+0.8∗0.20.3∗0.2+0.6∗0.7+0.8∗0.30.3∗0.3+0.6∗0.8+0.8∗0.40.3∗0.4+0.6∗0.9+0.8∗0.50.3∗0.5+0.6∗1.0+0.8∗0.6 T=0.550.720.891.061.23
这一步的作用是将词向量 ( h ) 与每个输出词向量(( W' ) 的列)做点积,得到未归一化的匹配分数。
Softmax 归一化得到概率分布。
将得分向量 ( u ) 转换为概率分布 ( p ),使得所有词的概率之和为 1。
Softmax 函数定义为 p j = e u j ∑ k e u k p_j = \frac{e^{u_j}}{\sum_{k} e^{u_k}} pj=∑keukeuj,它放大得分差异并输出一个合法的概率分布,用于多分类预测。
先计算指数:
e 0.55 = 1.733 , e 0.72 = 2.054 , e 0.89 = 2.435 , e 1.06 = 2.886 , e 1.23 = 3.421 e^{0.55} = 1.733, e^{0.72} = 2.054, e^{0.89} = 2.435, e^{1.06} = 2.886, e^{1.23} = 3.421 e0.55=1.733,e0.72=2.054,e0.89=2.435,e1.06=2.886,e1.23=3.421
总和 = 1.733+2.054+2.435+2.886+3.421 = 12.529
概率:
p ( the ) = 1.733 / 12.529 = 0.138 p ( cat ) = 2.054 / 12.529 = 0.164 p ( dog ) = 2.435 / 12.529 = 0.194 p ( mouse ) = 2.886 / 12.529 = 0.230 p ( bird ) = 3.421 / 12.529 = 0.273 \begin{aligned} p(\text{the}) &= 1.733 / 12.529 = 0.138 \\ p(\text{cat}) &= 2.054 / 12.529 = 0.164 \\ p(\text{dog}) &= 2.435 / 12.529 = 0.194 \\ p(\text{mouse}) &= 2.886 / 12.529 = 0.230 \\ p(\text{bird}) &= 3.421 / 12.529 = 0.273 \end{aligned} p(the)p(cat)p(dog)p(mouse)p(bird)=1.733/12.529=0.138=2.054/12.529=0.164=2.435/12.529=0.194=2.886/12.529=0.230=3.421/12.529=0.273
实际上下文词是 "dog" 索引 (2),我们希望其概率尽量大,当前为 0.194。
Softmax 层的作用是让模型输出一个可解释的概率,并用于后续损失计算。
损失函数与反向传播
作用:
衡量模型预测概率分布与真实标签(one-hot 形式)之间的差距。
对于 Skip-Gram,真实标签是上下文词对应的 one-hot 向量(例如 "dog" 的标签为 0,0,1,0,0)。
使用交叉熵损失:
L = − log p ( context ) = − log ( 0.194 ) = 1.640 L = -\log p(\text{context}) = -\log(0.194) = 1.640 L=−logp(context)=−log(0.194)=1.640
损失值较大,说明模型预测错误(概率低)。
交叉熵损失的作用是:当预测概率越接近 1 时损失越小,越接近 0 时损失越大,从而驱动模型通过反向传播调整权重,使正确词的预测概率逐步增大。
反向传播与权重更新
损失函数计算后,通过反向传播计算损失对 ( W ) 和 ( W' ) 的梯度,然后使用梯度下降(例如学习率 0.1)更新权重。
更新后的权重会使 "dog" 的预测概率增大,其他词的概率相对减小。
反复迭代后,( W ) 的每一行(即每个词的词向量)逐渐学习到语义信息,最终得到高质量的词嵌入。
反向传播与权重更新
反向传播:计算梯度
反向传播的核心是链式法则。我们依次计算损失 (L) 对输出层参数 (W') 和输入层参数 (W) 的梯度。
2.1 损失对输出得分 (u) 的梯度
对于 softmax 交叉熵损失,有一个经典的简洁结果:
∂ L ∂ u = p − y \frac{\partial L}{\partial u} = p - y ∂u∂L=p−y
其中 (y) 是真实上下文词的 one-hot 向量(对于 "dog",(y = 0,0,1,0,0^T)),§ 是模型预测的概率向量。
代入数值:
∂ L ∂ u = p − y = 0.138 0.164 0.194 0.230 0.273 − 0 0 1 0 0 = 0.138 0.164 − 0.806 0.230 0.273 \frac{\partial L}{\partial u} = p - y =\begin{bmatrix}0.138 \\ 0.164 \\ 0.194 \\ 0.230 \\ 0.273\end{bmatrix} - \begin{bmatrix}0 \\ 0 \\ 1 \\ 0 \\ 0\end{bmatrix}=\begin{bmatrix} 0.138 \\ 0.164 \\ -0.806 \\ 0.230 \\ 0.273 \end{bmatrix} ∂u∂L=p−y= 0.1380.1640.1940.2300.273 − 00100 = 0.1380.164−0.8060.2300.273
这个向量表示每个输出神经元上的误差信号。
损失对输出权重矩阵 (W') 的梯度
输出得分 (u) 与 (W') 的关系为:(u = h W'),其中 (h) 是隐藏层输出(1×3 行向量),(W') 是 3×5 矩阵。因此,损失对 (W') 的梯度为:
∂ L ∂ W ′ = h T ⋅ ∂ L ∂ u \frac{\partial L}{\partial W'} = h^T \cdot \frac{\partial L}{\partial u} ∂W′∂L=hT⋅∂u∂L
这里 (h^T) 是 3×1 列向量,( ∂ L ∂ u \frac{\partial L}{\partial u} ∂u∂L) 是 1×5 行向量(注意维度对齐)。
实际上,更准确的写法是:
( ∂ L ∂ W ′ ) i j = h i ⋅ ( ∂ L ∂ u ) j \left( \frac{\partial L}{\partial W'} \right)_{ij} = h_i \cdot \left( \frac{\partial L}{\partial u} \right)_j (∂W′∂L)ij=hi⋅(∂u∂L)j
即 (W') 的梯度是一个 3×5 矩阵,其第 (i) 行第 (j) 列元素等于 (h_i) 乘以 (u) 的梯度第 (j) 分量。
计算数值:
∂ L ∂ W ′ = 0.3 0.6 0.8 ⋅ 0.138 0.164 − 0.806 0.230 0.273 = 0.3 × 0.138 0.3 × 0.164 0.3 × ( − 0.806 ) 0.3 × 0.230 0.3 × 0.273 0.6 × 0.138 0.6 × 0.164 0.6 × ( − 0.806 ) 0.6 × 0.230 0.6 × 0.273 0.8 × 0.138 0.8 × 0.164 0.8 × ( − 0.806 ) 0.8 × 0.230 0.8 × 0.273 = 0.0414 0.0492 − 0.2418 0.0690 0.0819 0.0828 0.0984 − 0.4836 0.1380 0.1638 0.1104 0.1312 − 0.6448 0.1840 0.2184 \frac{\partial L}{\partial W'} =\begin{bmatrix} 0.3 \\ 0.6 \\ 0.8 \end{bmatrix}\cdot \begin{bmatrix} 0.138 & 0.164 & -0.806 & 0.230 & 0.273 \end{bmatrix}= \begin{bmatrix}0.3\times0.138 & 0.3\times0.164 & 0.3\times(-0.806) & 0.3\times0.230 & 0.3\times0.273 \\0.6\times0.138 & 0.6\times0.164 & 0.6\times(-0.806) & 0.6\times0.230 & 0.6\times0.273 \\0.8\times0.138 & 0.8\times0.164 & 0.8\times(-0.806) & 0.8\times0.230 & 0.8\times0.273\end{bmatrix} =\begin{bmatrix}0.0414 & 0.0492 & -0.2418 & 0.0690 & 0.0819 \\0.0828 & 0.0984 & -0.4836 & 0.1380 & 0.1638 \\0.1104 & 0.1312 & -0.6448 & 0.1840 & 0.2184\end{bmatrix} ∂W′∂L= 0.30.60.8 ⋅0.1380.164−0.8060.2300.273= 0.3×0.1380.6×0.1380.8×0.1380.3×0.1640.6×0.1640.8×0.1640.3×(−0.806)0.6×(−0.806)0.8×(−0.806)0.3×0.2300.6×0.2300.8×0.2300.3×0.2730.6×0.2730.8×0.273 = 0.04140.08280.11040.04920.09840.1312−0.2418−0.4836−0.64480.06900.13800.18400.08190.16380.2184
损失对隐藏层 (h) 的梯度
隐藏层 (h) 通过 (u = h W') 影响损失。由链式法则:
∂ L ∂ h = ∂ L ∂ u ⋅ ( W ′ ) T \frac{\partial L}{\partial h} = \frac{\partial L}{\partial u} \cdot (W')^T ∂h∂L=∂u∂L⋅(W′)T
这里 ( ∂ L ∂ u \frac{\partial L}{\partial u} ∂u∂L) 是 1×5 行向量,((W')^T) 是 5×3 矩阵,结果是一个 1×3 行向量。
计算数值:
∂ L ∂ h = 0.138 0.164 − 0.806 0.230 0.273 ⋅ 0.1 0.6 0.2 0.2 0.7 0.3 0.3 0.8 0.4 0.4 0.9 0.5 0.5 1.0 0.6 \frac{\partial L}{\partial h} = \begin{bmatrix}0.138 & 0.164 & -0.806 & 0.230 & 0.273\end{bmatrix} \cdot \begin{bmatrix}0.1 & 0.6 & 0.2 \\0.2 & 0.7 & 0.3 \\0.3 & 0.8 & 0.4 \\0.4 & 0.9 & 0.5 \\0.5 & 1.0 & 0.6\end{bmatrix} ∂h∂L=0.1380.164−0.8060.2300.273⋅ 0.10.20.30.40.50.60.70.80.91.00.20.30.40.50.6
逐元素计算:
- 第一列: ( 0.138 × 0.1 + 0.164 × 0.2 + ( − 0.806 ) × 0.3 + 0.230 × 0.4 + 0.273 × 0.5 ) = ( 0.0138 + 0.0328 − 0.2418 + 0.0920 + 0.1365 = 0.0333 ) (0.138\times0.1 + 0.164\times0.2 + (-0.806)\times0.3 + 0.230\times0.4 + 0.273\times0.5) = (0.0138 + 0.0328 - 0.2418 + 0.0920 + 0.1365 = 0.0333) (0.138×0.1+0.164×0.2+(−0.806)×0.3+0.230×0.4+0.273×0.5)=(0.0138+0.0328−0.2418+0.0920+0.1365=0.0333)
- 第二列: ( 0.138 × 0.6 + 0.164 × 0.7 + ( − 0.806 ) × 0.8 + 0.230 × 0.9 + 0.273 × 1.0 ) = ( 0.0828 + 0.1148 − 0.6448 + 0.2070 + 0.2730 = 0.0328 ) (0.138\times0.6 + 0.164\times0.7 + (-0.806)\times0.8 + 0.230\times0.9 + 0.273\times1.0) = (0.0828 + 0.1148 - 0.6448 + 0.2070 + 0.2730 = 0.0328) (0.138×0.6+0.164×0.7+(−0.806)×0.8+0.230×0.9+0.273×1.0)=(0.0828+0.1148−0.6448+0.2070+0.2730=0.0328)
- 第三列: ( 0.138 × 0.2 + 0.164 × 0.3 + ( − 0.806 ) × 0.4 + 0.230 × 0.5 + 0.273 × 0.6 ) = ( 0.0276 + 0.0492 − 0.3224 + 0.1150 + 0.1638 = 0.0332 ) (0.138\times0.2 + 0.164\times0.3 + (-0.806)\times0.4 + 0.230\times0.5 + 0.273\times0.6) = (0.0276 + 0.0492 - 0.3224 + 0.1150 + 0.1638 = 0.0332) (0.138×0.2+0.164×0.3+(−0.806)×0.4+0.230×0.5+0.273×0.6)=(0.0276+0.0492−0.3224+0.1150+0.1638=0.0332)
所以:
∂ L ∂ h = 0.0333 0.0328 0.0332 \frac{\partial L}{\partial h} =\begin{bmatrix}0.0333 & 0.0328 & 0.0332\end{bmatrix} ∂h∂L=0.03330.03280.0332
损失对输入权重矩阵 (W) 的梯度
隐藏层 (h = W^T x),其中 (x) 是 one-hot 向量。
由于 (x) 只在中心词索引(这里是1)处为1,其余为0,因此 (h) 等于 (W) 的第1行(索引从0开始)。
所以损失对 (W) 的梯度为:
∂ L ∂ W = x ⋅ ∂ L ∂ h \frac{\partial L}{\partial W} = x \cdot \frac{\partial L}{\partial h} ∂W∂L=x⋅∂h∂L
即 (W) 的梯度是一个 5×3 矩阵,只有第1行(对应中心词 "cat")有非零值,该行等于 ( ∂ L ∂ h \frac{\partial L}{\partial h} ∂h∂L)(1×3 行向量),其余行全为0。
具体数值:
∂ L ∂ W = 0 1 0 0 0 ⋅ 0.0333 0.0328 0.0332 = 0 0 0 0.0333 0.0328 0.0332 0 0 0 0 0 0 0 0 0 \frac{\partial L}{\partial W} =\begin{bmatrix} 0 \\ 1 \\ 0 \\ 0 \\ 0 \end{bmatrix}\cdot \begin{bmatrix}0.0333 & 0.0328 & 0.0332\end{bmatrix}= \begin{bmatrix}0 & 0 & 0 \\0.0333 & 0.0328 & 0.0332 \\0 & 0 & 0 \\0 & 0 & 0 \\0 & 0 & 0\end{bmatrix} ∂W∂L= 01000 ⋅0.03330.03280.0332= 00.033300000.032800000.0332000
权重更新
使用梯度下降法,学习率 η = 0.1 \eta = 0.1 η=0.1(示例值)。
更新公式为:
W new = W old − η ⋅ ∂ L ∂ W W_{\text{new}} = W_{\text{old}} - \eta \cdot \frac{\partial L}{\partial W} Wnew=Wold−η⋅∂W∂L
W new ′ = W old ′ − η ⋅ ∂ L ∂ W ′ W'{\text{new}} = W'{\text{old}} - \eta \cdot \frac{\partial L}{\partial W'} Wnew′=Wold′−η⋅∂W′∂L更新后的 (W'):
W new ′ = 0.1 − 0.00414 0.2 − 0.00492 0.3 + 0.02418 0.4 − 0.00690 0.5 − 0.00819 0.6 − 0.00828 0.7 − 0.00984 0.8 + 0.04836 0.9 − 0.01380 1.0 − 0.01638 0.2 − 0.01104 0.3 − 0.01312 0.4 + 0.06448 0.5 − 0.01840 0.6 − 0.02184 = 0.09586 0.19508 0.32418 0.39310 0.49181 0.59172 0.69016 0.84836 0.88620 0.98362 0.18896 0.28688 0.46448 0.48160 0.57816 W'_{\text{new}} = \begin{bmatrix} 0.1-0.00414 & 0.2-0.00492 & 0.3+0.02418 & 0.4-0.00690 & 0.5-0.00819 \\ 0.6-0.00828 & 0.7-0.00984 & 0.8+0.04836 & 0.9-0.01380 & 1.0-0.01638 \\ 0.2-0.01104 & 0.3-0.01312 & 0.4+0.06448 & 0.5-0.01840 & 0.6-0.02184\end{bmatrix}= \begin{bmatrix}0.09586 & 0.19508 & 0.32418 & 0.39310 & 0.49181 \\0.59172 & 0.69016 & 0.84836 & 0.88620 & 0.98362 \\0.18896 & 0.28688 & 0.46448 & 0.48160 & 0.57816\end{bmatrix} Wnew′= 0.1−0.004140.6−0.008280.2−0.011040.2−0.004920.7−0.009840.3−0.013120.3+0.024180.8+0.048360.4+0.064480.4−0.006900.9−0.013800.5−0.018400.5−0.008191.0−0.016380.6−0.02184 = 0.095860.591720.188960.195080.690160.286880.324180.848360.464480.393100.886200.481600.491810.983620.57816
注意:第三列(对应真实上下文词 "dog")的权重被增加了(因为梯度为负,减去负值等于加),这会使 "dog" 的得分 (u_2) 增大,从而提高其概率。
更新 (W)
W old = 0.2 0.1 0.5 0.3 0.6 0.8 0.9 0.4 0.2 0.7 0.1 0.3 0.5 0.2 0.4 W_{\text{old}} = \begin{bmatrix} 0.2 & 0.1 & 0.5 \\ 0.3 & 0.6 & 0.8 \\ 0.9 & 0.4 & 0.2 \\ 0.7 & 0.1 & 0.3 \\ 0.5 & 0.2 & 0.4 \end{bmatrix} Wold= 0.20.30.90.70.50.10.60.40.10.20.50.80.20.30.4
梯度 ( ∂ L ∂ W \frac{\partial L}{\partial W} ∂W∂L) 只有第1行非零:
η ⋅ ∂ L ∂ W = 0 0 0 0.00333 0.00328 0.00332 0 0 0 0 0 0 0 0 0 \eta \cdot \frac{\partial L}{\partial W} = \begin{bmatrix} 0 & 0 & 0 \\ 0.00333 & 0.00328 & 0.00332 \\ 0 & 0 & 0 \\ 0 & 0 & 0 \\ 0 & 0 & 0 \end{bmatrix} η⋅∂W∂L= 00.0033300000.0032800000.00332000
更新后的 (W)
W new = 0.2 0.1 0.5 0.3 − 0.00333 0.6 − 0.00328 0.8 − 0.00332 0.9 0.4 0.2 0.7 0.1 0.3 0.5 0.2 0.4 = 0.2 0.1 0.5 0.29667 0.59672 0.79668 0.9 0.4 0.2 0.7 0.1 0.3 0.5 0.2 0.4 W_{\text{new}} = \begin{bmatrix} 0.2 & 0.1 & 0.5 \\ 0.3-0.00333 & 0.6-0.00328 & 0.8-0.00332 \\ 0.9 & 0.4 & 0.2 \\ 0.7 & 0.1 & 0.3 \\ 0.5 & 0.2 & 0.4\end{bmatrix}= \begin{bmatrix}0.2 & 0.1 & 0.5 \\0.29667 & 0.59672 & 0.79668 \\0.9 & 0.4 & 0.2 \\0.7 & 0.1 & 0.3 \\0.5 & 0.2 & 0.4\end{bmatrix} Wnew= 0.20.3−0.003330.90.70.50.10.6−0.003280.40.10.20.50.8−0.003320.20.30.4 = 0.20.296670.90.70.50.10.596720.40.10.20.50.796680.20.30.4
只有中心词 "cat" 对应的词向量(第1行)被微调,其他词的向量不变。
这是因为 one-hot 输入只激活了该行。
更新后的效果
更新后,如果我们再次用 "cat" 作为输入进行前向传播,会得到新的概率分布。
由于我们增加了 "dog" 对应的输出权重,并微调了 "cat" 的词向量,预期 "dog" 的概率会从 0.194 上升,损失会下降。
反复迭代所有训练样本(中心词-上下文词对),最终 (W) 的每一行(词向量)会逐渐编码语义信息,使得语义相近的词向量在空间中靠近。
总结
- 前向传播:计算 (h)、(u)、§ 和损失 (L)。
- 计算输出层误差:( δ u = p − y \delta_u = p - y δu=p−y)。
- 更新 (W'):( ∂ L ∂ W ′ = h T δ u \frac{\partial L}{\partial W'} = h^T \delta_u ∂W′∂L=hTδu),( W ′ ← W ′ − η ∂ L ∂ W ′ W' \leftarrow W' - \eta \frac{\partial L}{\partial W'} W′←W′−η∂W′∂L)。
- 传播误差到隐藏层:( δ h = δ u ( W ′ ) T \delta_h = \delta_u (W')^T δh=δu(W′)T)。
- 更新 (W):( ∂ L ∂ W = x δ h \frac{\partial L}{\partial W} = x \delta_h ∂W∂L=xδh)(仅更新中心词对应行),( W ← W − η ∂ L ∂ W W \leftarrow W - \eta \frac{\partial L}{\partial W} W←W−η∂W∂L)。
上述推导基于标准 Skip-Gram 模型(无负采样)。
实际训练中,由于词表巨大,常用负采样(Negative Sampling)来近似梯度,只更新少量负样本对应的权重,从而大幅提高计算效率。
但核心思想相同:通过梯度下降最小化交叉熵损失,使模型能更准确地预测上下文。
总结
- 输入层:将单词转为 one-hot 向量,便于矩阵运算。
- 隐藏层:通过 ( W ) 将 one-hot 映射为低维稠密词向量,是词嵌入的核心。
- 输出层:通过 ( W' ) 将词向量映射为得分,衡量中心词与各词的关联。
- Softmax:将得分归一化为概率,用于多分类预测。
- 损失函数:交叉熵衡量预测与真实标签的差距,驱动模型优化。
权重矩阵的来源与作用
来源
- 初始时随机赋值(如上述示例)。
- 通过训练过程中的反向传播不断调整,使模型能更准确地预测上下文。
- 最终收敛后,W 和 W′ 都包含了词汇的语义信息(实践中通常只用 W 作为词向量)。
作用
输入权重矩阵 W:将 one-hot 向量映射为低维词向量。它的第 ii 行就是词 ii 的最终向量表示。
输出权重矩阵 W′:将词向量映射回词表大小的空间,用于计算概率。它也是词向量的另一个版本(常被忽略,但有时也可作为词向量使用)。
矩阵大小的意义
- 对于词表大小 V 和嵌入维度 N(通常 100~300),W 是 V×N,W′ 是 N×V。
- 整体参数量为 V×N+N×V=2NV,对于大词表(如 10 万词)仍是巨大的,因此实际训练中常用负采样等技术加速。