AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


使用和微调预训练transformers
发布日期:2024-05-03 08:37:48 浏览次数: 1786


使用和微调预训练的大型语言模型(LLMs)的三种常见方法包括:基于特征的方法、上下文提示和更新模型参数的子集。


首先,大多数预训练的LLMs或语言转换器可以在无需进一步微调的情况下使用。例如,我们可以使用特征为基础的方法,使用预训练的转换器生成的嵌入来训练一个新的下游模型,如线性分类器。其次,我们可以在输入中展示新任务的示例,这意味着我们可以直接展示预期的结果,而无需对模型进行任何更新或学习。这个概念也被称为提示(prompting)。最后,也可以微调所有或只微调一小部分参数以实现期望的结果。

01、

使用transformers进行分类任务


让我们从传统的方法开始利用预训练的transformers:训练另一个模型以提取特征嵌入,微调输出层和微调所有层。

基于特征的方法


在基于特征的方法中,我们加载预训练模型并将其“冻结”,这意味着我们不会更新任何预训练模型的参数。相反,我们将模型视为我们应用于新数据集的特征提取器。然后,我们在这些嵌入上训练一个下游模型。这个下游模型可以是我们喜欢的任何模型(随机森林、XGBoost等),但是线性分类器通常表现最好。这可能是因为像BERT、GPT、Llama、Mistral等预训练的transformers已经从输入数据中提取了高质量、信息丰富的特征。这些特征嵌入通常捕获了复杂的关系和模式,使得线性分类器能够有效地将数据分离成不同的类别。


此外,像逻辑回归模型和支持向量机这样的线性分类器往往具有强大的正则化特性。这些正则化特性有助于在使用预训练transformers生成的高维特征空间时防止过拟合。这种基于特征的方法是最有效的方法,因为它根本不需要更新transformers。最后,当为多个训练周期训练分类器时,可以预先计算给定训练数据集的嵌入(因为它们不会改变)。



图1说明了LLMs通常是如何创建并用于下游任务的微调的。在这里,一个在一般文本语料库上训练的预训练模型被微调以执行诸如德语到英语翻译之类的任务。

微调


微调预训练LLMs的传统方法包括仅更新输出层(我们将其称为微调I)和更新所有层(我们将其称为微调II)。


微调I类似于前面描述的基于特征的方法,但是它在LLM本身添加了一个或多个输出层。LLM的主干保持冻结,我们只更新这些新层的模型参数。由于我们不需要通过整个网络进行反向传播,因此这种方法在吞吐量和内存需求方面相对高效。在微调II中,我们加载模型并添加一个或多个输出层,类似于微调I。然而,与仅通过最后几层反向传播不同,我们通过反向传播更新所有层,使得这是最昂贵的方法。虽然这种方法的计算成本比基于特征的方法和微调I方法更高,但它通常会导致更好的建模或预测性能。对于更专业的领域特定数据集,这一点尤其如此。


图2总结了目前描述的三种方法。


除此之外还提供了关于这些方法的训练效率的经验法则。由于微调II涉及更新的层数和参数比微调I更多,所以微调II的反向传播成本更高。出于类似的原因,微调II比更简单的基于特征的方法成本更高。

02、

上下文学习、索引和提示调整


LLMs如GPT-2和GPT-3推广了上下文学习的概念,通常在这个上下文中被称为零样本或少样本学习,如图3所示。



如图3所示,上下文学习旨在在输入或提示中提供任务的上下文或示例,使模型能够推断出期望的行为并生成适当的响应。这种方法利用了模型在预训练期间从大量数据中学习的能力,这些数据包括各种任务和背景。


注意:少样本学习的定义,被认为是基于上下文学习的方法。


例如,假设我们想要使用大规模预训练的语言模型(如GPT-3)进行少样本的德语-英语翻译。为了做到这一点,我们提供一些德语-英语翻译的示例,以帮助模型理解所需的任务,如下所示:


