自然语言处理中的词表示

词表示是自然语言处理的基础,一个好的词向量在很大程度上决定了后续任务的上限。本文是我最近学习该部分内容的笔记,主要参照的是基于神经网络的词和文档语义向量表示方法研究一文,穿插了一些个人理解。内容较多,错误难免,请拍砖~


分布表示(Distributional Representation)假说:上下文相似的词,其语义也相似。根据建模方式的不同,主要分为三类:基于矩阵的分布表示、基于聚类的分布表示和基于神经网络的分布表示。
尽管不同的分布表示方法使用了不同的技术手段获取词表示,但由于这些方法均基于分布假说,它们的核心思想也都由两部分组成:

  1. 选择一种方式描述上下文
  2. 选择一种模型刻画目标词与其上下文之间的关系。

基于矩阵的分布表示

基于矩阵的分布表示通常又称为分布语义模型(distributional semantic models)。这类方法需要构建一个“词-上下文”矩阵,从矩阵中获取词的表示。在“词-上下文”矩阵中,每行对应一个词,每列表示一种不同的上下文,矩阵中的每个元素对应相关词和上下文的共现次数。在这种表示下,矩阵中的一行,就成为了对应词的表示,这种表示描述了该词的上下文的分布。由于分布假说认为上下文相似的词,其语义也相似,因此在这种表示下,两个词的语义相似度可以直接转化为两个向量的空间距离。这类方法具体可以分为三个步骤:

  1. 选取上下文。最常见的有三种方法:第一种,将词所在的文档作为上下文,形成“词-文档”矩阵(term-document matrix);第二种,将词附近上下文中的各个词(如上下文窗口中的5个词)作为上下文,形成“词-词”矩阵;第三种,将词附近上下文各词组成的n-gram作为上下文 。在这三种方法中,“词-文档”矩阵非常稀疏,而“词-词”矩阵相对较为稠密,效果一般好于前者。“词-n-gram”相对“词-词”矩阵保留了词序信息,建模更精确,但由于比前者更稀疏,实际效果不一定能超越前者。
  2. 确定矩阵中各元素的值。“词-上下文”共现矩阵根据其定义,里面各元素的值应为词与对应的上下文的共现次数。然而直接使用原始共现次数作为矩阵的值在大多数情况下效果并不好,因此研究人员提出了多种加权和平滑方法,最常用的有tf-idf、PMI 和直接取log。
  3. 矩阵分解(可选)。在原始的“词-上下文”矩阵中,每个词表示为一个非常高维(维度是不同上下文的总个数)且非常稀疏的向量,使用降维技术可以将这一高维稀疏向量压缩成低维稠密向量。降维技术可以减少噪声带来的影响,但也可能损失一部分信息。最常用的分解技术包括奇异值分解(SVD)、非负矩阵分解(NMF)、典型关联分析(Canonical Correlation Analysis,CCA)、Hellinger PCA(HPCA)。

著名的 Global Vector模型(GloVe)就是基于矩阵的分布表示

基于聚类的分布表示(分布聚类)

基于聚类的分布表示又称作分布聚类(distributional clustering),这类方法通过聚类手段构建词与其上下文之间的关系。其中最经典的方法是布朗聚类(Brown clustering)。布朗聚类是一种层级聚类方法,聚类结果为每个词的多层类别体系。因此可以根据两个词的公共类别判断这两个词的语义相似度。

这个方法似乎没有太多主流的应用,所以我没有做深入研究

基于神经网络的分布表示(词向量)

基于神经网络的分布表示一般称为词向量、词嵌入(word embedding)或分布式表示(distributed representation)。神经网络词向量表示技术通过神经网络技术对上下文,以及上下文与目标词之间的关系进行建模。由于神经网络较为灵活,这类方法的最大优势在于可以表示复杂的上下文。在前面基于矩阵的分布表示方法中,最常用的上下文是词。如果使用包含词序信息的n-gram作为上下文,当n增加时,n-gram的总数会呈指数级增长,此时会遇到维数灾难问题。而神经网络在表示n-gram时,可以通过一些组合方式对n个词进行组合,参数个数仅以线性速度增长。有了这一优势,神经网络模型可以对更复杂的上下文进行建模,在词向量中包含更丰富的语义信息。
神经网络词向量模型与其它分布表示方法一样,均基于分布假说,核心依然是上下文的表示以及上下文与目标词之间的关系的建模。构建上下文与目标词之间的关系,最自然的一种思路就是使用语言模型。

语言模型

