最近看了一些和bert比较像的算法,做一个简单的梳理吧,本文在已经明白bert的基础上介绍有什么改进哈,没有单独介绍bert哦~

Tokenization

介绍算法前说说关于token的,很多算法其实也都是基于这方面进行改进。简单来说,Tokenization是按照特定需求,把文本切分成一个字符串序列(其元素一般称为token)的过程,这个token的粒度是不一定的,可以是字符、单词甚至是句子。通常情况下,在英文中,使用的是单词或者子词(这里可以学习下BPE),中文中使用字符。事实上,粗粒度和细粒度各有优劣:

  • 细粒度的token表意可能不完整、但是词表更小,能表示更多的token,表征更容易学习,OOV问题更少
  • 粗粒度的token语义更完整,但需要的词表更大,表征难以学习,可能有严重的OOV问题,并且依赖于分词是否正确。举个例子:表妹下周六十八岁生日,分词为 表妹/下周六/十八岁/生日 和 表妹/下周/六十八岁/生日,这差异就大了。

在应用中具体用哪个,建议先用最常规的,比如中文用字,有精力再尝试词和多粒度混合的,个人感觉直接用词的会有点不好把握。

Roberta

论文地址:https://arxiv.org/pdf/1907.11692.pdf
项目地址:https://github.com/brightmart/roberta_zh、 https://github.com/pytorch/fairseq

Dynamic Masking

Bert在预处理训练数据时,每个样本会进行一次随机的mask,后续的每个训练步都采用这次mask,实际上就是每个epoch是重复的,被称为静态mask。Roberta在预处理时没有进行mask,而是在每次向模型提供输入时进行随机mask,这意味着mask是变化的、动态的。论文中也进行了静态mask和动态mask的效果对比,来证明其改进有效。

Model Input Format and Next Sentence Prediction

Bert为了捕捉句子之间的关系,使用了NSP任务进行预训练。简单来说就是输入的句子对(A, B),判断这两个句子是否是连续的。其中50%为正例,即A、B来自同一文章,50%为负例,A、B来自不同文章。但是在bert后,很多论文质疑其必要性。本文中,RoBERTa去除了NSP任务,每次输入连续的多个句子,直到最大长度512,通过实验验证了这种方式在推断句子关系任务上效果更好。(FULL-SENTENCES的最大长度512可以跨越文章,DOC-SENTENCES全部来源于同一文章,不能跨越文档边界,可以从下表中看出这种方式效果最好。)

Training with large batches

这部分归纳一下就是,数据更多、算力更多、更大batch。

Text Encoding

Bert采用character-level的BPE,词表大小3w。而Robert采用byte-level的BPE,词表大小5w,细粒度的词表减少UNKOWN标记,解决OOV问题。

Deberta

论文地址:https://arxiv.org/pdf/2006.03654.pdf
项目地址:https://github.com/microsoft/DeBERTa

微软提出的Deberta主要是解决了两个重要问题:

  • 一组词的attention不仅取决于内容本身,还取决于其相对位置(感觉对中文可能更有效果),比如deep learning连在一起的依赖关系肯定要强于分开的时候。
  • 由于微调没有mask,导致的训练和微调时候的不匹配问题。

Disentangled attention

Bert的输入层中每个token的向量是word (content) embedding和位置embedding的总和,使用的是一个向量。但在Deberta中,每个token使用两个向量表示,分别对其内容和位置进行编码,而token之间的attention权重也是根据内容与相对位置使用解耦的矩阵进行计算。

Enhanced mask decoder

Deberta使用EMD代替了原本Bert中的softmax层预测遮盖的token。一般情况下,微调时bert的输出后会接一个特定任务的Decoder,但是训练时遮盖Decoder是没有的,所以文中在预训练时用一个两层的Transformer decoder和softmax作为Decoder,并且在decoder的softmax之前将单词的绝对位置嵌入

为什么要加入绝对位置?比如““a new store opened beside the new mall”中的store和mall,他们局部上下文相似,,但在句子中扮演着不同的角色,这种角色的不同很大程度上决定于绝对位置。

为什么在这里加入绝对位置?在bert中较早的引入绝对位置可能会伤害了模型,使其不能足够的学习相对位置。

Virtual Adversarial Training

提出了新的虚拟对抗训练模式,来针对PLMs(预训练模型Pre-trained Language Models)在NLP下游任务的fine-tune。在fine-tunning时,使用layer normalization, 先将embedding进行normalize, 再将扰动并进normalize之后的embedding。这里介绍的不是很全面,他们发现这样会大大提高fine-tunning的性能,之后会全面研究。

效果就不多赘述了,毕竟也是霸榜过GLUE榜一的,NLU上基本SOTA。这里介绍一下有趣的attention可视化:

