当前位置:   article > 正文

大模型基础理论学习笔记——大模型训练_decoder only模型的训练

decoder only模型的训练

6.模型训练

前面章节中,我们分别讨论了大模型的两个关键的方面:模型架构和训练数据集。本章节中,我们将重点讨论大模型的训练,亦即大语言模型的训练。

6.1 目标函数

在前述章节中,我们按照是否包含编码器、解码器,将语言模型划分成了三类,三类模型架构不同,训练过程也有所不同。本节中,我们将继续以语言模型架构为依据,分别讨论三类语言模型训练的目标函数:

  • 仅编码器(Encoder-Only)模型(例如,BERT):计算双向上下文嵌入
  • 仅解码器(Decoder-Only)模型:计算单向上下文嵌入(contextual embeddings),一次生成一个token
  • 编码器-解码器(Encoder-Decoder)模型:编码输入,解码输出

尽管语言模型可以采用不同的架构,但其均需对上下文向量表征进行构建。根据大模型架构章节中的介绍,我们可以将这种对上下文表征(嵌入)映射描述为
ϕ : V L → R d × L [ x 1 , x 2 , … , x L ] → [ v 1 , v 2 , … , v L ] ,   ∀ i ∈ { 1 , … , L } , v i ∈ R d ϕ:VLRd×L[x1,x2,,xL][v1,v2,,vL],i{1,,L},viRd

ϕ:VL[x1,x2,,xL]Rd×L[v1,v2,,vL],i{1,,L},viRd
将词元序列映射为嵌入向量序列。

6.1.1 仅解码器(Decoder-Only)模型

仅解码器模型通常建模为自回归语言模型,通过建立一个条件分布基于前面的词元(token)序列预测下一个词元:
p ( x i ∣ x 1 : i − 1 ) p(x_i|x_{1:i-1}) p(xix1:i1)

(1)预测分布构建

为构建这个条件分布,我们将其分为三步:

Step 1: 使用上下文表征映射,将序列 x 1 : i − 1 x_{1:i-1} x1:i1 映射为上下文表征(嵌入) ϕ ( x 1 : i − 1 ) \phi(x_{1:i-1}) ϕ(x1:i1)

Step 2 : 使用嵌入矩阵 E ∈ R ∣ V ∣ × d E\in \mathbb{R}^{|\mathcal{V}|\times d} ERV×d 获得每个token的得分 E ϕ ( x 1 : i − 1 ) i − 1 E\phi(x_{1:i-1})_{i-1} (x1:i1)i1,此处是嵌入矩阵 E E E 与上下文表征(嵌入)映射 ϕ \phi ϕ 的第 i − 1 i-1 i1 列相乘;

Step 3: 对上述得分进行 S o f t m a x Softmax Softmax 归一化,得到 x i x_{i} xi 的最终分布估计。

将上述三个步骤串起来,即得到
p ( x i ∣ x 1 : i − 1 ) = s o f t m a x ( E ϕ ( x 1 : i − 1 ) i − 1 ) p(x_i|x_{1:i-1}) = softmax(E\phi(x_{1:i-1})_{i-1}) p(xix1:i1)=softmax((x1:i1)i1)

*注:

  • 在使用嵌入矩阵 E E E 获得每个token得分时,实际上是获取的词汇表中的每个token的得分;
  • 在使用嵌入矩阵 E 获得每个token得分时,实际上矩阵 E E E 仅与上下文表征(嵌入)映射 ϕ \phi ϕ 的第 i − 1 i-1 i1 列相乘,也就是仅处理了第 i − 1 i-1 i1 个嵌入。但这个嵌入是包含上下文的,是考虑了上文词元后的嵌入结果。因此,上述上下文表征(嵌入)映射是大模型架构章节中所介绍的传统的词嵌入函数 E m b e d T o k e n EmbedToken EmbedTokenSequenceModel 类嵌入序列模型的结合,即先由 E m b e d T o k e n EmbedToken EmbedToken 将词元序列嵌入为向量序列,再由SequenceModel将嵌入向量序列映射为上下文相关的嵌入序列,具体可表示为:
    V L → R d × L → R d × L x 1 : L → [ v 1 , v 2 , … , v L ] → [ v 1 ′ , v 2 ′ , … , v L ′ ] VLRd×LRd×Lx1:L[v1,v2,,vL][v1,v2,,vL]
    VLx1:LRd×L[v1,v2,,vL]Rd×L[v1,v2,,vL]
  • 上述最后一步中的Softmax实际上是沿 V \mathcal{V} V 的维度进行计算的,算得的结果是下一个token在词汇表 V \mathcal{V} V 上的分布。
