一枝(只)漂亮的小花(猫)是个什么鬼,它与现阶段最流行的语言模型又有什么联系?

一枝(只)漂亮的小花(猫)是输入法里的一个案例。稍带介绍下,我导师是哈工大计算机王晓龙教授,他是国内较早一批做输入法的学者,是智能拼音输入法的作者和构架提出者,当时他的智能拼音输入法1995年被微软看中后,基于此成为 PC 上流行一时的微软拼音输入法(详见「我知道的百度王海峰」)。「一枝(只)漂亮的小花(猫)」是他课堂上的经典案例(后面将简称小花猫案例),当然另一个他经常提起的就是「做科研要顶天立地」,这个先按下不表,有空再补上。

在输入法里,给定输入「yi zhi piao liang de xiao hua」,其对应希望得到的输出汉字是「一枝漂亮的小花」,但如果后面再加个「mao」呢?根绝上下文语境这个「枝」就得变换为「只」了。从这可以看到中文的字或词是由上文和下文同时决定的,有时单由一方决定不了,由这引发出对语言模型的探讨。

  • 语言模型

语言模型是对语言的建模,给定语言序列w1, w2, .., wn,语言模型就是计算该序列的概率,即P(w1, w2, ..., wn)。对于上述例子,就是计算P(一,只,(枝),漂,亮,的,小,花,(猫))。这东西有什么用了,用处可大了,有了概率也就有了值,也就可以比较,最终也就有了选择。比如在在输入法问题上,P(一,只,漂,亮,的,小,花,猫)> P(一,枝,漂,亮,的,小,花,猫),那可以让模型输出正确的答案。

那问题来了,如何计算出这个概率。目前来看主要分为统计语言模型和神经语言模型两大类,两者分别基于count和continuous-space空间。两者的表现形式大家可以自行百度 bag of words VS word embedding。

统计语言模型

统计模型主要是N-gram模型,下面给出unigram、bigram和trigram模型,如图1。

图1

实际应用中N一般不会大于4,因为会产生太多的稀疏值。N-gram模型的主要不足是缺乏长期依赖,只能建模到前 N-1 个词。例如在小花猫案例中,zhi取决于mao的信息,但他们中间的跨度是6,所以很难建立起zhi和mao的联系。

unigram、bigram和trigram反映了一个问题,即语言模型到底是在求什么。前面说到是求字元串序列的概率,从图1中的红框可以看出归根结底是求给定一串上下文出现某个词的概率(一般context<=3)。明白这个来看神经语言模型就更明白了。

神经语言模型

神经语言模型经历了基于前馈神经网路的模型、基于循环神经网路的模型、基于卷积网路的模型和基于自注意力机制的模型。

基于前馈神经网路的模型

最早提出基于前馈神经网路模型的是Benjio(A Neural Probabilistic Language Model,2003),如图,它是利用神经网路去建模当前词出现的概率与其前 N-1 个词之间的约束关系。(不得不佩服牛人,现在觉得理所当然的东西在当时是逆主流而行。)这种方式相比 n-gram 具有更好的泛化能力,缓解了稀疏性带来的问题,它可以建模context>3的关系。Mikolov等人基于其类似思路提出了划时代的word2vec模型Skip-gram(但稍微进行了调整,变成了上文和下文,具体有什么区别后面会讲到)。Benjio模型的主要不足在于需要预先设置context长度,一般是5-10个前置单词。理论上,Benjio模型可以解决小花猫案例(将序列倒过来)。

图2

基于循环神经网路的模型

前面提到基于前馈神经网路的模型仅能处理长度有限的序列(5-10 context),对于更长的怎么办。真实情况有这么长的场景需求吗?还真有哈,举个金融场景的例子。

「公司进行举行股东大会,就股权(投资/融资)进行详细阐述,公司近期因资金链问题」

如果不看「因资金链问题」部分,这个上下文场景「投资」和「融资」都可以,而如果加上的话大概率是选择「融资」,而他们之间的context跨度超过了10。

图3

Recurrent neural network based language model的模型如图3,大家可以看下RNN/LSTM/GRU等模型的介绍,这里不细说了。相比基于前馈神经网路的模型,基于循环神经网路的模型可以捕捉前向序列所有信息(LSTM/GRU可以有选择地捕捉相关信息)。

