🕷️ Crawler Inspector

URL Lookup

Direct Parameter Lookup

Raw Queries and Responses

1. Shard Calculation

Query:
Response:
Calculated Shard: 98 (from laksa000)

2. Crawled Status Check

Query:
Response:

3. Robots.txt Check

Query:
Response:

4. Spam/Ban Check

Query:
Response:

5. Seen Status Check

ℹ️ Skipped - page is already crawled

📄
INDEXABLE
CRAWLED
2 hours ago
🤖
ROBOTS ALLOWED

Page Info Filters

FilterStatusConditionDetails
HTTP statusPASSdownload_http_code = 200HTTP 200
Age cutoffPASSdownload_stamp > now() - 6 MONTH0 months ago
History dropPASSisNull(history_drop_reason)No drop reason
Spam/banPASSfh_dont_index != 1 AND ml_spam_score = 0ml_spam_score=0
CanonicalPASSmeta_canonical IS NULL OR = '' OR = src_unparsedNot set

Page Details

PropertyValue
URLhttps://yam.gift/2020/06/13/Paper/2020-06-13-Bart/
Last Crawled2026-04-13 23:53:36 (2 hours ago)
First Indexed2020-06-29 23:11:28 (5 years ago)
HTTP Status Code200
Meta TitleBart 论文+代码笔记 | 长琴
Meta DescriptionAI | NLP | 人工智能 | 哲学 | 自然语言处理 | 机器学习, Paper:https://arxiv.org/pdf/1910.13461.pdf Code:https://github.com/pytorch/fairseq 核心思想:基于 Transformer Seq2Seq 架构适应各种不同的输入噪声。
Meta Canonicalnull
Boilerpipe Text
Paper: https://arxiv.org/pdf/1910.13461.pdf Code: https://github.com/pytorch/fairseq 核心思想:基于 Transformer Seq2Seq 架构适应各种不同的输入噪声。 What 动机和核心问题 MLM 的方法通常专注于特定类型的最终任务(例如跨度预测,生成等),从而限制了它们的适用性。BART 结合了双向和自回归的 Transformer(可以看成是 Bert + GPT2)。具体而言分为两步: 任意的加噪方法破坏文本 使用一个 Seq2Seq 模型重建文本 主要的优势是噪声灵活性,也就是更加容易适应各种噪声(转换)。BART 对文本生成精调特别有效,对理解任务也很有效。它还提供了一种精调的新思路,效果嘛,如果不好就不会有论文了。 模型和算法 架构就是 Seq2Seq 的 Transformer,相比 Bert 有以下不同: Decoder 的每一层增加对 Encoder 最后隐层的交叉注意力(类似 Luong Attention,也是最初的 Attention 机制) 没有使用 Bert 在预测词的那个额外的前馈网络(这里说的应该就是那个 Pooler) Bart 允许任意的噪声,极端情况(比如所有源信息都丢失)下其实是一种语言模型(和 GPT2 类似)。具体包括: Token 遮蔽:和 Bert 一样。 Token 删除:输入中随机删除 Token,模型必须确定哪些位置是被删除的。 文本填充:文本跨度长度从泊松分布(λ= 3)中得出,每个跨度替换为一个 [MASK] ,0 对应插入。这个灵感来自 SpanBert,不同的是,但是 SpanBERT 采样跨度来自不同(固定几何)分布的长度,并用长度完全相同的 [MASK] 序列替换每个跨度 。 文本填充可以指导模型预测 跨度中缺少多少个 Token 。 句子排列:文档被切分成句子,然后随机 shuffle。 文档旋转:随机均匀选择一个 Token,让文档从选中的 Token 开始,训练模型识别文档的开始。 以下代码我们参考 Transformer 中的实现。首先看配置: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 class BartConfig : def __init__ ( self, activation_dropout= 0.0 , activation_function= "gelu" , vocab_size= 50265 , d_model= 1024 , encoder_ffn_dim= 4096 , encoder_layers= 12 , encoder_attention_heads= 16 , decoder_ffn_dim= 4096 , decoder_layers= 12 , decoder_attention_heads= 16 , encoder_layerdrop= 0.0 , decoder_layerdrop= 0.0 , attention_dropout= 0.0 , dropout= 0.1 , max_position_embeddings= 1024 , init_std= 0.02 , classifier_dropout= 0.0 , output_past=False, num_labels= 3 , is_encoder_decoder=True, pad_token_id= 1 , bos_token_id= 0 , eos_token_id= 2 , **common_kwargs ) : pass 然后是模型: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 class BartModel : def __init__ (self, config: BartConfig) : super().__init__(config) self.output_attentions = config.output_attentions self.output_hidden_states = config.output_hidden_states padding_idx, vocab_size = config.pad_token_id, config.vocab_size self.shared = nn.Embedding(vocab_size, config.d_model, padding_idx) self.encoder = BartEncoder(config, self.shared) self.decoder = BartDecoder(config, self.shared) self.init_weights() def forward ( self, input_ids, attention_mask=None, decoder_input_ids=None, encoder_outputs=None, decoder_attention_mask=None, decoder_cached_states=None, generation_mode=False, ) : if not generation_mode: decoder_input_ids, decoder_padding_mask, causal_mask = _prepare_bart_decoder_inputs( self.config, input_ids, decoder_input_ids=decoder_input_ids, decoder_padding_mask=decoder_attention_mask, causal_mask_dtype=self.shared.weight.dtype, ) else : decoder_padding_mask, causal_mask = None , None assert decoder_input_ids is not None if encoder_outputs is None : encoder_outputs = self.encoder( input_ids=input_ids, attention_mask=attention_mask) assert isinstance(encoder_outputs, tuple) decoder_outputs = self.decoder( decoder_input_ids, encoder_outputs[ 0 ], attention_mask, decoder_padding_mask, decoder_causal_mask=causal_mask, decoder_cached_states=decoder_cached_states, generation_mode=generation_mode, ) decoder_outputs = _filter_out_falsey_values(decoder_outputs) assert isinstance(decoder_outputs[ 0 ], torch.Tensor) encoder_outputs = _filter_out_falsey_values(encoder_outputs) return decoder_outputs + encoder_outputs 除了 Encoder 和 Decoder 外,有个需要注意的是 generation_mode 参数,当它为 True 时为生成模式,此时不需要 Mask;当为 False 时,与 GPT2 一样,需要对 Padding 和未来时间的 Token 进行 Mask。举个例子: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 tokenizer.all_special_tokens tokenizer.all_special_ids input_ids = torch.LongTensor(([[ 0 , 38 , 654 , 47 , 2 , 1 , 1 ]])) _prepare_bart_decoder_inputs(config, input_ids) """ (tensor([[ 2, 0, 38, 654, 47, 2, 1]]), tensor([[False, False, False, False, False, False, True]]), tensor([[0., -inf, -inf, -inf, -inf, -inf, -inf], [0., 0., -inf, -inf, -inf, -inf, -inf], [0., 0., 0., -inf, -inf, -inf, -inf], [0., 0., 0., 0., -inf, -inf, -inf], [0., 0., 0., 0., 0., -inf, -inf], [0., 0., 0., 0., 0., 0., -inf], [0., 0., 0., 0., 0., 0., 0.]])) """ 这里的 decoder_input_ids 其实是 input_ids 的上一步,两个 Mask 一目了然。 接下来就是两个核心组件:Encoder 和 Decoder 了,首先看一下简化的结构(以 Base 为例): 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 BARTModel( (encoder): TransformerEncoder( (embed_tokens): Embedding( 51201 , 768 , padding_idx= 1 ) (embed_positions): LearnedPositionalEmbedding( 1026 , 768 , padding_idx= 1 ) (layers): ModuleList( ( 0 ): TransformerEncoderLayer( (self_attn): MultiheadAttention( (k_proj): Linear(in_features= 768 , out_features= 768 , bias= True ) (v_proj): Linear(in_features= 768 , out_features= 768 , bias= True ) (q_proj): Linear(in_features= 768 , out_features= 768 , bias= True ) (out_proj): Linear(in_features= 768 , out_features= 768 , bias= True ) ) (self_attn_layer_norm): LayerNorm(( 768 ,), eps= 1e-05 , elementwise_affine= True ) (fc1): Linear(in_features= 768 , out_features= 3072 , bias= True ) (fc2): Linear(in_features= 3072 , out_features= 768 , bias= True ) (final_layer_norm): LayerNorm(( 768 ,), eps= 1e-05 , elementwise_affine= True ) ) ... (total 6 layers) ) (layernorm_embedding): LayerNorm(( 768 ,), eps= 1e-05 , elementwise_affine= True ) ) (decoder): TransformerDecoder( (embed_tokens): Embedding( 51201 , 768 , padding_idx= 1 ) (embed_positions): LearnedPositionalEmbedding( 1026 , 768 , padding_idx= 1 ) (layernorm_embedding): LayerNorm(( 768 ,), eps= 1e-05 , elementwise_affine= True ) (layers): ModuleList( ( 0 ): TransformerDecoderLayer( (self_attn): MultiheadAttention( (k_proj): Linear(in_features= 768 , out_features= 768 , bias= True ) (v_proj): Linear(in_features= 768 , out_features= 768 , bias= True ) (q_proj): Linear(in_features= 768 , out_features= 768 , bias= True ) (out_proj): Linear(in_features= 768 , out_features= 768 , bias= True ) ) (self_attn_layer_norm): LayerNorm(( 768 ,), eps= 1e-05 , elementwise_affine= True ) (encoder_attn): MultiheadAttention( (k_proj): Linear(in_features= 768 , out_features= 768 , bias= True ) (v_proj): Linear(in_features= 768 , out_features= 768 , bias= True ) (q_proj): Linear(in_features= 768 , out_features= 768 , bias= True ) (out_proj): Linear(in_features= 768 , out_features= 768 , bias= True ) ) (encoder_attn_layer_norm): LayerNorm(( 768 ,), eps= 1e-05 , elementwise_affine= True ) (fc1): Linear(in_features= 768 , out_features= 3072 , bias= True ) (fc2): Linear(in_features= 3072 , out_features= 768 , bias= True ) (final_layer_norm): LayerNorm(( 768 ,), eps= 1e-05 , elementwise_affine= True ) ) ... (total 6 layers) ) (output_projection): Linear(in_features= 768 , out_features= 51201 , bias= False ) ) (classification_heads): ModuleDict() ) EncoderLayer 其实就是 Bert 的 EncoderLayer: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 class EncoderLayer (nn.Module) : def __init__ (self, config: BartConfig) : super().__init__() self.self_attn = SelfAttention( self.embed_dim, config.encoder_attention_heads, dropout=config.attention_dropout, ) self.fc1 = nn.Linear(self.embed_dim, config.encoder_ffn_dim) self.fc2 = nn.Linear(config.encoder_ffn_dim, self.embed_dim) def forward (self, x, encoder_padding_mask) : residual = x x, attn_weights = self.self_attn( query=x, key=x, key_padding_mask=encoder_padding_mask, need_weights=self.output_attentions ) x = F.dropout(x, p=self.dropout, training=self.training) x = residual + x x = LayerNorm(self.embed_dim)(x) residual = x x = self.fc1(x) x = F.gelu(x) x = F.dropout(x, p=self.activation_dropout, training=self.training) x = self.fc2(x) x = F.dropout(x, p=self.dropout, training=self.training) x = residual + x x = LayerNorm(self.embed_dim)(x) return x, attn_weights 对比了一下 Transformer Bert 的实现,唯一的不同就是激活函数后面多了一个 Dropout。大致还是可以分为三块:自注意力模块、中间模块和输出模块。 Decoder 部分是在 GPT2 的基础上增加了交叉 Attention,具体代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 class DecoderLayer (nn.Module) : def __init__ (self, config: BartConfig) : super().__init__() self.embed_dim = config.d_model self.output_attentions = config.output_attentions self.self_attn = SelfAttention( embed_dim=self.embed_dim, num_heads=config.decoder_attention_heads, dropout=config.attention_dropout, ) self.dropout = config.dropout self.activation_dropout = config.activation_dropout self.encoder_attn = SelfAttention( self.embed_dim, config.decoder_attention_heads, dropout=config.attention_dropout, encoder_decoder_attention= True , ) self.encoder_attn_layer_norm = LayerNorm(self.embed_dim) self.fc1 = nn.Linear(self.embed_dim, config.decoder_ffn_dim) self.fc2 = nn.Linear(config.decoder_ffn_dim, self.embed_dim) def forward ( self, x, encoder_hidden_states, encoder_attn_mask=None, layer_state=None, causal_mask=None, decoder_padding_mask=None, ) : residual = x if layer_state is None : layer_state = {} x, self_attn_weights = self.self_attn( query=x, key=x, layer_state=layer_state, key_padding_mask=decoder_padding_mask, attn_mask=causal_mask, need_weights=self.output_attentions, ) x = F.dropout(x, p=self.dropout, training=self.training) x = residual + x x = self.self_attn_layer_norm(x) residual = x assert self.encoder_attn.cache_key != self.self_attn.cache_key x, _ = self.encoder_attn( query=x, key=encoder_hidden_states, key_padding_mask=encoder_attn_mask, layer_state=layer_state, ) x = F.dropout(x, p=self.dropout, training=self.training) x = residual + x x = LayerNorm(self.embed_dim)(x) residual = x x = self.fc1(x) x = F.gelu(x) x = F.dropout(x, p=self.activation_dropout, training=self.training) x = self.fc2(x) x = F.dropout(x, p=self.dropout, training=self.training) x = residual + x x = LayerNorm(self.embed_dim)(x) return ( x, self_attn_weights, layer_state, ) 大部分读者应该已经非常熟悉 Transformer 了,SelfAttention 的 qkv 都是输入的 x,而 Cross-Attention 的 q 是输入的 x,但 k 和 v 就变成了 Encoder 的最后隐层。另外需要注意的是,与 Encoder 的 SelfAttention 相比,Decoder 的 SelfAttention 需要 Mask 当前 Token 后面的 Token。这也就是 Transformer 架构的三种 Attention 机制。具体可以参考 这里 。 特点和创新 提出了一种更加有效地预训练方法,就是把 Transformer 整体作为预训练的架构。 使用任意噪声的输入。 How 如何构造数据并训练 官方并未提供预训练说明和代码,GitHub 上有个 Issue 可以关注: BART pretraining instructions · Issue #1614 · pytorch/fairseq Transformer 也没提供: How to pre-train BART model · Issue #4151 · huggingface/transformers 不过根据另一个 Issue 提供的训练时长,一般人应该也不会自己训练吧: BART training time · Issue #1525 · pytorch/fairseq 想想也是,一个 Bert 或 GPT2 都不小了,这还两个,能不慢才怪。 如何使用结果 文章介绍了如何在多种下游任务中进行使用: 序列分类:相同的 input 喂入 Encoder 和 Decoder,Decoder 最后一个 Token(EOS)的 hidden state 喂入多分类线性分类器。和 Bert 不同,最后添加 EOS 作为句子关系的标记。 序列标注:将整个文档喂入 Encoder 和 Decoder,使用 Decoder 顶部隐藏状态作为每个单词的表示。 序列生成:Encoder 输入句子,Decoder 输出。 翻译(源→英文):通过添加从双向语料学习的新的 Encoder 参数集,可以整体作为预训练的 Decoder。具体而言就是把 Bart 的 Encoder 替换为随机初始化的一个 Encoder,新的 Encoder 要学习源语言 Token 到 Bart 能够去噪为英文的输入映射。训练源 Encoder 分两步,都从 BART 模型的输出反向传播交叉熵损失。 第一步,冻结大多数 BART 参数,仅更新随机初始化的源 Encoder:位置 Embedding 和 Encoder 第一层的自注意输入投影矩阵。 第二步,训练所有模型参数进行少量迭代。 具体可以参考官方提供的 Example,使用并不复杂: fairseq/examples/bart at master · pytorch/fairseq 另外,我们也可以参考 Transformer 使用,其实预训练模型使用都是类似的,它们的共同点就是对输入的 Token 返回一个隐层表示,不同的模型和任务对输入和输出后的控制略有差别。 数据和实验 Base 需要说明的是,作者这里对对比模型重新进行了训练,细节可以参考论文。 结论如下: 预训练方法的性能在各个任务中有很大不同 Token Mask 至关重要,旋转文档和句子 Shuffle 表现不佳 从左到右的预训练模型能提高文本生成能力 双向模型对于 SQuAD 至关重要 预训练目标并不是唯一重要的因素 纯语言模型在 ELI5 上表现最佳 除此之外,使用了文本填充的 Bart 表现很好 大模型 实验设置: Encoder 和 Decoder 各 12 层,hidden size 1024 batch size 8000,500000 steps 文本填充 + 句子排列,每个文档 Mask 30% Token,变换所有句子 最后 10% 的训练步不使用 dropout 数据集 160G,包括新闻、书籍、故事和网络文本 分类任务: 生成任务: 除了摘要外,在对话回复、QA 方面也取得了 state-of-the-art 结果。 翻译: Baseline 是 Transformer 架构。 整体而言,在理解+生成的任务上表现想当可观,比如文本摘要、对话回复。 Discussion 相关工作 GPT 是单向语言模型,ELMo 双向但是互相没有交互。 BERT 使用 MLM 构建双向语言模型,RoBERTa, ALBERT 和 SpanBert 对其进行了优化,因为不是自回归模型,所以在文本生成任务上效果一般。 UniLM 使用一组 MASK,有些只允许使用左边的上下文,所以可以同时用于生成和判别任务。与 Bart 不同的是 UniLM 在预测上是条件独立的,Bart 采用的是自回归。 BART 减少了预训练和生成任务之间的不匹配,因为 Decoder 始终在未损坏的上下文中进行训练。 MASS 与 Bart 最类似,连续跨度(span)的 Token 被遮盖的输入映射到被遮盖的 Token 序列。由于不相交的 Token 集喂入 Encoder 和 Decoder,MASS 在判别任务上表现一般。 XLNet 通过以排列自回归预测被屏蔽的 Token 来扩展 BERT。它允许预测以左右上下文为条件。 打开脑洞 乍一看貌似好像没啥创新点,就是用了 Transformer 的架构作为预训练方法,原因是因为能够同时顾及到 MLM 和从左到右的语言模型,可以看成是后 Bert 时代预训练方法的综合集成。不过稍微想一想就知道,这样的模型必然是巨大且相对复杂的;而且 MLM 和自回归语言模型之间是否有冗余也不甚明确,但效果从理论上预期肯定会比单纯使用一种方法好。也许正如作者所期望的那样,MLM 负责理解,Auto-Regressive LM 负责生成,所以在文本摘要和对话回复等任务上才有那么大的效果提升。唯一的问题可能还是太复杂了,一个 Bert 都让工业界大多数中小公司头大了,这 Bart 还怎么上。想想刚开始那阵美滋滋地上了一个基于 Bert 的模型,结果并发上不去(只有普通的 CPU 服务器),C++,Rust 怼上去都没用,最后还是只能回到 Tiny 版甚至 Lite 版,做各种压缩,现在还在坑里没出来。 论文的相关工作部分总结的不错,本来还想看一下 SpanBert,UniLM,MASS 的,搞得都没有欲望了。谁让论文这么多呢,2020 年都过了一半了还在补 2019 年的作业。至于如何在 Bart 上进一步提升,目前的感觉应该就是知识图谱了,毕竟预训练已经足够 general 的时候,领域知识就显得更加重要了;然后具体任务上可能要引入强化学习,即用某种规则去 “引导” AI,这类算法还包括遗传算法、PSO 粒子群算法、蚁群算法等。关于整体架构的思考,感兴趣的小伙伴可以查看 2018 年的这篇 文章 。 Appendix huggingface/transformers: 🤗Transformers: State-of-the-art Natural Language Processing for Pytorch and TensorFlow 2.0.
Markdown
# [长琴](https://yam.gift/ "长琴") ## [知乎:长琴 \| 公众号:技术与人](https://yam.gift/) 菜单 [跳至内容](https://yam.gift/#content "跳至内容") - [Home/首页](https://yam.gift/) - [Series/导览](https://yam.gift/series/) - [About/关于我](https://yam.gift/about/) - [Fun/有趣](https://yam.gift/fun/) - [BigHuge/大神](https://yam.gift/leading/) - [Projects/项目](https://github.com/hscspring) - [Archives/存档](https://yam.gift/archives/) # Bart 论文+代码笔记 Paper:<https://arxiv.org/pdf/1910.13461.pdf> Code:<https://github.com/pytorch/fairseq> 核心思想:基于 Transformer Seq2Seq 架构适应各种不同的输入噪声。 ## What ### 动机和核心问题 MLM 的方法通常专注于特定类型的最终任务(例如跨度预测,生成等),从而限制了它们的适用性。BART 结合了双向和自回归的 Transformer(可以看成是 Bert + GPT2)。具体而言分为两步: - 任意的加噪方法破坏文本 - 使用一个 Seq2Seq 模型重建文本 主要的优势是噪声灵活性,也就是更加容易适应各种噪声(转换)。BART 对文本生成精调特别有效,对理解任务也很有效。它还提供了一种精调的新思路,效果嘛,如果不好就不会有论文了。 ### 模型和算法 架构就是 Seq2Seq 的 Transformer,相比 Bert 有以下不同: - Decoder 的每一层增加对 Encoder 最后隐层的交叉注意力(类似 Luong Attention,也是最初的 Attention 机制) - 没有使用 Bert 在预测词的那个额外的前馈网络(这里说的应该就是那个 Pooler) ![](http://qnimg.lovevivian.cn/paper-bart-1.jpeg) Bart 允许任意的噪声,极端情况(比如所有源信息都丢失)下其实是一种语言模型(和 GPT2 类似)。具体包括: - Token 遮蔽:和 Bert 一样。 - Token 删除:输入中随机删除 Token,模型必须确定哪些位置是被删除的。 - 文本填充:文本跨度长度从泊松分布(λ= 3)中得出,每个跨度替换为一个 `[MASK]`,0 对应插入。这个灵感来自 SpanBert,不同的是,但是 SpanBERT 采样跨度来自不同(固定几何)分布的长度,并用长度完全相同的 `[MASK]` 序列替换每个跨度 。 文本填充可以指导模型预测**跨度中缺少多少个 Token**。 - 句子排列:文档被切分成句子,然后随机 shuffle。 - 文档旋转:随机均匀选择一个 Token,让文档从选中的 Token 开始,训练模型识别文档的开始。 ![](http://qnimg.lovevivian.cn/paper-bart-2.jpeg) 以下代码我们参考 Transformer 中的实现。首先看配置: 然后是模型: 除了 Encoder 和 Decoder 外,有个需要注意的是 `generation_mode` 参数,当它为 True 时为生成模式,此时不需要 Mask;当为 False 时,与 GPT2 一样,需要对 Padding 和未来时间的 Token 进行 Mask。举个例子: 这里的 `decoder_input_ids` 其实是 `input_ids` 的上一步,两个 Mask 一目了然。 接下来就是两个核心组件:Encoder 和 Decoder 了,首先看一下简化的结构(以 Base 为例): EncoderLayer 其实就是 Bert 的 EncoderLayer: 对比了一下 Transformer Bert 的实现,唯一的不同就是激活函数后面多了一个 Dropout。大致还是可以分为三块:自注意力模块、中间模块和输出模块。 Decoder 部分是在 GPT2 的基础上增加了交叉 Attention,具体代码如下: 大部分读者应该已经非常熟悉 Transformer 了,SelfAttention 的 qkv 都是输入的 x,而 Cross-Attention 的 q 是输入的 x,但 k 和 v 就变成了 Encoder 的最后隐层。另外需要注意的是,与 Encoder 的 SelfAttention 相比,Decoder 的 SelfAttention 需要 Mask 当前 Token 后面的 Token。这也就是 Transformer 架构的三种 Attention 机制。具体可以参考[这里](https://yam.gift/2020/04/23/Paper/2020-04-23-Transformer/)。 ### 特点和创新 - 提出了一种更加有效地预训练方法,就是把 Transformer 整体作为预训练的架构。 - 使用任意噪声的输入。 ## How ### 如何构造数据并训练 官方并未提供预训练说明和代码,GitHub 上有个 Issue 可以关注: - [BART pretraining instructions · Issue \#1614 · pytorch/fairseq](https://github.com/pytorch/fairseq/issues/1614) Transformer 也没提供: - [How to pre-train BART model · Issue \#4151 · huggingface/transformers](https://github.com/huggingface/transformers/issues/4151) 不过根据另一个 Issue 提供的训练时长,一般人应该也不会自己训练吧: - [BART training time · Issue \#1525 · pytorch/fairseq](https://github.com/pytorch/fairseq/issues/1525) 想想也是,一个 Bert 或 GPT2 都不小了,这还两个,能不慢才怪。 ### 如何使用结果 文章介绍了如何在多种下游任务中进行使用: - 序列分类:相同的 input 喂入 Encoder 和 Decoder,Decoder 最后一个 Token(EOS)的 hidden state 喂入多分类线性分类器。和 Bert 不同,最后添加 EOS 作为句子关系的标记。 - 序列标注:将整个文档喂入 Encoder 和 Decoder,使用 Decoder 顶部隐藏状态作为每个单词的表示。 - 序列生成:Encoder 输入句子,Decoder 输出。 - 翻译(源→英文):通过添加从双向语料学习的新的 Encoder 参数集,可以整体作为预训练的 Decoder。具体而言就是把 Bart 的 Encoder 替换为随机初始化的一个 Encoder,新的 Encoder 要学习源语言 Token 到 Bart 能够去噪为英文的输入映射。训练源 Encoder 分两步,都从 BART 模型的输出反向传播交叉熵损失。 - 第一步,冻结大多数 BART 参数,仅更新随机初始化的源 Encoder:位置 Embedding 和 Encoder 第一层的自注意输入投影矩阵。 - 第二步,训练所有模型参数进行少量迭代。 具体可以参考官方提供的 Example,使用并不复杂: - [fairseq/examples/bart at master · pytorch/fairseq](https://github.com/pytorch/fairseq/tree/master/examples/bart) 另外,我们也可以参考 Transformer 使用,其实预训练模型使用都是类似的,它们的共同点就是对输入的 Token 返回一个隐层表示,不同的模型和任务对输入和输出后的控制略有差别。 ### 数据和实验 **Base** 需要说明的是,作者这里对对比模型重新进行了训练,细节可以参考论文。 ![](http://qnimg.lovevivian.cn/paper-bart-3.jpeg) 结论如下: - 预训练方法的性能在各个任务中有很大不同 - Token Mask 至关重要,旋转文档和句子 Shuffle 表现不佳 - 从左到右的预训练模型能提高文本生成能力 - 双向模型对于 SQuAD 至关重要 - 预训练目标并不是唯一重要的因素 - 纯语言模型在 ELI5 上表现最佳 - 除此之外,使用了文本填充的 Bart 表现很好 **大模型** 实验设置: - Encoder 和 Decoder 各 12 层,hidden size 1024 - batch size 8000,500000 steps - 文本填充 + 句子排列,每个文档 Mask 30% Token,变换所有句子 - 最后 10% 的训练步不使用 dropout - 数据集 160G,包括新闻、书籍、故事和网络文本 分类任务: ![](http://qnimg.lovevivian.cn/paper-bart-4.jpeg) 生成任务: ![](http://qnimg.lovevivian.cn/paper-bart-5.jpeg) 除了摘要外,在对话回复、QA 方面也取得了 state-of-the-art 结果。 翻译: ![](http://qnimg.lovevivian.cn/paper-bart-6.jpeg) Baseline 是 Transformer 架构。 整体而言,在理解+生成的任务上表现想当可观,比如文本摘要、对话回复。 ## Discussion ### 相关工作 - GPT 是单向语言模型,ELMo 双向但是互相没有交互。 - BERT 使用 MLM 构建双向语言模型,RoBERTa, ALBERT 和 SpanBert 对其进行了优化,因为不是自回归模型,所以在文本生成任务上效果一般。 - UniLM 使用一组 MASK,有些只允许使用左边的上下文,所以可以同时用于生成和判别任务。与 Bart 不同的是 UniLM 在预测上是条件独立的,Bart 采用的是自回归。 BART 减少了预训练和生成任务之间的不匹配,因为 Decoder 始终在未损坏的上下文中进行训练。 - MASS 与 Bart 最类似,连续跨度(span)的 Token 被遮盖的输入映射到被遮盖的 Token 序列。由于不相交的 Token 集喂入 Encoder 和 Decoder,MASS 在判别任务上表现一般。 - XLNet 通过以排列自回归预测被屏蔽的 Token 来扩展 BERT。它允许预测以左右上下文为条件。 ### 打开脑洞 乍一看貌似好像没啥创新点,就是用了 Transformer 的架构作为预训练方法,原因是因为能够同时顾及到 MLM 和从左到右的语言模型,可以看成是后 Bert 时代预训练方法的综合集成。不过稍微想一想就知道,这样的模型必然是巨大且相对复杂的;而且 MLM 和自回归语言模型之间是否有冗余也不甚明确,但效果从理论上预期肯定会比单纯使用一种方法好。也许正如作者所期望的那样,MLM 负责理解,Auto-Regressive LM 负责生成,所以在文本摘要和对话回复等任务上才有那么大的效果提升。唯一的问题可能还是太复杂了,一个 Bert 都让工业界大多数中小公司头大了,这 Bart 还怎么上。想想刚开始那阵美滋滋地上了一个基于 Bert 的模型,结果并发上不去(只有普通的 CPU 服务器),C++,Rust 怼上去都没用,最后还是只能回到 Tiny 版甚至 Lite 版,做各种压缩,现在还在坑里没出来。 论文的相关工作部分总结的不错,本来还想看一下 SpanBert,UniLM,MASS 的,搞得都没有欲望了。谁让论文这么多呢,2020 年都过了一半了还在补 2019 年的作业。至于如何在 Bart 上进一步提升,目前的感觉应该就是知识图谱了,毕竟预训练已经足够 general 的时候,领域知识就显得更加重要了;然后具体任务上可能要引入强化学习,即用某种规则去 “引导” AI,这类算法还包括遗传算法、PSO 粒子群算法、蚁群算法等。关于整体架构的思考,感兴趣的小伙伴可以查看 2018 年的这篇[文章](https://yam.gift/2018/07/22/2018-07-22-NLP-and-AI/)。 ## Appendix - [huggingface/transformers: 🤗Transformers: State-of-the-art Natural Language Processing for Pytorch and TensorFlow 2.0.](https://github.com/huggingface/transformers) [2020-06-13](https://yam.gift/2020/06/13/Paper/2020-06-13-Bart/) • [Feeling](https://yam.gift/categories/Feeling/) • - [Bart](https://yam.gift/tags/Bart/) - [NLP](https://yam.gift/tags/NLP/) - [Transformer](https://yam.gift/tags/Transformer/) ### 文章导航 [← RoBERTa 论文+代码笔记](https://yam.gift/2020/06/25/Paper/2020-06-25-RoBERTa/) [中文分词系列一:思考分词 →](https://yam.gift/2020/05/13/NLP/2020-05-13-Segmentation-Thinking/) ### Categories - [Coding](https://yam.gift/categories/Coding/)77 - [Feeling](https://yam.gift/categories/Feeling/)158 - [Thinking](https://yam.gift/categories/Thinking/)61 ### Music ### Recents - [探寻实时学习新路径:挖掘极致高效的“子空间微调”](https://yam.gift/2026/04/11/NLP/LLM-Training/2026-04-11-Real-time-Learning-from-PEFT/) - [RL新范式:从经验到更高质量数据——我们不再训练模型,而是在制造数据](https://yam.gift/2026/03/29/NLP/LLM-Training/2026-03-29-RL-New-Paradigm-Data/) - [Training-Free RL:当“训练”不再更新参数,而是更新上下文](https://yam.gift/2026/03/24/NLP/LLM-Training/2026-03-24-RL-New-Paradigm-Traning-Free/) - [从 OpenClaw 再谈 AI Coding:我们还剩下什么](https://yam.gift/2026/03/13/AI/2026-03-13-From-OpencClaw-to-AI-Coding/) - [Roleplay AI 观察:从 C.AI 到 Talkie,产品、数据、模型与情感需求](https://yam.gift/2026/03/09/Product/2026-03-09-From-Cai-and-Talkie-to-Roleplay/) ### Tag Cloud [ACT](https://yam.gift/tags/ACT/) [AE](https://yam.gift/tags/AE/) [AGAPO](https://yam.gift/tags/AGAPO/) [AGI](https://yam.gift/tags/AGI/) [AI](https://yam.gift/tags/AI/) [AI-Coding](https://yam.gift/tags/AI-Coding/) [AIGC](https://yam.gift/tags/AIGC/) [ALBERT](https://yam.gift/tags/ALBERT/) [AR](https://yam.gift/tags/AR/) [AUC](https://yam.gift/tags/AUC/) [Accuracy](https://yam.gift/tags/Accuracy/) [Activation](https://yam.gift/tags/Activation/) [Activation Steering](https://yam.gift/tags/Activation-Steering/) [Adam](https://yam.gift/tags/Adam/) [Age](https://yam.gift/tags/Age/) [Agent](https://yam.gift/tags/Agent/) [Aha](https://yam.gift/tags/Aha/) [Algorithm](https://yam.gift/tags/Algorithm/) [Array](https://yam.gift/tags/Array/) [Arrow](https://yam.gift/tags/Arrow/) [Attention](https://yam.gift/tags/Attention/) [Automatic Speech Processing](https://yam.gift/tags/Automatic-Speech-Processing/) [Automation](https://yam.gift/tags/Automation/) [BERT](https://yam.gift/tags/BERT/) [BIO](https://yam.gift/tags/BIO/) [BIOHD](https://yam.gift/tags/BIOHD/) [BM25](https://yam.gift/tags/BM25/) [BPE](https://yam.gift/tags/BPE/) [BabyGrow](https://yam.gift/tags/BabyGrow/) [Backtracking](https://yam.gift/tags/Backtracking/) [Backward](https://yam.gift/tags/Backward/) [Bahdanau Attention](https://yam.gift/tags/Bahdanau-Attention/) [Bart](https://yam.gift/tags/Bart/) [Bayes](https://yam.gift/tags/Bayes/) [Beam Search](https://yam.gift/tags/Beam-Search/) [Bert-Flow](https://yam.gift/tags/Bert-Flow/) [Bi-LSTM](https://yam.gift/tags/Bi-LSTM/) [Biasing](https://yam.gift/tags/Biasing/) [BigCodec](https://yam.gift/tags/BigCodec/) [Binary Search](https://yam.gift/tags/Binary-Search/) [Blending](https://yam.gift/tags/Blending/) [Brain](https://yam.gift/tags/Brain/) [Brain Decoding](https://yam.gift/tags/Brain-Decoding/) [Bridge](https://yam.gift/tags/Bridge/) [Business](https://yam.gift/tags/Business/) [C](https://yam.gift/tags/C/) [C.AI](https://yam.gift/tags/C-AI/) [C4](https://yam.gift/tags/C4/) [CARD](https://yam.gift/tags/CARD/) [CCG](https://yam.gift/tags/CCG/) [CE BERT](https://yam.gift/tags/CE-BERT/) [CFG](https://yam.gift/tags/CFG/) [CISPO](https://yam.gift/tags/CISPO/) [CKY](https://yam.gift/tags/CKY/) [CNN](https://yam.gift/tags/CNN/) [CRF](https://yam.gift/tags/CRF/) [CRL](https://yam.gift/tags/CRL/) [CS](https://yam.gift/tags/CS/) [CYK](https://yam.gift/tags/CYK/) [Calculus](https://yam.gift/tags/Calculus/) [Camera](https://yam.gift/tags/Camera/) [Cascades](https://yam.gift/tags/Cascades/) [Catalan](https://yam.gift/tags/Catalan/) [ChatBot](https://yam.gift/tags/ChatBot/) [ChatGPT](https://yam.gift/tags/ChatGPT/) [Chi2](https://yam.gift/tags/Chi2/) [Chunking](https://yam.gift/tags/Chunking/) [Class Imbalance Loss](https://yam.gift/tags/Class-Imbalance-Loss/) [Classification](https://yam.gift/tags/Classification/) [Clip](https://yam.gift/tags/Clip/) [CoT](https://yam.gift/tags/CoT/) [Codec](https://yam.gift/tags/Codec/) [Cognition](https://yam.gift/tags/Cognition/) [Collaborative Filtering](https://yam.gift/tags/Collaborative-Filtering/) [Collins Parser](https://yam.gift/tags/Collins-Parser/) [CompoundEngineering](https://yam.gift/tags/CompoundEngineering/) [Computational Linguistics](https://yam.gift/tags/Computational-Linguistics/) [Computer](https://yam.gift/tags/Computer/) [Computer Science](https://yam.gift/tags/Computer-Science/) [Confusing Labels](https://yam.gift/tags/Confusing-Labels/) [Context Engineering](https://yam.gift/tags/Context-Engineering/) [Context Learning](https://yam.gift/tags/Context-Learning/) [Context-Free Grammars](https://yam.gift/tags/Context-Free-Grammars/) [Continual Pre-training](https://yam.gift/tags/Continual-Pre-training/) [Continual Pretraining](https://yam.gift/tags/Continual-Pretraining/) [Contrastive-Learning](https://yam.gift/tags/Contrastive-Learning/) [Coordinate Ascent](https://yam.gift/tags/Coordinate-Ascent/) [Cosine](https://yam.gift/tags/Cosine/) [Cosine Similarity](https://yam.gift/tags/Cosine-Similarity/) [Cross Entropy](https://yam.gift/tags/Cross-Entropy/) [Cross-brackets](https://yam.gift/tags/Cross-brackets/) [Cross-view](https://yam.gift/tags/Cross-view/) [Ctrl](https://yam.gift/tags/Ctrl/) [Culture](https://yam.gift/tags/Culture/) [DA](https://yam.gift/tags/DA/) [DAC](https://yam.gift/tags/DAC/) [DAPO](https://yam.gift/tags/DAPO/) [DB](https://yam.gift/tags/DB/) [DCPO](https://yam.gift/tags/DCPO/) [DELTA](https://yam.gift/tags/DELTA/) [DLM](https://yam.gift/tags/DLM/) [DNN](https://yam.gift/tags/DNN/) [DP](https://yam.gift/tags/DP/) [DPO](https://yam.gift/tags/DPO/) [Darling](https://yam.gift/tags/Darling/) [Data Augmentation](https://yam.gift/tags/Data-Augmentation/) [Data Clearing](https://yam.gift/tags/Data-Clearing/) [Data Enhancement](https://yam.gift/tags/Data-Enhancement/) [Data Preprocess](https://yam.gift/tags/Data-Preprocess/) [Data Science](https://yam.gift/tags/Data-Science/) [Data Structure](https://yam.gift/tags/Data-Structure/) [DataManagement](https://yam.gift/tags/DataManagement/) [Database](https://yam.gift/tags/Database/) [DeBERTa](https://yam.gift/tags/DeBERTa/) [Debiasing](https://yam.gift/tags/Debiasing/) [Decoder](https://yam.gift/tags/Decoder/) [Decoding](https://yam.gift/tags/Decoding/) [Deep](https://yam.gift/tags/Deep/) [DeepGen](https://yam.gift/tags/DeepGen/) [DeepGraph](https://yam.gift/tags/DeepGraph/) [DeepLearning](https://yam.gift/tags/DeepLearning/) [DeepScaleR](https://yam.gift/tags/DeepScaleR/) [DeepSeek](https://yam.gift/tags/DeepSeek/) [DeepSeek-GRM](https://yam.gift/tags/DeepSeek-GRM/) [DeepSeek-V3.2](https://yam.gift/tags/DeepSeek-V3-2/) [DeepSeekMath-V2](https://yam.gift/tags/DeepSeekMath-V2/) [DeltaNet](https://yam.gift/tags/DeltaNet/) [Dependence](https://yam.gift/tags/Dependence/) [Diary](https://yam.gift/tags/Diary/) [Disentangled Attention](https://yam.gift/tags/Disentangled-Attention/) [DistilBERT](https://yam.gift/tags/DistilBERT/) [Distillation](https://yam.gift/tags/Distillation/) [Django](https://yam.gift/tags/Django/) [Docker](https://yam.gift/tags/Docker/) [Docker-Compose](https://yam.gift/tags/Docker-Compose/) [Dockerfile](https://yam.gift/tags/Dockerfile/) [Dr GRPO](https://yam.gift/tags/Dr-GRPO/) [DrDAPO](https://yam.gift/tags/DrDAPO/) [DrGRPO](https://yam.gift/tags/DrGRPO/) [Dream](https://yam.gift/tags/Dream/) [Dropout](https://yam.gift/tags/Dropout/) [Dynamic-Mask](https://yam.gift/tags/Dynamic-Mask/) [EDA](https://yam.gift/tags/EDA/) [EM](https://yam.gift/tags/EM/) [EMD](https://yam.gift/tags/EMD/) [EMPO](https://yam.gift/tags/EMPO/) [ERL](https://yam.gift/tags/ERL/) [ERNIE](https://yam.gift/tags/ERNIE/) [ETTRL](https://yam.gift/tags/ETTRL/) [EVOL-RL](https://yam.gift/tags/EVOL-RL/) [EXAONE](https://yam.gift/tags/EXAONE/) [Economics](https://yam.gift/tags/Economics/) [Edit Distance](https://yam.gift/tags/Edit-Distance/) [Efficient-DeepLearning](https://yam.gift/tags/Efficient-DeepLearning/) [Elasticsearch](https://yam.gift/tags/Elasticsearch/) [Electra](https://yam.gift/tags/Electra/) [Elixir](https://yam.gift/tags/Elixir/) [Ellipsis](https://yam.gift/tags/Ellipsis/) [Embedding](https://yam.gift/tags/Embedding/) [Embeddings](https://yam.gift/tags/Embeddings/) [Embodied AI](https://yam.gift/tags/Embodied-AI/) [Encoder](https://yam.gift/tags/Encoder/) [Entropy](https://yam.gift/tags/Entropy/) [Evaluation](https://yam.gift/tags/Evaluation/) [Eventlet](https://yam.gift/tags/Eventlet/) [ExT5](https://yam.gift/tags/ExT5/) [Exam](https://yam.gift/tags/Exam/) [F1](https://yam.gift/tags/F1/) [FD Leak](https://yam.gift/tags/FD-Leak/) [FDW](https://yam.gift/tags/FDW/) [FLAN](https://yam.gift/tags/FLAN/) [FSM](https://yam.gift/tags/FSM/) [Faith](https://yam.gift/tags/Faith/) [FastCuRL](https://yam.gift/tags/FastCuRL/) [Feature Engineering](https://yam.gift/tags/Feature-Engineering/) [Feature-based](https://yam.gift/tags/Feature-based/) [Few-Shot](https://yam.gift/tags/Few-Shot/) [Few-shot Prompting](https://yam.gift/tags/Few-shot-Prompting/) [Fine-tuning](https://yam.gift/tags/Fine-tuning/) [Flash-Attention](https://yam.gift/tags/Flash-Attention/) [Formal Grammars](https://yam.gift/tags/Formal-Grammars/) [Forward](https://yam.gift/tags/Forward/) [Full-Text-Search](https://yam.gift/tags/Full-Text-Search/) [Function Syntax](https://yam.gift/tags/Function-Syntax/) [Funk MF](https://yam.gift/tags/Funk-MF/) [Funnel Transformer](https://yam.gift/tags/Funnel-Transformer/) [Future](https://yam.gift/tags/Future/) [GAE](https://yam.gift/tags/GAE/) [GBTD](https://yam.gift/tags/GBTD/) [GELU](https://yam.gift/tags/GELU/) [GLU](https://yam.gift/tags/GLU/) [GMPO](https://yam.gift/tags/GMPO/) [GP](https://yam.gift/tags/GP/) [GPT-1](https://yam.gift/tags/GPT-1/) [GPT-2](https://yam.gift/tags/GPT-2/) [GPT-3](https://yam.gift/tags/GPT-3/) [GPT3](https://yam.gift/tags/GPT3/) [GPU](https://yam.gift/tags/GPU/) [GRM](https://yam.gift/tags/GRM/) [GRPO](https://yam.gift/tags/GRPO/) [GRU](https://yam.gift/tags/GRU/) [GSG](https://yam.gift/tags/GSG/) [GSPO](https://yam.gift/tags/GSPO/) [GTPO](https://yam.gift/tags/GTPO/) [GTPO-S](https://yam.gift/tags/GTPO-S/) [Gan](https://yam.gift/tags/Gan/) [Garden-path](https://yam.gift/tags/Garden-path/) [Gated DeltaNet](https://yam.gift/tags/Gated-DeltaNet/) [GiGPO](https://yam.gift/tags/GiGPO/) [Git](https://yam.gift/tags/Git/) [Global Pointer](https://yam.gift/tags/Global-Pointer/) [Glow](https://yam.gift/tags/Glow/) [Graceful Shutdown](https://yam.gift/tags/Graceful-Shutdown/) [Gradient Descent](https://yam.gift/tags/Gradient-Descent/) [Graph](https://yam.gift/tags/Graph/) [GraphQL](https://yam.gift/tags/GraphQL/) [Grid Grammar](https://yam.gift/tags/Grid-Grammar/) [Growth](https://yam.gift/tags/Growth/) [H2O-Danube](https://yam.gift/tags/H2O-Danube/) [HMM](https://yam.gift/tags/HMM/) [Hard-SVM](https://yam.gift/tags/Hard-SVM/) [Hinge Loss](https://yam.gift/tags/Hinge-Loss/) [Hope](https://yam.gift/tags/Hope/) [Host-only](https://yam.gift/tags/Host-only/) [HuggingLLM](https://yam.gift/tags/HuggingLLM/) [Human-in-Loop](https://yam.gift/tags/Human-in-Loop/) [Human-in-the-Loop](https://yam.gift/tags/Human-in-the-Loop/) [IDE](https://yam.gift/tags/IDE/) [IE](https://yam.gift/tags/IE/) [IQR](https://yam.gift/tags/IQR/) [IcePop](https://yam.gift/tags/IcePop/) [Imbalance Data](https://yam.gift/tags/Imbalance-Data/) [Impossible-Triangle](https://yam.gift/tags/Impossible-Triangle/) [In-Context Learning](https://yam.gift/tags/In-Context-Learning/) [Industry](https://yam.gift/tags/Industry/) [Inference Scaling](https://yam.gift/tags/Inference-Scaling/) [Information Extraction](https://yam.gift/tags/Information-Extraction/) [Information Theory](https://yam.gift/tags/Information-Theory/) [Instruct](https://yam.gift/tags/Instruct/) [InstructGPT](https://yam.gift/tags/InstructGPT/) [Instruction Following](https://yam.gift/tags/Instruction-Following/) [Instruction Inference](https://yam.gift/tags/Instruction-Inference/) [Intuitor](https://yam.gift/tags/Intuitor/) [Isolation Forest](https://yam.gift/tags/Isolation-Forest/) [ItemCF](https://yam.gift/tags/ItemCF/) [Jaccard](https://yam.gift/tags/Jaccard/) [Java](https://yam.gift/tags/Java/) [Jax](https://yam.gift/tags/Jax/) [Job](https://yam.gift/tags/Job/) [Jupyter](https://yam.gift/tags/Jupyter/) [JustGRPO](https://yam.gift/tags/JustGRPO/) [K2](https://yam.gift/tags/K2/) [KAT](https://yam.gift/tags/KAT/) [KKT](https://yam.gift/tags/KKT/) [KL](https://yam.gift/tags/KL/) [KS](https://yam.gift/tags/KS/) [Kernel](https://yam.gift/tags/Kernel/) [Kernel Function](https://yam.gift/tags/Kernel-Function/) [Kernel Method](https://yam.gift/tags/Kernel-Method/) [Keyword](https://yam.gift/tags/Keyword/) [Kimi](https://yam.gift/tags/Kimi/) [Knowledge Graph](https://yam.gift/tags/Knowledge-Graph/) [L1](https://yam.gift/tags/L1/) [LCPO](https://yam.gift/tags/LCPO/) [LIMD](https://yam.gift/tags/LIMD/) [LIMO](https://yam.gift/tags/LIMO/) [LIMR](https://yam.gift/tags/LIMR/) [LLM](https://yam.gift/tags/LLM/) [LLM-Colosseum](https://yam.gift/tags/LLM-Colosseum/) [LLaDA](https://yam.gift/tags/LLaDA/) [LM](https://yam.gift/tags/LM/) [LOF](https://yam.gift/tags/LOF/) [LR](https://yam.gift/tags/LR/) [LSTM](https://yam.gift/tags/LSTM/) [Labeling](https://yam.gift/tags/Labeling/) [Language Model](https://yam.gift/tags/Language-Model/) [LayerNorm](https://yam.gift/tags/LayerNorm/) [Lexical Semantics](https://yam.gift/tags/Lexical-Semantics/) [Lexicalism](https://yam.gift/tags/Lexicalism/) [Lexicalized CFG](https://yam.gift/tags/Lexicalized-CFG/) [Lexicalized Grammars](https://yam.gift/tags/Lexicalized-Grammars/) [Life](https://yam.gift/tags/Life/) [Linear Algebra](https://yam.gift/tags/Linear-Algebra/) [Linear Sturcture](https://yam.gift/tags/Linear-Sturcture/) [Linked List](https://yam.gift/tags/Linked-List/) [LinkedList](https://yam.gift/tags/LinkedList/) [Linux](https://yam.gift/tags/Linux/) [Listen](https://yam.gift/tags/Listen/) [Llama](https://yam.gift/tags/Llama/) [LoRA](https://yam.gift/tags/LoRA/) [LoRA-XS Real-time Learning](https://yam.gift/tags/LoRA-XS-Real-time-Learning/) [Logistic Regression](https://yam.gift/tags/Logistic-Regression/) [Lucene](https://yam.gift/tags/Lucene/) [Luong Attention](https://yam.gift/tags/Luong-Attention/) [MDLM](https://yam.gift/tags/MDLM/) [MEMM](https://yam.gift/tags/MEMM/) [MF](https://yam.gift/tags/MF/) [MIO](https://yam.gift/tags/MIO/) [MM Fusion](https://yam.gift/tags/MM-Fusion/) [MOPD](https://yam.gift/tags/MOPD/) [MR-Search](https://yam.gift/tags/MR-Search/) [MTL](https://yam.gift/tags/MTL/) [Machine](https://yam.gift/tags/Machine/) [Machine Learning](https://yam.gift/tags/Machine-Learning/) [Machine Translation](https://yam.gift/tags/Machine-Translation/) [Manacher](https://yam.gift/tags/Manacher/) [Managemnt](https://yam.gift/tags/Managemnt/) [MarkBERT](https://yam.gift/tags/MarkBERT/) [Markov](https://yam.gift/tags/Markov/) [Materialized Views](https://yam.gift/tags/Materialized-Views/) [Math](https://yam.gift/tags/Math/) [Matplotlib](https://yam.gift/tags/Matplotlib/) [Matrix Factorization](https://yam.gift/tags/Matrix-Factorization/) [Median](https://yam.gift/tags/Median/) [MemAPO](https://yam.gift/tags/MemAPO/) [Meta Learning](https://yam.gift/tags/Meta-Learning/) [Meta RL](https://yam.gift/tags/Meta-RL/) [Metric](https://yam.gift/tags/Metric/) [MiCA](https://yam.gift/tags/MiCA/) [MiMo](https://yam.gift/tags/MiMo/) [MiniMax](https://yam.gift/tags/MiniMax/) [Minimum Edit Distance](https://yam.gift/tags/Minimum-Edit-Distance/) [Minkowski](https://yam.gift/tags/Minkowski/) [MoE](https://yam.gift/tags/MoE/) [Model Evaluation](https://yam.gift/tags/Model-Evaluation/) [Module](https://yam.gift/tags/Module/) [Monad](https://yam.gift/tags/Monad/) [Monkey Patch](https://yam.gift/tags/Monkey-Patch/) [Multi-Head Attention](https://yam.gift/tags/Multi-Head-Attention/) [Multi-Modal](https://yam.gift/tags/Multi-Modal/) [MultiModal](https://yam.gift/tags/MultiModal/) [Multitask](https://yam.gift/tags/Multitask/) [Multiway Tree](https://yam.gift/tags/Multiway-Tree/) [NAT](https://yam.gift/tags/NAT/) [NER](https://yam.gift/tags/NER/) [NLG](https://yam.gift/tags/NLG/) [NLM](https://yam.gift/tags/NLM/) [NLP](https://yam.gift/tags/NLP/) [NLU](https://yam.gift/tags/NLU/) [NMT](https://yam.gift/tags/NMT/) [NNW](https://yam.gift/tags/NNW/) [NOVER](https://yam.gift/tags/NOVER/) [NTP](https://yam.gift/tags/NTP/) [Naive Bayes](https://yam.gift/tags/Naive-Bayes/) [Neo4j](https://yam.gift/tags/Neo4j/) [Network](https://yam.gift/tags/Network/) [Ngram](https://yam.gift/tags/Ngram/) [NodeJS](https://yam.gift/tags/NodeJS/) [Normalizing Flow](https://yam.gift/tags/Normalizing-Flow/) [NumPy](https://yam.gift/tags/NumPy/) [Numba](https://yam.gift/tags/Numba/) [Numpy](https://yam.gift/tags/Numpy/) [OEL](https://yam.gift/tags/OEL/) [OMNI](https://yam.gift/tags/OMNI/) [ORZ](https://yam.gift/tags/ORZ/) [Occupation](https://yam.gift/tags/Occupation/) [One-Shot](https://yam.gift/tags/One-Shot/) [Online Learning](https://yam.gift/tags/Online-Learning/) [Online Softmax](https://yam.gift/tags/Online-Softmax/) [Online-DPO-R1](https://yam.gift/tags/Online-DPO-R1/) [OpenAI](https://yam.gift/tags/OpenAI/) [OpenClaw](https://yam.gift/tags/OpenClaw/) [OpenSource](https://yam.gift/tags/OpenSource/) [OpenSpec](https://yam.gift/tags/OpenSpec/) [Orientation](https://yam.gift/tags/Orientation/) [P-R](https://yam.gift/tags/P-R/) [PCCG](https://yam.gift/tags/PCCG/) [PCFG](https://yam.gift/tags/PCFG/) [PEGASUS](https://yam.gift/tags/PEGASUS/) [PLM](https://yam.gift/tags/PLM/) [PPMI](https://yam.gift/tags/PPMI/) [PPO](https://yam.gift/tags/PPO/) [PTM](https://yam.gift/tags/PTM/) [PageRank](https://yam.gift/tags/PageRank/) [Palindromic](https://yam.gift/tags/Palindromic/) [Pandarallel](https://yam.gift/tags/Pandarallel/) [Pandas](https://yam.gift/tags/Pandas/) [Partial Parsing](https://yam.gift/tags/Partial-Parsing/) [Passion](https://yam.gift/tags/Passion/) [Pearson](https://yam.gift/tags/Pearson/) [Philosophy](https://yam.gift/tags/Philosophy/) [Phrase Structure Grammar](https://yam.gift/tags/Phrase-Structure-Grammar/) [Phrase Structure Grammars](https://yam.gift/tags/Phrase-Structure-Grammars/) [PoS](https://yam.gift/tags/PoS/) [Polars](https://yam.gift/tags/Polars/) [Pooling](https://yam.gift/tags/Pooling/) [Position-Encoding](https://yam.gift/tags/Position-Encoding/) [Post-Training](https://yam.gift/tags/Post-Training/) [Post-training](https://yam.gift/tags/Post-training/) [Postgres](https://yam.gift/tags/Postgres/) [Pragmatic Automatic Processing](https://yam.gift/tags/Pragmatic-Automatic-Processing/) [Pre-Trained](https://yam.gift/tags/Pre-Trained/) [Pre-Training](https://yam.gift/tags/Pre-Training/) [Pre-training](https://yam.gift/tags/Pre-training/) [Precision](https://yam.gift/tags/Precision/) [Pretrain](https://yam.gift/tags/Pretrain/) [Pretrained](https://yam.gift/tags/Pretrained/) [Pretraining](https://yam.gift/tags/Pretraining/) [Probabilistic Grammar](https://yam.gift/tags/Probabilistic-Grammar/) [Probabilistic Model](https://yam.gift/tags/Probabilistic-Model/) [Promote](https://yam.gift/tags/Promote/) [Prompt](https://yam.gift/tags/Prompt/) [ProtoBERT](https://yam.gift/tags/ProtoBERT/) [Pruning](https://yam.gift/tags/Pruning/) [Psychology](https://yam.gift/tags/Psychology/) [PyPI](https://yam.gift/tags/PyPI/) [Python](https://yam.gift/tags/Python/) [QA](https://yam.gift/tags/QA/) [Quant](https://yam.gift/tags/Quant/) [Quantization](https://yam.gift/tags/Quantization/) [Query](https://yam.gift/tags/Query/) [Queue](https://yam.gift/tags/Queue/) [Qwen](https://yam.gift/tags/Qwen/) [Qwen3](https://yam.gift/tags/Qwen3/) [Qwen3-Next](https://yam.gift/tags/Qwen3-Next/) [R-Drop](https://yam.gift/tags/R-Drop/) [R1](https://yam.gift/tags/R1/) [R1-Zero](https://yam.gift/tags/R1-Zero/) [R3](https://yam.gift/tags/R3/) [RAG](https://yam.gift/tags/RAG/) [RAVR](https://yam.gift/tags/RAVR/) [REER](https://yam.gift/tags/REER/) [RELU](https://yam.gift/tags/RELU/) [RENT](https://yam.gift/tags/RENT/) [RESTRAIN](https://yam.gift/tags/RESTRAIN/) [RFE](https://yam.gift/tags/RFE/) [RGR](https://yam.gift/tags/RGR/) [RHO](https://yam.gift/tags/RHO/) [RHO-1](https://yam.gift/tags/RHO-1/) [RL](https://yam.gift/tags/RL/) [RLHF](https://yam.gift/tags/RLHF/) [RM](https://yam.gift/tags/RM/) [RM-R1](https://yam.gift/tags/RM-R1/) [RMSE](https://yam.gift/tags/RMSE/) [RMSProp](https://yam.gift/tags/RMSProp/) [RNN](https://yam.gift/tags/RNN/) [ROC](https://yam.gift/tags/ROC/) [RWD](https://yam.gift/tags/RWD/) [Rank](https://yam.gift/tags/Rank/) [RaspberryPi](https://yam.gift/tags/RaspberryPi/) [Raspberrypi](https://yam.gift/tags/Raspberrypi/) [Reasoning](https://yam.gift/tags/Reasoning/) [Recall](https://yam.gift/tags/Recall/) [Recommendation](https://yam.gift/tags/Recommendation/) [Recursion](https://yam.gift/tags/Recursion/) [Reduction](https://yam.gift/tags/Reduction/) [Reformer](https://yam.gift/tags/Reformer/) [Regex](https://yam.gift/tags/Regex/) [Regular Expression](https://yam.gift/tags/Regular-Expression/) [Reinforce++](https://yam.gift/tags/Reinforce/) [Reinforcement Learning](https://yam.gift/tags/Reinforcement-Learning/) [Relationship Extraction](https://yam.gift/tags/Relationship-Extraction/) [Representation](https://yam.gift/tags/Representation/) [Reqular Expressions](https://yam.gift/tags/Reqular-Expressions/) [Retrieving](https://yam.gift/tags/Retrieving/) [Reward](https://yam.gift/tags/Reward/) [RoBERTa](https://yam.gift/tags/RoBERTa/) [RolePlay](https://yam.gift/tags/RolePlay/) [Rotated Sorted Array](https://yam.gift/tags/Rotated-Sorted-Array/) [Rust](https://yam.gift/tags/Rust/) [SAPO](https://yam.gift/tags/SAPO/) [SCFG](https://yam.gift/tags/SCFG/) [SGD](https://yam.gift/tags/SGD/) [SLM](https://yam.gift/tags/SLM/) [SMO](https://yam.gift/tags/SMO/) [SQL](https://yam.gift/tags/SQL/) [SRN](https://yam.gift/tags/SRN/) [SRT](https://yam.gift/tags/SRT/) [STAR-LDM](https://yam.gift/tags/STAR-LDM/) [STaR](https://yam.gift/tags/STaR/) [SVD++](https://yam.gift/tags/SVD/) [SVM](https://yam.gift/tags/SVM/) [Scaling](https://yam.gift/tags/Scaling/) [Scaling Law](https://yam.gift/tags/Scaling-Law/) [Seaborn](https://yam.gift/tags/Seaborn/) [Search](https://yam.gift/tags/Search/) [Seed-Thinking](https://yam.gift/tags/Seed-Thinking/) [Segmentation](https://yam.gift/tags/Segmentation/) [Selection-Inference](https://yam.gift/tags/Selection-Inference/) [Self-Attention](https://yam.gift/tags/Self-Attention/) [Self-Verified](https://yam.gift/tags/Self-Verified/) [Semantic Automatic Processing](https://yam.gift/tags/Semantic-Automatic-Processing/) [Semantic Similarity](https://yam.gift/tags/Semantic-Similarity/) [Senta](https://yam.gift/tags/Senta/) [Sentence Representation](https://yam.gift/tags/Sentence-Representation/) [Sentence Similarity](https://yam.gift/tags/Sentence-Similarity/) [Sentence-BERT](https://yam.gift/tags/Sentence-BERT/) [Sentiment Classification](https://yam.gift/tags/Sentiment-Classification/) [SentimentAnalysis](https://yam.gift/tags/SentimentAnalysis/) [Sentry](https://yam.gift/tags/Sentry/) [Siamese](https://yam.gift/tags/Siamese/) [Sigmoid](https://yam.gift/tags/Sigmoid/) [SimCSE](https://yam.gift/tags/SimCSE/) [Similarity](https://yam.gift/tags/Similarity/) [Simon](https://yam.gift/tags/Simon/) [Simple-Zoo](https://yam.gift/tags/Simple-Zoo/) [Simpson Paradox](https://yam.gift/tags/Simpson-Paradox/) [Skill](https://yam.gift/tags/Skill/) [Skywork Reward](https://yam.gift/tags/Skywork-Reward/) [Slide](https://yam.gift/tags/Slide/) [Smoothing](https://yam.gift/tags/Smoothing/) [Soft-SVM](https://yam.gift/tags/Soft-SVM/) [Softmax](https://yam.gift/tags/Softmax/) [Sort](https://yam.gift/tags/Sort/) [Span](https://yam.gift/tags/Span/) [Sparse Attention](https://yam.gift/tags/Sparse-Attention/) [Spell Check](https://yam.gift/tags/Spell-Check/) [Spurious Reward](https://yam.gift/tags/Spurious-Reward/) [SqueezeBERT](https://yam.gift/tags/SqueezeBERT/) [Stable LM](https://yam.gift/tags/Stable-LM/) [Stack](https://yam.gift/tags/Stack/) [Stacking](https://yam.gift/tags/Stacking/) [Statistics](https://yam.gift/tags/Statistics/) [Stirling](https://yam.gift/tags/Stirling/) [Strategic](https://yam.gift/tags/Strategic/) [StratifiedKFold](https://yam.gift/tags/StratifiedKFold/) [Streaming](https://yam.gift/tags/Streaming/) [String](https://yam.gift/tags/String/) [Study](https://yam.gift/tags/Study/) [Style](https://yam.gift/tags/Style/) [Substring](https://yam.gift/tags/Substring/) [Summarization](https://yam.gift/tags/Summarization/) [Supertagging](https://yam.gift/tags/Supertagging/) [Swap](https://yam.gift/tags/Swap/) [System](https://yam.gift/tags/System/) [T5](https://yam.gift/tags/T5/) [TF-IDF](https://yam.gift/tags/TF-IDF/) [THW](https://yam.gift/tags/THW/) [TIS](https://yam.gift/tags/TIS/) [TRT](https://yam.gift/tags/TRT/) [TS3-Codec](https://yam.gift/tags/TS3-Codec/) [TTRL](https://yam.gift/tags/TTRL/) [TTS](https://yam.gift/tags/TTS/) [Tagging](https://yam.gift/tags/Tagging/) [Talkie](https://yam.gift/tags/Talkie/) [TanH](https://yam.gift/tags/TanH/) [TensorBay](https://yam.gift/tags/TensorBay/) [Tensorflow](https://yam.gift/tags/Tensorflow/) [Test](https://yam.gift/tags/Test/) [Text Classification](https://yam.gift/tags/Text-Classification/) [Text Generation](https://yam.gift/tags/Text-Generation/) [Text Normalization](https://yam.gift/tags/Text-Normalization/) [TextCNN](https://yam.gift/tags/TextCNN/) [TextRank](https://yam.gift/tags/TextRank/) [Thought](https://yam.gift/tags/Thought/) [TiDAR](https://yam.gift/tags/TiDAR/) [TinyLoRA](https://yam.gift/tags/TinyLoRA/) [Tokenizer](https://yam.gift/tags/Tokenizer/) [Transformer](https://yam.gift/tags/Transformer/) [Transformer-XL](https://yam.gift/tags/Transformer-XL/) [Tree](https://yam.gift/tags/Tree/) [Treebank](https://yam.gift/tags/Treebank/) [Tuning](https://yam.gift/tags/Tuning/) [Tutorial](https://yam.gift/tags/Tutorial/) [Ubuntu](https://yam.gift/tags/Ubuntu/) [UniLM](https://yam.gift/tags/UniLM/) [Unity Operation](https://yam.gift/tags/Unity-Operation/) [Unix](https://yam.gift/tags/Unix/) [Unsupervised Elicitation](https://yam.gift/tags/Unsupervised-Elicitation/) [UserCF](https://yam.gift/tags/UserCF/) [VAPO](https://yam.gift/tags/VAPO/) [VITS](https://yam.gift/tags/VITS/) [Vagrant](https://yam.gift/tags/Vagrant/) [Valence](https://yam.gift/tags/Valence/) [Vector Semantics](https://yam.gift/tags/Vector-Semantics/) [Verifier](https://yam.gift/tags/Verifier/) [Virtual Network](https://yam.gift/tags/Virtual-Network/) [VirtualBox](https://yam.gift/tags/VirtualBox/) [Visualization](https://yam.gift/tags/Visualization/) [Viterbi](https://yam.gift/tags/Viterbi/) [Vocabulary Learning](https://yam.gift/tags/Vocabulary-Learning/) [VoiceAgent](https://yam.gift/tags/VoiceAgent/) [Voila](https://yam.gift/tags/Voila/) [Voting](https://yam.gift/tags/Voting/) [W2NER](https://yam.gift/tags/W2NER/) [WOE](https://yam.gift/tags/WOE/) [Web Server Multithreaded Server](https://yam.gift/tags/Web-Server-Multithreaded-Server/) [Wide](https://yam.gift/tags/Wide/) [Word2vec](https://yam.gift/tags/Word2vec/) [Work](https://yam.gift/tags/Work/) [World Model](https://yam.gift/tags/World-Model/) [XLNet](https://yam.gift/tags/XLNet/) [XTTS](https://yam.gift/tags/XTTS/) [Z-Score](https://yam.gift/tags/Z-Score/) [Zero-Short](https://yam.gift/tags/Zero-Short/) [Zero-Shot](https://yam.gift/tags/Zero-Shot/) [Zero-shot](https://yam.gift/tags/Zero-shot/) [ZhouZhihua](https://yam.gift/tags/ZhouZhihua/) [Zipf](https://yam.gift/tags/Zipf/) [Ziya](https://yam.gift/tags/Ziya/) [antigravity](https://yam.gift/tags/antigravity/) [attention sink](https://yam.gift/tags/attention-sink/) [bias](https://yam.gift/tags/bias/) [binning](https://yam.gift/tags/binning/) [context](https://yam.gift/tags/context/) [emacs](https://yam.gift/tags/emacs/) [few-shot](https://yam.gift/tags/few-shot/) [ffmpeg](https://yam.gift/tags/ffmpeg/) [gated attention](https://yam.gift/tags/gated-attention/) [gpt-oss](https://yam.gift/tags/gpt-oss/) [harmony format](https://yam.gift/tags/harmony-format/) [jpype](https://yam.gift/tags/jpype/) [kanban](https://yam.gift/tags/kanban/) [knowledge Graph](https://yam.gift/tags/knowledge-Graph/) [lightinfer](https://yam.gift/tags/lightinfer/) [motion](https://yam.gift/tags/motion/) [node2vec](https://yam.gift/tags/node2vec/) [oat-zero](https://yam.gift/tags/oat-zero/) [off-by-one attention](https://yam.gift/tags/off-by-one-attention/) [orz](https://yam.gift/tags/orz/) [pararun](https://yam.gift/tags/pararun/) [promptlog](https://yam.gift/tags/promptlog/) [s1](https://yam.gift/tags/s1/) [skill](https://yam.gift/tags/skill/) [spec](https://yam.gift/tags/spec/) [ssh](https://yam.gift/tags/ssh/) [str](https://yam.gift/tags/str/) [trae](https://yam.gift/tags/trae/) [vim](https://yam.gift/tags/vim/) [vlc](https://yam.gift/tags/vlc/) © 2026 hscspring All rights reserved. Powered by [Hexo](https://hexo.io/)
Readable Markdown
Paper:<https://arxiv.org/pdf/1910.13461.pdf> Code:<https://github.com/pytorch/fairseq> 核心思想:基于 Transformer Seq2Seq 架构适应各种不同的输入噪声。 ## What ### 动机和核心问题 MLM 的方法通常专注于特定类型的最终任务(例如跨度预测,生成等),从而限制了它们的适用性。BART 结合了双向和自回归的 Transformer(可以看成是 Bert + GPT2)。具体而言分为两步: - 任意的加噪方法破坏文本 - 使用一个 Seq2Seq 模型重建文本 主要的优势是噪声灵活性,也就是更加容易适应各种噪声(转换)。BART 对文本生成精调特别有效,对理解任务也很有效。它还提供了一种精调的新思路,效果嘛,如果不好就不会有论文了。 ### 模型和算法 架构就是 Seq2Seq 的 Transformer,相比 Bert 有以下不同: - Decoder 的每一层增加对 Encoder 最后隐层的交叉注意力(类似 Luong Attention,也是最初的 Attention 机制) - 没有使用 Bert 在预测词的那个额外的前馈网络(这里说的应该就是那个 Pooler) ![](http://qnimg.lovevivian.cn/paper-bart-1.jpeg) Bart 允许任意的噪声,极端情况(比如所有源信息都丢失)下其实是一种语言模型(和 GPT2 类似)。具体包括: - Token 遮蔽:和 Bert 一样。 - Token 删除:输入中随机删除 Token,模型必须确定哪些位置是被删除的。 - 文本填充:文本跨度长度从泊松分布(λ= 3)中得出,每个跨度替换为一个 `[MASK]`,0 对应插入。这个灵感来自 SpanBert,不同的是,但是 SpanBERT 采样跨度来自不同(固定几何)分布的长度,并用长度完全相同的 `[MASK]` 序列替换每个跨度 。 文本填充可以指导模型预测**跨度中缺少多少个 Token**。 - 句子排列:文档被切分成句子,然后随机 shuffle。 - 文档旋转:随机均匀选择一个 Token,让文档从选中的 Token 开始,训练模型识别文档的开始。 ![](http://qnimg.lovevivian.cn/paper-bart-2.jpeg) 以下代码我们参考 Transformer 中的实现。首先看配置: 然后是模型: 除了 Encoder 和 Decoder 外,有个需要注意的是 `generation_mode` 参数,当它为 True 时为生成模式,此时不需要 Mask;当为 False 时,与 GPT2 一样,需要对 Padding 和未来时间的 Token 进行 Mask。举个例子: 这里的 `decoder_input_ids` 其实是 `input_ids` 的上一步,两个 Mask 一目了然。 接下来就是两个核心组件:Encoder 和 Decoder 了,首先看一下简化的结构(以 Base 为例): EncoderLayer 其实就是 Bert 的 EncoderLayer: 对比了一下 Transformer Bert 的实现,唯一的不同就是激活函数后面多了一个 Dropout。大致还是可以分为三块:自注意力模块、中间模块和输出模块。 Decoder 部分是在 GPT2 的基础上增加了交叉 Attention,具体代码如下: 大部分读者应该已经非常熟悉 Transformer 了,SelfAttention 的 qkv 都是输入的 x,而 Cross-Attention 的 q 是输入的 x,但 k 和 v 就变成了 Encoder 的最后隐层。另外需要注意的是,与 Encoder 的 SelfAttention 相比,Decoder 的 SelfAttention 需要 Mask 当前 Token 后面的 Token。这也就是 Transformer 架构的三种 Attention 机制。具体可以参考[这里](https://yam.gift/2020/04/23/Paper/2020-04-23-Transformer/)。 ### 特点和创新 - 提出了一种更加有效地预训练方法,就是把 Transformer 整体作为预训练的架构。 - 使用任意噪声的输入。 ## How ### 如何构造数据并训练 官方并未提供预训练说明和代码,GitHub 上有个 Issue 可以关注: - [BART pretraining instructions · Issue \#1614 · pytorch/fairseq](https://github.com/pytorch/fairseq/issues/1614) Transformer 也没提供: - [How to pre-train BART model · Issue \#4151 · huggingface/transformers](https://github.com/huggingface/transformers/issues/4151) 不过根据另一个 Issue 提供的训练时长,一般人应该也不会自己训练吧: - [BART training time · Issue \#1525 · pytorch/fairseq](https://github.com/pytorch/fairseq/issues/1525) 想想也是,一个 Bert 或 GPT2 都不小了,这还两个,能不慢才怪。 ### 如何使用结果 文章介绍了如何在多种下游任务中进行使用: - 序列分类:相同的 input 喂入 Encoder 和 Decoder,Decoder 最后一个 Token(EOS)的 hidden state 喂入多分类线性分类器。和 Bert 不同,最后添加 EOS 作为句子关系的标记。 - 序列标注:将整个文档喂入 Encoder 和 Decoder,使用 Decoder 顶部隐藏状态作为每个单词的表示。 - 序列生成:Encoder 输入句子,Decoder 输出。 - 翻译(源→英文):通过添加从双向语料学习的新的 Encoder 参数集,可以整体作为预训练的 Decoder。具体而言就是把 Bart 的 Encoder 替换为随机初始化的一个 Encoder,新的 Encoder 要学习源语言 Token 到 Bart 能够去噪为英文的输入映射。训练源 Encoder 分两步,都从 BART 模型的输出反向传播交叉熵损失。 - 第一步,冻结大多数 BART 参数,仅更新随机初始化的源 Encoder:位置 Embedding 和 Encoder 第一层的自注意输入投影矩阵。 - 第二步,训练所有模型参数进行少量迭代。 具体可以参考官方提供的 Example,使用并不复杂: - [fairseq/examples/bart at master · pytorch/fairseq](https://github.com/pytorch/fairseq/tree/master/examples/bart) 另外,我们也可以参考 Transformer 使用,其实预训练模型使用都是类似的,它们的共同点就是对输入的 Token 返回一个隐层表示,不同的模型和任务对输入和输出后的控制略有差别。 ### 数据和实验 **Base** 需要说明的是,作者这里对对比模型重新进行了训练,细节可以参考论文。 ![](http://qnimg.lovevivian.cn/paper-bart-3.jpeg) 结论如下: - 预训练方法的性能在各个任务中有很大不同 - Token Mask 至关重要,旋转文档和句子 Shuffle 表现不佳 - 从左到右的预训练模型能提高文本生成能力 - 双向模型对于 SQuAD 至关重要 - 预训练目标并不是唯一重要的因素 - 纯语言模型在 ELI5 上表现最佳 - 除此之外,使用了文本填充的 Bart 表现很好 **大模型** 实验设置: - Encoder 和 Decoder 各 12 层,hidden size 1024 - batch size 8000,500000 steps - 文本填充 + 句子排列,每个文档 Mask 30% Token,变换所有句子 - 最后 10% 的训练步不使用 dropout - 数据集 160G,包括新闻、书籍、故事和网络文本 分类任务: ![](http://qnimg.lovevivian.cn/paper-bart-4.jpeg) 生成任务: ![](http://qnimg.lovevivian.cn/paper-bart-5.jpeg) 除了摘要外,在对话回复、QA 方面也取得了 state-of-the-art 结果。 翻译: ![](http://qnimg.lovevivian.cn/paper-bart-6.jpeg) Baseline 是 Transformer 架构。 整体而言,在理解+生成的任务上表现想当可观,比如文本摘要、对话回复。 ## Discussion ### 相关工作 - GPT 是单向语言模型,ELMo 双向但是互相没有交互。 - BERT 使用 MLM 构建双向语言模型,RoBERTa, ALBERT 和 SpanBert 对其进行了优化,因为不是自回归模型,所以在文本生成任务上效果一般。 - UniLM 使用一组 MASK,有些只允许使用左边的上下文,所以可以同时用于生成和判别任务。与 Bart 不同的是 UniLM 在预测上是条件独立的,Bart 采用的是自回归。 BART 减少了预训练和生成任务之间的不匹配,因为 Decoder 始终在未损坏的上下文中进行训练。 - MASS 与 Bart 最类似,连续跨度(span)的 Token 被遮盖的输入映射到被遮盖的 Token 序列。由于不相交的 Token 集喂入 Encoder 和 Decoder,MASS 在判别任务上表现一般。 - XLNet 通过以排列自回归预测被屏蔽的 Token 来扩展 BERT。它允许预测以左右上下文为条件。 ### 打开脑洞 乍一看貌似好像没啥创新点,就是用了 Transformer 的架构作为预训练方法,原因是因为能够同时顾及到 MLM 和从左到右的语言模型,可以看成是后 Bert 时代预训练方法的综合集成。不过稍微想一想就知道,这样的模型必然是巨大且相对复杂的;而且 MLM 和自回归语言模型之间是否有冗余也不甚明确,但效果从理论上预期肯定会比单纯使用一种方法好。也许正如作者所期望的那样,MLM 负责理解,Auto-Regressive LM 负责生成,所以在文本摘要和对话回复等任务上才有那么大的效果提升。唯一的问题可能还是太复杂了,一个 Bert 都让工业界大多数中小公司头大了,这 Bart 还怎么上。想想刚开始那阵美滋滋地上了一个基于 Bert 的模型,结果并发上不去(只有普通的 CPU 服务器),C++,Rust 怼上去都没用,最后还是只能回到 Tiny 版甚至 Lite 版,做各种压缩,现在还在坑里没出来。 论文的相关工作部分总结的不错,本来还想看一下 SpanBert,UniLM,MASS 的,搞得都没有欲望了。谁让论文这么多呢,2020 年都过了一半了还在补 2019 年的作业。至于如何在 Bart 上进一步提升,目前的感觉应该就是知识图谱了,毕竟预训练已经足够 general 的时候,领域知识就显得更加重要了;然后具体任务上可能要引入强化学习,即用某种规则去 “引导” AI,这类算法还包括遗传算法、PSO 粒子群算法、蚁群算法等。关于整体架构的思考,感兴趣的小伙伴可以查看 2018 年的这篇[文章](https://yam.gift/2018/07/22/2018-07-22-NLP-and-AI/)。 ## Appendix - [huggingface/transformers: 🤗Transformers: State-of-the-art Natural Language Processing for Pytorch and TensorFlow 2.0.](https://github.com/huggingface/transformers)
Shard98 (laksa)
Root Hash6823574039602236898
Unparsed URLgift,yam!/2020/06/13/Paper/2020-06-13-Bart/ s443