概括word2vec
将word映射成连续(高维)向量,求解文本特征提取的问题
1.NNLM(Neural Network Language model)
从语言模型出发,将模型的最优化过程转化为求词向量的过程。
目标函数:
使用了非对称的前向窗函数,窗长度为n-1
输入层(input):One hot表示,假设有10w词。则输入的行向量 []1∗10w [ ] 1 ∗ 10 w
投影层(projection layer):采用线性投影方式将词向量投影到稠密D维表示。
D=C∗行向量T D = C ∗ 行 向 量 T 投影矩阵C为300*10w,则每个词向量转换成300*1的稠密向量。
隐藏层(hidden layer):做全连接,全连接“神经元”数量用户自定,若设为500,则得到了(300*N)·500的矩阵。
输出层(output):softmax分类器,输出为概率向量 []1×词个数V [ ] 1 × 词 个 数 V ,取概率最大的max(p)。
各层权重优化:BP+SGD
计算复杂度: N∗D+N∗D∗H+H∗V N ∗ D + N ∗ D ∗ H + H ∗ V ,在word2vec中,为了避免隐层带来的高计算复杂度,直接去掉了隐层。
2.CBOW(连续词袋)
word2vec结构对NNLM结构进行简化
结构图:
目标函数:
输入层(input):直接使用低维稠密表示。直接随机初始化,比如300维,后续做最优化。
投影层(projection):简化为求和(或平均)。
输出层(output):输出层依然是Softmax分类器,输出为概率向量 []1×词个数V [ ] 1 × 词 个 数 V 。
特点:1.无隐层;2.使用双向上下文窗口。
3.CBOW改进
由于上述模型输出为词的数量,维度太高。因此,采用以下改进方法:
3.1层次softmax
1.层次softmax使用哈夫曼树,来编码输出层的词典
2.计算非叶子节点的词向量贡献。
假设每个节点的参数为
θi
θ
i
,若当前节点为左子树节点,则将其代入sigmoid函数为
11+e−θTix
1
1
+
e
−
θ
i
T
x
;若当前节点为右子树节点,
1−11+e−θTix
1
−
1
1
+
e
−
θ
i
T
x
。
3.计算量降为 log2V l o g 2 V
3.2负例采样
在样本不均衡情况下,采用负样本采样方法。将这个思想应用到word2vec中。
将正确的词设为正样本,则其余的全是负样本。假设原语料库中包含10w个词,则正样本为1,负样本为10w-1。假设从中选取500个词,其中包含正样本1个,负样本499个。
采样规则:
1.假设词汇表中的词有V个,将长度为1的线段分为V份,每个词对应的线段长度为:
可见,高频词所占线段长,低频词所占线段短
2.将[0,1]划分为M次,M>>V,每次随机生成一个[1, M - 1]的整数,看落在哪个词对应的部分上。
词划分N与M划分如下图:
一般样本不是很大时用CBOW,样本量非常大时,用Skip-Gram
4.Word2Vec:Skip-Gram模型
假如,原始语句为:我喜欢学习机器学习
CBOW为,我喜欢__机器学习,来预测“学习”
Skip-Gram恰好相反,学习,来预测“我喜欢__机器学习”
5.Word2Vec:存在的问题
- 对于每个窗口的内容单独训练,没有考虑全局
- 对于多义词无法很好的表示与处理,因为使用了唯一的词向量