语言模型可以对一段文本的概率进行估计,对信息检索、机器翻译、语音识别等任务有着重要的作用。形式化讲,统计语言模型的作用是为一个长度为m的字符串确定一个概率分布P(w_1,w_2, ...,w_m),表示其存在的可能性,其中w_1w_m依次表示这段文本中的各个词。一般在实际求解过程中,通常采用下式计算其概率值:
\begin{array} { r l } { P \left( w _ { 1 } , w _ { 2 } , \ldots , w _ { m } \right) = } & { P \left( w _ { 1 } \right) P \left( w _ { 2 } | w _ { 1 } \right) P \left( w _ { 3 } | w _ { 1 } , w _ { 2 } \right) } \\ { } & { \dots P \left( w _ { i } | w _ { 1 } , w _ { 2 } , \ldots , w _ { i - 1 } \right) \ldots P \left( w _ { m } | w _ { 1 } , w _ { 2 } , \ldots , w _ { m - 1 } \right) } \end{array}
在实践中,如果文本的长度较长,上述公式右部P \left( w _ { i } | w _ { 1 } , w _ { 2 } , \dots , w _ { i - 1 } \right)的估算会非常困难。因此,研究者们提出使用一个简化模型:n元模型(n-gram model)。在n元模型中估算条件概率时,距离大于等于n的上文词会被忽略,也就是对上述条件概率做了以下近似:
P \left( w _ { i } | w _ { 1 } , w _ { 2 } , \ldots , w _ { i - 1 } \right) \approx P \left( w _ { i } | w _ { i - ( n - 1 ) } , \ldots , w _ { i - 1 } \right)
n元模型中,传统的方法一般采用频率计数的比例来估算n元条件概率:
P \left( w _ { i } | w _ { i - ( n - 1 ) } , \ldots , w _ { i - 1 } \right) = \frac { \operatorname { count } \left( w _ { i - ( n - 1 ) } , \ldots , w _ { i - 1 } , w _ { i } \right) } { \operatorname { count } \left( w _ { i - ( n - 1 ) } , \ldots , w _ { i - 1 } \right) }
其中,\operatorname { count } \left( w _ { i - ( n - 1 ) } , \ldots , w _ { i - 1 } \right)表示文本序列w _ { i - ( n - 1 ) } , \ldots , w _ { i - 1 }在语料中出现的次数。
为了更好地保留词序信息,构建更有效的语言模型,我们希望在n元模型中选用更大的n。但是,当n较大时,长度为n序列出现的次数就会非常少,在按照上述公式估计n元条件概率时,就会遇到数据稀疏问题,导致估算结果不准确。因此,一般在百万词级别的语料中,三元模型是比较常用的选择,同时也需要配合相应的平滑算法,进一步降低数据稀疏带来的影响。
为了更好地解决n元模型估算概率时遇到的数据稀疏问题,神经网络语言模型应运而生。

神经网络语言模型(NNLM)

神经网络语言模型(Neural Network Language Model ,NNLM)在学习语言模型的同时,也能得到词向量。
NNLM 同样也是对n 元语言模型进行建模,估算P \left( w _ { i } | w _ { i - ( n - 1 ) } , \dots , w _ { i - 1 } \right)的值。但与传统方法不同的是,NNLM 不通过计数的方法对n元条件概率进行估计,而是直接通过一个神经网络结构,对其进行建模求解。下图展示了NNLM 的基本结构。

NNLM模型

具体而言,对语料中一段长度为n的序列w _ { i - ( n - 1 ) } , \dots , w _ { i - 1 } , w _ { i }n元语言模型需要最大化以下概率:
P \left( w _ { i } | w _ { i - ( n - 1 ) } , \dots , w _ { i - 1 } \right)
其中,w_i 为需要通过语言模型预测的词(目标词)。对于整个模型而言,输入为条件部分的整个词序列:w _ { i - ( n - 1 ) } , \dots , w _ { i - 1 },输出为目标词的分布。而神经网络的目标就是要让输出中,w _ { i }(目标词)的概率最大。
神经网络语言模型采用普通的三层前馈神经网络结构,其中第一层为输入层。Bengio提出使用各词的词向量作为输入以解决数据稀疏问题,因此输入层为词w _ { i - ( n - 1 ) } , \dots , w _ { i - 1 }的词向量的顺序拼接:
\boldsymbol { x } = \left[ \boldsymbol { e } \left( w _ { i - ( n - 1 ) } \right) ; \ldots ; \boldsymbol { e } \left( w _ { i - 2 } \right) ; \boldsymbol { e } \left( w _ { i - 1 } \right) \right]
当输入层完成对上文的表示x之后,模型将其送入剩下两层神经网络,依次得到隐藏层h和输出层y:

