大模型基础理论学习笔记——大模型适配

本文目录

  • 7.大模型适配
    • 7.1 大模型适配基础要素
    • 7.2 当前主流大模型适配方法
      • 7.2.1 探针方法(Probing)
        • (1)探针方法介绍
        • (2)基于probing的大模型适配
      • 7.2.2 微调方法(Fine-tuning)
        • (1)指令微调方法(Instruction fine-tuning)
      • 7.2.3 轻量级微调(Lightweight Fine-tuning)
        • (1)提示调整(Prompt Tuning)
        • (2)前缀调整(Prefix Tuning)
        • (3)适配器调整(Adapter Tuning)
        • (4)Lightweight Fine-tuning的其他性质
  • 参考资料

7.大模型适配

对于自然语言任务,我们通过对语言模型进行预训练,例如对仅解码器架构的语言模型采用预测下一个词元的方式进行训练,对仅编码器架构的语言模型采用掩码语言模型训练及预测下一句的训练等。经过预训练的语言模型已经具备一定的语言能力,通过给出上下文已经能够完成一些下游任务。

从语言模型的训练方式来说,语言模型,例如GPT-3,通常是任务不可知的(task-agnostic)。在机器学习和人工智能的背景下,task-agnostic通常指的是一种可以在多个不同任务上运行,而不需要对每个单独任务进行特别调整或训练的方法。这种方法的优点在于模型具有广泛的适用性,但也带来了一些挑战。

然而,仅基于预训练并不能使语言模型很好地完成全部的下游任务,在处理下游任务时,下游任务与语言模型的训练数据(例如,Pile数据集)可能在格式和主题上有所不同,或者需要随时间更新新知识

(1)格式的差异:下游任务与语言模型预训练过程可能存在数据格式上的差异,例如:

  • 自然语言推理(NLI):这个下游任务要求两个句子的比较并产生单一的二进制输出(如情感分析等任务),这与语言模型通常用于预测下一个词元或填充 [MASK] 标记的任务截然不同。

  • 仅编码器架构模型(如BERT)预训练与下游任务的差异:在仅编码器架构模型预训练,如掩码语言模型任务训练中,使用了 [MASK] 标记,而在许多下游任务中并没有这样的标记。尽管预训练过程中,在训练方法的设计上,通过掩码函数 A ( x ~ 1 : L ∣ x 1 : L ) A(\tilde{x}_{1:L}|x_{1:L}) A(x~1:Lx1:L) 的设计均衡了 [MASK] 掩码和随机词出现的概率分布,但面对具体的下游任务,仍然需要进行精调(Fine-tuning)。

(2)主题的变化:语言模型可能需要能够适配处理各种不同的主题。下游任务可能集中在特定的主题或领域上,例如医疗记录分析或法律文档解析。这样的任务可能涉及专门的术语和知识,与模型的通用训练任务相去甚远,可能会超出模型的训练范围。

(3)知识的更新:随着时间的推移,新的信息和知识不断涌现,语言大模型仅经过预训练很难做到与时俱进。同时,有时下游任务可能涉及在训练期间不公开的信息。这可能需要更多特定领域的专业知识和调整。

基于上述情况,语言模型需要使用特定于任务的数据或领域知识来针对下游任务进行适配

7.1 大模型适配基础要素

