Word2vec 是 Google 在 2013 年开源的一款将词表征为实数值向量的高效工具。能够将单词映射到K维向量空间,同时由于算法考虑了每个单词的上下文环境,因此词向量表示同时具有语义特性。本文对Word2Vec的算法原理以及其在spark MLlib中的实现进行了对应分析。(PS:第一次用latex打这么多公式,真是心累~)
1.背景知识
1.1 词向量
NLP中词向量通常有两种表示方式:
- One-hot Representaion
把每个单词按顺序编号,每个词就是一个很长的向量,向量的长度等于词表的大小,只有对应位置上的数字编号为1,其余位置为0.在实际应用中一般采用稀疏矩阵的表示方式。例如:
假设词表为{I, am, study, spark, machine, learning}
则若用稠密矩阵来表示单词spark,则为[0,0,0,1,0,0,0], 在Scala语法中就是Vectors.dense(0,0,0,1,0,0,0);
若用稀疏矩阵来表示单词spark,则为(6, 3, 1),这是一个三元组,6表示向量维度,3,1表示矩阵在3这个位置上的元素为1,其余位置元素均为0。在Scala语法中就是Vectors.sparse(6,(3),(1)) - Distributed Representaion
其基本思想是通过训练将每个词映射为K维实数向量,通过词之间的距离(例如cosine相似度、欧氏距离)来判断它们之间的语义相似度。Word2Vec就是使用这种Distributed Representaion的词向量表示方式。Word2Vec算法的一个附加输出就是输入语料文本中每个单词的Distributed Representaion词向量。
1.2 分类和逻辑回归
(1) 一般来说,回归不用再分类问题上,因为回归是连续模型,如果非要引入,可以使用logistic回归。logistic回归本质上仍是线性回归,只是在特征 XX 到结果
的映射中加入了一层函数映射,先做线性求和再使用σ(z)σ(z) 作为假设函数来映射,将连续值映射到{0,1}上。logistic回归只能用于二分类,对于任意样本x={
x1,x2,...xn}Tx={
x1,x2,...xn}T,其评估函数为:
其中 σ(z)=11+e−zσ(z)=11+e−z 就是sigmoid函数
(2) 选用sigmoid函数来做logistic回归的理由有:
平滑映射:能将x∈(−∞,∞)x∈(−∞,∞)平滑映射到(0,1)区间
其导数具有如下特点:
σ′(z)=ddz(11+e−z)=e−z(1+e−z)2=11+e−z(1−11+e−z)=σ(z)(1−σ(z))(1.2)(1.2)σ′(z)=ddz(11+e−z)=e−z(1+e−z)2=11+e−z(1−11+e−z)=σ(z)(1−σ(z))
(3) 使用logistic回归进行二分类,实际上是取阈值T=0.5,即使用如下判别公式:
y(x)={
10hθ(x)≥0.5hθ(x)<0.5(1.3)(1.3)y(x)={
1hθ(x)≥0.50hθ(x)<0.5
假设这里的二分类满足伯努利分布,也即
p(y=1|x;θ)p(y=0|x;θ)=hθ(x)=1−hθ(x)(1)(2)(1)p(y=1|x;θ)=hθ(x)(2)p(y=0|x;θ)=1−hθ(x)
也即:
p(y|x;θ)=(hθ(x))y(1−hθ(x))1−y(1.4)(1.4)p(y|x;θ)=(hθ(x))y(1−hθ(x))1−y
(4)参数 θθ 向量的求取方法通常为:假设训练集是独立同分布的,期待模型能在全部训练数据上预测最准,也就是求使其概率积最大 θθ ,使用最大似然估计,其对数似然函数表示为:
L(θ)l(θ)=p(Y|X;θ)=∏i=1mp(y(i)|x(i);θ)=∏i=1m(hθ(x(i)))y(i)(1−hθ(x(i)))1−y(i)=logL(θ)=∑i=1my(i)loghθ(x(i))+(1−y(i))log(1−hθ(x(i)))(3)(1.5)(3)L(θ)=p(Y|X;θ)=∏i=1mp(y(i)|x(i);θ)=∏i=1m(hθ(x(i)))y(i)(1−hθ(x(i)))1−y(i)(1.5)l(θ)=logL(θ)=∑i=1my(i)loghθ(x(i))+(1−y(i))log(1−hθ(x(i)))
(5)要求得使上面的似然函数 l(θ)l(θ) 最大的 θθ ,可使用牛顿上升法,即使用 θ:=θ+α∇θl(θ)θ:=θ+α∇θl(θ) 迭代公式来不断迭代直到收敛,其中
∇θjl(θ)=∑i=1m(y(i)×1hθ(x(i))+(