\boldsymbol { h } = \tanh \left( \boldsymbol { b } ^ { ( 1 ) } + H \boldsymbol { x } \right)
\boldsymbol { y } = \boldsymbol { b } ^ { ( 2 ) } + W \boldsymbol { x } + U \boldsymbol { h }
其中H \in \mathbb { R } ^ { | \boldsymbol {h} | \times ( n - 1 ) | e | },U \in \mathbb { R } ^ { | \mathbb { V } | \times | \boldsymbol {h} | }| \mathbb { V } |表示词汇表的大小,| e |表示词向量的维度,|\boldsymbol {h}|是隐层的维度。矩阵W \in \mathbb { R } ^ { | \mathbb { V } | \times ( n - 1 ) | e | }表示从输入层到输出层的直连边权重矩阵。如果使用该直连边,可以减少一半的迭代次数;但如果没有直连边,可以生成性能更好的语言模型。因此在后续工作中,很少有使用输入层到输出层直连边的工作。

输出层一共有| \mathbb { V } |个元素,,依次对应下一个词为词表中某个词的可能性。这里使用softmax函数,将其转化为对应的概率。

在NNLM模型中,词向量出现在两个地方,一个是输入层的词向量e ( w ),另一是隐层的权重UU的维度是| \mathbb { V } | \times | \boldsymbol { h } |,这可以看做是\mathbb{V}|\boldsymbol {h}|维的行向量,其中的每一个向量,均可以看做某个词在模型中的另一个词向量,记为e '( w )。在不考虑W 的情况下,每个词在模型中有两套词向量。通常在实际工作中只是用第一个作为词向量。

\boldsymbol{y}展开,得到:
\begin{aligned} \boldsymbol { y } \left( w _ { i } \right) & = \boldsymbol { b } ^ { ( 2 ) } + \boldsymbol { e } ^ { \prime } \left( w _ { \boldsymbol { i } } \right) ^ { \mathrm { T } } \tanh \left( \boldsymbol { b } ^ { ( 1 ) } + H \left[ \boldsymbol { e } \left( w _ { i - ( n - 1 ) } \right) ; \ldots ; \boldsymbol { e } \left( w _ { i - 1 } \right) \right] \right) \\ & = E \left( w _ { i } ; w _ { i - ( n - 1 ) : i - 1 } \right) \end{aligned}
E \left( w _ { i } ; w _ { k - } ( n - 1 ) : i - 1 \right)被称为能量函数。

log双线性语言模型(LBL)

2007 年,Mnih和Hinton在神经网络语言模型(NNLM)的基础上提出了log双线性语言模型(Log-Bilinear Language Model,LBL)。LBL模型的能量函数为:
\ E \left( w _ { i } ; w _ { i - ( n - 1 ) : i - 1 } \right) = \boldsymbol { b } ^ { ( 2 ) } + \boldsymbol { e } \left( w _ { i } \right) ^ { \mathrm { T } } \boldsymbol { b } ^ { ( 1 ) } + \boldsymbol { e } \left( w _ { i } \right) ^ { \mathrm { T } } H \left[ \boldsymbol { e } \left( w _ { i - ( n - 1 ) } \right) ; \ldots ; \boldsymbol { e } \left( w _ { i - 1 } \right) \right]
LBL模型的能量函数与NNLM的能量函数主要有两个区别。一、LBL 模型中,没有非线性的激活函数tanh,而由于NNLM 是非线性的神经网络结构,激活函数必不可少;二、LBL 模型中,只有一份词向量e,也就是说,无论一个词是作为上下文,还是作为目标词,使用的是同一份词向量。其中第二点(只有一份词向量),只在原版的LBL模型中存在,后续的改进工作均不包含这一特点。

循环神经网络语言模型(RNNLM)

