word2vec
一、参考资料
(1)斯坦福224n课堂笔记
https://web.stanford.edu/class/archive/cs/cs224n/cs224n.1214/
(2)github代码
这个是skip-gram的
https://github.com/Adoni/word2vec_pytorch
二、自己复述
什么是word2vec?怎么训练的?有什么用?优缺点是什么?用输入-隐层,还是隐层到-输出表示词的embedding?用输入到隐层
word2vec是一个以无监督方式从大量文本中语料中学习词向量的一种模型。使得语义相似的词在高维向量空间内距离相近。
主要有CBOW和skip-gram两种模型,也就是从上下文预测中心词,和根据中心词预测上下文。认真看的是skip-gram模型。
模型结构类似一个3层神经网络,输入层/隐层和输出层,输入层的维度为词袋的维度,隐层的维度为词向量的维度,输出层的维度也为词袋的维度。模型的权重矩阵就可以当做是词的embedding。
模型怎么算是训练好了呢。假如中心词是a,上下文是b,输入a,输出层b对应的位置的概率最大。用交叉熵来量化,算这个概率的时候,用到softmax,要对词袋中的所有词都计算一遍e*,计算量非常大,使用负采样来优化,只更新部分负样本对应的权重参数。
负样本的选取是从词袋中随机抽取 ,词抽中的概率与词频有关。一般来说一个正样本抽5个负样本。
模型训练的正样本为真实的中心词与上下文对,负样本为随机抽的非真实的上下文。
优点:简单,容易训练,不需要人工标注数据。有考虑上下文,相对于之前svd等完全上下文无关的效果较好
确定:词与向量是静态的一对一,没办法处理一词多意的情况
2.复习问题
负采样代码是怎么实现的:正(上下文)、负样本(随机取样)是怎么放进模型的;损失函数又是怎么算的;参数怎么更新的?
假设训练的batch_size是8,负采样个数是5
forward时,模型输入
pos_u:中心词u,torch.Size([8])
pos_v:上下文v,torch.Size([8])
neg_v:负采样,torch.Size([8,5])