大语言模型适配下游任务所需要的基础要素如下:

  • 预训练语言模型(Pre-trained Language Model):这个是我们进行适配工作的基础,它是一个已经经过预训练的语言模型,已经具备基本的语言能力,其参数我们用 θ L M \theta_{LM} θLM 表示。

  • 下游任务数据集(Downstream Task Dataset):这是大语言模型需要适配任务的训练数据,它可能是一组来自下游任务分布 P t a s k P_{task} Ptask 的样本数据,每个样本由输入x目标输出y组成,记为: ( x ( 1 ) , y ( 1 ) ) , ( x ( 2 ) , y ( 2 ) ) , … , ( x ( n ) , y ( n ) ) (x^{(1)}, y^{(1)}), (x^{(2)}, y^{(2)}),\dots, (x^{(n)}, y^{(n)}) (x(1),y(1)),(x(2),y(2)),,(x(n),y(n))

  • 适配参数(Adaptation Parameters):为了适配下游任务,我们需要找到一组参数 γ \gamma γ,它可以来自现有参数的子集或引入的新的参数。我们通过训练调整这些参数,使大语言模型特定任务上的表现更好。

  • 任务损失函数(Task Loss Function):为将大语言模型适配下游任务,我们定义一个损失函数 l t a s k l_{task} ltask,一方面用来衡量大语言模型在下游任务上的表现,另一方面,也用来训练调整上述适配参数,以使大语言模型目标任务上提升性能。

  • 优化问题(Optimization Problem):基于上述要素,对大语言模型的适配可以转化为一个优化问题,即:寻找一组适配参数 γ a d a p t \gamma_{adapt} γadapt,是的任务损失函数在整个下游任务数据集上最小化,即最小化如下目标

    L t a s k = m i n γ ∈ Γ E ( x i , y i ) ∈ P t a s k [ l t a s k ( γ , θ L M , x i , y i ) ] \mathcal{L}_{task} = min_{\gamma\in \Gamma} \mathbb{E}_{(x_i,y_i)\in P_{task}} \left[\mathcal{l}_{task}(\gamma, \theta_{LM},x_i,y_i)\right] Ltask=minγΓE(xi,yi)Ptask[ltask(γ,θLM,xi,yi)]

7.2 当前主流大模型适配方法

7.2.1 探针方法(Probing)

(1)探针方法介绍

大规模预训练表征(例如BERT、ELMo等)能够很大程度的提升很大范围的下游任务的性能,能够达到很高的准确度。然而,这些模型究竟学到了什么仍是一个值得探讨的开放科学问题。研究者围绕这一问题开展了很多研究工作,大部分的工作都采用了“探针(Probe)”的技术手段[1]

探针(Probe) 是一种监督训练的模型,它训练基于有限的表征预测一些属性(例如词性标注(parts-of-speech)),它是一种分析和理解模型内部表示的方法。目前,采用探针技术已经能够准确地基于各种表征在需要词性标注等信息的自然语言任务上达到很高的准确度。探针技术会引入一个新的参数集 Γ \Gamma Γ,用于定义Probe,这些Probe通常采用浅层前馈网络实现,如下图所示[2]。通过Probing方法,我们可以检查和理解模型的表示。
大模型基础理论学习笔记——大模型适配_第1张图片
具体而言,Probe的训练过程如下。该技术的原应用问题是神经机器翻译(Neural Machine Translation,NMT)问题。对于已训练好的NMT模型,我们固化NMT模型参数,通过该模型的编码器对输入语句进行编码,抽取出编码后得到的特征表征,以这些特征表征为输入,训练一个线性的或浅层前馈网络分类器来预测每个表征对应单词的词性,通过预测准确度来评估语言模型习得表征的质量。

对于前馈网络的选择,研究人员通过引入Control Task进行分析,发现直接采用MLP的性能并不理想,采用MLP作为Probe会使得输出的结果无关于其语言属性的表征,因而其任务准确度的提升更多的可能是依赖于Probe表达能力更强。相比之下,采用线性或双线性的Probe达到的性能更为理想

(2)基于probing的大模型适配

对于采用Probing方法进行大模型适配,通常应用于仅编码器架构模型(如BERT),但解码器模型也可以使用。在适配中,我们从语言模型的最后一层表示中训练一个Probing(或预测头)到输出(例如,类标签),即实现基于语言模型提取的特征训练一个面向下游任务的小型网络。由于预训练模型本身的权重是固定的,只对参数量很少的线性的或浅前馈网络进行训练,因此可以大大的减缓训练成本。