循环神经网络语言模型(Recurrent Neural Network based Language Model,RNNLM)则直接对P \left( w _ { i } | w _ { 1 } , w _ { 2 } , \dots , w _ { i - 1 } \right)进行建模(注意不是P \left( w _ { i } | w _ { i - ( n - 1 ) } , \dots , w _ { i - 1 } \right)

该模型就是把NNLM隐层变成RNN,每一个隐层包含此前所有上文信息

RNNLM里面最厉害的就属ELMo了。该模型利用多层双向LSTM的加权和来表示词向量,其中权重可根据具体任务动态调节。

C&W模型

与基于语言模型的词向量生成方法不同,C&W以直接生成词向量为目标。


C&W模型

C&W模型没有去求解P \left( w _ { i } | w _ { 1 } , w _ { 2 } , \dots , w _ { i - 1 } \right),而是直接对n元短语打分。对于语料中出现过的n元短语,模型会对其打高分;而对于语料中没有出现的随机短语,模型会对其打低分。通过这种方式,C&W 模型可以更直接地学习得到符合分布假说的词向量。
具体而言,对于整个语料,C&W模型需要最小化:
\sum _ { ( w , c ) \in \mathbb { D } } \sum _ { w ^ { \prime } \in \mathbb { V } } \max \left( 0,1 - \operatorname { score } ( w , c ) + \operatorname { score } \left( w ^ { \prime } , c \right) \right)
其中,(w,c)为从语料中选出的一个n元短语w _ { i - ( n - 1 ) / 2 } , \dots , w _ { i + ( n - 1 ) / 2 }w为序列中的中间词,也是目标词,即w_ic表示w的上下文;w'为字典中的某一个词。正样本(w,c)来自语料,而负样本(w',c)则是将正样本序列中的中间词替换成其它词。
即:
\begin{array} { l } { ( w , c ) = w _ { i - ( n - 1 ) / 2 } , \ldots , w _ { i + ( n - 1 ) / 2 } } \\ { \left( w ^ { \prime } , c \right) = w _ { i - ( n - 1 ) / 2 } , \ldots , w _ { i - 1 } , w ^ { \prime } , w _ { i + 1 } , \ldots , w _ { i + ( n - 1 ) / 2 } } \end{array}
C&W模型与NNLM相比,主要的不同点在于C&W模型将目标词放到了输入层,同时输出层也从语言模型的|\mathbb {V}|个节点变为一个节点,这个节点的数值表示对这组n元短语的打分。这个区别使得C&W模型成为神经网络词向量模型中最为特殊的一个,其它模型的目标词均在输出层,只有C&W模型的目标词在输入层。

CBOW模型

CBOW模型

CBOW模型的结构如上图,该模型一方面根据C&W模型的经验,使用一段文本的中间词作为目标词;另一方面,又以NNLM作为蓝本,并在其基础上做了两个简化。一、CBOW没有隐藏层,去掉隐藏层之后,模型从神经网络结构直接转化为log线性结构,与Logistic回归一致。log线性结构比三层神经网络结构少了一个矩阵运算,大幅度地提升了模型的训练速度。二、CBOW去除了上下文各词的词序信息,使用上下文各词词向量的平均值,代替神经网络语言模型使用的上文各词词向量的拼接。形式化地,CBOW模型对于一段训练样本w _ { i - ( n - 1 ) } , \dots , w _ { i },输入为:
\boldsymbol { x } = \frac { 1 } { n - 1 } \sum _ { w _ { j } \in c } e \left( w _ { j } \right)
由于没有隐藏层,CBOW模型的输入层直接就是上下文的表示。CBOW 模型根据上下文的表示,直接对目标词进行预测:
P ( w | c ) = \frac { \exp \left( e ^ { \prime } ( w ) ^ { \mathrm { T } } \boldsymbol { x } \right) } { \sum _ { w ^ { \prime } \in \mathbb { V } } \exp \left( \boldsymbol { e } ^ { \prime } \left( w ^ { \prime } \right) ^ { \mathrm { T } } \boldsymbol { x } \right) }
对于整个语料而言,与神经网络语言模型类似,CBOW的优化目标为最大化:
\sum _ { ( w , c ) \in \mathbb { D } } \log P ( w | c )

Skip-gram模型

Skip-gram模型

Skip-gram模型的结构如上图,与CBOW模型一样,Skip-gram模型中也没有隐藏层。和CBOW模型不同的是,Skip-gram模型每次从目标词w的上下文c中选择一个词,将其词向量作为模型的输入x,也就是上下文的表示。Skip-gram模型同样通过上下文预测目标词,对于整个语料的优化目标为最大化:
\sum _ { ( w , c ) \in \mathbb { D } } \sum _ { w _ { j } \in c } \log P ( w | w _ { j } )
其中,
P ( w | w _ { j } ) = \frac { \exp \left( \boldsymbol { e } ^ { \prime } ( w ) ^ { \mathrm { T } } \boldsymbol { e } \left( w _ { j } \right) \right) } { \sum _ { w ^ { \prime } \in \mathrm { V } } \exp \left( e ^ { \prime } \left( w ^ { \prime } \right) ^ { \mathrm { T } } \boldsymbol { e } \left( w _ { j } \right) \right) }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容