diff --git a/docs/chapter3/3.1 Encoder-Only.md b/docs/chapter3/3.1 Encoder-Only.md index de028bb..a236aa8 100755 --- a/docs/chapter3/3.1 Encoder-Only.md +++ b/docs/chapter3/3.1 Encoder-Only.md @@ -96,7 +96,9 @@ NSP 任务的核心思路是要求模型判断一个句对的两个句子是否 通过要求模型判断句对关系,从而迫使模型拟合句子之间的关系,来适配句级的 NLU 任务。同样,由于 NSP 的正样本可以从无监督语料中随机抽取任意连续的句子,而负样本可以对句子打乱后随机抽取(只需要保证不要抽取到原本就连续的句子就行),因此也可以具有几乎无限量的训练数据。 -在具体预训练时,BERT 使用了 800M 的 BooksCorpus 语料和 2500M 的英文维基百科语料,90% 的数据使用 128 的上下文长度训练,剩余 10% 的数据使用 512 作为上下文长度进行预训练,总共约训练了 3.3B token。可以看到,相比于传统的非预训练模型,其训练的数据量有指数级增长。当然,更海量的训练数据需要更大成本的算力,BERT 的 base 版本和 large 版本分别使用了 16块 TPU 和 64块 TPU 训练了 4天才完成。 +在具体预训练时,BERT 使用了 800M 的 BooksCorpus 语料和 2500M 的英文维基百科语料,90% 的数据使用 128 的上下文长度训练,剩余 10% 的数据使用 512 作为上下文长度进行预训练,总共约训练了 3.3B token。其训练的超参数也是值得关注的,BERT 的训练语料共有 13GB 大小,其在 256 的 batch size 上训练了 1M 步(40 个 Epoch)。而相较而言,LLM 一般都只会训练一个 Epoch,且使用远大于 256 的 batch size。 + +可以看到,相比于传统的非预训练模型,其训练的数据量有指数级增长。当然,更海量的训练数据需要更大成本的算力,BERT 的 base 版本和 large 版本分别使用了 16块 TPU 和 64块 TPU 训练了 4天才完成。 ### (4)下游任务微调 @@ -108,6 +110,46 @@ NSP 任务的核心思路是要求模型判断一个句对的两个句子是否 BERT 一经提出,直接在 NLP 11个赛道上取得 SOTA 效果,成为 NLU 方向上当之无愧的霸主,后续若干在 NLU 任务上取得更好效果的模型都是在 BERT 基础上改进得到的。直至 LLM 时代,BERT 也仍然能在很多标注数据丰富的 NLU 任务上达到最优效果,事实上,对于某些特定、训练数据丰富且强调高吞吐的任务,BERT 比 LLM 更具有可用性。 +## 3.1.2 RoBERTa + +BERT 作为 NLP 划时代的杰作,同时在多个榜单上取得 SOTA 效果,也带动整个 NLP 领域向预训练模型方向迁移。以 BERT 为基础,在多个方向上进行优化,还涌现了一大批效果优异的 Encoder-Only 预训练模型。它们大都有和 BERT 类似或完全一致的模型结构,在训练数据、预训练任务、训练参数等方面上进行了优化,以取得能力更强大、在下游任务上表现更亮眼的预训练模型。其中之一即是同样由 Facebook 发布的 RoBERTa。 + +前面我们说过,预训练-微调的一个核心优势在于可以使用远大于之前训练数据的海量无监督语料进行预训练。因为在传统的深度学习范式中,对每一个任务,我们需要从零训练一个模型,那么就无法使用太大的模型参数,否则需要极大规模的有监督数据才能让模型较好地拟合,成本太大。但在预训练-微调范式,我们在预训练阶段可以使用尽可能大量的训练数据,只需要一次预训练好的模型,后续在每一个下游任务上通过少量有监督数据微调即可。而 BERT 就使用了 13GB(3.3B token)的数据进行预训练,这相较于传统 NLP 来说是一个极其巨大的数据规模了。 + +但是,13GB 的预训练数据是否让 BERT 达到了充分的拟合呢?如果我们使用更多预训练语料,是否可以进一步增强模型性能?更多的,BERT 所选用的预训练任务、训练超参数是否是最优的?RoBERTa 应运而生。 + +### (1)优化一:去掉 NSP 预训练任务 + +RoBERTa 的模型架构与 BERT 完全一致,也就是使用了 BERT-large(24层 Encoder Layer,1024 的隐藏层维度,总参数量 340M)的模型参数。在预训练任务上,有学者质疑 NSP 任务并不能提高模型性能,因为其太过简单,加入到预训练中并不能使下游任务微调时明显受益,甚至会带来负面效果。RoBERTa 设置了四个实验组: + + 1. 段落构建的 MLM + NSP:BERT 原始预训练任务,输入是一对片段,每个片段包括多个句子,来构造 NSP 任务; + 2. 文档对构建的 MLM + NSP:一个输入构建一对句子,通过增大 batch 来和原始输入达到 token 等同; + 3. 跨越文档的 MLM:去掉 NSP 任务,一个输入为从一个或多个文档中连续采样的完整句子,为使输入达到最大长度(512),可能一个输入会包括多个文档; + 4. 单文档的 MLM:去掉 NSP 任务,且限制一个输入只能从一个文档中采样,同样通过增大 batch 来和原始输入达到 token 等同 + +实验结果证明,后两组显著优于前两组,且单文档的 MLM 组在下游任务上微调时性能最佳。因此,RoBERTa 在预训练中去掉了 NSP,只使用 MLM 任务。 + +同时,RoBERTa 对 MLM 任务本身也做出了改进。在 BERT 中,Mask 的操作是在数据处理的阶段完成的,因此后期预训练时同一个 sample 待预测的 \ 总是一致的。由于 BERT 共训练了 40 个 Epoch,为使模型的训练数据更加广泛,BERT 将数据进行了四次随机 Mask,也就是每 10个 Epoch 模型训练的数据是完全一致的。而 RoBERTa 将 Mask 操作放到了训练阶段,也就是动态遮蔽策略,从而让每一个 Epoch 的训练数据 Mask 的位置都不一致。在实验中,动态遮蔽仅有很微弱的优势优于静态遮蔽,但由于动态遮蔽更高效、易于实现,后续 MLM 任务基本都使用了动态遮蔽。 + +### (2)优化二:更大规模的预训练数据和预训练步长 + +RoBERTa 使用了更大量的无监督语料进行预训练,除去 BERT 所使用的 BookCorpus 和英文维基百科外,还使用了 CC-NEWS(CommonCrawl 数据集新闻领域的英文部分)、OPENWEBTEXT(英文网页)、STORIES(CommonCrawl 数据集故事风格子集),共计 160GB 的数据,十倍于 BERT。 + +同时,RoBERTa 认为更大的 batch size 既可以提高优化速度,也可以提高任务结束性能。因此,实验在 8K 的 batch size(对比 BERT 的 batch size 为 256)下训练 31K Step,也就是总训练 token 数和 BERT 一样是 3.3B 时,模型性能更好,从而证明了大 batch size 的意义。在此基础上,RoBERTa 一共训练了 500K Step(约合 66个 Epoch)。同时,RoBERTa 不再采用 BERT 在 256 长度上进行大部分训练再在 512 长度上完成训练的策略,而是全部在 512 长度上进行训练。 + +当然,更大的预训练数据、更长的序列长度和更多的训练 Epoch,需要预训练阶段更多的算力资源。训练一个 RoBERTa,Meta 使用了 1024 块 V100(32GB 显存)训练了一天。 + +### (3)优化三:更大的 bpe 词表 + +RoBERTa、BERT 和 Transformer 一样,都使用了 bpe 作为 tokenizer 的编码策略。bpe,即 Byte Pair Encoding,字节对编码,是指以子词对作为分词的单位。例如,对“Hello World”这句话,可能会切分为“Hel,lo,Wor,ld”四个子词对。而对于以字为基本单位的中文,一般会按照 字节编码进行切分。例如,在 UTF-8 编码中,“我”会被编码为“E68891”,那么在 bpe 中可能就会切分成“E68”,“891”两个字词对。 + +一般来说,bpe 编码的词典越大,编码效果越好。当然,由于 Embedding 层就是把 token 从词典空间映射到隐藏空间(也就是说 Embedding 的形状为 (vocab_size, hidden_size),越大的词表也会带来模型参数的增加。 + +BERT 原始的 bpe 词表大小为 30K,RoBERTa 选择了 50K 大小的词表来优化模型的编码能力。 + +通过上述三个部分的优化,RoBERTa 成功地在 BERT 架构的基础上刷新了多个下游任务的 SOTA,也一度成为 BERT 系模型最热门的预训练模型。同时,RoBERTa 的成功也证明了更大的预训练数据、更大的预训练步长的重要意义,这也是 LLM 诞生的基础之一。 + **参考资料** -1. [BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding](https://arxiv.org/abs/1810.04805) \ No newline at end of file +1. [BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding](https://arxiv.org/abs/1810.04805) +2. [RoBERTa: A Robustly Optimized BERT Pretraining Approach](https://arxiv.org/abs/1907.11692) \ No newline at end of file