|预训练语言模型:还能走多远?( 五 )


基于这样的一个简单方式 , 我们就可以把文本生成和BERT这样的理解任务结合起来放到一个模型里面 。 可以看到无论是在生成 , 还是分类任务上都有非常不错的效果 , 和XLNet相比效果上相当 , 但更加简洁 。
获得一个好的预训练语言模型依赖于五个关键因素:即算力、数据、结构、任务、训练 。 华为诺亚发布了自己的预训练模型 , 叫作NEZHA 。
算力是非常重要的 , 因此我们也和华为芯片团队进行合作 , 来训练更大的模型;我们不是互联网公司 , 没有那么多的数据;模型结构方面 , 我们做了相对位置编码的创新;在训练任务方面 , 我们提出了概率掩码 , 取得了不错的效果 。 在CLUE总榜和小模型榜上排名第一 , 后来我们训练了NEZHA的英文版本 , 在SuperGLUE榜上仅次于T5模型 。
我们在工业界实验室除了攀登珠峰 , 也非常关注落地工作 。 如何将预训练模型用到我们的产品中?我们做了三个压缩工作TinyBERT、TernaryBERT和DynaBERT 。 除了压缩算法上的创新 , 我们还和诺亚AI使能团队合作进行更加底层的加速 。
预训练语言模型压缩加速 , 本质上可以类比为老师/学生的教学场景 。 老师如何教出好学生?有四个核心要素:老师、知识、方法和学生 , 也就是我们如何来抽取一些特征函数或者评价函数 , 让学生更好地模拟老师的行为 。
我们知道模型压缩在视觉领域已经被广泛研究 , 而NLP存在自己的问题 。 其中一个重要的差异是 , 除了压缩本身是一种知识迁移外 , 预训练模型包含了预训练和下游任务微调阶段 , 本身也是一种知识迁移 。 我们如何考虑这么多不同的知识迁移?如何在Transformer这种结构上来做更好的迁移?
|预训练语言模型:还能走多远?
本文插图

我们在蒸馏、量化和剪枝上面做了三个不同的压缩技术 , 分别是TinyBERT、TernaryBERT和DynaBERT 。
第一个工作是我们在去年年初的时候开始做的 , 当时的情况是大家觉得这个东西很热门 , 效果也很好 , 但是能否帮助到我们的产品是有疑问的 。
首先基于华为手机助手场景做了一个非常简单的任务 , 同时做短文本意图分类和关键内容抽取的任务 。 发现效果非常好 , 但是在终端和云端的CPU上运行无法满足产品的要求 。
我们提出了TinyBERT , 两步Transformer蒸馏的工作 。 在NLP领域DA也非常有用 , 是屡试不爽的一个技巧 。 不过当前我们的DA方法不够高效 , 最近也在进行这方面的改良 。 我们测了两种结构 , 一个是TinyBERT-4层 , 一个是6层 。 在6层上 , 我们看到平均值是79.4 , 几乎已经达到和老师差不多的一个效果 。 但是在4层上还是有2.5的差距 。 大家知道 , 一个瘦高的模型 , 其实比一个矮胖的模型效果上要更好 , 但是现实中很多产品不能用太多层 。
|预训练语言模型:还能走多远?
本文插图

第二个工作是我们从去年年底开始的 , 研究怎么来做BERT的量化 。 我们把蒸馏和量化进行了融合 , 用蒸馏来引导整个量化过程 。 这类想法比较自然 , 在其他领域也得到了验证 , 但是在预训练领域还是有很多自己的问题 。
|预训练语言模型:还能走多远?
本文插图

第三个工作DynaBERT是一个动态压缩的技术 , 我们希望能够一次训练 , 多端部署 。 实际中有很多不同的硬件 , 针对不同的平台需要适配不同大小的模型 。 我们在宽度和深度方面做了不同的伸缩 , 最终得到一个包含多个子网络的超网络 , 训练好之后 , 可以根据不同的应用场景抽取不同的子网络来满足我们生产的需求 。
如何做到使模型变小的情况下依旧保持良好的效果?针对这个问题 , 我们对attention模式做了可视化 , 发现小网络的中间层Attention模式实现了某种功能融合 。


推荐阅读