作为 2018 年自然语言处理领域的新秀,BERT 是过去几年自然语言处理(NLP)领域的集大成者,一经出场就技惊四座,碾压所有算法,刷新了 11 项 NLP 测试的最高纪录,甚至有「超越人类」的表现,它被认为是未来 NLP 研究和工业应用最为主流的语言模型之一。
然而最近台湾国立成功大学的一篇论文却给人们泼了冷水。这一研究认为,BERT 至少在 ARCT 任务上利用了不正常的统计线索。正是这些统计线索,BERT 才能获得极好的效果,如果在不改变原数据的情况下去除不正常的线索,BERT 甚至不如随机猜测。
此言一出,立即引发了机器学习社区的强烈反响,在研究社区中有人评价道:「我非常喜欢这篇论文,它用简单有效的方式表明这些模型没有被正确地『理解』,并且只使用了简单的(错误的)统计线索。我认为大多数人(可能除了伊隆·马斯克)都很清楚,这就是 BERT 模型所做的事情。然而,目前有关 BERT 在少量标签情况下的改进版仍层出不穷。」
毫无疑问,BERT 的研究很有价值,但目前的一些基准测试可能已被证明并没有效果。当我们看到 BERT「解决」了一些任务的消息时,看起来就像我们已经解决了 NLP 问题,这些事件已经形成了浮夸的风气,值得我们担忧。
首先,是时候重新审视一下当今的 NLP Benchmark 现状了。
NLP 是如此活跃的一个开发领域,其热度的不断增加离不开各种排行榜:这些排行榜是多个共享任务、基准系统的核心,如 GLUE 基准以及 SQUAD、AllenAI 等单独的数据集。这些排行榜激发了工程团队之间的竞争,帮助其开发出更好的模型来解决人类自然语言处理问题。但事实真的是这样吗?麻省大学博士后 Anna Rogers 就这一现象表达了她的观点。
排行榜有什么错?
通常来讲,NLP 领域的排行榜都是下图这个样子:
网上和学术论文中的排行榜(将所提出的模型和基准模型进行对比)都遵循以上这种格式。
如今,用模型的测试性能来评估其是否新颖或有趣是远远不够的,但排行榜恰恰展示的只有这一点。由于深度学习的范围如此之广,充满各种不同的架构,因此很难找出标准方法来衡量模型参数、训练数据等额外信息。在论文中,这些细节有时写在方法部分,有时出现在附录或 GitHub repo 的评论里,或者直接就没有提。在那些在线排行榜中,每个系统的细节也只能从论文链接(若有的话)或 repo 的代码中找到。
在这个越发忙碌的世界里,如果不是为了评审和复现,我们中有多少人会真正去找这些细节呢?这些简单的排行榜已经提供了我们最关心的信息,即哪些是最新的 SOTA。我们通常懒得思考,不会去批判性地接收这些信息,即使在提醒很快出现的时候也会选择忽略。如果我们不得不积极地去找到这些警示信号……好吧,根本不可能。冠军模型在 twitter 上爆红,可能还会在盲审中得到一些好处。
这种 SOTA 至上方法的危害也引发了很多讨论。如果读者眼里只有排行榜,那研究者就会认为:只有击败 SOTA 才是有价值的研究。这样的想法带来了一大批水论文,它们的性能提升非常有限,而且很多无法复现(Crane, 2018)。这也给那些做同样任务的研究者带来了一些问题,他们的模型没有达到 SOTA,因此会觉得连论文都没必要写。
GLUE 基准当前排名,上面每一个模型成本都非常大,基本不是一般研究者能复现的。
本文旨在探讨排行榜最近带来的另一个问题。其成因非常简单:从根本上来说,模型性能的提升可能基于多个原因,要么是从可用的数据中构建了更好的表征,要么只是用了更多的数据或更深的网络。问题是,如果一个模型用了更多的数据/计算,我们就很难找出其性能提升的真正原因。
最流行的排行榜现在由基于 Transformer 的模型占据。在横扫各大排行榜数月之后,BERT 在 NAACL 2019 大会上获得了最佳论文奖。最近,XLNet 又后来者居上,在 20 项任务上碾压 BERT,成为新的预训练模型 SOTA。其他的 Transformers 模型还包括 GPT-2、ERNIE 等。
问题在于:这些模型都很大。虽然代码是开源的,但复现这些结果或创造可与之匹敌的模型所需的算力不是一般实验室可以承担的。例如,XLNet 的训练 token 达到了 32B,需要使用 128 个 Cloud TPU 训练 2 天,费用超过 6.14 万美元。单单只是微调模型也非常昂贵。
这样的排行榜真的还 OK?
但一方面,这一趋势看起来又是可预测,甚至是必然的:拥有较多资源的用户会想法设法利用更多资源来实现更好的性能。有人甚至认为大模型证明了自身的可扩展性,并实现了深度学习与生俱来的潜力,即能够基于更多信息学习到更复杂的模式。没有人知道解决特定 NLP 任务时到底需要多少数据,但数据越多应该效果越好,并且限制数据似乎会适得其反。
从此观点来看——从现在开始,似乎只有业界才能做顶层 NLP 研究。学者们只能通过获得更多资助或与高性能计算中心合作来提升自己的参与度。此外,他们还可以转向分析,在业界提供的大模型之上构建一些东西或者创建数据集。
但是,就 NLP 的整体进展而言,这或许不是最好的选择。
为什么「大模型+排行榜=灾难」?
简单来讲,大模型的主要问题在于:「更多数据和计算带来的 SOTA 结果」并不是真正的研究进展(「More data & compute = SOTA」is NOT research news)。
排行榜的目的在于显示真正的进步,那么我们需要着眼于提出新架构。很明显,大型预训练模型是珍贵的,但是除非作者证明他们的系统在使用同等规模数据和算力时性能优于其他模型,否则很难判断他们展示的是模型还是资源。
此外,该研究相当程度上是不可复现的:没人会花 6.14 万美元复现 XLNet 训练。其控制变量测试表明 XLNet 在 3 个数据集上的性能仅比 BERT 高出 1-2%,因此我们实际上并不清楚其 masking 策略是否比 BERT 更成功。
同时,学习器模型的开发并未被推动,因为其面临的基础任务更难,而看重排行榜的社区只关注 SOTA。这最后会让学术团队付出代价,学生毕业时可能无法成为更好的工程师。
最后,大型深度学习模型通常过参数化。例如,BERT 的较小版本在大量语法测试实验中的得分高于大型版本。深度学习模型需要大量算力这件事本身并不一定是坏事,但浪费算力对环境是没有益处的。
BERT 不过是统计拟合
除了对数据与算力的质疑,台湾国立成功大学的研究者近日发表了一篇新论文,他们重新探讨了神经网络在理解自然语言中的作用。研究者首先发现 BERT 在 Argument Reasoning Comprehension Task 中性能极好,且只比人类基线水平低 3 个百分点。但是进一步研究却发现,该结果只是利用数据集中的统计线索得出。所以如果针对这些线索做个对抗数据集,那么模型的效果不会比随机猜强多少。
-
论文:Probing Neural Network Comprehension of Natural Language Arguments
-
论文地址:https://arxiv.org/pdf/1907.07355.pdf
这项研究是在论证推理理解(ARCT)这一任务上测试的,这种任务还是挺难的,例如简单的论证「今天会下雨,所以要带伞。」,它潜在的前提即「淋湿是不好的」。而 ARCT 避免直接理解潜在前提,并将重心放在了推断上,如下所示为 ARCT 任务的一个数据点:
ARCT 测试集中的一个样本,模型需要从 Reason 和 Warrant 推断出 Claim。例如「我们可以选择不使用谷歌,且其它搜索引擎也不会重定向到谷歌,那么谷歌就不是寡头垄断」。
BERT 这样的预训练模型能在该数据集上获得 77% 的准确率,只比正常人类基线水平低三个百分点。如果没有足够的通用知识,它能获得这么好的效果是不科学的,因此研究者继续探索 BERT 在该任务中学到了什么。
这种探索也不是这篇论文开启的,先前已经有很多研究试图探索 BERT 的决策过程。但研究者发现 BERT 会搜索 warrant 中的线索词,例如 not 等。这也就表明,BERT 如此优秀的性能都将归功于探索一些「伪」统计线索。
如果我们取推论的逆否命题,那么就有可能去除这些不正常的统计线索,也就能构建对抗样本了。在这样的的对抗数据集上,BERT 只能实现 53% 的准确率,差不多是随机猜测的概率了。此外,因为很多模型实际上也都在发现这样的不正常统计线索,该对抗数据集能作为更多的度量方法。如下所示为上面 ARCT 案例的对抗样本:
我们只需要按照逻辑改变「Not」之类的词,模型就解决不了了。BERT 在这样的对抗数据集只能获得如下效果:
从这样的实验结果可以看出,BERT 这类模型很大程度上都在拟合某些不正常的统计线索。但毋庸置疑的是,BERT 的拟合建模能力还是非常强的,远远超过了 BiLSTM 之类的模型。研究者在最后表示,除了 GLUE 这样的基准,对抗数据集也应该被采用为标准的度量方法,并为模型性能提供更鲁棒的评估标准。
可能的解决方案
对 NLP 排行榜的追捧正将我们置于危险的境地,它让我们放弃了可复现性的目标,只看到谷歌的某个模型在几个月之后超越了另一个模型。为了避免这种情况再次发生,排行榜需要做出改变。
大体上有两种可能的解决方案:
对于某一特定任务而言,我们应该可以提供一个标准的训练语料库,并将计算量限制在强大基线模型所使用的范围内。如果基线类似于 BERT,这将激励研究者进一步开发能够更好利用资源的模型。如果一个系统利用预训练表征(词嵌入、BERT 等),则最后得分应该将预训练数据的大小考虑进来。
对于像 GLUE 这样的一整组任务而言,我们可以令参与者使用他们想要的所有数据和计算,但需要将它们考虑进最后得分之中。排行榜不应只体现模型相对于基线的性能提升,还应列出其利用的资源量。
这两种方法都需要一种可靠的方式来估测算力消耗,至少可以是任务组织者估计的推理时间。Aleksandr Drozd(RIKEN CCS)认为最好的方法是仅报告 FLOP 计数,这在 PyTorch 和 TensorFlow 等框架中已经可以实现。我们或许也可以为接收深度学习模型的共享任务建立通用的服务,在一批数据上训练一个 epoch,为研究人员提供估测数字。
评估训练数据也不是一个简单的任务:纯文本语料库的价值应该低于带注释的语料库或 Freebase。这或许是可以进行测量的。例如,非结构化数据应该可被估测为原始 token 计数 N、aN 这样的增强/解析数据和 N^2 这样的结构化数据作为索引。
与上述相反的一个论点是,某些模型本身可能需要比其他模型更多的数据,且只有在大规模实验中才能获得合理的评估。但即使在这种情况下,一篇令人信服的论文也需要展示新模型能够比其他模型更好地利用大量数据,我们也需要对所有模型在相同的数据上做多轮训练。
近几个月来,我们不断看到 NLP 领域的新进展,每隔几个月都会出现更新、更强大的模型,实现不切实际的结果。但每当人们开始检视数据集的时候就会发现:其实这些模型根本没有学到任何知识。我们是时候从模型优化的工作上后退一步,仔细研究这些数据集,以及它们的真正意义了。