这次实在没有时间我偷一点懒,写的简略些。虽然这一次的任务是NLPer熟悉的不能再熟悉的word2vec, 具体来看:
- 文本表示:从one-hot到word2vec。
- 词袋模型:离散、高维、稀疏。
- 分布式表示:连续、低维、稠密。word2vec词向量原理并实践,用来表示文本。
从one-hot 到word2vec
独热编码即 One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。
**优点:**解决了分类器不好处理离散数据的问题,并且在一定程度上也起到了扩充特征的作用。
缺点: 在文本特征表示上有些缺点就非常突出了。首先,它是一个词袋模型,不考虑词与词之间的顺序(文本中词的顺序信息也是很重要的);其次,它假设词与词相互独立(在大多数情况下,词与词是相互影响的);最后,它得到的特征是离散稀疏的。更大的问题是其不满足我们前面的期望——相似的词的距离较近而不相似的较远。对于one-hot向量来说,相同的词距离是0,而不同的词距离是1。这显然是有问题的,因为cat和dog的距离肯定要比cat和apple要远。但是在one-hot的表示里,cat和其它任何词的距离都是1
为了解决上述缺陷,提出了word2vec。其实这基于Firth 教授在1957年提出一个分布式语义的假设,即A word’s meaning is given by the words that frequently appear close-by (一个词的语义是由它周围经常出现的词决定的)。 word2vec的本质就是求词向量的框架。这里对于每一个词用一个低纬度的稠密向量来表示,词是由所有维度共同表示,单独一维并没有的独立的含义。
从数学角度看, word2vec的目标函数:
J
(
θ
)
=
−
1
T
l
o
g
(
L
(
θ
)
)
J(\theta)= -\frac{1}{T}log(\mathcal{L}(\theta))
J(θ)=−T1log(L(θ))
其中,
L
(
θ
)
=
∏
t
=
1
T
∏
−
m
≤
j
≤
m
;
j
!
=
m
P
(
w
t
+
1
∣
w
t
;
θ
)
\mathcal{L}(\theta)=\prod_{t=1}^T \prod_{-m \le j \le m; j != m}P(w_{t+1}|w_t;\theta)
L(θ)=t=1∏T−m≤j≤m;j!=m∏P(wt+1∣wt;θ)
对于word2vec的具体求解,目前主流的是两种方法,即 CBOW 和 skip-gram。两种都采用了滑动窗口,前者是用窗口内的其他词去预测中心词,而后者则是用中心词去预测窗口的其他词。现实中,两者的效果接近。
从实现的角度,采用的是最基本的神经网络(输入层->隐藏层->输出层),如下图所示CBOW的实现:
关于其他word2vc的方式,比如glove, 我会在后面有时间补上。
参考文献
- 郭耀华的blog,NLP之——Word2Vec详解,https://www.cnblogs.com/guoyaohua/p/9240336.html
- cs224n, lecture 2