BERT有很多改进版本,ALBERT是一个轻量化版本。ALBERT源自2020年的发表论文《ALBERT: A LITE BERT FOR SELF-SUPERVISED LEARNING OF LANGUAGE REPRESENTATIONS》,论文地址:https://arxiv.org/pdf/1909.11942.pdf。从题目可以看出,论文重点是轻量化BERT模型,以及优化了半监督学习,本文主要关注轻量化模型部分。

目前NLP的高级模型BERT、GPT-2都基于Pretrain/fine-tune模式,先使用无监督学习的海量文本预训练出一个带有“语言常识”的大模型,然后再根据具体任务调优,这就完美解决了具体任务训练集不足的问题。模型往往拥有千万或亿级的参数,目前的趋势是随着模型功能能越来越强大,模型的规模也越来越大,这使普通开发者越发无法企及。

随着BERT模型越来越频繁地被使用到真实场景中,模型的速度、规模、硬件逐渐成为瓶颈。预训练模型一般都规模庞大,在后期调优以及调用模型时也都需要花费大量的内存、算力和时间。ALBERT在基本保证模型质量的前提下把模型缩小到BERT-LARGE的1/18(18M/334M),训练提速1.7倍。

原理

ALBERT全称是 A Lite BERT,轻量级的BERT,它使用了两种技术来简化参数:

分解了词嵌入(Embedding)参数

从原理来看,词嵌入表示的是词含义与上下文无关,而隐藏层表示的是词之间的组合含义,句子越长它的信息量越丰富,后者更加复杂,也需要更多参数。如果词表V非常大(词多),需要V×E空间存储参数,如果保持词嵌入层大小E与隐藏词H的大小一致,当H变大时,VxE也跟着迅速变大。因此,论文作者将原来词嵌入层大小恒等于隐藏层大小:E≡H,改为:H>>E。这样就减少了参数,也可以支持未来使用更大的词表,比如对中文来说,词为单位比以字为单位效果更佳,但词量又比较大。 当前BERT、GPT-2模型的隐藏层大小动辄512、768维,而腾讯词向量200维就可以很好地描述800多万词条的词性。因此,论文作者将词过嵌入过程从原来的V->H分解成:先把词V映射到E(V->E),再由E映射到H(E->H),使其复杂度从O(V×H)降到了O(V×E+E×H),当E比H小很多时其优势尤为明显。

共享了交叉层(cross-layer)参数

ALBERT与BERT原理一样,都沿用了Transformer模型的方案,堆叠了多个Encoder层,BERT标准版12层,BERT-LARGE版24层来说。ALBERT共享了所有层的参数,使参数数据大幅减少。 论文作者对比了LARGE模型24层,每一层的输入与输出的L2距离以及cosine相似性,如下图所示。

可以看到,共享了参数之后ALBERT比BERT表现更加平滑稳定, 笔者个人认为:多层共享参数方法有点像RNN,BERT中每一层(layer)提取出不同层次的关系(有的在词法层,有的在词义层),由于参数足够多,存储在参数矩阵中的有效信息可能是稀疏的,因此将多层参数存储在一起,并没有产生严重的互相影响。

除了简化参数,ALBERT还在Next-sentence prediction (NSP)方面对BERT做了一些训练方法上的优化,不是本篇重点,有兴趣的读者请直接查看论文。 效果

下面列出了ALBERT与BERT的对比效果,最后两列分别是二者在多者任务中的平均分和速度对比。可以看到,其模型参数显著减少,而计算提度相对没有那么明显,这是由于模型由于共享了参数,而层数和对应层的计算量没变,只减小了Embedding的计算量。也可以从表中看到,简化后模型效果相对于BERT变化不大。文中还针对不同的共享方法,以及不同Embedding大小提供了大量实验数据,详见论文。

代码

TensorFlow实现(官方源码):
https://github.com/google-research/ALBERT

Pytorch实现(2.3.0以上版本支持ALBERT):
https://github.com/huggingface/transformers

中文版TensorFlow:
https://github.com/brightmart/albert_zh

中文模型:
https://storage.googleapis.com/albert_models/albert_base_zh.tar.gz

ALBERT用法与BERT基本一致。

posted on 2020-03-13 12:16  xieyan0811  阅读(120)  评论(0编辑  收藏  举报