ℹ️ Skipped - page is already crawled
| Filter | Status | Condition | Details |
|---|---|---|---|
| HTTP status | PASS | download_http_code = 200 | HTTP 200 |
| Age cutoff | PASS | download_stamp > now() - 6 MONTH | 0 months ago |
| History drop | PASS | isNull(history_drop_reason) | No drop reason |
| Spam/ban | PASS | fh_dont_index != 1 AND ml_spam_score = 0 | ml_spam_score=0 |
| Canonical | PASS | meta_canonical IS NULL OR = '' OR = src_unparsed | Not set |
| Property | Value |
|---|---|
| URL | https://yam.gift/2020/06/13/Paper/2020-06-13-Bart/ |
| Last Crawled | 2026-04-13 23:53:36 (2 hours ago) |
| First Indexed | 2020-06-29 23:11:28 (5 years ago) |
| HTTP Status Code | 200 |
| Meta Title | Bart 论文+代码笔记 | 长琴 |
| Meta Description | AI | NLP | 人工智能 | 哲学 | 自然语言处理 | 机器学习, Paper:https://arxiv.org/pdf/1910.13461.pdf Code:https://github.com/pytorch/fairseq 核心思想:基于 Transformer Seq2Seq 架构适应各种不同的输入噪声。 |
| Meta Canonical | null |
| 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)

Bart 允许任意的噪声,极端情况(比如所有源信息都丢失)下其实是一种语言模型(和 GPT2 类似)。具体包括:
- Token 遮蔽:和 Bert 一样。
- Token 删除:输入中随机删除 Token,模型必须确定哪些位置是被删除的。
- 文本填充:文本跨度长度从泊松分布(λ= 3)中得出,每个跨度替换为一个 `[MASK]`,0 对应插入。这个灵感来自 SpanBert,不同的是,但是 SpanBERT 采样跨度来自不同(固定几何)分布的长度,并用长度完全相同的 `[MASK]` 序列替换每个跨度 。 文本填充可以指导模型预测**跨度中缺少多少个 Token**。
- 句子排列:文档被切分成句子,然后随机 shuffle。
- 文档旋转:随机均匀选择一个 Token,让文档从选中的 Token 开始,训练模型识别文档的开始。

以下代码我们参考 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**
需要说明的是,作者这里对对比模型重新进行了训练,细节可以参考论文。

结论如下:
- 预训练方法的性能在各个任务中有很大不同
- 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 年的这篇[文章](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)

Bart 允许任意的噪声,极端情况(比如所有源信息都丢失)下其实是一种语言模型(和 GPT2 类似)。具体包括:
- Token 遮蔽:和 Bert 一样。
- Token 删除:输入中随机删除 Token,模型必须确定哪些位置是被删除的。
- 文本填充:文本跨度长度从泊松分布(λ= 3)中得出,每个跨度替换为一个 `[MASK]`,0 对应插入。这个灵感来自 SpanBert,不同的是,但是 SpanBERT 采样跨度来自不同(固定几何)分布的长度,并用长度完全相同的 `[MASK]` 序列替换每个跨度 。 文本填充可以指导模型预测**跨度中缺少多少个 Token**。
- 句子排列:文档被切分成句子,然后随机 shuffle。
- 文档旋转:随机均匀选择一个 Token,让文档从选中的 Token 开始,训练模型识别文档的开始。

以下代码我们参考 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**
需要说明的是,作者这里对对比模型重新进行了训练,细节可以参考论文。

结论如下:
- 预训练方法的性能在各个任务中有很大不同
- 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 年的这篇[文章](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) |
| Shard | 98 (laksa) |
| Root Hash | 6823574039602236898 |
| Unparsed URL | gift,yam!/2020/06/13/Paper/2020-06-13-Bart/ s443 |