可以看到,RoBERTa有更为明显的对角线效果,说明token会更加明显的关注自身,竖直条纹主要是因为高频词引起的,比如‘a’,‘the’这种。而Deberta的对角线效应并不非常明显,应该是EMD的作用,竖直条纹主要在第一列,说明[CLS]的主导性是可取的,证明我们后续下游任务选取[CLS]作为特征载体作为输入序列的上下文表示也是有效的。

Albert

论文地址:https://openreview.net/pdf?id=H1eA7AEtvS
项目地址:https://github.com/brightmart/albert_zh 、https://github.com/google-research/albert

albert总结两点:更小!更快!

Factorized embedding parameterization

在bert、xlnet、roberta中,词表的embedding size(E)和transformer层的隐层hidden size(H)基本是相同的,这主要有两方面的缺陷:

  • 理论上来说,存储了上下文信息的H应该要远大于只有词信息的E;
  • 实践上来说,NLP任务的词表一般较大,若E=H,那么参数量就容易大,embedding在训练中更新得比较稀疏。

因次,谷歌此次的Albert采用了较小一些的E,比如64、128、256等,训练了一个独立于上下文的embedding(V × E),之后计算时再投影到隐层空间上(乘一个E × H),这实际上是做了一次因式分解。通过embedding分解来达到降低参数量的作用,从公式上看,O(V × H) -> O(V × E + E × H)(V是词表维度,H是隐层维度,E是词向量维度)。在文章中,实验显示E的大小与实际效果并不完全正相关,因此其他实验的E都选择了128.

但是,这种因式分解实际上不是降低参数量的主要手段,我们来做一个计算:以bert-base为例,隐层维度H为768,词表大小V为3w,此时的参数量为768 × 3w = 2304w,假设我们将embedding做因式分解,那么此时的参数量为3w × 128 + 128 × 768 = 393.8304w。参数量节省大约为19M,而原本的bert-base参数量在110M,节省19M并不是什么革命性变化。

Cross-layer parameter sharing

其实bert和transformer的参数80%在Attention feed-forward block中。跨层参数共享就是不论12层还是24层的,都只有一个transformer,在之前的Universal Transformer和Deep Equilibrium Models就已经有了这种改进。参数共享有三种方式:只共享feed-forward、只共享attention、共享全部参数。Albert是全部参数共享的,可以认为12层的transformer encoder的每个参数实际上占用了对应的同一个变量。这实际上是降低参数量的主要手段。 作者还对比了每层输入输出的L2距离和相似度,发现bert结果较为震荡,Albert更稳定,认为Albert有稳定网络参数的作用。

Inter-sentence coherence loss

在Robert中就介绍了NSP任务可能是无用, albert的作者也重新审视了NSP,认为这个任务实际上不仅是句子之间关系的预测,还包含了主题预测,因为负例来自不同的文章,假设A来自于财经新闻,B来自于文学小说,那么模型会倾向于往主体关联性预测上靠拢。因此在Albert中,作者将NSP换成了SOP( Sentence-Order Prediction),其中AB不论正例还是负例都来自于同一篇文章,预测两句话A、B是否交换过顺序,实现显示新增的任务有1个点的提升。

Ambert

论文地址:https://arxiv.org/pdf/2008.11869.pdf
目前未开源~

字节的这个模型一句话概括就是:粗粒度和细粒度混合的bert。对于中文来说,Ambert将一句话分别切成粗粒度和细粒度两种序列,分别输入两个Encoder,且两个Encoder参数是共享的,相对于bert理论上不会有参数量的大幅度变化。

和开始说的tokenization的粗粒度细粒度考虑以下,凡是用到了粗粒度的都要考虑到分词的准确性,这种方式可能带来意想不到的收益,但是也可能效果并不好,要考虑到稳定性。

ZEN

来自创新工场的zen模型,本质上是N-gram增强的中文bert,训练中考虑到了不同的字符组合。
论文地址:https://arxiv.org/abs/1911.00720
项目地址:https://github.com/sinovation/ZEN

Wobert

来自追一科技的以词为基本单位的中文bert模型
项目地址:https://github.com/ZhuiyiTechnology/WoBERT

NEZHA

来自华为诺亚方舟实验室开发的中文bert
项目地址:https://github.com/huawei-noah/Pretrained-Language-Model/tree/master/NEZHA-TensorFlow

  • 相对位置编码:使用相对位置的正弦函数计算输出和attention的得分
  • 全词覆盖:wwm策略,当一个汉字被覆盖时,属于同一个汉字的其他汉字也被一起覆盖
  • 混合精度训练:传统的深度神经网络训练采用FP32,而混合精度在训练时主权重采用FP16,并使用FP16存储的权重、激活、梯度执行前向和后向传递,最后将梯度转换为FP32,用FP32梯度更新主权重。
  • 采用LAMB优化器:将bert训练时间从3天缩减为76分钟。

