统计自然语言处理之美:从 NNLM 到 Bert

要不要让机器理解语言?

自然语言处理六十多年的发展历程,基本可以分为两个阶段。第一阶段从 20 世纪 50 年代到 70 年代,人们对计算机处理自然语言的认识都局限在人类学习语言的方式上,用了二十年时间苦苦探寻让计算机理解语言的方法,最终却一无所获。当时学术界普遍认为,要让机器完成翻译等自然语言处理任务,首先必须让机器理解语言,因此分析语句和获取语义成为首要任务,而这主要依靠语言学家来人工总结文法规则。特别是 20 世纪 60 年代基于乔姆斯基形式语言的编译器得到了很大的发展,更加鼓舞了人们通过概括自然语言语法来解决自然语言处理问题的决心。但是人类的自然语言既复杂又灵活,仅靠手工编写的文法规则根本无法覆盖(这还不考虑规则之间存在的矛盾),而且与规范严谨的程序语言不同,自然语言是一种复杂的上下文有关文法,很难用计算机进行解析。因此这一阶段,可以说人们对自然语言处理的研究进入了一个误区。

正如人类是通过空气动力学而不是简单地模仿鸟类造出了飞机,事实上进行自然语言处理也未必要让机器完全理解语言。20 世纪 70 年代,随着统计语言学的提出,基于数学模型和统计的自然语言处理方法开始兴起,并渐渐替代了过去基于规则的研究方法,这个领域才在接下来的三十多年里取得了一系列突破。当时基于统计方法的核心模型是通信系统加隐马尔可夫模型,这个系统的输入和输出都是一维的符号序列,而且保持原有的次序(例如语音识别、词性分析),但是面对输出为二维树形结构的句法分析以及次序会有很大变化的机器翻译等任务时,这种方法就难以解决了。从 20 世纪 80 年代以来,随着硬件的快速发展,人们可以获得的计算能力不断提高,同时伴随着互联网的发展,产生了海量的数据,越来越多的统计机器学习方法被运用到自然语言处理中,许多之前一直难以解决的问题都取得了进展。例如随着基于有向图的统计模型的发展,机器已经能够进行复杂的句法分析,2005 年 Google 基于统计方法的翻译系统更是全面超过了基于规则的 SysTran 翻译系统。

2006 年,随着机器学习领域的泰斗 Hinton 表明深度信念网络可以通过逐层预训练策略有效地训练,基于神经网络和反向传播算法进行训练的深度学习方法开始兴起。越来越多之前由于缺乏数据、计算能力以及有效优化方法而被忽视的神经网络模型得到了复兴,典型的代表就是 1997 年就已提出的长短时记忆 (LSTM) 网络,直到如今,许多 LSTM 的变体依然在序列建模任务中广泛应用,包括 Google 的许多自然语言处理任务。随着越来越多的自然语言处理研究者将注意力转向深度学习方法,各种结构各异的神经网络模型也被引入到自然语言处理任务中。例如2017 年 Google 在前人工作的基础上提出的 Attention 模型,为当时普遍使用各种 LSTM 和 CNN 模型进行编码的自然语言处理领域提供了另一种解决思路,模型中包含的 Transformer 结构更是引导了后续自然语言处理模型的发展。

可以说,今天已经没有人还会质疑基于统计的自然语言处理研究方法,但同时传统基于规则的方法也依然有存在的价值。正如近年来的许多研究者尝试将传统的语言学特征融入到最新的神经网络模型中,如何将传统语言学积累的研究成果与深度学习方法相结合,更多地从语言学角度来设计和运用模型也正吸引越来越多研究者的注意。

从 NNLM 到 Bert

正如第一节所说,人类的自然语言是一种上下文相关的信息表达方式,因此要让机器能够处理自然语言,首先就需要为自然语言建立数学模型,这个模型被称为“统计语言模型”。统计语言模型的核心思想就是能够判断一个文字序列是否构成人类能理解并且有意义的句子(也就是判断一个句子是不是人话),这个问题曾经困扰了学术界很多年。20 世纪 70 年代之前,研究者试图从文字序列是否合乎文法、含义是否正确的角度入手,最终伴随着难以穷尽以及越来越繁琐的规则,这个问题依然无法有效解决。直到 IBM 实验室的 Jelinek 为了研究语音识别问题换了一个思路,用一个非常简单的统计模型就解决了这个问题。