然而,对于预训练模型的输入,线性的或浅前馈网络需要对多少内容进行表征才可以呢?由于许多任务(例如分类)需要固定长度的输出,Transformer编码器如何将多个词元组成的序列映射到一个嵌入向量需要进一步研究。这其中,两种常见的策略是:

  1. CLS token策略:在该策略下,预训练和微调期间,我们在提示符前加上一个名为CLS的特殊token。我们使用与CLS token对应的嵌入向量作为后续用于下游任务的嵌入。例如,在BERT模型的训练中就是用了此策略,在输入序列前加上了特殊词元 [CLS] 。
  2. 平均化token策略:另一种常见方法是对L个token求平均。注意,由于每个嵌入向量都是上下文相关的并且位置依赖的,这并不使模型具有置换不变性。

7.2.2 微调方法(Fine-tuning)

微调方法(Fine-tuning)以预训练的语言模型参数 θ L M \theta_{LM} θLM 为初始值,通过使用比预训练小一个数量级的学习率进行微调训练。在微调过程中,我们对所有的语言模型参数和面向特定任务的预测头参数进行训练,并使用全新的优化器对参数进行优化。从上述介绍的微调的过程可以看出,微调需要存储针对每个下游任务专门化的大型语言模型,这可能相当昂贵。然而,微调是在更大的模型家族(即,非常具有表现力)上进行优化的,并且通常比探针方法有更好的性能。

(1)指令微调方法(Instruction fine-tuning)

零样本学习(Zero-shot learning)是指模型在训练阶段没有见过的任务或类别上进行泛化的能力。它允许模型在没有任何具体示例的情况下解释和处理全新的信息。针对零样本性能的微调是对现有模型的进一步优化,可以提高模型在未见过的任务上的表现。

然而,想要达到零样本学习能力,模型的微调过程实质上是一种指令微调(Instruction fine-tuning) 的过程。如下图所示[5],指令微调方法结合了预训练-微调提示两个范式的优点,从而实现通过监督学习提升模型在推理时响应输入的交互文本的质量。具体而言,以预训练后的语言模型为基础,在微调过程中,通过在输入文本中加入提示信息,再以具体任务的标签进行监督训练,从而提升大语言模型的上述能力。
大模型基础理论学习笔记——大模型适配_第2张图片
为了有效促进大预言模型指令微调的性能,研究者针对不同的下游任务,设计了一系列提示信息模板,具体包括面向零样本泛化任务、面向问答任务、面向情感分析任务、以及面向文章概括任务等,面向各个任务的提示信息模板如下图所示。
大模型基础理论学习笔记——大模型适配_第3张图片
采用指令微调后的模型能够具备相较未进行微调的模型更好的性能,如:

  • 零样本学习能力:与原始语言模型相比,未见任务的零样本性能得到了显著提高。这表明微调可以有效地改善模型的泛化能力。
  • 与人类对齐能力:有效的指令可以让语言模型更好地理解人类用户的需求,并产生有用、诚实、无害的反馈,使语言模型更好地与人类价值观和目标一致。

在面向与人类对齐的大语言模型指令微调中,除上述基于提示信息的监督训练过程,还包括通过人类反馈对模型进行进一步调优训练。与监督训练合并,整个训练过程如下:

  • 基于人类数据的监督训练:收集符合人类期望的示例,并对这些示例进行监督微调。

  • 基于指令采样与人类偏好收集:对于每个指令,监督微调后的语言模型输出中采样k个输出。然后收集人类对哪个采样输出最优先的反馈。同时基于此数据训练奖励函数模型

  • 基于强化学习微调语言模型:基于训练所得的奖励函数模型,通过强化学习进一步微调监督微调后的大语言模型,以最大化人类偏好奖励。

7.2.3 轻量级微调(Lightweight Fine-tuning)

