热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

亚马逊:我们提取了BERT的一个最优子架构,只有Bertlarge的16%,CPU推理速度提升7倍...

选自arXiv作者:AdriandeWynter、DanielJ.Perry机器之心编译机器之心编辑部提取BERT子架构是一个非常值得探讨的问题,但现有

选自arXiv

作者:Adrian de Wynter、Daniel J. Perry

机器之心编译

机器之心编辑部

提取 BERT 子架构是一个非常值得探讨的问题,但现有的研究在子架构准确率和选择方面存在不足。近日,来自亚马逊 Alexa 团队的研究者细化 BERT 子架构提取过程,并提取了一个最优子架构 Bort,它的大小仅为 BERT-large 的 16%,CPU 上的推理速度却提升到了原来的八倍。

在自然语言处理领域,BERT 是一个里程碑式的进展。只需要添加一个单层线性分类器和一个简单的微调策略,它就能在多项任务中达到优异的性能。但另一方面,BERT 的应用也面临很多问题,如规模大、推理速度慢、预训练过程复杂。研究人员已经做了许多尝试来提取一个更简单的子架构,希望这个子架构能够保持原始 BERT 的优异性能,同时简化预训练过程,缩短推理时间。这些研究取得了不同程度的成功。然而,他们提取的这些子架构在准确率方面仍然低于原始架构的实现,而且架构参数集的选择往往看起来很随意。

虽然这个问题在计算上很难解决,但 de Wynter 最近的一项研究表明:存在一种近似算法——更具体地说,一种完全多项式时间近似模式(FPTAS)——在一定条件下能够有效地提取出具有最优保证的此类集合。

在本文中,来自 Amazon Alexa 团队的研究者将提取 BERT 最优子架构参数集这一问题细化为三个指标:推断延迟、参数大小和误差率。该研究证明:BERT 具备 strong AB^nC 属性,可满足这些条件组合,使上述算法表现得像 FPTAS。然后,研究者从一个高性能的 BERT 变体中提取了一个最优的子架构,称为 Bort,其大小是 BERT-large 的 16%,在 CPU 上的推理速度提升到原来的 8 倍。

  • 论文地址:https://arxiv.org/pdf/2010.10499.pdf

  • GitHub地址:https://github.com/alexa/bort/

尽管 FPTAS 可以确保找到表现最优的架构,但它返回的是在上述三个指标上表现最优的架构参数集,而不会输出一个训练到收敛的架构。因此,研究者对 Bort 进行了预训练,发现与原先的训练相比,预训练速度有了明显的提高:在相同的 GPU、数据集大小也相当的情况下,Bort 训练了 288 小时,BERT-large 训练了 1153 小时,而 RoBERTa-large 训练了 24,576 小时。

研究者还在 GLUE、SuperGLUE 以及 RACE 公共 NLU 基准上对 Bort 进行了评估。结果表明,与 BERT-large 相比,Bort 在所有这些基准上都获得了显著提高,提升幅度从 0.3% 到 31% 不等。

研究者在 GitHub 上开源了训练模型以及代码:https://github.com/alexa/bort/

Bort:BERT 的「最优」子架构

Bert 是一种基于 transformer 的双向全连接架构,它包括一个依赖于词汇量的嵌入层(BERT 的词汇量 V = 28,996 tokens)、包含 Transformer 的 D 编码器层,以及一个输出层。BERT 架构刚推出时有两个变体:

  • BERT-large(D = 24 编码器层、A = 16 注意力头、H = 1,024 隐藏层大小、I = 4,096 中间层大小);

  • BERT-base(D =12、A = 12、H = 768、I = 3072)。

在形式上,令 Ξ 表示包含四元组 (即架构参数)数值有效组合的有限集合。与 de Wynter (2020b) 的研究一致,该研究将 BERT 架构族描述为某个函数的陪域(codomain),如下公式 1 所示:

算法