bert的兄弟姐妹梳理——Roberta、DeBerta、Albert、Ambert、Wobert等相关推荐

  1. 文本分类器,可自由加载BERT、Bert-wwm、Roberta、ALBert以及ERNIE1.0

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 基于谷歌开源的BERT编写的文本分类器(基于微调方式),可自由加载NLP领域知名的预训练语言模 ...

  2. 系统学习NLP(三十二)--BERT、XLNet、RoBERTa、ALBERT及知识蒸馏

    参考:https://zhuanlan.zhihu.com/p/84559048 一.BERT BERT是一种基于Transformer Encoder来构建的一种模型,它整个的架构其实是基于DAE( ...

  3. 算法面试之Roberta、Albert

    算法面试之Roberta.Albert Roberta 1.dynamic masking 2.No NSP and Input Format 3.Text Encoding Albert 1.词向量 ...

  4. 不要停止预训练实战-Roberta与Albert

    文章目录 前言 任务描述 任务数据集 实验设置 预训练数据生成 roberta的预训练数据处理 albert的预训练数据处理 预训练代码 模型结构 Roberta embedding_lookup e ...

  5. Bert RoBerta DistilBert ALBert 解读

    目录 1 Transformer结构 1.1 self attention的理解 1.2 Multi head理解 1.3 transformer基本单元构成 2 Bert 2.1 bert的输入三部 ...

  6. BERT的优秀变体:ALBERT论文图解介绍

    2020-06-15 09:22:09 作者:amitness 编译:ronghuaiyang 正文共: 3116 字 21 图 预计阅读时间: 9 分钟 导读 ALBERT作为BERT的一个变体,在 ...

  7. roberta与albert

    roberta 简介 RoBERTA,是BERT模型的改进版,并获得了更好的自然语言处理效果,且其在GLUE.SQuAD.RACE等三个榜单上取得了SOTA效果 细节 训练数据集上,RoBERTa采用 ...

  8. 知识蒸馏基础及Bert蒸馏模型

    为了提高模型准确率,我们习惯用复杂的模型(网络层次深.参数量大),甚至会选用多个模型集成的模型,这就导致我们需要大量的计算资源以及庞大的数据集去支撑这个"大"模型.但是,在部署服务 ...

  9. 蒸馏 (distill_Distill-BERT:使用BERT进行更智能的文本生成

    蒸馏 (distill The field of natural language processing is now in the age of large scale pretrained mod ...

最新文章

  1. getDeclaredField(x);与set方法的用法
  2. python做图像识别好还是c++好_OpenCV人脸检测(C++/Python)
  3. C# 调用SQL的存储过程的接口及实现
  4. 在Opendaylight中karaf启动的时候自动安装feature
  5. CTabControl使用(系统配置程序部分功能)
  6. echarts定时加载动画数据
  7. linux快照软件哪个好,Linux下的快照snapshot的实现
  8. c#抽象属性_C#中的抽象属性
  9. OPTEE的进程间通信(Inter-Process Communication, IPC)
  10. mysql where clause is ambiguous_mysql …in where clause is ambiguous
  11. MDK中编译报错 Error: L6218E: Undefined symbol SystemInit (referred from startup_cmsdk_cm0.o).
  12. 《月亮与六便士》的读后感作文3000字
  13. CTF Alice与Bob
  14. unity 打安卓包 华为手机图片被压扁
  15. stl文件用proe怎么打开_3dMax怎么导入proe的文件渲染?3dmax导入stl文件过程
  16. 大公司病,太TM形象了!
  17. 水压计算机控制系统原理图,水压试验机控制系统研究与开发
  18. 【毕业季·进击的技术er】一个读研学生的唠唠嗑
  19. vsftpd 配置文件详解
  20. sequelize 向数据库插入数据,自增id该如何添加

热门文章

  1. ECSHOP系统,数据库表名称、结构
  2. web3创业合伙人招募!!!
  3. 《Python数据科学入门》之数据库的使用(第4章)
  4. HNU程序设计-图书馆信息管理系统设计以及实验报告
  5. 2000-2009十年十大创业新模式
  6. sql——如何将html代码存入数据库中
  7. 进大厂就一定要考研吗?答案毫无疑问是否定的
  8. YOLOv2---优图代码+实现细节
  9. gpt4和gpt3.5对比有什么提升?
  10. 猎聘Q1营收毛利齐增,在线招聘的“春天”要来了么?