參數(shù)高效微調(diào)PEFT(一)快速入門(mén)BitFit、Prompt Tuning、Prefix Tuning —— peft教程與實(shí)踐
概述
PEFT高效调参项目实战是一系列技术文章,旨在提升深度学习领域中预训练语言模型的参数效率。本文介绍了参数高效微调(PEFT)技术,针对预训练语言模型结合下游任务进行微调时遇到的算力需求高、存储成本大及模型多样性损失问题,PEFT技术通过微调模型的一小部分参数,达到提升模型性能的目的,同时显著降低计算和存储成本。文章通过全量微调Bloom模型生成式问答机器人的案例,展示如何使用PEFT方法,如BitFit和Prefix Tuning等,实现轻量级微调。同时,文章还讨论了BitFit方法的原理与实现,以及如何通过Prefix Tuning适应不同任务需求,提供了详细的代码示例和步骤说明,帮助读者理解并实践PEFT技术在实际项目中的应用。此实战指南为NLP领域在模型微调方向提供了高效且实用的方法,推动了技术在实际场景中的落地与优化。
2. 全量微调Bloom模型:生成式问答机器人案例
2.1 生成式问答机器人概述
生成式问答机器人需要模型能够根据输入的指令生成相应的答案。以Bloom模型为例,该模型是澜舟科技开源的预训练生成模型,特别适用于中文任务。
2.1.1 加载数据集与预处理优化
首先,加载问题-答案对数据集,并进行预处理,包括指令、输入文本和期望输出的整合以及特殊标记符的添加:
from datasets import Dataset
from transformers import AutoTokenizer, AutoModelForCausalLM
ds = Dataset.load_from_disk("alpaca_data_zh")
ds = ds.map(lambda x: {'instruction': x['instruction'], 'input': x['input'], 'output': x['output']}, remove_columns=ds.column_names)
ds = ds.map(lambda x: {'text': f'Human: {x["instruction"]} Human: {x["input"]} Assistant: {x["output"]}'}, remove_columns=['instruction', 'input'])
tokenizer = AutoTokenizer.from_pretrained("langboat/bloom-389m-zh")
ds = ds.map(lambda x: tokenizer(x["text"], truncation=True, max_length=256, padding="max_length", return_tensors="pt"), batched=True)
ds.set_format("torch", columns=["input_ids", "attention_mask"])
2.1.2 创建模型与配置训练器
接着,使用预处理后的数据集创建模型,并配置训练参数和训练器:
model = AutoModelForCausalLM.from_pretrained("langboat/bloom-389m-zh")
tokenizer = AutoTokenizer.from_pretrained("langboat/bloom-389m-zh")
args = TrainingArguments(
output_dir="./chatbot",
per_device_train_batch_size=1,
logging_steps=100,
num_train_epochs=1
)
trainer = Trainer(
model=model,
args=args,
train_dataset=ds,
data_collator=DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False)
)
2.1.3 模型训练及推理
训练模型并进行推理,验证模型性能:
trainer.train()
pipe = pipeline("text-generation", model=model, tokenizer=tokenizer, device=0)
input = "Human: 考试有哪些技巧?\n"
predictions = pipe(input, max_length=256, do_sample=True)
3. BitFit概述与轻量微调Bloom模型实现
3.1 BitFit方法概述与原理
BitFit通过在Bert模型中仅更新bias参数或部分bias参数,实现微调过程中的参数效率。这种方法显著减少了训练所需资源,同时保持了模型性能。
3.2 BitFit在Bloom模型中的实现
考虑到Bloom模型的特性,我们进行如下步骤实现BitFit方法:
-
加载预训练模型和tokenizer
-
初始化模型参数:我们只更新bias参数,非bias参数设置为不可训练:
model = AutoModelForCausalLM.from_pretrained("langboat/bloom-389m-zh", low_cpu_mem_usage=True)
for name, param in model.named_parameters():
if "bias" not in name:
param.requires_grad = False
4. Prefix Tuning概述与应用
4.1 Prefix Tuning方法原理
Prefix Tuning通过在生成式模型前添加可训练的前缀(Prefix)来适应特定任务,进一步提高微调效率。前缀可以引导模型生成与任务相关的输出,且可以灵活调整以适应不同任务需求。
4.2 Prefix Tuning在不同模型架构中的应用
针对自回归和编码器-解码器架构模型,前缀的添加方式有所不同:
- 自回归架构模型:在句子的开头添加前缀,调整模型对输入的感知,引导生成更符合任务需求的输出。
- 编码器-解码器架构模型:在输入端和输出端分别添加前缀,分别影响编码和解码过程,实现更精细的控制。
实例演示与代码示例
5.1 BitFit轻量微调Bloom模型步骤
通过上述步骤,完成BitFit方法下的Bloom模型轻量级微调。
5.2 使用peft库进行微调的简要介绍
尽管peft库未直接支持BitFit,但可以结合其特性实现类似功能,进一步优化模型微调过程。
结论与后续探索
PEFT技术通过优化微调策略,显著降低了模型微调的资源消耗,为大规模预训练模型的下游任务应用提供了高效途径。未来,随着PEFT方法的不断发展,将拓展至更多模型架构和任务场景,推动NLP领域向更高效、更个性化的应用方向发展。
共同學(xué)習(xí),寫(xiě)下你的評(píng)論
評(píng)論加載中...
作者其他優(yōu)質(zhì)文章