欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 人工智能 > pytorch >内容正文

pytorch

[深度学习] 自然语言处理 --- ALBERT 介绍

发布时间:2023/12/15 pytorch 77 豆豆
生活随笔 收集整理的这篇文章主要介绍了 [深度学习] 自然语言处理 --- ALBERT 介绍 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

一、简介

随着Transfomer结构的普及,一时间大语料、大参数量的预训练模型成为主流。当在实际部署BERT等模型时,往往需要使用蒸馏、压缩或其他优化技术对模型进行处理。

ALBERT模型来自论文 Google 最近公布的论文 《ALBERT: A LITE BERT FOR SELF-SUPERVISED LEARNING OF LANGUAGE REPRESENTATIONS》从名字就可以看出 ALBERT 是 BERT 的“改进版”,其进步的地方,一言以蔽之,就是 用更少的参数,取得了更好的效果

github: https://github.com/google-research/ALBERT

ALBERT模型也是基于这一点考虑,通过各种手段减少参数量,得到一个占用较小的模型,对实际落地有较大的意义,不过由于其主要还是减少参数量,所以在推断时间上并没有优化,所有对量大的需求还是很有问题的。
 

总体来说,ALBERT有意义的创新主要有:

  • 修正了句子预测这一一直被诟病的预训练任务,改为了预测句子之间的连贯性;

  • 对Embedding进行因式分解;

  • 跨层的参数共享。

  • 模型大小与模型性能之间的关系

      这是作者开篇讨论的问题。近一两年,预训练语言模型给自然语言处理领域带来了巨大的突破。从 ELMO,GPT,到 Bert,XLNet 和 RoBerta,我们不难看出,性能越强的模型,参数量也越大。既然模型的参数量如此重要,我们就会有一个很直接的假设:参数量越大,模型的性能就会越高。

      先不考虑硬件资源和训练时间(还是要考虑,如此大的开销已经将很多参与者挤出门外了),如果上述假设成立,那么我们只需要想方设法地扩展模型规模就可以了。作者为验证假设,将 Bert-large 模型的隐藏层 size 扩展了一倍,构建了 Bert-xlarge模型。该模型的参数量较 Bert-large 提升了一倍,然而遗憾的是,如图1所示,Bert-xlarge 出现了模型退化(model degradation)现象,性能不升反降。因此,简单地推高参数量,不仅会面临更加严峻的硬件资源不足以及训练时间过长问题,且无法获得更好的效果的。

     

                                                              Bert-large 与 Bert-xlarge 对比图

      其实这也比较好理解,参数量越大性能越好,我认为这本身是没有正确的,但前提是对模型中参数的运用没有退化,或者说模型内单位参数所发挥的作用没有退化。举个例子,鲸鱼大脑的绝对体积和重量都要超过人类,但其大脑很大一部分精力用在控制其“臃肿”的体积上,而不是用来思考和记忆,因此远不如人类聪明。
      因此为了提升模型性能,我们既可以“做加法”,在模型结构合理有效的前提下,增大模型的规模(e.g. Bert --> Bert-large, Bert --> XLNet);也可以“做减法”,降低参数量,但提升参数的利用效率、更大地发挥参数的效果。本篇论文中所设计的 ALBERT,就是在“做减法”的基础上,在性能上全面超越 Bert。

    三  ALBERT的改进

    1. SOP任务

    BERT在提出的时候提供了两种预训练任务,一个是遮蔽语言模型,即以一定比例随机遮蔽一定比例的输入标记,然后预测那些被遮蔽的标记的预训练任务(PS:ALBERT也不是直接做这个任务,而是换成N-gram的预测任务),另一个则是预测第二个句子是不是第一个句子的下一句。但在随后的实践中,第二个任务被证明并没有给模型带来受益,主要由于这个任务过于简单。于是,在ALBERT中这个任务被换成了预测句子间的顺序,增加模型学会这种任务的能力:

    从实验上看,有所提升,但个人感觉这个预训练任务还是有待改进。

    2. Embedding因式分解

    这一步操作其实就是没啥特别好说的,无外乎就是觉得词嵌入时的向量维度应该小一点,然后通过个网络扩充一下提升维度,这样一通操作就可以把参数量从 O(V x H)   降到了   O(V x E  + E x H)

    (有点像深度可分离卷积的做法):

     

    论文实验结果

    从实验上看,使用这种方法降低了词向量维度,但没有损失太多的精度(相对来说吧),使用权值共享的策略时增加词向量不升反降(感觉有点神奇)。

    3. 跨层的参数共享

    共享权值不是什么新鲜的事情,之前一般采用只共享全连接层或只共享attention层,ALBERT则更直接全部共享,不过从实验结果看,全部共享的代价是可以接受的,同时共享权值带来了一定的训练难度,使得模型更鲁棒:

    ALBERT 在参数量上要远远小于 Bert。譬如,ALBERT-large 的参数量仅有 18M,仅为 Bert-large 的 1/18;将 Bert 的隐藏层扩展到 2048 维,参数量会飙升到 1.27G 且性能下降,而 H = 2048 的 ALBERT-xlarge 模型只有 59M 的参数,更大的模型 ALBERT-xxlarge(H=4096)参数量也仅有 233M。另外作者在 ALBERT-xxlarge 中设定了 12 层的网络,之所以不设置为 24 层,是因为通过实验作者验证了二者在性能上相近,而后者的计算成本更高。

    4. dropout的移除

    在ALBERT的实验中作者提到对掩码任务和下游任务取消dropout都带来了提升,这一点无疑非常值得去思考:

    掩码任务

    下游任务

    同时,作者也提到100w步之后,ALBERT依旧没有过拟合的迹象。

     

    四、ALBERT的实验结果

    最后作者又总结了一遍论文中提出的模型——ALBERT-xxlarge 的强大性能(使用了 Bert、XLNet 和 RoBERTa 的训练数据):在 13 项 NLP 任务上都取得了最佳,包括 GLUE 上的 9 个任务 和 SQuAD、RACE等 4 个数据集。

     

    简单一句话来说,就是小但强。仅从ALBERT本身来说其实是蛮让人失望的,因为并没有带来很多有营养的创新,同时由于其的小更多是共享权值带来的,这也就导致它并没有减少推断时的时间。但另一方面来说,ALBERT减少了占用,本身就给大规模部署带来优势,如果再结合上蒸馏等技术,占用小、速度快、精度高的Bert仿佛就在眼前。

    最近,谷歌开源了中文版本和Version 2

    ALBERT 2性能再次提升

    在这个版本中,“no dropout”“additional training data”“long training time”策略将应用到所有的模型。

    与初代ALBERT性能相比结果如下:

    从性能的比较来说,对于ALBERT-base、ALBERT-large和ALBERT-xlarge,v2版要比v1版好得多。

    说明采用上述三个策略的重要性。

    平均来看,ALBERT-xxlarge比v1略差一些,原因有以下2点:

    额外训练了1.5M步(两个模型的唯一区别就是训练1.5M和3M步)

    对于v1,在BERT、Roberta和XLnet给出的参数集中做了一点超参数搜索;对于v2,只是采用除RACE之外的V1参数,其中使用的学习率为1e-5和0 ALBERT DR。

     

    参考

  • 「NLP」ALBERT:更轻更快的NLP预训练模型
  • 一文揭开ALBERT的神秘面纱
  • albert_pytorch
  • ALBERT 论文:ALBERT: A LITE BERT FOR SELF-SUPERVISED LEARNING OF LANGUAGE REPRESENTATIONS

  •  

    总结

    以上是生活随笔为你收集整理的[深度学习] 自然语言处理 --- ALBERT 介绍的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。