(2)模型训练

模型训练方面,仅解码器架构模型可以采用自回归方式进行训练,训练的目标为最大化当前预测分布下训练数据的出现概率,即最大化似然函数
L ( θ ) = ∑ x ∈ D ∑ i = 1 L − l o g p θ ( x i ∣ x 1 : i − 1 ) L(\theta) = \sum_{x\in D} \sum_{i=1}^{L} -\mathrm{log} p_{\theta}(x_i|x_{1:i-1}) L(θ)=xDi=1Llogpθ(xix1:i1)
其中, θ \theta θ 为语言模型的所有参数, D D D 是由一组序列组成的训练数据。

6.1.2 仅编码器(Encoder-Only)模型

仅编码器架构模型主要是以BERT(Bidirection Encoder Representations from Transformers)为代表的模型。不同于仅解码器架构模型,仅编码器架构模型训练需要定义明确的训练任务。对于BERT而言,其训练包括以下两个部分:

  • 掩码语言模型(Mask Language Model)
  • 下一语句预测(Next Sentence Prediction)

BERT的模型架构如下图所示[1]

Bert 模型架构

(1)输入输出表征

为了使得BERT模型能够无歧义的使用单个token序列表征单个句子和成对的句子(例如:<问题,回答>),我们需要引入一些特殊的标记token。具体包括以下几个:

  • 我们以一个特殊的分类标记 [CLS] 标记每个序列的起始。对应于这个token的最后一个隐状态通常在分类任务中被作为序列叠加表征。
  • 句子对被打包成单一序列,我们通过两种方式进行区分:
  • 在两个句子中间插入 [SEP] 词元进行分隔;
  • 在每个token中加入一个嵌入(可训练),表征其属于第一个句子还是第二个句子。
(2)掩码语言模型训练

直觉上,深度双向模型要比从左到右的模型或者从左到右和从右到左模型的浅拼接效果性能更好,因而BERT选择了使用深度双向模型的建模方式。为了训练这个深度双向表征,BERT采用使用 [MASK] 随机掩盖掉一定比例的输入token,并让模型预测这些被掩盖的token,即掩码语言模型。该过程有些类似于添加噪声让模型进行去噪,还原添加噪声前的原始序列,即

[the, [MASK], ate, [MASK], cheese] --> [the, mouse, ate, the, cheese]
  • 1

左侧为输入序列,右侧为需要重建的序列(即对于输出的监督序列)。我们可以定义左侧序列为 x ~ 1 : L \tilde{x}_{1:L} x~1:L,右侧序列为 x 1 : L x_{1:L} x1:L,则模型要做的即是建立如下映射
x ~ 1 : L → x 1 : L \tilde{x}_{1:L} \rightarrow x_{1:L} x~1:Lx1:L
预测分布构建与仅解码器架构模型类似,最终得到
p ( x i ∣ x 1 : L ) = s o f t m a x ( E ϕ ( x 1 : L ) i − 1 ) p(x_i|x_{1:L}) = softmax(E\phi(x_{1:L})_{i-1}) p(xix1:L)=softmax((x1:L)i1)
所不同的是,对于下一个词元的分布预测是基于整个序列的,而不仅仅是基于该词前面的部分的,即在仅解码器模型中我们取 p ( x i ∣ x 1 : i − 1 ) p(x_i|x_{1:i-1}) p(xix1:i1),而在仅编码器模型中,我们取 p ( x i ∣ x 1 : L ) p(x_i|x_{1:L}) p(xix1:L) 对于上下文表征函数 ϕ \phi ϕ 也是如此。

为了方便后文对目标函数描述,我们这里将从 x 1 : L x_{1:L} x1:L 生成 x ~ 1 : L \tilde{x}_{1:L} x~1:L 的掩码函数记为 A ( x ~ 1 : L ∣ x 1 : L ) A(\tilde{x}_{1:L}|x_{1:L}) A(x~1:Lx1:L),其定义如下:
对于任意一个选定要替换token x i x_i xi

  • 以0.8的概率将该词元替换为 [MASK];

  • 以0.1的概率设置为原本的词元 x i x_i xi

  • 以0.1的概率设置为从词汇表 V \mathcal{V} V 中随机选择的一个词元。

这样做的原因是由于在预训练(Pre-train) 期间,输入到BERT都是带有 [MASK] 的序列;而在精调(Fine-tuning) 期间,我们会输入没有 [MASK] 的句子,而这将导致分布发生变化。

(3)下一句预测