Jelinek 的想法非常简单,一个文字序列 $w_1,w_2,…,w_n$ 是否合理,就看这个句子 $S$ 出现的概率 $P(S)$ 如何,出现概率越大的句子越合理:

\[P(S) = P(w_1,w_2,...,w_n)\\ = P(w_1)P(w_2|w_1)P(w_3|w_1,w_2)...P(w_n|w_1,w_2,...,w_{n-1})\]

不难看出,任意一个词语 $w_n$ 的出现概率都取决于它前面出现的所有词(理论上除了前面的词语之外,也可以引入后面的词语联合起来预测单词的出现概率)。不过随着前面词语数量的增加,条件概率 $P(w_n\mid w_1,w_2,…,w_{n-1})$ 会变得越来难计算,因而实际计算时会假设任意一个词语 $w_i$ 的出现概率仅仅与前面的 $N-1$ 个词语有关,即:

\[P(w_i|w_1,w_2,...,w_{i-1}) = P(w_i|w_{i-N+1},w_{i-N+2},...,w_{i-1})\]

这种假设被称为马尔可夫假设,对应的语言模型被称为 N 元 (N-Gram) 模型。特别地,$N=2$ 时,任意词语 $w_i$ 的出现概率只与它前面的词语 $w_{i-1}$ 有关,统计模型称为二元 (Bigram) 模型;$N=1$ 时的一元模型实际上就是一个上下文无关模型。由于 N 元模型的空间和时间复杂度都几乎是 N 的指数函数,因此实际应用中最常见的是 $N=3$ 的三元模型。可是,即使是三元、四元甚至是更高阶的语言模型,依然无法覆盖所有的语言现象。因为在自然语言中,上下文之间的相关性可能跨度非常大,甚至可以从一个段落跨到另一个段落,这也是为什么包括篇章分析等跨段落的篇章级任务正受到越来越多研究者的关注,而这是马尔可夫假设解决不了的。此时就需要采用包括 LSTM、Transformer 等模型来捕获词语之间的长程依赖性 (long distance dependency) 了。

2003年,Bengio提出了神经网络语言模型 NNLM (Neural Network Language Model),可惜它生不逢时,在之后的十年中都没有引起太大的反响。直到2013年,随着越来越多的深度学习模型被引入到自然语言处理任务中,NNLM才被重新发掘,并成为使用神经网络建模语言的经典范例。NNLM的思路非常接近于前面介绍的统计语言模型,它通过输入单词前面的 $n-1$ 个单词来预测当前词。

首先通过查表 $C$ 得到要预测单词 $w_t$ 前面的 $n-1$ 个单词对应的词向量 $C(w_{t-n+1}),…,C(w_{t-2}),C(w_{t-1})$,然后将这些词向量拼接后输入到带有激活函数的隐藏层中,最后接 softmax 层进行预测。特别地,包含所有词语词向量的矩阵 $C$ 也是模型的参数,需要通过学习获得。因此 NNLM 不仅能够能够根据上文预测后接的词语是什么,同时获得了所有词语的词向量 (Word Embedding)。

2013 年真正将神经网络语言模型发扬光大的是 Google 提出的 Word2Vec,可以说这个模型训练得到的词向量在很长一段时间里,都是自然语言处理神经网络方法的标配组件,即使是后来出现的 Glove 模型也难以掩盖它的光芒。Word2Vec 的模型结构和 NNLM 基本一致,只是训练方法有所不同,分为 CBOW (Continuous Bag-of-Words) 和 Skip-gram 两种。

