深入理解深度学习——BERT派生模型:BART(Bidirectional and Auto-Regressive Transformers)

分类目录:《深入理解深度学习》总目录


UniLM和XLNet都尝试在一定程度上融合BERT的双向编码思想,以及GPT的单向编码思想,同时兼具自编码的语义理解能力和自回归的文本生成能力。由脸书公司提出的BART(Bidirectional and Auto-Regressive Transformers)也是如此,它是一个兼顾上下文信息和自回归特性的模型。不同的是,UniLM和XLNet的模型结构与BERT基本一致,通过修改训练过程让模型具备了一定的文本生成能力,故模型的主要功能依然是语义理解。BART使用了传统的Transformer结构,不仅继承了BERT的语义理解能力,更展现了强大的序列到序列的文本生成能力。与BERT相比,其改进点如下:

  • 使用原始的Transformer Encoder-Decoder作为模型结构,区别于仅使用Transformer Encoder的BERT和仅使用Transformer Decoder的GPT。
  • 使用多样化的噪声干扰方式,让模型更注重文本的语义理解而不是结构化信息。

在进行语义理解时,BERT会获得一些额外的结构信息,如被掩码词的位置、序列的长度等,这些格式化的信息会让模型直接利用句式结构信息来辅助语义理解,即削弱模型在训练过程中获得的语义理解能力。BART通过引入自回归训练Decoder和多样化噪声,来降低模型对结构化信息的依赖,更注重对文本的理解。同时,在引入Decoder之后,其文本生成能力得到了极大增强。

算法细节

模型结构

BART使用了原始的Transformer Encoder-Decoder结构,具体模型结构和《深入理解深度学习——Transformer》系列文章中描述的基本一致,唯一的不同在于将激活函数从默认的ReLU改为GeLU。原始的Transformer被提出后用于机器翻译,由于其强大的语义提取能力,GPT将Transformer Decoder作为模型主结构,用于文本生成任务,BERT将Transformer Encoder作为模型主结构,用于文本理解任务。而BART将BERT与GPT合并,即直接使用原始的Transformer结构。三者的模型结构对比如下图所示,下图(a)为BERT的模型结构示意图,其模型结构主体使用双向编码器(Transformer Encoder),输入是带掩码的文本序列,输出是在掩码位置的词;下图(b)为GPT的模型结构示意图,其模型主体使用自回归解码器(Transformer Decoder),输入是正常的句子,输出是每个词的下一个词;下图©是BART的模型结构示意图,其模型主体同时使用双向编码器和自回归解码器(即完整的Transformer结构),输入是带掩码的文本序列,输出是在掩码位置填补预测词的完整序列。
在这里插入图片描述

噪声预训练

为了尽可能地减少模型对结构化信息的依赖,BART使用了5种不同的噪声方式进行训练,如下图所示。

BART使用的5种噪声方式示意图

  • Token Masking:与BERT一样,将个别词随机替换成[MASK],训练模型推断单个词的能力
  • Token Deletion:随机删除个别词,训练模型推断单个词及位置的能力。
  • Text Infilling:将一段连续的词随机替换成[MASK],甚至可以凭空添加[MASK],训练模型根据语义判断[MASK]包含的词及其长度。
  • Sentence Permutation:随机打乱文本序列的顺序,加强模型对词的关联性的提取能力。
  • Document Rotation:将文本序列连成圈,随机选择序列的起始词(保留序列的有序性,随机选择文本起始点),以此训练模型识别句首的能力。

值得注意的是,所有的噪声都添加在Encoder的输入文本上。

下游任务微调
  1. 序列分类任务:序列分类任务的微调改写与GPT的极为相似,即将输出序列最后一个词预测的token作为分类标签进行训练(序列的终止符一般为<EOS>),该终止符等效于BERT的分类标签[CLS],如下图所示:在这里插入图片描述

  2. 单词级别的分类和标注任务:直接将Decoder对应的每一个输出作为分类标签。如下图所示,对于由5个词 A B C D E ABCDE ABCDE组成的句子,在预训练过程中,若Decoder的输入为词 A A A,则训练目标为词 B B B。在单词分类(标注)任务的微调训练过程中,若Decoder的输入为词 A A A,则训练目标为词 A A A对应的类别标签。

  3. 序列到序列任务:由于BART的结构是传统的Transformer,故天然适合做序列到序列任务,不需要额外的改动。