在很多下游任务(如问答(Question Answering,QA)、自然语言推理(Natural Language Inference,NLI))是基于两个句子之间关系的理解的,而这个能力在语言建模的时候并没有直接建立。因此,为了使训练所得的语言模型能够理解句子之间的关系,我们采用预测下一个句子的预训练方式,基于任何单一语言的语料,来对语言模型进行预训练。

为此,我们给如BERT拼接好的词元序列(语句对)

[[CLS],the,mouse,ate,the,cheese,[SEP],it,was,full]
  • 1

让BERT给出 [SEP] 后的句子是否是**[SEP]**前句子的下一个句子。这种方法虽然简单,但对于QA和NLI类任务非常有效果。

在训练数据集构建方面,我们以50%的概率选择句子B是句子A的下一句(标记为IsNext),以50%的概率选择句子B不是句子A的下一句(标记为NotNext),这样,建立类似如下的数据条目

[[CLS],Sentence A,[SEP],Sentence B], IsNext
[[CLS],Sentence A,[SEP],Sentence B], NotNext
  • 1
  • 2
(4)训练目标

BERT的训练目标是:

O ( θ ) = ∑ ( x 1 : L , c ) ∈ D E I , x ~ 1 : L ∼ A ( ⋅ ∣ x 1 : L , I ) [ ∑ i ∈ I − l o g p θ ( x ~ i ∣ x 1 : L ) ] − l o g p ( c ∣ ϕ ( x 1 : L ) 1 ) \mathcal{O}(\theta) = \sum_{(x_{1:L},c)\in \mathcal{D}} \mathbb{E}_{I,\tilde{x}_{1:L}\sim A(\cdot|x_{1:L},I)} \left[ \sum_{i\in I} -\mathrm{log}p_{\theta}(\tilde{x}_i|x_{1:L}) \right] - \mathrm{log}p(c|\phi(x_{1:L})_1) O(θ)=(x1:L,c)DEI,x~1:LA(x1:L,I)[iIlogpθ(x~ix1:L)]logp(cϕ(x1:L)1)

该式第一部分为掩码语言模型训练目标函数,第二部分为下一句预测训练目标函数,通过上式统一为一个训练目标函数。

(5)RoBERTa

RoBERTa在BERT的基础上进行了以下改进:

  • 删除了训练目标中下一句预测部分的损失函数(发现它没有帮助,且去除后对下游任务的性能有少量提升)。
  • 使用了更多数据训练(在BOOKCORPUS的基础上,添加了CC-NEWS、OPENWEBTEXT以及STORIES数据集,将训练数据集规模从16GB文本扩展至160GB文本 )。

通过训练方法和训练数据的调整,RoBERTa达到了以下效果:

  • 在预训练步数更少(最多到500K)的前提下,性能超越了与BERTLARGE以及XLNetLARGE接近的性能水平;

  • RoBERTa在各种基准上显著提高了BERT的准确性(例如,在SQuAD上由81.8到89.4)。

6.1.3 编码器-解码器(Encoder-Decoder)模型

在大模型架构中,我们已经介绍过编码器-解码器架构的模型实际上是在某种程度上融合了上述两个架构的优势和特点。基于此,编码器-解码器的运行过程就自然而然分为两个过程:

  • 采用类似仅编码器的方式对输入进行双向编码处理

  • 采用类似仅解码器的方式进行自回归解码输出

编码器-解码器架构的典型模型包括BART、T5等,下面对这两个典型模型的训练进行介绍。

6.1.3.1 BART(Bidirectional Auto-Regressive Transformers)

BART[2]是基于Transformer的编码器-解码器模型,是一种基于 sequence-to-sequence模型架构建立的降噪自编码器,并且可以应用到种类非常宽广任务上,其架构与BERT和GPT的对比如下图所示。BART模型融合了双向编码和自回归Transformers两类架构的优势:

  • 一方面,不同于仅编码器架构的BERT模型,BART中Encoder的输入与Decoder的输出之间不存在对齐关系,输入序列可以使用任意的噪声进行变换处理,相比之下,BERT则由于每个[MASK] token都是独立预测的,需要输出与输入对齐,因而不具备此方面能力。

  • 另一方面,由于BART的编码器部分可以同时获取和利用整个输入序列的上下文,相比GPT能够更好地学习双向关联关系。
    BART 模型架构

对于BART模型的预训练包括两个阶段:

(1)对文本添加任意噪声,形成有噪声的文本;

(2)采用训练一个sequence-to-sequence模型,通过处理添加噪声后的文本,重建原始文本。

