1、ALbert
BERT不足:只把BERT的宽度增加到2倍(hidden Size 从1024增加到2048),发现参数已经达到了12亿7千万个,内存直接爆了。
Attention feed-forward block占总共参数的80%左右,Token embedding projection block占参数的20%左右。
ALBERT在同一任务时效果没BERT好的原因:可能是feed forward 层共享,效果会下降
ALBERT模型为了给BERT瘦身,让模型更大的BERT有算力能跑起来。作者通过权值共享和矩阵分解减少参数。
- 改进BERT:主要是不同层之间共享参数,以及用矩阵分解降低embedding的参数
- 降低了空间复杂度,但计算量并没有减少,所以在模型进行下游任务和预测的时候并不会更快。
所以作者说现在优化BERT的方法也是往时间复杂度的方向优化。
- Factorized Embedding Parameterization,矩阵分解降低embedding参数量。
- Cross-layer Parameter Sharing,不同层之间共享参数。
- Sentence Order Prediction(SOP),next sentence任务的负样本增强。
对BERT进行了三个改造
1)词嵌入向量参数的因式分解 Factorized embedding parameterization
O(V * H) to O(V * E + E * H)
V:词表大小;H:隐层维度;E:词向量维度
如以ALBert_xxlarge为例,V=30000, H=4096, E=128
那么原先参数为V * H= 30000 * 4096 = 1.23亿个参数,现在则为V * E + E * H = 30000*128+128*4096 = 384万 + 52万 = 436万,
词嵌入相关的参数变化前是变换后的28倍。
以 BERT-Base 为例
- 以 BERT-Base 为例,Base中的Hidden size 为768, 词表大小为3w,此时的参数量为:768 * 3w = 23040000。
- 如果将 Embedding 的维度改为 128,那么此时Embedding层的参数量为: 128 * 3w + 128 * 768 = 3938304。二者的差为19101696,大约为19M。
- 其实Embedding参数量从原来的23M变为了现在的4M,似乎变化特别大,然而当我们放到全局来看的话,BERT-Base的参数量在110M,降低19M也不能产生什么革命性的变化。
- 因此,可以说Embedding层的因式分解其实并不是降低参数量的主要手段。
先把第一次的映射放到很低的维度,然后在映射为我们需要的维度。这样做有两个好处:
- 词的Context independent表示与Context dependent表示之间解锁,可以自由的对Context dependent表示进行加高,也就是网络变宽。
- One-hot向量到第一次映射的参数非常多,可以把这块参数变的非常小。(BERT的One-hot向量输入,第一次投影是词与词之间是没有交互的。只有到了做Attention时,词与词之间才有交互。因此第一次投影不需要很高维度的向量。)
矩阵分解本质上就是一个低秩分解的操作,其通过对Embedding 部分降维来达到降低参数的作用。
- 在最初的BERT中,以Base为例,Embedding层的维度与隐层的维度一样都是768,
- 但是对于词的分布式表示,往往并不需要这么高的维度,比如在Word2Vec时代最多采用50或300这样的维度。
- 那么一个很简单的思想就是,通过将Embedding部分分解来达到降低参数量的作用
2)跨层参数共享 Cross-Layer Parameter Sharing
参数共享能显著减少参数。共享可以分为全连接层、注意力层的参数共享;注意力层的参数对效果的减弱影响小一点。
ALBERT提出的另一个减少参数量的方法就是层之间的参数共享,即多个层使用相同的参数。
参数共享有三种方式:只共享feed-forward network的参数、只共享attention的参数、共享全部参数。ALBERT默认是共享全部参数的。
可以理解为此时的权值共享并不是说12层transformer_encoder的值是一样的,只是占用了同一变量,所以模型的计算量并没有少,只是参数个数变成了原来的12分之一。
3)段落连续性任务 Inter-sentence coherence loss
使用段落连续性任务。正例,使用从一个文档中连续的两个文本段落;负例,使用从一个文档中连续的两个文本段落,但位置调换了。
避免使用原有的NSP任务,原有的任务包含隐含了预测主题这类过于简单的任务。
SOP 全称为 Sentence Order Prediction,其用来取代 NSP 在 BERT 中的作用,毕竟一些实验表示NSP非但没有作用,反而会对模型带来一些损害。
SOP的方式与NSP相似,其也是判断第二句话是不是第一句话的下一句,但对于负例来说,SOP并不从不相关的句子中生成,而是将原来连续的两句话翻转形成负例。
4)其他变化
1)去掉了dropout Remove dropout to enlarge capacity of model.
Further increase model capacity by removing dropout
最大的模型,训练了1百万步后,还是没有过拟合训练数据。说明模型的容量还可以更大,就移除了dropout
(dropout可以认为是随机的去掉网络中的一部分,同时使网络变小一些)
We also note that, even after training for 1M steps, our largest models still do not overfit to their training data.
As a result, we decide to remove dropout to further increase our model capacity.
其他型号的模型,在我们的实现中我们还是会保留原始的dropout的比例,防止模型对训练数据的过拟合。
2)为加快训练速度,使用LAMB做为优化器 Use LAMB as optimizer, to train with big batch size
使用了大的batch_size来训练(4096)。 LAMB优化器使得我们可以训练,特别大的批次batch_size,如高达6万。
3)使用n-gram(uni-gram,bi-gram, tri-gram)来做遮蔽语言模型 Use n-gram as make language model
即以不同的概率使用n-gram,uni-gram的概率最大,bi-gram其次,tri-gram概率最小。
本项目中目前使用的是在中文上做whole word mask,稍后会更新一下与n-gram mask的效果对比。n-gram从spanBERT中来。