轻量级微调(Lightweight Fine-Tuning) 是一种特殊的微调技术,旨在结合全面微调的表现力和更节省资源的优点。轻量级微调试图在不需要为每个任务存储完整语言模型的同时,保持与全面微调相同的表现力。具体而言,轻量级微调的一些主要方法包括:

  • 提示调整(Prompt Tuning) :通过微调模型的输入prompt提示来优化模型的表现。该方法被视为一种更灵活的微调方法,允许用户通过调整输入提示来引导模型的输出,而不是直接修改模型参数。
  • 前缀调整(Prefix Tuning) :与提示调整类似,前缀调通过添加特定前缀来调整模型的行为,从而对特定任务进行定制。
  • 适配器调整(Adapter Tuning) :适配器调整是通过在模型的隐藏层之间插入可训练的“适配器”模块来微调模型的一种方法。这些适配器模块允许模型在不改变原始预训练参数的情况下进行微调,从而降低了存储和计算的需求。

事实上,前两种微调方法的可行得益于大语言模型对输入提示的敏感。

(1)提示调整(Prompt Tuning)

提示调整(Prompt Tuning) 是一种特殊的微调技术,多用于文本分类任务。提示调整的灵感来源于推理为基础的自适应提示设计/工程(Prompt design/Prompt engineering)。提示调整专注于优化输入提示,而不是改变模型的内部参数,如下图所示。
大模型基础理论学习笔记——大模型适配_第4张图片
如图所示,模型调整方法需要为每一个下游任务均保存整个预训练模型,而提示调整方法则仅需要为每一个下游任务保存很小的任务绑定的提示,并且可以支持基于原始预训练模型的混合任务推理。在具体训练实现方面,提示调整通过在输入前添加多个可学习的、连续的标记嵌入实现,具体而言,考虑一个由 n n n 个词元构成的输入序列 { x 1 , x 2 , … , x n } \{x_1,x_2,\dots,x_n\} {x1,x2,,xn},通过提示调整方法进行轻量级微调过程如下[6]

  • 以基于T5模型的文本分类任务为例,T5模型首先对输入词元序列进行嵌入,得到矩阵 X e ∈ R n × e X_e\in \mathbb{R}^{n\times e} XeRn×e,其中 e e e 是嵌入空间维度。

  • 使用可以训练的提示信息(称为软提示,Soft-Prompt,记为 P e ∈ R p × e P_e\in \mathbb{R}^{p\times e} PeRp×e)与该嵌入拼接,得到拼接后的矩阵 [ P e ; X e ] ∈ R ( p + n ) × e [P_e;X_e]\in \mathbb{R}^{(p+n)\times e} [Pe;Xe]R(p+n)×e

  • 该拼接矩阵按照原过程传入编码器-解码器模型。

  • 在优化网络参数时,固定预训练大语言模型参数 θ \theta θ,通过最大化概率 P r θ ; θ P ( Y ∣ [ P e ; X e ] ) Pr_{\theta;\theta_P}(Y|[P_e;X_e]) Prθ;θP(Y[Pe;Xe]),并进更新软提示参数 θ P \theta_P θP 实现网络参数的更新。其中, Y Y Y 是类别标签词元序列(T5将所有自然语言处理问题均考虑为文本生成问题)。

随着冻结语言模型的规模增加,提示调整的性能变得越来越有竞争力,甚至可以与全面微调(也称为“模型调整”)相媲美。这表明,即使在不改变预训练参数的情况下,也可以通过调整输入提示来获得出色的性能。

然而,上述过程仍存在两点挑战:

  • 由于输入长度有限(由Transformer架构的特征导致),可调参数数量有限;

  • 输入嵌入对于模型输出距离太远,对模型输出的影响过于间接。

为解决上述挑战,更进一步地,研究者采用深度提示调整方法,在每一层添加可训练提示,如下图所示[7]
大模型基础理论学习笔记——大模型适配_第5张图片
在初始化策略方面,提示调整涉及不同的初始化策略,如:

  • 随机词汇词嵌入(Embedding of random vocab words):选择随机的词汇作为嵌入。
  • 类标签词嵌入(Embedding of class label words):使用与分类标签相关的词汇进行嵌入。
  • 随机初始化(Random init):这种方法通常效果不佳,不推荐使用。