其中 CBOW 使用待预测词语周围的词语 $w(t-2),w(t-1),w(t+1),w(t+2)$ 来进行预测 $w(t)$,Skip-gram 则正好相反,它使用当前词语 $w(t)$ 来预测它的周围词语。可以看到,与严格参照统计语言模型的 NNLM 不同(每个词语的出现概率只与它前面的词语有关,因此通过前面的词语来预测当前词语),Word2Vec 在结构上更加自由,训练目标也更多地是为获得词向量服务。特别是其提出的同时通过上文和下文来预测当前词语的 CBOW 训练方法,打破了语言模型只能通过上文来预测下文的固定思维,为后续一系列神经语言模型的发展奠定了基础。

虽然 Word2Vec 取得了巨大的成功,但是有一片乌云一直笼罩在词向量的上空,那就是多义词问题。正如第一节所说,自然语言是一种复杂的表示体系,而自然语言中常见的多义正是语言灵活性和高效性的一种体现。但是 Word2Vec 训练得到的词向量却对此束手无策,无论一个词语的上下文如何,对于一个词语,Word2Vec 都只能有一个词向量,这意味着多义词被编码到了完全相同的参数空间。

而事实上,早在 20 世纪 90 年代初,Yarowsky 就给出了一个非常简单又有效的解决方案——运用词语之间的互信息。具体的做法是,对于一个多义词,分别从大量文本中找出这个词在表示不同语义时,同时出现的互信息最大的一些词。当在文中遇到这个词语时,只需要看看上下文中哪些词语出现的多就可以了。简单来说,就是通过一个多义词的上下文来判断这个词语当前表达的语义。因此在 2018 年之前的自然语言处理领域,都是将 Word2Vec 预训练好的词向量作为模型的输入,然后通过 LSTM、CNN 等模型来重新对句子中的词语进行编码,以便捕获到词语的上下文信息。

一直到 2018 年 ELMO 的提出,直接在词向量端给出了一种简洁优雅的解决方案。与 Word2Vec 训练好之后就固定了的静态词向量不同,ELMO 会自动地根据词语的上下文信息去动态调整词语的词向量,因此自然就解决了多义词问题。具体来说,ELMO 首先利用语言模型进行预训练,然后在实际使用时,从预训练网络中提取对应词语的网络各层的词向量拼接起来作为新的词向量。

ELMO 采用双层双向 LSTM 作为网络结构,从两个方向编码词语的上下文信息来进行预测,本质上就是将编码层直接封装到了语言模型中。在训练完成后,不仅学习到了词语的词向量,还训练好了一个双层双向的 LSTM 网络结构。因此对于输入中的每一个词语,不仅可以得到初始的词向量,还可以往上从第一层双向 LSTM 中得到包含句法信息的词向量,从第二层 LSTM 中得到包含语义信息的词向量,最终通过加权求和就可以得到每一个词语最终的词向量。但是 ELMO 也依然存在缺陷,首先它使用 LSTM 作为编码器而不是 17 年 Google 提出的特征提取能力更强的 Transformer,其次直接通过拼接来融合双向抽取特征的方法也不够优美。

随着兼具 RNN 捕获长距离依赖能力以及 CNN 并行计算优点的 Transformer 的出现,越来越多的自然语言处理模型选择其为编码器,随后将 ELMO 中的 LSTM 更换为 Transformer 的 GPT 模型也很快出现了。但是 GPT 又再次追随了 NNLM 的脚步,只通过词语的上文来进行预测,而抛弃了词语的下文,这在很大程度上限制了模型的应用场景。例如阅读理解这种任务,如果预训练时候不把词语的下文嵌入到词向量中,会白白丢掉很多信息。

不过这一缺陷很快就得到了解决,18 年底随着 Bert 的提出,这一阶段神经语言模型的发展终于出现了一位集大成者,它在 11 个各种类型的自然语言处理任务中都达到目前最好的效果。Bert 在模型大框架上采用和 GPT 完全相同的两阶段模型,首先是语言模型预训练,然后使用微调模式解决下游任务。Bert 不仅像 GPT 模型一样采用 Transformer 作为编码器,而且在预训练阶段采用了类似 ELMO 的双向语言模型。