这里来简单对比下Skip-gram模型和循环神经网路模型。对于上下文信息,Skip-gram模型能同时覆盖,而循环神经网路模型仅能单向覆盖上文或下文,如果要覆盖上下文就需要用Bi-RNN/LSTM/GRU模型。这会有什么影响吗?它与后面将会提到预训练语言模型的建模思路有关(Bert用的是类似Skip-gram方案,ELMo用的是Bi-RNN/LSTM/GRU方案)。

基于卷积神经网路的模型

CNN和RNN是NLP领域经典的神经网路结构,既然有了基于循环神经网路的模型,那为什么没有基于卷积神经网路的模型呢?别说,还真有!Convolutional Neural Network Language Models,它是在基于前馈神经网路模型的基础上将前向网路替换成了卷积网路(如图4),所以模型的创新性没那么高。

图4

基于自注意力机制的模型

很多预训练语言模型都是基于自注意力机制的模型,包括GPT、BERT和XLNet,大家可以看下张俊林老师的《从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史》文章。

下面来对比下基于循环神经网路的模型(RNN)、基于卷积神经网路的模型(CNN)和基于自注意力机制的模型(Transformer)。首先是他们都可以对语言建模,但建模的形式各不相同。如图5,CNN是从空间的角度进行建模,基于邻域策略从空间维度不断扩大,在小花猫案例中通过三跳将「只」与「猫」建立关系;RNN是从时间的角度进行建模,通过不停迭代往后递进,在小花猫案例中通过六跳将「只」与「猫」建立关系(其思路与N-gram有些类似,只不过能保存更多前面的信息);Transformer是从完全图的角度进行建模,任何两点都是直达,所以在小花猫案例中通过一跳将「只」与「猫」建立关系。当然从图中也可以看到Transformer结构比CNN和RNN要复杂。

图 5

  • 预训练语言模型

预训练语言模型经历了word2vec、ELMo、GPT-1、Bert、GPT-2和XLNet的发展见文章(从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史),这里我稍微介绍下ELMo、Bert和XLNet的区别。

从语言模型建模的角度,ELMo走的是基于循环神经网路的模型思路,基于LSTM结构,所以注定模型在预研建模过程中不能同时看上文和下文,只能看一个方向。如果想看两边就得用双向LSTM结构,然后将两者concat,这种不足就是不能在过程中同时借助上文和下文信息。Bert走的是Skip-gram模型思路,基于Transformer结构,当然作者巧妙地借助了Mask机制来实现这一操作(深深膜拜这一思路),模型能同时看上文和下文信息。要实现这一机制Transformer是个基础,能不能用LSTM结构?不行,因为LSTM只能看一边。Transformer是不是只能同时看两边?不是,GPT-1和GPT-2就是走看一边的思路,具体要看怎么使用Transformer。

XLNet比较有意思,它是想借助看一边的形式来实现同时看两边的效果,优势是什么呢?文中说是解决Mask测试中不出现问题和Mask依赖问题。它是怎么做到的呢?基于Transformer结构,主要借助双流注意力和Attention mask机制来解决。可以看下张俊林老师的《XLNet:运行机制及和Bert的异同比较》,介绍得很详细,关键在于下面这张图6,张老师特别做了标记,非常容易理解。

图6

这里稍微延伸下思考。Bert和XLNet都是能同时看两边,说明看两边相比看一边确实要好一些,只是策略不同而已。那是不是还有其他策略呢?个人觉得还有,如果你能想到并解决,那你也是大牛了。毕竟大部分人都仅能做到在现有的基础上修修补补,而像Bert和XLNet那样能提出一个全新的思路还是很稀少。另外,很好奇为什么XLNet不用Next sentence prediction loss,文中给出了对比结果,但没有具体解释,不知是不是与Transformer-XL有关。

上面所讲纯属个人思考,眼光有限,错误难免,谨慎参考。

参考文献

我知道的百度王海峰

A Neural Probabilistic Language Model

Recurrent neural network based language model

Convolutional Neural Network Language Models

从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史

XLNet:运行机制及和Bert的异同比较


推荐阅读:
相关文章