查看原文
其他

【NLP】ALBERT:更轻更快的NLP预训练模型

小Dream哥 有三AI 2020-09-08

目前在NLP领域,出彩的预训练模型的新工作,几乎都是基于BERT的改进,前面我们就介绍了XLNET。今天我来介绍一个更新的工作,相比于BERT,它更轻量,效果也要好。


作者&编辑 | 小Dream哥

1 预训练模型进展

2018年底,BERT横空出世之后,预训练模型开始走进NLP舞台的中央,吸引了业内所有人的关注。之后,各种预训练模型开始不断的刷新NLP领域的SOTA榜单,比较有影响力的包括,GPT-2.0,XLNET,RoBERTa等。


大体来说,上述预训练模型确实都基于BERT了做了一些改进,在模型结构、训练模式等方面都有一些创新。但是大部分的预训练模型也有一个共通的“特点”,即模型相对“笨重”,预训练成本高。


ALBERT的作者就是基于这样的背景,提出ALBERT这个模型的。其试图解决大部分预训练模型训练成本高,参数量巨大的问题。

2  ALBERT的改进点

ALBERT为了减少模型参数主要有以下几点:

1.词嵌入参数因式分解;

2.隐藏层间参数共享

此外,为了提升模型性能,ALBERT提出了一种新的训练任务:

句子间顺序预测

下面我们详细介绍以下这几个改进点:


1)词嵌入参数因式分解


ALBERT的提出者认为,词向量只是记忆了相对少量的词语的信息,更多的语义和句法等信息时由隐藏层记忆的。因此,他们认为,词嵌入的维度可以不必与隐藏层的维度一致,可以通过降低词嵌入的维度的方式来减少参数量。假设词表的大小为V,词嵌入的维度为E,隐藏层的维度为H。


BERT的情况是,E=H;ALBERT的方案是,将E降低,在词嵌入和隐藏层之间加入一个project层,连接两个层。我们来分析一下,两种情况嵌入层的参数量。

1.BERT:ParameterNumBERT = E*V = H*V


通常情况下V很大,BERT中文模型V约为30000,BERT_base中H = 1024:

ParameterNumBERT=30000*1024 


2.ALBERT:ParameterNumAL = (V +H)*E

ALBERT中,E=128;H=1024:

ParameterNumAL=30000*128+128*1024


ParameterNumAL/ParameterNumAL =7.7


从上面的分析可以看出,通过嵌入层的参数因式分解,成功将嵌入层的参数缩小为原来的1/8。


2)隐藏层的参数共享

如上图所示,是BERT的结构示意图,BERT_base中,包含12层中间的隐藏层;BERT_large中,包含24层中间的隐藏层;各层之间的参数均不共享。


参数共享可以显著减少参数数量,参数共享可以分为全连接层、注意力层的参数共享;在ALBERT中,全连接层、注意力层的参数均是共享的,也就是ALBERT依然有多层的深度连接,但是各层之间的参数是一样的。很明显的,通过这种方式,ALBERT中隐藏层的参数量变为原来的1/12或者1/24。


3)句子间顺序预测


在BERT中,句子间关系的任务是next sentence predict(NSP),即向模型输入两个句子,预测第二个句子是不是第一个句子的下一句。


在ALBERT中,句子间关系的任务是sentence-order prediction(SOP),即句子间顺序预测,也就是给模型两个句子,让模型去预测两个句子的前后顺序。文中介绍,SOP是比NSP要更为复杂的任务,相比于NSP,通过SOP任务模型能够学到更多的句子间的语义关系。

3  ALBERT的效果

如上图所示,展示了ALBERT与BERT不同大小模型的参数量及其在各个数据集的效果。


从上面的结果,可以得到一个基本的结论,相比于BERT,ALBERT能够在不损失模型性能的情况下,显著的减少参数量。ALBERT_xxlarge模型有233M的参数量,其在各个数据集上的表现却能够全面优于有1270M参数的BERT_xlarge模型。


此外,作者还分别分析了嵌入层参数因式分解、隐藏层参数共享以及SOP任务对ALBERT模型性能的影响。作者的结论是,嵌入层参数因式分解、隐藏层参数共享基本不会对模型的性能造成损失,SOP任务能够提升模型的性能。


值得注意的一点是,作者还发现ALBERT在训练了100w步之后,模型依旧没有过拟合,于是作者尝试去掉dropout,却意外的发现下游任务的效果竟然有了一定的提升。这是NLP领域第一次发现dropout对大规模的预训练模型会造成负面影响。


此外,ALBERT还有一个albert_tiny模型,其隐藏层仅有4层,模型参数量约为1.8M,非常的轻便。相对于BERT,其训练和推理预测速度提升约10倍,但精度基本保留,语义相似度数据集LCQMC测试集上达到85.4%,相比bert_base仅下降1.5个点。

对于一些相对比较简单一些或实时性要求高的任务,如语义相似度计算、分类任务等,ALBERT很适合。

总结


总的来说,ALBERT利用词嵌入参数因式分解和隐藏层间参数共享两种手段,在显著减少了模型的参数量的同时,基本没有损失模型的性能;


隐藏层间参数共享能够极大的减少模型参数,对模型训练速度的提升也有一定的帮助。但是对推理预测速度却不会有任何帮助,因为前向传播时的计算量一点也没有减少。基于此,ALBERT的研究者们,提供了albert_tiny模型,提高了模型的推理速度,代价却很低(准确率降低很少)。


通过引进SOP的训练任务,模型的准确度也有一定的提升。


我们会在知识星球讨论ALBERT实现相关的代码及问题,感兴趣的同学可以扫描下面的二维码了解。


读者们可以留言,或者加入我们的NLP群进行讨论。感兴趣的同学可以微信搜索jen104,备注"加入有三AI NLP群"


下期预告:知识图谱概述

知识星球推荐

扫描上面的二维码,就可以加入我们的星球,助你成长为一名合格的自然语言处理算法工程师。


知识星球主要有以下内容:


(1) 聊天机器人。考虑到聊天机器人是一个非常复杂的NLP应用场景,几乎涵盖了所有的NLP任务及应用。所以小Dream哥计划以聊天机器人作为切入点,通过介绍聊天机器人的原理和实践,逐步系统的更新到大部分NLP的知识,会包括语义匹配,文本分类,意图识别,语义匹配命名实体识别、对话管理以及分词等。


(2) 知识图谱。知识图谱对于NLP各项任务效果好坏的重要性,就好比基础知识对于一个学生成绩好坏的重要性。他是NLP最重要的基础设施,目前各大公司都在着力打造知识图谱,作为一个NLP工程师,必须要熟悉和了解他。


(3) NLP预训练模型。基于海量数据,进行超大规模网络的无监督预训练。具体的任务再通过少量的样本进行Fine-Tune。这样模式是目前NLP领域最火热的模式,很有可能引领NLP进入一个全新发展高度。你怎么不深入的了解?


转载文章请后台联系

侵权必究

往期精选


Modified on

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存