(2)前缀调整(Prefix Tuning)

前缀调整(Prefix Tuning) 是一种特别设计用于语言生成任务的微调方法,已在BART和GPT-2模型上进行了实现。

考虑输入序列 x x x 和输出序列 y y y,记 z = [ x ; y ] z=[x;y] z=[x;y] 是二者的拼接, X i d x X_{idx} Xidx Y i d x Y_{idx} Yidx 分别为 对用于序列 x x x 和序列 y y y 的下表索引。记输入步 i i i 时Transformer所有层的激活输出为 h i ∈ R d h_i\in \mathbb{R}^d hiRd,其中, h i = [ h i ( 1 ) ; …   ; h i ( n ) ] h_i = [h_i^{(1)};\dots;h_i^{(n)}] hi=[hi(1);;hi(n)] 为在 i i i 输入不Transformer所有激活层输出的拼接。那么,自回归Transformer模型 p θ ( y ∣ x ) p_\theta(y|x) pθ(yx) h i h_i hi 的计算为

h i = L M ϕ ( z i , h < i ) h_i = LM_{\phi}(z_i,h_{\lt i}) hi=LMϕ(zi,h<i)

其中 h i h_i hi 的最后一层激活即为对下一个词元分布的计算

p ϕ ( z i + 1 ∣ h ≤ i ) = s o f t m a x ( W ϕ h i ( n ) ) p_{\phi}(z_{i+1}|h_{\leq i}) = softmax(W_{\phi}h_i^{(n)}) pϕ(zi+1hi)=softmax(Wϕhi(n))

前缀调整通过在 z z z 添加前缀PREFIX得到 z = [ P R E F I X ; x ; y ] z=[\mathrm{PREFIX};x;y] z=[PREFIX;x;y] 或者 z = [ P R E F I X ; x ; P R E F I X ; y ] z=[\mathrm{PREFIX};x;\mathrm{PREFIX};y] z=[PREFIX;x;PREFIX;y] 如果同时前缀编码器和解码器。记 P i d x P_{idx} Pidx 为前缀序列的索引下标, P θ P_\theta Pθ 为可训练的前缀矩阵(参数为 θ \theta θ),则自回归模型对于 h i h_i hi 的计算调整为