在文本噪声化处理方面,BART采用了如下图所示变换,与仅编码器架构类似,记为 A ( x ~ 1 : L ∣ x 1 : L ) A(\tilde{x}_{1:L}|x_{1:L}) A(x~1:Lx1:L)

  • 词元掩码(Token Masking):与BERT[1]中做法相同,随机选择token,并替换为 [MASK]

  • 词元删除(Token Deletion):随机选择token,并删除。

  • 文本充填(Text Infilling):采用多个文本段,文本段长度从泊松分布( λ = 3 \lambda=3 λ=3)中抽取,采样到的文本段替换为一个 [MASK],其中文本段长度为0的情况对应于插入一个 [MASK]

  • 语句顺序变换(Sentence Permutation):将一个文档拆分成多个整句,将这些整句的排列顺序进行随机变换。

  • 文档旋转(Document Rotation):任意选定文档中的一个词元,将该词元之后的部分移到文档开始位置之前,拼接成新的文档。这种训练任务能够训练模型识别文档的开头。
    BART 训练文本处理
    在模型预训练目标方面,BART通过优化重建损失——即解码器输出与原始文档之间的交叉熵实现,即
    L = E q ϕ ( z ∣ x ) l o g   p θ ( y ∣ z ) \mathcal{L} = \mathbb{E}_{q_{\phi}(z|x)} \mathrm{log}\,p_{\theta}(y|z) L=Eqϕ(zx)logpθ(yz)

6.1.3.2 T5 (Text-to-Text Transfer Transformer)

T5是另一种基于Transformer的编码器-解码器模型。首先为什么叫T5模型,因为是T5是Text-to-Text Transfer Transformer的简写。Transfer来自Transfer Learning,预训练模型大体在这范畴。那么 Text-to-Text指的是什么呢?这就是作者在这提出的一个统一框架,将所有 NLP 任务都转化成 Text-to-Text (文本到文本)任务[3],通过这样的方式就能将 NLP 任务都转换成 Text-to-Text 形式,也就可以用同样的模型,同样的损失函数,同样的训练过程,同样的解码过程来完成所有 NLP 任务,如下图所示。
T5 自然语言处理任务统一训练框架
例如,英德翻译,只需将训练数据集的输入部分前加上“translate English to German(给我从英语翻译成德语)” 就行。假设需要翻译"That is good",那么写成 “translate English to German:That is good.” 输入模型,之后就可以直接输出德语翻译 “Das ist gut.”。文章发在arxiv上是2019年,距离2022年InstructGPT论文[4]发于arxiv还要早3年,但其实这里面已经有了Instruct的影子了,即通过前缀Instruct来统一多种任务。

T5作为一个单一模型完成多种自然语言任务,在预训练方面,文章作者团队尝试了多种无监督目标,尝试的目标及实验设计过程如下图所示。
T5 预训练目标
T5预训练目标探索过程
在训练过程中,我们从无标签的文本数据集中抽取一段文本,处理为噪声化的文本(例如BART中的处理操作),然后使模型预测其对应的目标输出。通过实验,作者发现“i.i.d. noise, replace spans”的效果最好。

事实上,这篇工作的 idea 创新也不大,包括架构、训练方法等,它最重要作用是给整个 NLP 预训练模型领域提供了一个通用框架,把所有任务都转化成一种形式,正如论文里所说的

introducing a unified framework that converts every language problem into a text-to-text format.

6.2 优化算法

在上面的部分我们讨论了语言模型训练的目标,亦即目标函数。在本节,我们将对如何对上述目标进行寻优进行讨论。为了简单起见,我们以自回归语言模型为例:

O ( θ ) = ∑ x ∈ D − l o g p θ ( x ) \mathcal{O}(\theta) = \sum_{x\in \mathcal{D}} -\mathrm{log} p_{\theta}(x) O(θ)=xDlogpθ(x)

6.2.1 随机梯度下降(SGD)

最简单的优化算法是用小批量进行随机梯度下降,参数更新公式:

θ t ← θ t − 1 − η 1 ∣ B t ∣ ∑ x ∈ B t ∇ θ ( − l o g p θ ( x ) ) \theta_t \leftarrow \theta_{t-1} - \eta \frac{1}{|B_t|} \sum_{x\in B_t} \nabla_\theta (-\mathrm{log} p_\theta(x)) θtθt1ηBt1xBtθ(logpθ(x))

其中:

  • η \eta η 为学习率

  • B t B_t Bt为批量大小

在参数调整上,针对大语言模型,由于稳定性问题,学习率和一些直觉(例如,二阶方法)仍然有用,但要使大语言模型有效训练,还需要克服许多其他独特的挑战。

6.2.2 Adaptive Moment Estimation(Adam)