将以下德语句子翻译成英语:
例1:
德语:“Ich liebe Pfannkuchen。”
英语:“I love pancakes.”
例2:
德语:“Das Wetter ist heute schön。”
英语:“The weather is nice today.”
翻译这句话:
德语:“Wo ist die nächste Bushaltestelle?”


一般来说,上下文学习在某些任务或特定数据集上的表现不如微调,因为它依赖于预训练模型从其训练数据中推广而不进一步调整其参数以适应手头的特定任务。


然而,上下文学习也有其优势。当微调的标记数据有限或不可用时,它可能特别有用。它还可以使我们在不直接访问模型或只通过UI或API与模型进行交互的情况下,快速尝试不同的任务。与此相关的是上下文学习的概念,即硬提示调整,其中硬指的是输入标记的不可微性质。之前描述的微调方法更新模型参数以更好地执行手头的任务,而硬提示调整旨在优化提示本身以实现更好的性能。提示调整不会修改模型参数,但可能涉及使用较小的标记数据集来确定特定任务的最佳提示形式。例如,为了改进前面的德语-英语翻译任务的提示,我们可以尝试以下三种提示变体:


• “将德语'{german_sentence}'翻译成英语:{english_translation}”
• “德语:'{german_sentence}' | 英语:{english_translation}”
• “从德语到英语:'{german_sentence}' -> {english_translation}”


提示调整是参数微调的资源高效替代方案。然而,它的性能通常不如完全模型微调好,因为它不会为特定任务更新模型的参数,这可能限制了其适应任务特定细微差别的能力。此外,提示调整可能需要人类参与,以比较不同提示的质量或使用另一种类似的方法来实现。这通常被称为硬提示,因为再次,输入标记不可微。此外,还存在其他方法,建议使用另一个LLM进行自动提示生成和评估。


利用纯上下文学习的另一种方法是LLM索引,如图4所示。



在LLMs的上下文中,我们可以将索引视为一种基于上下文学习的变通方法,它允许我们将LLMs连接到现有的数据源。在图4中,一个索引模块将文档或网站解析成较小的块。这些块被嵌入为可以存储在向量数据库中的向量。当用户提交查询时,索引模块计算嵌入查询与数据库中每个向量之间的向量相似度。最后,索引模块检索与查询最相似的前k个嵌入以合成响应。


LLM索引通常被用作将LLMs连接到现有数据源的框架或过程的总称。这个框架的一个具体例子是检索增强生成(RAG)。RAG涉及将LLM与检索系统结合起来,以增强模型生成响应的能力。



03、

参数高效微调


近年来,许多方法已被开发出来更有效地调整预训练的转换器以适应新的目标任务。这些方法通常被称为参数高效微调,目前在时间线上最流行的方法总结在图5中。



与前面讨论的硬提示方法相比,软提示策略优化了提示的嵌入版本。虽然在硬提示调整中我们修改了离散输入标记,但在软提示调整中我们使用可训练的参数张量。


软提示调整


软提示调整的想法是在嵌入的查询标记之前添加一个可训练的参数张量(“软提示”)。然后,通过梯度下降调整前置张量以改进在目标数据集上的建模性能。在类似Python的伪代码中,软提示调整可以描述为
x = EmbeddingLayer(input_ids)
x = concatenate([soft_prompt_tensor, x],
dim=seq_len)
output = model(x)
其中soft_prompt_tensor具有与嵌入层生成的嵌入相同的特征维度。因此,修改后的输入矩阵具有额外的行(就像它将原始输入序列扩展了额外的标记一样,使其变得更长)。


前缀调整


另一种流行的提示调整方法是前缀调整。前缀调整类似于软提示调整,但在前缀调整中,我们将可训练张量(软提示)添加到每个转换器块中,而不仅仅是嵌入的输入,这可以稳定训练。前缀调整的实现如下伪代码所示:


def transformer_block_with_prefix(x):
➊ soft_prompt = FullyConnectedLayers( # Prefix
soft_prompt) # Prefix
# 2:
➋ x = concatenate([soft_prompt, x], # Prefix
dim=seq_len) # Prefix
➌ x = SelfAttention(x)
x = LayerNorm(x + residual)
residual = x
x = FullyConnectedLayers(x)
x = LayerNorm(x + residual)
return x 