该研究想要找出一个架构参数集 ξ = ,对推理速度 i(b(X; ·))、参数量 p(b(·; W) 和误差率 e(b(X; W^∗ ), Y ) 这三个度量指标进行优化。

de Wynter (2020b) 表明, 对于任意架构而言,这都是一个 NP-Hard 问题。de Wynter (2020b) 中的 FPTAS 是一种近似算法,该算法依赖于对 i(·)、p(·) 和 e(·, ·) 代理函数的优化,这三个代理函数分别表示为 iˆ(·)、pˆ(·) 和 eˆ(·, ·)。执行过程中将它们表示为 Ξ 的函数,并通过选择一个参数最多、推理时间最长的架构 T∈B(T 被称为极大点,maximum point)和 W - 系数指标对它们进行标量化处理,具体如下公式 2 所示:

求取 i(·) 和 p(·) 的代理相对简单,事实上,的代理必须通过损失函数来获得。同样地,保证运行时和可逼近性依赖于两个额外的输入参数:选定的最大训练步数量 n > 0,预期间隔大小 1 ≤  ≤ |Ξ|。ϵ 的的选择直接影响该近似算法求得解的质量。

用知识蒸馏进行预训练

尽管 FPTAS 能够确保我们获得描述最优子架构的架构参数集,但如何高效预训练参数化模型仍是一个待解决问题。

根据以往的研究(详见论文第二章)可以得出结论,使用知识蒸馏(KD)来预训练上述语言模型可以在前述评估指标上达到良好的性能。鉴于代理误差函数 eˆ(·, ·) 是关于极大点的交叉熵,因此将上述评估通过 KD 进行扩展是很自然的事情。

该研究还比较了 Bort 架构的自监督预训练和基于 KD 的预训练,发现与另一种方法相比,使用学生模型的最后一层和教师模型之间的一个简单交叉熵就足以找到一个优秀模型,该模型可以获得更高的遮蔽语言模型(MLM)准确率和更快的预训练速度。

评估

为了验证在经过最佳子架构提取过程之后,Bort 是否保留了 BERT 和 RoBERTa 的强大泛化性能,研究者在 GLUE、SuperGLUE 基准以及 RACE 数据集上微调了 Bort。结果表明,Bort 比其他类似 BERT 的压缩模型要好得多,在多个任务上的性能都大大优于其他模型

GLUE

GLUE(Generalized Language Evaluation benchmark)包含一组常见的自然语言任务。主要是侧重于自然语言推理(NLI),它由十个数据集组成。

研究者通过在所有任务中添加单层线性分类器来微调 Bort,但 CoLA 除外。在 CoLA 中,研究者发现在 Bort 和分类器之间添加额外的线性层可以提高收敛速度。研究者使用 Agora 对所有任务进行了微调。

结果如表 4.15 所示。除了 QQP 和 QNLI 以外,Bort 几乎在所有任务上表现优异,它的性能比其他基于 BERT 的同等模型要好得多。相比于 BERT-large,Bort 的性能提高了 0.3%-31%。研究者将这种提升归功于 Agora 的微调,因为它允许模型更好地学习每个任务的目标分布。

SuperGLUE

SuperGLUE 包含一组常见的自然语言任务,它由十个数据集组成。

研究者通过添加单层线性分类器来微调 Bort,并在所有任务中运行 Agora 至收敛。结果如表 5 所示:Bort 在除了 ReCoRD 以外的所有任务中获得了超越或媲美 BERT-large 的结果

RACE

RACE 数据集是一个文本阅读的多项选择题数据集,经过专业注释,被分成两个数据集:RACE-H(从高中考试题目中提取的数据集)和 RACE-M(从初中考试题目中提取的数据集)。

与之前实验一样,研究者通过添加单层线性分类器来微调 Bort,并运行 Agora 进行收敛。

结果如表 6 所示。总体而言,Bort 获得了良好的结果,在两个任务上都比 BERT-large 的性能高出 9-10%

© THE END 

转载请联系本公众号获得授权

投稿或寻求报道:content@jiqizhixin.com



推荐阅读
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 题目《BZOJ2654: Tree》的时间限制为30秒,内存限制为512MB。该问题通过结合二分查找和Kruskal算法,提供了一种高效的优化解决方案。具体而言,利用二分查找缩小解的范围,再通过Kruskal算法构建最小生成树,从而在复杂度上实现了显著的优化。此方法不仅提高了算法的效率,还确保了在大规模数据集上的稳定性能。 ... [详细]
  • OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战
    OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战 ... [详细]
  • 解决针织难题:R语言编程技巧与常见错误分析 ... [详细]
  • 在 Linux 环境下,多线程编程是实现高效并发处理的重要技术。本文通过具体的实战案例,详细分析了多线程编程的关键技术和常见问题。文章首先介绍了多线程的基本概念和创建方法,然后通过实例代码展示了如何使用 pthreads 库进行线程同步和通信。此外,还探讨了多线程程序中的性能优化技巧和调试方法,为开发者提供了宝贵的实践经验。 ... [详细]
  • 每日前端实战:148# 视频教程展示纯 CSS 实现按钮两侧滑入装饰元素的悬停效果
    通过点击页面右侧的“预览”按钮,您可以直接在当前页面查看效果,或点击链接进入全屏预览模式。该视频教程展示了如何使用纯 CSS 实现按钮两侧滑入装饰元素的悬停效果。视频内容具有互动性,观众可以实时调整代码并观察变化。访问以下链接体验完整效果:https://codepen.io/comehope/pen/yRyOZr。 ... [详细]
  • 计算机视觉领域介绍 | 自然语言驱动的跨模态行人重识别前沿技术综述(上篇)
    本文介绍了计算机视觉领域的最新进展,特别是自然语言驱动的跨模态行人重识别技术。上篇内容详细探讨了该领域的基础理论、关键技术及当前的研究热点,为读者提供了全面的概述。 ... [详细]
  • 【图像分类实战】利用DenseNet在PyTorch中实现秃头识别
    本文详细介绍了如何使用DenseNet模型在PyTorch框架下实现秃头识别。首先,文章概述了项目所需的库和全局参数设置。接着,对图像进行预处理并读取数据集。随后,构建并配置DenseNet模型,设置训练和验证流程。最后,通过测试阶段验证模型性能,并提供了完整的代码实现。本文不仅涵盖了技术细节,还提供了实用的操作指南,适合初学者和有经验的研究人员参考。 ... [详细]
  • 探索聚类分析中的K-Means与DBSCAN算法及其应用
    聚类分析是一种用于解决样本或特征分类问题的统计分析方法,也是数据挖掘领域的重要算法之一。本文主要探讨了K-Means和DBSCAN两种聚类算法的原理及其应用场景。K-Means算法通过迭代优化簇中心来实现数据点的划分,适用于球形分布的数据集;而DBSCAN算法则基于密度进行聚类,能够有效识别任意形状的簇,并且对噪声数据具有较好的鲁棒性。通过对这两种算法的对比分析,本文旨在为实际应用中选择合适的聚类方法提供参考。 ... [详细]
  • 应用链时代,详解 Avalanche 与 Cosmos 的差异 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 在拉斯维加斯举行的Interop 2011大会上,Bitcurrent的Alistair Croll发表了一场主题为“如何以云计算的视角进行思考”的演讲。该演讲深入探讨了传统IT思维与云计算思维之间的差异,并提出了在云计算环境下应具备的新思维方式。Croll强调了灵活性、可扩展性和成本效益等关键要素,以及如何通过这些要素来优化企业IT架构和运营。 ... [详细]
  • 通过使用CIFAR-10数据集,本文详细介绍了如何快速掌握Mixup数据增强技术,并展示了该方法在图像分类任务中的显著效果。实验结果表明,Mixup能够有效提高模型的泛化能力和分类精度,为图像识别领域的研究提供了有价值的参考。 ... [详细]
  • 本文探讨了基于点集估算图像区域的Alpha形状算法在Python中的应用。通过改进传统的Delaunay三角剖分方法,该算法能够生成更加灵活和精确的形状轮廓,避免了单纯使用Delaunay三角剖分时可能出现的过大三角形问题。这种“模糊Delaunay三角剖分”技术不仅提高了形状的准确性,还增强了对复杂图像区域的适应能力。 ... [详细]
  • 本文探讨了BERT模型在自然语言处理领域的应用与实践。详细介绍了Transformers库(曾用名pytorch-transformers和pytorch-pretrained-bert)的使用方法,涵盖了从模型加载到微调的各个环节。此外,还分析了BERT在文本分类、情感分析和命名实体识别等任务中的性能表现,并讨论了其在实际项目中的优势和局限性。 ... [详细]
author-avatar
NHHermit
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有