Adam[5]算法主要有以下两个创新:

  1. 引入动量 m t m_t mt v t v_t vt,且均初始化为0。
  2. 参数的每个维度都有一个自适应(不同)的步长(受二阶方法启发)。

参数更新过程:

g t ← 1 ∣ B t ∣ ∑ x ∈ B t ∇ θ ( − l o g p θ ( x ) ) m t ← β 1 m t − 1 + ( 1 − β 1 ) g t v t ← β 2 v t − 1 + ( 1 − β 2 ) g t 2 m ^ t ← m t 1 − β 1 t v ^ t ← v t 1 − β 2 t θ t ← θ t − 1 − η m ^ t v ^ t + ϵ gt1|Bt|xBtθ(logpθ(x))mtβ1mt1+(1β1)gtvtβ2vt1+(1β2)g2tˆmtmt1βt1ˆvtvt1βt2θtθt1ηˆmtˆvt+ϵ

gtmtvtm^tv^tθtBt1xBtθ(logpθ(x))β1mt1+(1β1)gtβ2vt1+(1β2)gt21β1tmt1β2tvtθt1ηv^t +ϵm^t

其中:

  • β 1 \beta_1 β1 β 2 \beta_2 β2 分别为一阶矩估计的指数衰减率和二阶矩估计的指数衰减率,通常分别取值为0.9和0.999(Pytorch中torch.optim.Adam的默认值)

  • ϵ \epsilon ϵ 为保证计算稳定性的分母添加项,通常取值为 1e-8

尽管相比单纯随机梯度下降,Adam能够在一些问题上达到更好的收敛效果,但也应看到其存储从2倍的模型参数( θ t , g t \theta_t, g_t θt,gt)增加到了4倍( θ t , g t , m t , v t \theta_t, g_t, m_t, v_t θt,gt,mt,vt )。

6.2.3 AdaFactor

AdaFactor[6]是一种为减少存储占用的优化算法。它有如下特点:

  • 不储存 m t , v t m_t, v_t mt,vt 这样的 O ( m × n ) O(m\times n) O(m×n)矩阵,而是存储行和列的和 O ( m + n ) O(m+n) O(m+n)并重构矩阵
  • 去除动量
  • 被用来训练T5
  • AdaFactor可能使训练变得困难[7]

参数更新过程包括权重矩阵的更新和权重向量的更新,具体如下图所示:
AdaFactor 参数更新过程

6.2.4 混合精度训练

混合精度训练[8]是另一种减少存储的方法:

  • 默认的精度是:FP32(32位浮点),这是多数主流深度学习框架(如Tensorflow(tf.float32)、Pytorch(torch.float32)等)默认使用的精度。
  • 其他可选精度:FP16(16位浮点),这个精度在多数主流深度学习框架也能支持,但会丢失精度。
  • 除上述精度外,现在使用HuggingFace的Transformers库还可以使用FP8来加载模型,以进一步削减内存占用,以支撑使用较少的GPU实现更大规模模型的训练,但目前对于直接使用Pytorch似乎还不支持。
  • 可选解决方案:将主权重存储在FP32中,并在FP16中执行其他所有操作。
  • 损失缩放:按比例放大损失,以避免梯度数值太小。

6.2.5 学习率

通常情况下,深度学习中的学习率会随着时间的推移而衰减。对于Transformer模型,我们实际上需要通过预热(warmup)提高学习率。一个潜在的原因是防止层归一化的梯度消失,导致使用Adam优化器训练时不稳定。

参考资料

[1] Devlin, Jacob et al. “[BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding](1810.04805.pdf (arxiv.org)).” North American Chapter of the Association for Computational Linguistics (2019).

[2] Lewis, Mike, et al. “[BART: Denoising Sequence-to-Sequence Pre-Training for Natural Language Generation, Translation, and Comprehension.](1910.13461.pdf (arxiv.org))” Proceedings of the 58th Annual Meeting of the Association for Computational Linguistics, Association for Computational Linguistics, 2020.

[3] T5 模型:NLP Text-to-Text 预训练模型超大规模探索 - 知乎 (zhihu.com)

[4] Training language models to follow instructions with human feedback (arxiv.org)

[5] Adam: A Method for Stochastic Optimization (arxiv.org)

[6] Adafactor: Adaptive Learning Rates with Sublinear Memory Cost (arxiv.org)

[7] [Paper] Adafactor: Adaptive Learning Rates with Sublinear Memory Cost · Veritable Tech Blog

[8] [1710.03740] Mixed Precision Training (arxiv.org)

[9] 第6章 模型训练 (datawhalechina.github.io)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/904149
推荐阅读
相关标签
  

闽ICP备14008679号