最近一直在思考word2Vec这算法,其根本是想知道它是怎么从softmax的思想,丝滑转变为词距离远近的思想,理解了这种思想,可以解决很多其他相似的问题。
想要理解这个算法,需要知道它是怎么操作的。
以skip-gram算法为主,假设我有一句话,I love deep learning,以deep 为中心词,然后windows=3,这样我们可以得到三个训练样本(deep, love)、(deep, learning)、(deep, I),训练样本的意思是,根据A,预测B,例如根据deep预测 love,根据deep,预测learning。我的词表大小是M,第一组样本 deep,love 扔进网络,deep经过nn.Embedding得到w_deep,然后 w_deep输入nn.Linear,得到和词表M个标量分数(logits);也就是:
score(I), score(love), score(deep), score(learning), ... score(word10000)
因为Linear本质是 y = Wx + b, 然后经过softmax之后,将标量变成了概率,即模型认为:
P(I|deep) = 0.08
P(love|deep)=0.85
P(deep|deep)=0.02
P(learning|deep)=0.05
但是我们输入的样本是deep, love, love概率越低,产生的loss值越大。
需要理解:
- 生成训练样本的时候,窗口的大小,只是影响样本的多少,在样本训练中,不会体现这个词距离中心词多远,为什么,因为Skip-gram 的目标不是学习"空间距离",而是学习一个词的上下文;
- 但是有一个问题,两个词距离越近,进入训练的样本数就越多,因为在预料中,距离比较近的词,就会频繁出现,这样进入训练的次数就会多,从而间接去影响梯度;
- 在 word2vec 之前,计算机表示词通常是, one-hot类型,两个词之间没有距离,word2vec 将词变成了连续向量。
- word2vect重要的思想是,不要人工定义语义,只要设计一个预测任务,就可以让模型自己学习表示空间,这个思想影响巨大。