前言
在自然语言系统中,词被看作最为基本的单元,如何将词进行向量化表示是一个很基本的问题,词嵌入(word embedding)就是把词映射为低维实数域向量的技术。
一、词的离散表示和分布式表示
1.词的离散表示
-
1.1 One-hot表示
根据语料构造一个大小为V的词汇表,并为每一个词分配一个id。
每个词都可以表示为一个V维向量,除了该词id对应的维度为1外,其余维度为0。 -
1.2 n-gram
与One-hot类似,只是统计单元由单个的词变成了连续的几个词,如2-gram是统计连续的两个单词构造词典。 -
离散表示的缺点
-
- 词向量维度随着词汇表大小的增长而增长带来的内存问题;
-
- 词向量过于稀疏,浪费内存,丢失信息;
-
- 无法衡量词和词之间的关系。
2.词的分布式表示
词的分布式表示的核心思想是:一个词是由这个词的周边词汇一起来构成精确的语义信息,因此可以用一个词附近的其他词来表示该词。词的分布式表示有以下几种代表方法:
-
共现矩阵
使用固定大小的滑窗统计词与词在窗口内的共现次数,然后将每个词表示为一个大小为V的矩阵,每个维度为该词与该维度对应词的共现次数。
共现矩阵方法仍然会存在内存问题以及稀疏性问题。 -
word2vec
谷歌2013年提出的Word2Vec是目前最常用的词嵌入模型之一,它实际上是一种浅层的神经网络模型,有两种网络结构,分别为CBoW和Skip-gram,目的都是得到词的稠密表示。需要指出的是,两种方法都会先采用滑动窗口的方式来对语料库进行窗口采集,所不同的是窗口内数据的使用方式。
二、word2vec包含的两种模型
1.跳元模型(skip-gram)
Skip-gram使用中间词来预测上下文借此学习词向量,即根据target word来预测context。
使用Skip-gram预测的上下文词的概率为:
p
(
w
o
∣
w
i
)
=
e
V
w
o
T
U
w
i
∑
w
∈
v
o
c
a
b
e
V
w
T
U
w
i
p(w_o|w_i)=\frac{e^{V_{w_o}^TU_{w_i}}}{\sum_{w\in vocab}e^{V_{w}^TU_{w_i}}}
p(wo∣wi)=∑w∈vocabeVwTUwieVwoTUwi
其中,
w
i
w_i
wi为中心词,
w
o
w_o
wo为上下文中的词。
跳元模型的似然函数是给定任何中心词的情况下生成所有上下文词的概率:
∏
t
=
1
T
∏
−
m
<
=
j
<
=
m
,
j
!
=
0
p
(
w
(
t
+
j
)
∣
w
(
t
)
)
\prod_{t=1}^T\prod_{-m<=j<=m,j!=0}p(w^{(t+j)}|w^{(t)})
t=1∏T−m<=j<=m,j!=0∏p(w(t+j)∣w(t))
其中文本序列的长度为T,时间步t处的词表示为
w
(
t
)
w^{(t)}
w(t),通过最大化似然函数来学习模型参数
跳元模型的中心词向量通常作为词表示
2.连续词袋模型(CBOW)
对于每一个窗口,CBOW通过中间词两边的上下文来预测中间词,从而学习词向量的表达, 即根据context预测target word。使用CBoW预测的目标词的概率为:
p
(
w
o
∣
c
o
n
t
e
x
t
)
=
e
V
w
o
T
∑
w
c
∈
c
o
n
t
e
x
t
U
w
c
∑
w
∈
v
o
c
a
b
e
V
w
T
∑
w
c
∈
c
o
n
t
e
x
t
U
w
c
p(w_o|context)=\frac{e^{V_{w_o}^T\sum_{w_c\in context}U_{w_c}}}{\sum_{w\in vocab}e^{V_{w}^T\sum_{w_c\in context}U_{w_c}}}
p(wo∣context)=∑w∈vocabeVwT∑wc∈contextUwceVwoT∑wc∈contextUwc
U
w
U_w
Uw和
V
w
V_w
Vw分别是矩阵U和V对应词w的列,vocab为整个词汇表,
w
o
w_o
wo为中心词,context为上下文
跳元模型的似然函数是给定上下文词的情况下生成所有中心词的概率:
∏
t
=
1
T
p
(
w
t
∣
c
o
n
t
e
x
t
)
\prod_{t=1}^Tp(w^{t}|context)
t=1∏Tp(wt∣context)
通过最大化似然函数来学习模型参数
跳元模型的中心词向量通常作为词表示
改进模型的两种方式
在通过最大化似然函数来学习模型参数的过程中,两种模型的梯度计算都包含求和,但是在一个词表上求和的梯度计算成本是巨大的。因此需要对这一步进行改良,具体改良办法有两种:
-
层次softmax
层次Softmax的基本思想是将复杂的归一化概率分解为一系列条件概率乘积的形式,每一层条件概率对应一个二分类问题,可以通过一个简单的逻辑回归函数去拟合。这样,我们将对V个词的概率归一化问题,转化成了对 log 2 V \log_2V log2V个词的概率拟合问题。
通过构造一棵二叉树可以很直观地理解这一过程,二叉树的每一个叶节点代表一个词,假设词w从根节点到叶节点的路径编码分别为 e 1 , e 2 , . . e k e_1,e_2,..e_k e1,e2,..ek,对应的子树分别为 T 1 , T 2 , . . . , T k T_1,T_2,...,Tk T1,T2,...,Tk,其中k为路径长度。以Skip-gram为例,其所要最大化的概率可以转化为
p ( w o ∣ w i ) = ∏ j = 1 k p ( e j ∣ T j , V w o T U w i ) p(w_o|w_i)=\prod_{j=1}^kp(e_j|T_j,V_{w_o}^TU_{w_i}) p(wo∣wi)=j=1∏kp(ej∣Tj,VwoTUwi)
需要指出的是,层次Softmax进行最大化的时候,是对路径上的每一个逻辑回归分别优化的,即假定各逻辑回归间没有关联。
层次Softmax存在的问题是人为增强了词与词之间的耦合性。例如,一个word出现的条件概率的变化,会影响到其路径上所有非叶节点的概率变化,间接地对其他word出现的条件概率带来不同程度的影响。
通常使用霍夫曼编码来构造层次Softmax的二叉树,因为霍夫曼编码可以保证二叉树的平均路径最短,最大程度减小模型的复杂度。 -
负采样
可以换一个角度来思考问题。因为Word2Vec的最终目的是得到词向量矩阵U,因此训练任务并非仅仅只能是根据输入词预测输出词的概率,可以将任务修改为预测某一个词是否是输入词的上下文词的概率。这样,问题就由原来的多分类问题转变成了二分类问题,每个二分类问题可以通过一个简单的逻辑回归函数去拟合。目标函数变为:
arg max θ ∏ ( w , c ) ∈ D p ( 1 ∣ w , c ; θ ) \arg \max _\theta\prod_{(w,c)\in D}p(1|w,c;\theta) argθmax(w,c)∈D∏p(1∣w,c;θ)
由于只存在正样本,这样优化将使得所有词的词向量趋于一致,所以考虑负采样,即引入负样本,那么目标函数变为:
arg max θ ∏ ( w , c ) ∈ D p ( 1 ∣ w , c ; θ ) ∏ ( w , c ) ∈ D ′ p ( 0 ∣ w , c ; θ ) = arg max θ ∑ ( w , c ) ∈ D log p ( 1 ∣ w , c ; θ ) + ∑ ( w , c ) ∈ D ′ log p ( 0 ∣ w , c ; θ ) = arg max θ ∑ ( w , c ) ∈ D log σ ( V c T U w ) + ∑ ( w , c ) ∈ D ′ log σ ( − V c T U w ) \arg \max _\theta\prod_{(w,c)\in D}p(1|w,c;\theta)\prod_{(w,c)\in D'}p(0|w,c;\theta) \\ =\arg \max _\theta\sum_{(w,c)\in D}\log p(1|w,c;\theta)+\sum_{(w,c)\in D'}\log p(0|w,c;\theta) \\ =\arg \max _\theta\sum_{(w,c)\in D}\log \sigma(V_c^TU_w)+\sum_{(w,c)\in D'}\log \sigma(-V_c^TU_w) argθmax(w,c)∈D∏p(1∣w,c;θ)(w,c)∈D′∏p(0∣w,c;θ)=argθmax(w,c)∈D∑logp(1∣w,c;θ)+(w,c)∈D′∑logp(0∣w,c;θ)=argθmax(w,c)∈D∑logσ(VcTUw)+(w,c)∈D′∑logσ(−VcTUw)
具体负采样的方法是依据词频进行带权采样,假设语料库中词w的频率为 n w n_w nw,则词w被负采样的概率为:
n w α ∑ w n w α \frac{n_w^\alpha}{\sum_w n_w^\alpha} ∑wnwαnwα
其中, α \alpha α一般为小于1的正数起到放缩作用,使得频率小的词被采样的几率得到提升,频率大的词被采样的几率被降低,这样能增加低频词被采样到的机会,可以显著提高低频词的词向量的准确度。 α \alpha α在原论文中的取值为0.75。