自BERT出现之后,NLP领域取得了很大的进展,并且随着加大模型的容量,BERT模型的进度也在各个数据集上都有一些提升,但虽然提升模型的大小是能对下游任务的效果有一定的提升,但是如果进一步提升模型规模,势必会导致显存或者内存出现OOM1的问题,长时间的训练也可能是导致模型出现退化的情况。那么如何在大幅度减少模型参数的情况下,却几乎不影响bert模型精度呢?于是便有了————ALBERT
一、回顾bert的参数来源
bert是基于transformer实现的,我在此处截取了bert中transformer中的encoder端;transformer中的参数来源主要来源于下方(红色方框)的 token embedding projection block 和上方(蓝色方框)的attention-ffn block
Attention feed-forward block(80%):
- Parameter size O(L x H x H)
- L: layer size
- hidden size – needs to be large
Token embedding projection block(20%):
- Parameter size O(V x E)
- V: vocab size
- E: embedding size –often the same size as H
二、The method of ALBert
既然已经清楚了bert的主要参数来源,那么就来看一下这一篇论文里面减少模型参数具体的措施。
Method1:factorized embedding parametrization(矩阵因式分解)
前提分析
- Token embeddings are context independent
while hidden layer embeddings are context dependent.
- Token embeddings are sparsely updated.
这个idea的来源主要是基于两点:一个就是one-hot vector进行更新时,只会更新每个单词的one-hot vector对应的那个1相关的参数(也就是图中黑色的圆圈);
另外一点就是在进行one-hot embedding projection的过程中是没有单词之间的交互,只有到了后面的attention部分才有单词之间的interaction,因此基于以上两点,便有了下面的做法:
先讲单词的one-hot vector(V-dimension) 投影到一个低纬度(E),才从这个低纬度投影投影到模型所需要的纬度(H)
- 结果:O(VxH)➡️O(VxE+ExH),其中E<<H
- 实验结果:
可以从图中看到,E从768变为128以后,模型参数减少了17%,但是模型的精度只下降了0.6%
Method2:Cross-layer parameter sharing(跨层参数共享)
第二个方法很简单,也就是同时共享transformer模块里面的attention和ffn的参数
- 结果:O(LxHxH)➡️O(HxH)
- 实验结果:
可以看到,参数共享以后,模型的参数量减少了大概百分之七十,但是模型精度减少了不到百分之三。
Combing method 1 and method 2
论文里还展示了,两个方法同时结合起来的实验效果:
可以看到,结合两个方法以后,ALbert -xxlarge版本模型的宽度使Bert-large的四倍,但是参数量却只有其百分之七十,而且在五个数据集上的实验结果却高了3.5%。
Design better self-supervised learning tasks
除了上面两个减少模型参数的方法以外,论文中还设计了两个提高模型精度对方法(trick?)
第一个就是设计了一个新的预训练策略:
SOP:Sentence order prediction,摒弃了原来bert采取的NSP预训练策略,这两种方法的主要不同在于:SOP的负样本是把正样本的顺序进行颠倒,而不是如NSP是从另外一个document中采样第二句来作为负样本。
具体如图:
SOP
NSP
- 实验结果
Remove dropout
第二个方法就是移除了dropout
- 实验结果:
移除了dropout以后,作者们发现了两点:
- 第一就是模型的精度不降反升(这点很值得思考 why?????);
- 第二就是大大减少了模型在训练过程中对显存的使用量;
三、Summery
- 论文一共提出了两种减少模型参数的方法和两种提高模型精度的策略,对于实验的分析十分清楚,建议去看原文,或者去看ALbert作者Dc.Lan曾经对该论文的直播讲述(https://www.bilibili.com/vide...)
- 关于dropout 移除以后,模型的精度却有所提升,这一点我并没找到合理的解释??也欢迎大家留言😊;
- 就是albert其实并没有真正的提高模型的推理速度,貌似是因为矩阵因式分解很耗时间???或许是因为self-attention在整个transformer模型中所占用的时间很少?(1/10?)
- 模型未来可以与 model distillation与 sparse attention相结合来提高推理速度,这应该是一个不错的研究方向
最后就是:前段时间记性不好+有事耽误了,现在才想起来写博客,😂
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。