综上所述,BART通过使用多样化的噪声干扰方式进行训练,在文本理解任务上达到与RoBERTa持平的效果,更通过引入Transformer Decoder结构,在多个生成式任务上达到SOTA效果,其模型体积仅比BERT大10%,算是性价比极高的模型。

参考文献:
[1] Lecun Y, Bengio Y, Hinton G. Deep learning[J]. Nature, 2015
[2] Aston Zhang, Zack C. Lipton, Mu Li, Alex J. Smola. Dive Into Deep Learning[J]. arXiv preprint arXiv:2106.11342, 2021.
[3] 车万翔, 崔一鸣, 郭江. 自然语言处理:基于预训练模型的方法[M]. 电子工业出版社, 2021.
[4] 邵浩, 刘一烽. 预训练语言模型[M]. 电子工业出版社, 2021.
[5] 何晗. 自然语言处理入门[M]. 人民邮电出版社, 2019
[6] Sudharsan Ravichandiran. BERT基础教程:Transformer大模型实战[M]. 人民邮电出版社, 2023
[7] 吴茂贵, 王红星. 深入浅出Embedding:原理解析与应用实战[M]. 机械工业出版社, 2021.

这些警告信息是关于一些 TensorFlow 函数和类的变化和更新的提示。我会逐个解释每个警告的含义: 1. "From E:\pycharm-workspace\BERT\BERT-BiLSTM-CRF-NER-master\bert_base\bert\modeling.py:359: calling dropout (from tensorflow.python.ops.nn_ops) with keep_prob is deprecated and will be removed in a future version. Instructions for updating: Please use rate instead of keep_prob. Rate should be set to rate = 1 - keep_prob." 这个警告表示在 "modeling.py" 文件的第 359 行中,使用了 `dropout` 函数,并传递了 `keep_prob` 参数。然而,将来的 TensorFlow 版本将移除 `keep_prob` 参数,并建议使用 `rate` 参数代替。`rate` 参数的计算方式为 `rate = 1 - keep_prob`。 你可以将代码中的 `keep_prob` 替换为 `rate` 来消除这个警告。 2. "From E:\pycharm-workspace\BERT\BERT-BiLSTM-CRF-NER-master\bert_base\bert\modeling.py:673: dense (from tensorflow.python.layers.core) is deprecated and will be removed in a future version. Instructions for updating: Use keras.layers.Dense instead." 这个警告表示在 "modeling.py" 文件的第 673 行中,使用了 `dense` 函数,但该函数已被废弃,并将在将来的 TensorFlow 版本中移除。建议使用 `keras.layers.Dense` 来代替。 你可以将代码中的 `dense` 替换为 `keras.layers.Dense` 来消除这个警告。 3. "From E:\pycharm-workspace\BERT\BERT-BiLSTM-CRF-NER-master\venv\lib\site-packages\tensorflow_core\python\layers\core.py:187: Layer.apply (from tensorflow.python.keras.engine.base_layer) is deprecated and will be removed in a future version. Instructions for updating: Please use layer.__call__ method instead." 这个警告表示在 "core.py" 文件的第 187 行中,使用了 `Layer.apply` 方法,但该方法已被废弃,并将在将来的 TensorFlow 版本中移除。建议使用 `layer.__call__` 方法来代替。 你可以将代码中的 `Layer.apply` 替换为 `layer.__call__` 来消除这个警告。 4. "From E:\pycharm-workspace\BERT\BERT-BiLSTM-CRF-NER-master\bert_base\bert\modeling.py:277: The name tf.erf is deprecated. Please use tf.math.erf instead." 这个警告表示在 "modeling.py" 文件的第 277 行中,使用了 `tf.erf` 函数,但该函数已被废弃。建议使用 `tf.math.erf` 函数来代替。 你可以将代码中的 `tf.erf` 替换为 `tf.math.erf` 来消除这个警告。 总之,这些警告信息是为了提醒你在代码中使用了已被废弃或即将被移除的 TensorFlow 函数和类。建议根据警告信息中的建议进行相应的更新,以保持代码的兼容性和稳定性。 如果你对这些警告信息有更多疑问或需要进一步帮助,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

von Neumann

您的赞赏是我创作最大的动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值