文章目录
原BERT缺点:
- 内存占用过高
- 功耗过高
- 延迟高
Bert 模型压缩对比表
论文 | 剪枝 | 低秩因式分解 | 知识蒸馏 | 参数共享 | 量化 | 预训练 | 微调 |
---|---|---|---|---|---|---|---|
ALBERT: A Lite Bert for self-supervisedLearning of Language Representations | 1 | 1 | 1 | ||||
Q-BERT: Hessian Based Ultra Low Precision Quantization of BERT | 1 | 1 | 1 | ||||
Extreme Language Model Compression withOptimal Subwords and Shared Projections | 1 | 1 | |||||
DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter | 1 | 1 | |||||
FastBERT: a Self-distilling BERT with Adaptive Inference Time | 1 | 1 | |||||
TinyBERT: Distilling BERT for Natural Language Understanding | 1 | 1 | 1 |
ALBERT
- 论文名称:ALBERT: A Lite Bert for self-supervisedLearning of Language Representations【低秩因式分解 + 跨层参数共享】
- 论文地址:https://openreview.net/forum?id=H1eA7AEtvS
- 论文源码:https://github.com/google-research/ALBERT
- 收录期刊:ICLR 2020 spotlight presentation收录
- 模型压缩方法:低秩因式分解 + 跨层参数共享
降低了参数量,并没有降低时间复杂度,用ALBERT进行预测的速度并没有加快。
Factorized embedding parameterization【低秩因式分解】
动机:Bert的参数量大部分集中于模型的隐藏层架构上,在嵌入层中只有30,000词块,其所占据的参数量只占据整个模型参数量的小部分;
方法:将输入层和输出层的权重矩阵分解为两个更小的参数矩阵;
我们知道BERT的embedding大小为词汇表的长度 V 乘以每个字或单词 embedding 隐藏层大小H,总参数量为:V×H。ALBERT通过参数E来分解这个embedding矩阵,让整体embedding参数变小, V × H = V × E + E × H V × H = V × E + E × H V×H=V×E+E×H,当 E 远远小于 H 的时候,模型所需的参数将大大减少。论文推荐E=128,效果较好。
举个例子:我们的中文BERT的词汇表大小大约为2万,参数量为20000×768 = 1536万 = 15M,用参数E拆解矩阵的话,参数量为20000×128 + 128×768=265.8304万 = 2M+
思路:在输入层和输出层使用嵌入大小远小于原生Bert的嵌入大小,再使用简单的映射矩阵使得输入层的输出或者最后一层隐藏层的输出可以通过映射矩阵输入到第一层的隐藏层或者输出层;
优点:在不显著增加词嵌入大小的情况下能够更容易增加隐藏层大小;
Cross-layer parameter sharing【跨层参数共享】
动机:隐藏层 参数 大小 一致;
方法:隐藏层中的每一层都使用相同的参数,用多种方式共享参数,例如只共享每层的前馈网络参数或者只共享每层的注意力子层参数。默认情况是共享每层的所有参数;
跨层参数共享就是ALBERT的重中之重了,因为他的存在减少了BERT模型的绝大部分的参数。跨层共享的机制非常简单,就是单独用一个Self-Attention层循环12次,每一层的参数都一样。这样子我们就用1层的参数量来表示12层的参数,为此,模型的参数当然大大降低了。
为什么这个机制能行?作者提到给BERT的每一层参数做了分析,发现每一层的参数基本相似,因此直接共享了。
优点:防止参数随着网络深度的增加而增大;
Sentence Order Prediction【句子顺序预测】
句子顺序预测损失(SOP)代替Bert中的下一句预测损失(NSP):
动机:通过实验证明,Bert中的下一句预测损失(NSP) 作用不大;
介绍:用预测两个句子是否连续出现在原文中替换为两个连续的句子是正序或是逆序,用于进一步提高下游任务的表现
很多BERT类的模型在预训练的过程中放弃了NSP任务,因为它不仅没给下游任务的效果带来提升,反而伤害了整体的性能。为此,ALBERT同样也放弃了NSP任务,改用了SOP任务作为预训练任务。SOP任务也很简单,它的正例和NSP任务一致(判断两句话是否有顺序关系),反例则是判断两句话是否为反序关系。
举个SOP例子:正例:1.朱元璋建立的明朝。2.朱元璋处决了蓝玉。反例:1.朱元璋处决了蓝玉。2.朱元璋建立的明朝。
优点:参数量上有所降低;
缺点:其加速指标仅展示了训练过程,由于ALBERT的隐藏层架构采用跨层参数共享策略并未减少训练过程的计算量,加速效果更多来源于低维的嵌入层;