2019-08-07
他们创造了横扫NLP的XLNet:专访CMU博士杨植麟

花费数万美元成本训练最强大k8官方网址模型是近年来 NLP 领域里经常发生的事情。杨植麟认为,依靠算力解决问题是当前研究 AI 的王道:让计算机去做它的强项——计算;如果算力解决不了的问题,再用算法去做。

「我读过人工智能先驱 Richard Sutton 几个月前的文章《苦涩的教训》,它的大意是说:你如果纵观 70 年的 AI 发展历程,就会发现以算力为杠杆的通用方法是最有效的,」杨植麟说道。「从深蓝、AlphaGo 到 NLP 最近的进展都遵循了这个思路。所以我们要做的事情就是:一方面把算力推到极致,另一方面发明和提升通用算法,解决更难的问题。XLNet 可以理解成这两方面的一个结合。」

「把算力推到极致的好处是知晓当前算法的边界,避免在算力可以解决的问题上做一些不必要的算法创新,让大家关注最重要的研究问题。但同时大算力带来的弊端是提升了研究门槛,比如一般的学校和实验室可能没有资源做预训练。这个问题我觉得短时间内要通过不同的分工来解决,资源多的研究者利用资源做大算力研究,资源少的研究者做基于小算力的研究。」

此外,最近 Facebook 提出来的 RoBERTa 也体现了这一点,杨植麟说:「现在预训练的提升主要来自两个方面,一个是算法和模型,一个是训练细节、数据和算力。RoBERTa 表明了第二个方面的重要性,而 XLNet 一方面证明了在训练细节、数据和算力都差不多的情况下算法可以提升效果,一方面探索了增加训练数据的重要性。这两个方向是互补的,而且未来的发展还会持续在两个方向上提升。」

「很多历史上优秀的工作比如 GAN 和 Transformer 都不需要特别大的算力;刘寒骁等人的可导网络结构搜索影响力很大,但就只用了三四个 GPU;我们的 Transformer-XL 最开始也是用一两个 GPU 就在中等数据集上验证了效果会比 RNN 好接近十个点。」

XLNet 的思考与做法

那么从 Transformer-XL 到 XLNet 最核心的思想到底是什么样的,语言模型未来又该如何发展?杨植麟向机器之心介绍了构建 XLNet 的核心思考与做法,整篇论文最精华的地方也就在这里。

我们希望从三个方面出发介绍 XLNet,即 XLNet 是怎样想的、怎样做的,它又该如何提升。在这之前我们希望读者能先了解自回归和自编码两种模式的语言模型:

如上所示分别为自回归模型与自编码模型,其中黄色块为输入字符,蓝色块为字符的位置。对于自回归语言模型,它希望通过已知的前半句预测后面的词或字。对于自编码语言模型,它希望通过一句话预测被 Mask 掉的字或词,如上所示第 2 个位置的词希望通过第 1、3、5 个词进行预测。

我们需要更好的语言建模任务

以前,最常见的语言模型就是自回归式的了,它的计算效率比较高,且明确地建模了概率密度。但是自回归语言模型有一个缺陷,它只能编码单向语义,不论是从左到右还是从右到左都只是单向语义。这对于下游 NLP 任务来说是致命的,因此也就有了 BERT 那种自编码语言模型。

BERT 通过预测被 Mask 掉的字或词,从而学习到双向语义信息。但这种任务又带来了新问题,它只是建模了近似的概率密度,因为 BERT 假设要预测的词之间是相互独立的,即 Mask 之间相互不影响。此外,自编码语言模型在预训练过程中会使用 MASK 符号,但在下游 NLP 任务中并不会使用,因此这也会造成一定的误差。

为此,杨植麟表示我们需要一种更好的预训练语言任务,从而将上面两类模型的优点结合起来。XLNet 采用了一种新型语言建模任务,它通过随机排列自然语言而预测某个位置可能出现的词。如下图所示为排列语言模型的预测方式:

如上排列语言示例,因为随机排列是带有位置信息的,所以扰乱顺序并不影响建模效果。随机排列语言后,模型就开始依次预测不同位置的词。

如果我们知道所有词的内容及位置,那么是不是顺序地分解句子并不太重要。相反这种随机的分解顺序还能构建双向语义,因为如上利用「语言」和「喜欢」预测「处理」就利用了上下文的词。如下原论文展示了不同分解顺序预测同一词的差别,如果第一个分解的词的「3」,那么它就只能利用之前的隐藏状态 mem 进行预测。

这理解起来其实也非常直观,如果我们知道某些词及词的位置,那么完形填空式地猜某个位置可能出现哪些词也是没问题的。此外,我们可以发现,这种排列语言模型就是传统自回归语言模型的推广,它将自然语言的顺序拆解推广到随机拆解。当然这种随机拆解要保留每个词的原始位置信息,不然就和词袋模型没什么差别了。

我们需要更好的结构

前面我们为预训练语言模型构建了新的任务目标,这里就需要调整 Transformer 以适应任务。如果读者了解一些 Transformer,那么就会知道某个 Token 的内容和位置向量在输入到模型前就已经加在一起了,后续的隐向量同时具有内容和位置的信息。但杨植麟说:「新任务希望在预测下一个词时只能提供位置信息,不能提供内容相关的信息。因此模型希望同时做两件事,首先它希望预测自己到底是哪个字符,其次还要能预测后面的字符是哪个。」

这两件事是有冲突的,如果模型需要预测位置 2 的「喜欢」,那么肯定不能用该位置的内容向量。但与此同时,位置 2 的完整向量还需要参与位置 5 的预测,且同时不能使用位置 5 的内容向量。