paper地址:
Distributed Representations of Words and Phrases and their Compositionality-Tomas Mikolov
翻译:
0 简介:
最近发布的连续型Skip-gram,对于学习高质量分布式向量表述,是一个非常高效的模型,它描述了大量精确的语法语义方面的词语关系。在这篇论文中,我们将陈述数个延伸,将会推进向量的质量和训练速度。通过对于高频词的二次抽样关于二次采样与其他,我们获得了巨大的速度提升,同时也学到了更为规范的词语表达。一个分层softmax函数的替代品——负例采样也将会被介绍。
一个词语表达的内在局限表现在它们忽视了词语在句子中的顺序,以及它们在表达俚语方面的无能为力。就比如,“Canada"和"Air"两个词不能轻易得到"Air Canada”(加拿大航空公司)这样的意思。基于这个例子,我们将介绍一个在文中查找短语的简单方法,并会证明,获得大量短语的优良的的向量表示这件事是可能的。
1 导言:
向量空间中的分布式词语表示可以帮助有些学习算法去实现NLP任务的更好表现,而这种效果是通过给相似词语归类实现的。一个早期的词语表示可以追溯到1986年,发明者是 Rumelhart, Hinton, and Williams [13]。这个想法自出现起,已经被运用到逻辑语言模型,并取得了巨大的成功[1]。接下来的工作包括自动语音识别、机器翻译[14,7]以及自然语言处理方面的广泛应用[2,20,15,3,18,19,9]。
最近,马尔可夫[8]介绍了Skip-gram模型,它是一个从大量杂乱无章的文本数据中学习到高质量的词向量表示的行之有效的方法。与大多数先前被运用于词向量学习的神经网络架构不同,Skip-gram模型(用单词的周围词表示这个单词)的训练(图1)并不包含稠密矩阵(非零元素占大多数的矩阵)乘法。这使得训练过程是极其高效的:一个优化过的单机实现能够在一天内在超过1000亿的单词上进行训练。
使用神经网络计算得出的词语表达非常有意思,因为学习过的向量能够精确地对许多语言学上的规律和模式进行编译。令人惊讶的是,这些模式中的许多都能够被看作是线性的。举个例子,向量计算"Madrid" - “Spain” + “France"的结果超级超级超级接近于向量"Paris”[9,8]。
在这篇论文中,我们会陈述几个初代Skip-gram模型的延伸。我们将证实训练中,高频词的二次采样会得到巨大的速度飞跃(大约2倍到10倍),也会改善低频单词表达的精确性。另外,我们发现,与使用在先前工作的更为复杂的分层softmax方法[8]相比,一个噪声对比评估(NCE)的简化变体对于训练Skip-gram模型来说,能够产生更快的训练和更好的高频词的向量表示。
词语表示局限于它们并不能表示俗语,毕竟,俗语并不是由独立的单词组成。比如,“Boston Globe”(波士顿环球报)是一个报纸名,它并不是一个"Boston"(波士顿)和"Globe"(全球)意思的自然组合(斯认为这些名称并不符合我们的自然语言使用规范)。因此,使用向量去表示整个短语使得Skip-gram(以下简称sg)模型更富有表现力。其他旨在通过组合词向量来表示句意(如递归自动编译器[15]),也将会受益于使用词组(短语)向量,而不是简单的词向量。
从基于单词到基于词组(短语)的模型延伸是相对简单的。首先,我们使用一个数据驱动的方法来识别大量的短语,然后,我们在训练中将这些短语看作是独立的tokens(Tokens are the total number N of running words)。为了评估短语向量的质量,我们开发了一个同时包含词语和短语的类比推理任务测试集。测试集中一个典型的类比对是“Montreal”:“Montreal Canadiens”::“Toronto”:“TorontoMaple Leafs”(“蒙特利尔”:“蒙特利尔加拿大人”::“多伦多”:“多伦多枫叶” )。很显然, 与(vec(“Montreal Canadiens”) - vec(“Montreal”) + vec(“Toronto”))这个结果向量最接近的向量是vec(“Toronto Maple Leafs”)。
最后,我们描述另外一个sg模型的有趣的性能。我们发现,简单的向量加法经常会产生有意义的结果。比如,vec(“Russia”) + vec(“river”) 接近于vec(“Volga River”), 以及 vec(“Germany”) + vec(“capital”) 接近于vec(“Berlin”)。这样的语意合成性表明:在词向量表示上采取基础的数学计算,我们就可以达到一个并不明显的语言理解程度。
2 Skip-gram模型
可以参考
NLP之—word2vec算法skip-gram原理详解
sg模型的训练目的是去发现,能有效运用于预测句子、文件中的周围词的单词表示。正规点说,给定一串训练单词
w
1
w_1
w1、
w
2
w_2
w2、
w
3
w_3
w3…
w
T
w_T
wT,那么sg模型的训练木丁就是去最大化平均对数概率,其公式如下:
在这个公式中,c代表训练上下文的规格,能够作用于中心词
w
T
w_T
wT(应该是自己设置的,就是对于某一个训练单词,取它左右的多少个词)。更大的c会导致更多的训练样本,进一步导致更高的精确度,当然,精确度是以训练时间为代价的。基础的sg公式使用softmax函数定义了
p
(
w
t
+
j
∣
w
t
)
p({w_{t+j}}|w_t)
p(wt+j∣wt),具体如下:
在这个式子中,
v
w
I
v_{wI}
vwI代表的是词
w
I
w_I
wI的输入向量表示,带 ’ 上标的代表的是词
w
o
w_o
wo的输出向量表示,W代表词汇库中的单词数量。这个公式是不切实际的,因为W往往很大。
个人理解:(1)中的求和其实本来是乘积,后来取了对数,就转化成了求和。对于每一个下标t,取词
w
t
w_t
wt,它被叫做输入词,也是中心词。c代表我要取这个中心词的左右各c个,作为输出词、周围词。假设,取了一个中心词
w
t
w_t
wt、和一个周围词
w
t
+
j
w_{t+j}
wt+j,就要计算它们的条件概率(代表已知中心词的情况下,这个周围词出现的概率)。利用softmax函数,就计算出了给定当前中心词,我会预测出这个周围词的概率。
如前所述,(1)式本来是乘积:
1
T
∏
t
=
1
T
∏
−
c
⩽
j
⩽
c
,
j
=
/
0
P
(
w
t
+
j
∣
w
t
)
\frac{1}{T} \prod_{t=1}^{T}\prod_{-c{\leqslant}j{\leqslant}c,j=/0}P(w_{t+j}|{w_t})
T1t=1∏T−c⩽j⩽c,j=/0∏P(wt+j∣wt)
为什么是乘积?其实是因为所有的周围词都是独立的,也就是说最最最一开始的公式是一个联合条件概率:
1
T
∏
t
=
1
T
P
(
w
t
−
c
,
w
t
+
2
,
w
t
−
1
,
w
t
+
1
,
w
t
+
2
.
.
.
w
t
+
c
∣
w
t
)
\frac{1}{T} \prod_{t=1}^{T}P(w_{t-c},w_{t+2},w_{t-1},w_{t+1},w_{t+2}...w_{t+c}|{w_t})
T1t=1∏TP(wt−c,wt+2,wt−1,wt+1,wt+2...wt+c∣wt)
如果给(1)的式子加上一个负号,就可以作为损失函数,我们想要这个损失函数最小,所以要不断更新。更新什么?词向量,什么词向量?就是,(1)中的w是词,(2)中的v才是向量。在sg模型中,每一个词都有两种向量表示,分别是:作为中心词的向量表示和作为周围词的向量表示,这也就是(2)中v带上标和不带上标的区别。具体这个词向量怎么计算出来的,就是用one-hot编码去乘权重矩阵,个人理解训练的过程就是去更新这个权重矩阵。更加详细地,还是看那篇博客吧,那篇博客里也提到了这个效率问题,并最后说有层级softmax和负采样这两种解决方法,这也是下文所讲。
2.1 层级softmax
上文的完全softmax计算复杂度太高,针对这个问题,一个计算方面很高效的近似计算方法——层级softmax被提出。在神经网络语言模型的背景下,它首先被Morin和Bengio提出[12]。其主要的优势在于:并不是通过评估神经网络W(所有)个输出结点(周围词)来获得概率分布,而是只评估
log
2
(
W
)
\log_2{(W)}
log2(W)个结点(输出词)。
层级softmax使用二叉树代表输出层,使用W个单词代表叶子。针对每个节点,明确的指出了其子节点的概率。这些定义了将概率赋予单词的随机游走。
更加精确地说,每一个单词w可以通过一条来自树根结点地可能路径来到达。设n(w,j)为从根结点到w结点这条路径上的第j个结点,同时设置L(w)为这条路径的长度,所以n(w,1)代表从根结点到w结点这条路径上的第1个结点,也就是根结点自身,n(w,L(w))=w。另外,对于任何一个内部结点n,设ch(n)为n结点的任意固定的子结点,设[[x]]为1,如果x是对的,否则为-1。层级softmax定义p(
w
O
w_O
wO|
w
I
w_I
wI)如下:
这个公式中,
σ
(
x
)
=
1
1
+
e
x
p
(
−
x
)
σ(x)= \frac{1}{1+exp(-x)}
σ(x)=1+exp(−x)1。balabala原paper中也没有证明,接着说:可以被证明
∑
w
=
1
W
p
(
w
∣
w
I
)
=
1
\sum_{w=1}{W}p(w|w_I) = 1
∑w=1Wp(w∣wI)=1。这意味着计算
log
p
(
w
O
∣
w
I
)
和
▽
p
(
w
O
∣
w
I
)
\log p(w_O|w_I)和▽p(w_O|w_I)
logp(wO∣wI)和▽p(wO∣wI)的代价和L(WO)是成正比的,平均来讲,这个路径长度不超过log(W)。标准的sg模型的softmax公式会给每一个词w指定两个表示,即上文所讲的
v
w
v_w
vw和
v
w
v_w
vw带上标’。与标准的不同,层级softmax公式用
v
w
v_w
vw表示每一个词w,用
v
n
v_n
vn带‘上标来表示二叉树的内部结点n。(说的v是向量吧)
层级softmax所使用的树结构对于性能有很大的影响。 Mnih 和 Hinton探索了很多方法用于构建树结构以及对于训练时长和结果模型精度的提升[10]。在我们的工作中,我们使用一个哈夫曼树,因为它给频繁的单词分配了很短的编码,所以训练速度很快(怎么跟计算机组成原理的指令编码差不多)。之前被观察得,按照词的频率来将它们组合在一起可以有效地提高以神经网络为基础的语言模型的效率。[5,8]
2.2 负例采样
层级softmax的一个替换是噪声对比估计(Noise Contrastive Estimation,简称为NCE),这个方法被 Gutmann and Hyvarinen [4]提出, Mnih and Teh[11]将其运用到了语言建模中。NCE假设,一个好的模型应该能够通过逻辑回归来区分数据和噪声。这类似于Collobert 和 Weston使用的合页损失(hinge loss) 他俩通过将数据排序在噪声之上来训练模型。
合页损失函数的理解
虽然NCE可以近似最大化softMax的对数概率,然而sg模型唯一关心的只是学习到高质量的向量表示,所以我们可以随意地简化NCE,只要向量表示能够维持它们的质量。我们通过下面的公式定义负例采样(NEG):
这个公式被用来替代sg中的每一个
l
o
g
P
(
w
O
∣
w
I
)
logP(w_O|w_I)
logP(wO∣wI)项。因此,我们的任务是使用逻辑回归来区分目标词
w
O
w_O
wO和噪声分布中
P
n
(
w
)
P_n(w)
Pn(w)中的draws(?),其中,每一个数据样本都有k个负例样本。我们的实验表明,k的值在5-20之间对于小规模的训练数据集来说是有效地,而对于大的数据集,k可以小到2-5。NEG和NCE的主要差别是,NCE需要样本和噪声分布的数值概率,而负例采样只需要样本。虽然NCE可以近似最大化softMax的对数概率,这个性能对于我们的应用是不重要的。
NCE和NEG都有噪声分布 P n ( w ) P_n(w) Pn(w)来作为一个自由参数。我们测试了很多 P n ( w ) P_n(w) Pn(w)的选择,并发现
不翻了,翻不动了,看知乎一篇文章就都懂了。
word2vec之skip-gram