NLP - word2vec理论基础

概括word2vec

将word映射成连续(高维)向量,求解文本特征提取的问题

1.NNLM(Neural Network Language model)

从语言模型出发,将模型的最优化过程转化为求词向量的过程。
目标函数:

L ( θ ) = t l o g P ( w t | w t n + 1 , . . . , w t 1 )

使用了非对称的前向窗函数,窗长度为n-1

输入层(input):One hot表示,假设有10w词。则输入的行向量 [ ] 1 10 w
投影层(projection layer):采用线性投影方式将词向量投影到稠密D维表示。
D = C T 投影矩阵C为300*10w,则每个词向量转换成300*1的稠密向量。
隐藏层(hidden layer):做全连接,全连接“神经元”数量用户自定,若设为500,则得到了(300*N)·500的矩阵。
输出层(output):softmax分类器,输出为概率向量 [ ] 1 × V ,取概率最大的max(p)。
各层权重优化:BP+SGD
计算复杂度 N D + N D H + H V ,在word2vec中,为了避免隐层带来的高计算复杂度,直接去掉了隐层。

2.CBOW(连续词袋)

word2vec结构对NNLM结构进行简化
结构图:

目标函数:

J = w c o r p u s P ( w | c o n t e x t ( w ) )

输入层(input):直接使用低维稠密表示。直接随机初始化,比如300维,后续做最优化。
投影层(projection):简化为求和(或平均)。
输出层(output):输出层依然是Softmax分类器,输出为概率向量 [ ] 1 × V
特点:1.无隐层;2.使用双向上下文窗口。

3.CBOW改进

由于上述模型输出为词的数量,维度太高。因此,采用以下改进方法:

3.1层次softmax

1.层次softmax使用哈夫曼树,来编码输出层的词典

2.计算非叶子节点的词向量贡献。
假设每个节点的参数为 θ i ,若当前节点为左子树节点,则将其代入sigmoid函数为 1 1 + e θ i T x ;若当前节点为右子树节点, 1 1 1 + e θ i T x

P ( ) = $ 1 1 + e θ 1 T x · ( 1 1 1 + e θ 2 T x ) · ( 1 1 1 + e θ 3 T x ) · ( 1 1 + e θ 4 T x )

3.计算量降为 l o g 2 V

3.2负例采样

在样本不均衡情况下,采用负样本采样方法。将这个思想应用到word2vec中。
将正确的词设为正样本,则其余的全是负样本。假设原语料库中包含10w个词,则正样本为1,负样本为10w-1。假设从中选取500个词,其中包含正样本1个,负样本499个。
采样规则
1.假设词汇表中的词有V个,将长度为1的线段分为V份,每个词对应的线段长度为:

l e n ( w ) = c o u n t e r ( w ) u D c o u n t e r ( u )

可见,高频词所占线段长,低频词所占线段短
2.将[0,1]划分为M次,M>>V,每次随机生成一个[1, M - 1]的整数,看落在哪个词对应的部分上。
词划分N与M划分如下图:

一般样本不是很大时用CBOW,样本量非常大时,用Skip-Gram

4.Word2Vec:Skip-Gram模型

假如,原始语句为:我喜欢学习机器学习
CBOW为,我喜欢__机器学习,来预测“学习”
Skip-Gram恰好相反,学习,来预测“我喜欢__机器学习”

5.Word2Vec:存在的问题
  1. 对于每个窗口的内容单独训练,没有考虑全局
  2. 对于多义词无法很好的表示与处理,因为使用了唯一的词向量
参考文献
  1. http://www.cnblogs.com/pinard/p/7160330.html
  2. https://blog.csdn.net/abcjennifer/article/details/46397829
  3. https://blog.csdn.net/yingfengfeixiang/article/details/80054729

猜你喜欢

转载自blog.csdn.net/fisherming/article/details/80079444