word2vec skip gram 直观理解
- 目标
根据给定的单词预测与该单词同处一个窗口内其他每个单词出现的概率 - 目标损失函数:
针对每个窗口内非target word 的context word,构建
C ( θ ) = − ∑ w i ∑ c = 1 C l o g p ( w O , c ∣ w I ) C(\theta) = - \sum_{w_i}\sum_{c=1}^Clogp(w_O,c | w_I) C(θ)=−wi∑c=1∑Clogp(wO,c∣wI)损失函数并利用最大似然估计进行求解。 - 网络结构
第一层为输入的单词one-hot向量,维度为1xV,V代表词表中所有词的个数。
中间为隐层,神经元个数代表了压缩后每个词向量的维数N,常见个数有100,200,300。
隐层和输入层间的矩阵V维度为VxN,待学习完成后,每一行的向量对应着词表中每个词作为target词时的词向量。
隐层和输出层间的矩阵N维度为NxV,待学习完成后,每一列的向量对应着词表中每个词每个词作为context 词时的词向量。
- 隐层权重矩阵V
我们用h代表输入词的one-hot向量x和V矩阵点积之后的结果,对应V矩阵中的第k行,x中等于1的那行为k,k的取值范围是整个词表的大小V。
- 隐层权重矩阵N
wj为窗口内任意一个context词,其向量 v w j ′ v'_{w_j} vwj′为N矩阵中的一列。 s j c s_{jc} sjc代表输入词和一个窗口内的context词点积后的结果,对该结果进行softmax操作即可得知输入一个target word,窗口内每个context word 的输出概率 p ( w j = w O , c ∣ w I ) p(wj = w_{O,c} | w_I) p(wj=wO,c∣wI)
训练过程
- 损失函数
从第一步到第二步是将联合概率写为C个 p ( w j = w O , c ∣ w I ) p(w_j = w_{O},c \mid w_I) p(wj=wO,c∣wI)乘积的形式
- SGD update for W ′ W^{\prime} W′
t
j
c
t_{jc}
tjc起到指示作用,当
w
j
c
w_{jc}
wjc不在window内时为0,此时产生误差
e
j
c
e_{jc}
ejc
- SGD update for
W
W
W
值得注意的是在计算 ∂ C ( θ ) ∂ h i \frac{\partial C(\theta)}{\partial h_{i}} ∂hi∂C(θ)时需要对所有的 s j s_{j} sj计算偏导数,这与更新 W ′ W^{\prime} W′中 ∂ C ( θ ) ∂ s j c \frac{\partial C(\theta)}{\partial s_{jc}} ∂sjc∂C(θ)时不同,因为后者只需要考虑context word的向量而非所有词典中词的向量
通过用向量表示求和过程,可以得到输出词向量和输入词向量对应的
v
w
j
′
v'_{w_j}
vwj′和
v
w
I
v_{w_I}
vwI的更新公式
需要注意的是在更新 v w I v_{w_I} vwI时需要遍历词典中的每个词,会造成计算的不便,于是优化方法hierarchical softmax 和negative sampling被提出
负采样
相比于原始模型每次更新所有的输入词向量
v
w
I
v_{w_I}
vwI,负采样在每次更新时只选取一些输出词而不是整个词典,即
w
j
∈
{
w
O
}
∪
W
n
e
g
w_{j} \in\left\{w_{O}\right\} \cup \mathcal{W}_{\mathrm{neg}}
wj∈{wO}∪Wneg
参考资料:台大《应用深度学习》