【Word2Vec】Skip-gram 的直观理解(深入浅出)
01 什么是skip-gram
一句话来说就是,给定中心词,然后预测其周围的词:
02 模型结构
- 对于skip-gram来说,输入是一个
[1 x V]
维的ont-hot向量,其中V为词表大小
,值为1的那一项就表示我们的中心词
。 - 经过一个
[V x N]
的矩阵得到一个[1 x N]
的向量,这个向量就是我们需要的词的embedding表示
。 - 然后
[1 x N]
的向量经过一个[N x V]
的矩阵得到一个[1 x V]
的向量,这个向量的值就是中心词与词表中其他词的相似度
,经过softmax就是中心词旁边周围词出现的概率
。 - 优化目标:经过训练
[V x N]
和[N x V]
这两个矩阵,使得最后目标词与周围词的出现概率最大
,而与除了周围词以外的词概率最小(负采样,这里不详细展开了)。
03 直观理解skip-gram流程
这里的每一步,对应了 02 模型结构 中的步骤。
这里我们举一个例子,一步步推导是怎么走的,这样更加直观:
以这句话为例:I love machine learning
。
我们随机初始化两个矩阵:
[V x N]的矩阵为:
[0.1, 0.2]
[0.3, -0.2]
[0.5, 0.4]
[-0.1, 0.3]
其中,V为4,表示词表中有4个单词,N为2表示我们想讲词向量映射为2(这个N是超参数,可以自己设定)。
注意这里为了文章简洁,使用两个相同矩阵,只是转置了一下,真实情况中一般是随机初始化的(大概率不同)。
1. 输入[1 x V]向量
假设我们的目标词是love
,那么输入向量就是[0, 1, 0, 0]
。
2. 经过一个[V x N]的矩阵得到一个[1 x N]的向量
输入向量 x [V x N]的矩阵的直观理解
就是:将词映射成embeding
。
以所举例子所示,向量 x 矩阵的结果就是:
I -> [0.1, 0.2]
love -> [0.3, -0.2]
machine-> [0.5, 0.4]
learning -> [-0.1, 0.3]
也就是将love从ont-hot向量映射为[0.3, -0.2]这个embedding。
3. [1 x N]的向量经过一个[N x V]的矩阵得到一个[1 x V]的向量
这个过程即做预测
,skip-gram的预测过程就是找出跟中心词最相近的词
,向量表示最简单就是看向量乘积,越高说明越相似。
比如,如果想知道love和I、machine之间的相似度:
4. 优化目标
使用交叉熵损失函数,目标是最小化目标词
与真实上下文词
之间的预测误差(注意是真实上下文)。
对于该例子就是:
然后反向传播计算损失,不断优化两个矩阵,最后使得总损失最小,直观理解
就是目标词与周围词的出现概率最大
;
- 训练完成后的第一个矩阵的每一行,就对应着每个词的embedding表示;
- 训练完成后,在做预测时:给定一个词,想知道他的上下文词是谁,就看3. 的结果[1 x V]的向量值最大的n个元素,就对应最可能的n个上下文词。