目录1:修改为前缀调整的转换器块


让我们将目录1分为三个主要部分:实施软提示,将软提示(前缀)与输入连接起来,并实现转换器块的其余部分。首先,将软提示处理为一组全连接层 ➊。其次,将转换后的软提示与主要输入x ➋ 进行连接。它们连接的维度由seq_len表示,指的是序列长度维度。第三,代码的后续行 ➌ 描述了转换器块中的标准操作,包括自注意、层归一化和围绕残差连接的前馈神经网络层。


正如目录1所示,前缀调整通过添加可训练的软提示修改了转换器块。图6进一步说明了普通的转换器块与前缀调整转换器块之间的区别。



例如,如果A=25且B=50,则ΔW的大小为25×50=1,250。如果h=5,则WA有125个参数,WB有250个参数,两个矩阵合并后总共只有125+250=375个参数。


学习了权重更新矩阵后,我们可以编写完全连接层的矩阵乘法,如下所示:


def lora_forward_matmul(x):
h = x . W # Regular matrix multiplication
h += x . (W_A . W_B) * scalar
return h


目录2:使用LoRA的矩阵乘法。

在目录2中,标量是一个调整组合结果的幅度的缩放因子(原始模型输出加上低秩调整)。这平衡了预训练模型的知识和新任务特定调整之间的关系。根据引入LoRA方法的原始论文,使用LoRA的模型在几个任务特定基准测试中表现略好于使用前面描述的适配器方法的模型。通常,LoRA的表现甚至比使用先前描述的Finetuning II方法微调的模型更好。


04、

通过人类反馈进行强化学习


前面的部分侧重于通过微调使LLMs的建模性能更好的方法。现在,我们要转变方向,就是如何通过微调来改进LLMs的建模性能?
为了适应或微调LLM以适应新的目标领域或任务,传统的方法是使用带标签的目标数据的监督方法。例如,使用微调II,可以使用一个包含带情感标签的文本的数据集,如积极、中性和消极,来调整预训练的LLM,以进行情感分类等目标任务。


监督微调是训练LLM的基础步骤。一个额外的、更先进的步骤是使用人类反馈的强化学习(RLHF),可以进一步提高模型与人类偏好的一致性。例如,ChatGPT及其前身InstructGPT是两个流行的预训练LLMs(GPT-3)使用RLHF进行微调的示例。


在RLHF中,预训练模型通过结合监督学习和强化学习的组合进行微调。这种方法由最初的ChatGPT模型推广,该模型又基于InstructGPT。通过让人类对不同的模型输出进行排名或评分来收集人类反馈,提供奖励信号。收集的奖励标签可用于训练一个奖励模型,然后用于引导LLMs对人类偏好的适应。奖励模型通过监督学习进行学习,通常使用预训练LLM作为基础模型,然后用于通过额外的微调将预训练LLM调整到人类偏好。这个额外的微调阶段的训练使用了一种称为近端策略优化的强化学习的变体。


RLHF使用奖励模型而不是直接将人类反馈用于训练预训练模型,因为让人类参与学习过程会造成瓶颈,因为我们无法实时获得反馈。


05、

调整预训练语言模型


虽然微调预训练LLMs的所有层仍然是适应新目标任务的黄金标准,但存在多种有效的替代方法可以利用预训练转换器。例如,我们可以有效地将LLMs应用到新任务中,同时通过使用基于特征的方法、上下文学习或参数高效微调技术来最小化计算和标记成本。我们已经看到,这些方法可以让我们在不同的任务和数据限制下最大限度地利用预训练LLMs。


写在最后


我们探讨了使用人类反馈的强化学习技术如何通过与监督学习相结合来改进预训练LLMs的性能。这些方法中的每一种都有其自己的权衡和适用范围,因此选择合适的方法取决于任务的性质、可用的资源和所需的性能水平。




53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询