h i = { P θ [ i , : ] , if i ∈ P i d x L M ϕ ( z i , h < i ) , otherwise h_i = \left\{ \begin{array}{l} P_\theta[i,:], \quad \text{if} \quad i\in P_{idx} \\ LM_{\phi}(z_i,h_{\lt i}), \quad \text{otherwise} \end{array} \right. hi={Pθ[i,:],ifiPidxLMϕ(zi,h<i),otherwise

从注意力的角度看,前缀调整使用了一个广义的注意力操作定义

A t t n − o p ( Q , K , V ) = V   s o f t m a x ( K T Q d ) Attn-op(Q,K,V) = V\,softmax\left(\frac{K^TQ}{\sqrt{d}}\right) Attnop(Q,K,V)=Vsoftmax(d KTQ)

对于注意力头 i i i,前缀调整通过将可学习的权重 P ( i ) k e y ,   P ( i ) v a l u e ∈ R d × k P(i)_{key},\,P(i)_{value}\in \mathbb{R}^{d\times k} P(i)key,P(i)valueRd×k 与键和值连接,其中 d d d K , Q , V K,Q,V K,Q,V 的行数,从而计算具有较大序列长度的注意力

K p r e f i x = [ P ( i ) k e y , K ] V p r e f i x = [ P ( i ) v a l u e , V ] h e a d i = A t t n − o p ( Q , K p r e f i x , V p r e f i x ) \begin{align} K_{prefix} & = [P(i)_{key}, K] \nonumber \\ V_{prefix} & = [P(i)_{value}, V] \nonumber\\ head_i & = Attn-op(Q,K_{prefix},V_{prefix}) \nonumber \end{align} KprefixVprefixheadi=[P(i)key,K]=[P(i)value,V]=Attnop(Q,Kprefix,Vprefix)

(3)适配器调整(Adapter Tuning)

适配器调整(Adapter Tuning) 是一种微调技术,通过在每个(冻结的)Transformer层之间添加新的学习“bottleneck”层(称为适配器)来实现

具体而言,适配器调整通常是操作于序列中每个元素 x ∈ R d x\in \mathbb{R}^d xRd 的两层残差网络,其计算过程定义为

A d a p t e r ( x ) = x + W u p σ ( W d o w n x ) Adapter(x) = x + W_{up}\sigma(W_{down}x) Adapter(x)=x+Wupσ(Wdownx)

其中, W d o w n ∈ R r × d W_{down} \in \mathbb{R}^{r\times d} WdownRr×d W u p ∈ R d × r W_{up} \in \mathbb{R}^{d\times r} WupRd×r 为学习到的权重,它们将 x x x 投影到一个瓶颈维度 r r r,然后再投影回维度 d d d,上述计算过程如下图所示[8]
大模型基础理论学习笔记——大模型适配_第6张图片
从上述设计可以看出,适配器调整提供了一种灵活的微调方法,允许在不改变原始Transformer层的情况下,通过引入新的可学习层来调整模型。这种方法与提示调整和前缀调整等技术相结合,为自然语言处理任务提供了一种高效、可扩展的解决方案。

(4)Lightweight Fine-tuning的其他性质

Lightweight Fine-tuning还有如下性质:

  • Lightweight Fine-tuning的表达能力相当复杂,因为它与特定的预训练语言模型(LM)紧密相连。如果预训练LM的权重为0,则Pormpt/Prefix Tuning将不起作用。

  • 以上提到的Promt/Prefix/Adapter Tuning提供了一种实现个性化模型的方法。假设我们想为N个用户部署个性化模型,通过Prefix Tuning,我们可以存储N个前缀,每个用户一个。然后,在一个小批量内,通过在每个输入之前附加相应的用户特定前缀,可以并行运行每个用户的个性化模型。这种方法实现了用户特定的调整,同时有效地利用了并行处理能力。

  • Lightweight Fine-tuning方法的鲁棒性得到了提升,这些方法倾向于在与全面微调相比,改善分布外(out-of-distribution,OOD)的性能,例如在不同主题或领域的文本上的表现。例如,Prompt Tuning方法提高了OOD的准确性:与在SQuAD上训练并在领域外的MRQA 2019任务上测试的全面微调(模型调整)相比,Prompt Tuning方法在F1结果上表现得更好。

  • Prefix Tuning有助于提高模型在领域外(OOD)的准确性,例如在XSUM摘要任务中,其中模型在新闻文章上进行微调,并在体育(新闻到体育)或在{世界,英国,商业}文章上进行训练,并在{健康,科技}文章上进行测试(在新闻内部)。XSUM任务中使用的评估指标是ROUGE-L,这是一种基于与参考摘要匹配的长度L子序列的自动评估指标。值得注意的是,当测试数据集不是领域外分布时,Prefix Tuning的准确性通常略低于模型的全量微调。

参考资料

[1] [1909.03368] Designing and Interpreting Probes with Control Tasks (arxiv.org)

[2] [1704.03471] What do Neural Machine Translation Models Learn about Morphology? (arxiv.org)

[3] [2103.10385] GPT Understands, Too (arxiv.org)

[4] 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).

[5] [2109.01652] Finetuned Language Models Are Zero-Shot Learners (arxiv.org)

[6] [2104.08691] The Power of Scale for Parameter-Efficient Prompt Tuning (arxiv.org)

[7] [2110.07602] P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks (arxiv.org)

[8] [1902.00751] Parameter-Efficient Transfer Learning for NLP (arxiv.org)

[9] 第7章 大模型之Adaptation (datawhalechina.github.io)

你可能感兴趣的:(人工智能,学习,笔记,人工智能,自然语言处理,语言模型)