albert算法详解
Albert是谷歌在Bert基础上设计的一个精简模型,主要为了解决Bert参数过大、训练过慢的问题。
albert主要有三大改动:
一、Embedding参数因式分解
这里我们设定词的embedding size用E表示,隐藏层的大小用H表示,在Bert、XLNet、RoBERTa中E≡H的,即两者永远相等的。但是这种设置,无论从模型角度还是实用性角度考虑,都是欠优的,论文提到原因如下:
- 1.建模角度
(1)词嵌入训练是为了让模型学习到上下文无关的向量,也就是最后生成的向量不仅仅局限于某一片段的上下文语境中,而是能够从本质上代表本词的全局语境;
(2)而bert的隐藏层学习学出来的是上下文相关的向量,最终一层层学出来的词向量正是为了能够最大限度结合当前训练文本的语境,与当前文本片段语境越贴切越好。
所以,类似于bert这种预训练模型,可以将E和H分别设定更好,这样H可以设置的更大,能够包含更多的信息,甚至可以根据需要设置H>>E。albert中词embedding层设为了128,参数层不同版本设置不一样:base、large、xlarge、xxlarge:768、1024、2048、4096
- 2.实际角度
NLP中的字典大小V通常是非常大的,例如bert的V=30000,如果E≡H,增大H,那么词嵌入矩阵VxE也将变得非常大,将导致产生数十亿的参数,并且在反向传播中,更新的都是比较稀疏的值。
解决办法:所以,综合上述两点,Albert采用了一种因式分解的方法来降低参数量,通过把E和H分开设定,这样就把原来的VxH大矩阵变成两个小矩阵,参数量将从O(VxH)变成O(VxE+ExH),当H>>E的时候,参数削减更加明显。例如:V=30000,E=128,H=768,则原参数量VH=30000768=23,040,000,削减后VE+EH=30000128+128768=3,938,304,参数变成了原来的1/6。
二、跨层参数共享
Transformer中可以共享全连接层,也可以共享Attention层参数,但是albert选择共享了所有层,也就是12个encoder都用一样的参数,再次大幅减少参数量。论文中作者对比了输出向量在L2距离和相似度的计算,发现Bert的结果更加震荡,而Albert的结果比较稳定
三、NSP改为SOP(sentence-order prediction)
Bert使用的NSP损失,预测两个片段在原文中是否连续出现的二分类损失,但是最近的研究都表示NSP的作用不可靠,究其原因主要因为该任务缺乏难度。因为NSP其实就是同一主题的预测,相比连贯性预测更容易,而且可能与MLM任何存在学习重叠情况。
Albert提出一种的句间连贯性预测任务,称之为sentence-order prediction(SOP),正负样本表示如下:
正样本:与bert一样,两个连贯的语句
负样本:在原文中也是两个连贯的语句,但是顺序交换一下。
SOP因为正负样本都是在同一个文档中选的,只关注句子的顺序而不考虑主题方面的影响,所以这将迫使模型在话语层面学习更细粒度的区分。并且通过实验发现,SOP能解决NSP的问题,但是只学习NSP的模型却不能解决SOP的任务
参考文献:
1.https://yiyibooks.cn/yiyibooks/A_LITE_BERT_FOR_SELFSUPERVISED_LEARNING_OF_LANGUAGE_REPRESENTATIONS/index.html
2.https://www.cnblogs.com/gczr/p/12761962.html