因此 Bert 不仅编码能力强大,而且对于种类繁多且各具特点的下游任务,Bert 都可以简单地通过改造输入输出部分来完成,具有非常强大的普适性。不过 Bert 的优点同样也是它的一个缺陷,由于 Bert 构建的是双向语言模型,因而无法直接用于文本生成类任务,不过也可以通过将 Bert 附着在以 Transformer 作为 encoder、decoder 的 Seq2Seq 结构上,根据任务选择不同的预训练数据初始化 encoder 和 decoder 来完成文本生成类任务。

可以看到,从 2003 年 NNLM 模型提出时的无人问津,到 18 年底 Bert 模型几乎在所有任务上横扫自然语言处理领域,神经网络语言模型的发展也经历了漫长的时间。在这段时间里,许多的研究者一直在不断地努力,在前人工作的基础上进行改进,这才迎来了 Bert 的成功。因此 Bert 的出现并非一蹴而就,它不仅借鉴了 ELMO、GPT 等模型的结构与框架,更是延续了 Word2Vec 提出的 CBOW 的思想,是这一阶段神经语言模型发展的集大成者。

Bert之后如何发展

以 Bert 为代表的预训练模型本质上是通过设计一个网络结构来做语言模型任务,然后把大量的无标注的自然语言文本利用起来,将文本中蕴含的语言学知识抽取出来并编码到网络结构中。这样当下游任务的标注信息数量有限时,这些先验的语言学特征就可以对任务产生极大的特征补充作用。正如第一节所说,如何引入先验的语言学知识一直是自然语言处理,尤其是深度学习场景下神经网络模型的主要目标之一。在很长的一段时间里,这个问题一直没有太好的解决办法,很多时候还是依赖于人工构造的特征工程,而 ELMO、GPT、Bert 这样的两阶段模式无疑提出了一种自然又简洁的解决方案。

Bert 模型取得成功之后,自然语言处理的研究者们并没有停下脚步,例如 MASSALBERT 等都在 Bert 的基础上进行了某个方向的改良。其中微软提出的 UNILM (UNIfied pretrained Language Model) 就是其中一个典型的代表,它把 Bert 的 MASK 机制运用到了一个很高的水平。

UNILM 通过给 Transformer 中 Self-Attention 添加不同的 MASK 矩阵,就可以在不改变 Bert 模型结构的基础上,同时实现双向、单向和 Seq2Seq 的语言模型,并且还可以直接沿用 Bert 的 Masked Language Model 的预训练权重,收敛也很快,可以说是一个对 Bert 进行扩展的优雅方案。在 Bert 取得巨大成功的鼓舞下,正在有越来越多的机构和研究者加入这一领域,相信在接下来的一段时间里还会有越来越多高效的神经语言模型出现。

不过对于自然语言处理其他领域的研究者而言,这些预训练的语言模型虽然为构建特定下游任务的模型提供了很大的便利,却也在很大程度上束缚住了大家的手脚。尤其是在以Bert为代表的两阶段模型的框架下,任务模型往 Bert 结构上靠成为一种必然的趋势,同时对海量预训练模型参数的微调也需要耗费大量的计算资源,这在一定程度上也提高了自然语言处理研究的门槛。

总结

本文简单地回顾了从 20 世纪 50 年代以来自然语言处理的发展历程,可以看到,自然语言处理先是经历了从以语言学规则为核心到以数学统计为核心的转变,之后伴随着深度学习的崛起,以 Word2Vec、Bert 为代表的神经语言模型以及各种结构各异的自然语言处理神经网络模型也迎来了蓬勃发展的时期,并且在大部分上自然语言处理任务上都取得了很大的突破,其中一些任务(例如机器翻译等)甚至达到了可以商用的水平。伴随着越来越多自然语言处理研究成果的落地,如今自然语言处理已经融入了大家的日常生活,甚至在许多方面都已经改变了人们的生活习惯。

相信伴随着自然语言处理研究的发展,比 Transformer 编码能力更强的特征抽取器会不断出现,同时比 Bert 更好地引入大量无监督数据中包含的语言学知识的方法也会出现。

自然语言处理的发展,依旧任重而道远。