大语言模型LLM微调技术深度解析:Fine-tuning、Adapter-Tuning与Prompt Tuning的作用机制、流程及实践应用(LLM系列08)

文章目录

  • 大语言模型LLM微调技术深度解析:Fine-tuning、Adapter-Tuning与Prompt Tuning的作用机制、流程及实践应用(LLM系列08)
    • Fine-tuning
    • Adapter-Tuning
    • Prompt Tuning
    • 策略对比与应用场景

大语言模型LLM微调技术深度解析:Fine-tuning、Adapter-Tuning与Prompt Tuning的作用机制、流程及实践应用(LLM系列08)

随着诸如GPT-3、BERT等大型语言模型在自然语言处理(NLP)领域的崛起,其广泛的适用性和优秀的泛化能力已经得到了充分证明。然而,为了将这些预训练模型应用于特定任务,对其进行微调成为了不可或缺的关键环节。本文介绍Fine-tuning、Adapter-Tuning和Prompt Tuning三种核心微调策略的工作原理、执行步骤、具体流程以及在实际应用场景中的对比。

Fine-tuning

Fine-tuning,又称全面微调,是基于预训练模型进行进一步训练以适应特定任务的基本方法。以下是详细的步骤:

  1. 预训练模型加载:首先,从存储库中加载预训练好的LLM模型权重,并将其初始化至待微调的模型结构中。

  2. 任务数据准备:针对目标NLP任务收集并清洗相关数据,进行必要的预处理,例如分词、填充、标记化等操作。

  3. 模型结构调整:根据任务特点,可能需要添加分类头、序列标注层或其他特定结构,以适配特定任务的输出形式。

  4. 微调训练迭代:利用目标数据集,在保持大部分预训练参数的基础上,通过梯度下降算法更新所有参数。此阶段会降低学习率以防止过度扰动预训练模型学到的通用语言知识,并采用正则化等策略减少过拟合风险。

  5. 验证与调优:在独立的验证集上评估微调后模型的性能,根据需要进行超参数调优、早停策略或模型集成等技术提高泛化性能。

Fine-tuning虽能充分利用预训练模型的知识迁移能力,有效提升各类NLP任务的表现,但也存在一些挑战。比如,当任务数据有限时容易出现过拟合,且大量参数的更新会导致较高的计算成本和存储开销。

Fine-tuning涉及整个模型的调整,以下是一个使用Hugging Face Transformers库进行文本分类任务Fine-tuning的基本Python代码示例:

from transformers import AutoTokenizer, AutoModelForSequenceClassification, TrainingArguments, Trainer# 加载预训练模型与分词器
model_name = 'bert-base-uncased'
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2)# 准备训练数据
train_dataset = ... # 假设已准备好训练数据集
eval_dataset = ... # 同理,准备验证数据集# 设置训练参数
training_args = TrainingArguments(output_dir='./results',num_train_epochs=3,per_device_train_batch_size=16,per_device_eval_batch_size=16,warmup_steps=500,weight_decay=0.01,logging_dir='./logs',
)# 创建Trainer并开始微调
trainer = Trainer(model=model,args=training_args,train_dataset=train_dataset,eval_dataset=eval_dataset,
)trainer.train()

Adapter-Tuning

Adapter-Tuning作为一种更轻量级的微调方式,旨在解决上述问题。该方法在模型内部插入少量可训练的Adapter模块,而非修改所有参数。具体实施步骤如下:

  1. Adapter模块插入:在预训练模型的隐藏层之间插入一系列具有固定结构的轻量级Adapter层,这些Adapter通常由几个全连接层构成,具有远小于主体模型的参数数量。

  2. 冻结主模型参数:在训练过程中,保持预训练模型的所有参数不变,仅对Adapter模块进行训练。

  3. Adapter训练与评估:通过任务数据集训练Adapter模块,让它们捕捉到任务特有的模式和规律,同时不影响主模型中蕴含的通用语言理解能力。

Adapter-Tuning特别适合在多任务学习场景下应用,因为每个任务可以拥有独立的Adapter,这样就可以在一个共享主模型上实现多种任务的学习和推理,大大减少了资源消耗。

Adapter-Tuning则是只训练插入模型内部的小型Adapter模块。下面是一个使用AdapterHub库实现Adapter微调的例子:

from transformers import BertModel, BertTokenizer
from adapterhub.adapter_config import AdapterConfig
from adapters.transformers import TransformerAdapter# 加载预训练模型和分词器
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')# 创建并插入Adapter
adapter_config = AdapterConfig.load("pfeiffer")  # 选用Pfeiffer Adapter配置
adapter = TransformerAdapter(config=adapter_config, name="task_adapter")
model.add_adapter(adapter.name)# 训练Adapter
# 在此处假设有一个训练循环,仅更新adapter.parameters()而不是model.parameters()# 使用Adapter进行推理时,需要指定使用的Adapter
outputs = model(**inputs, adapter_names=["task_adapter"])

Prompt Tuning

Prompt Tuning聚焦于如何通过设计和优化提示(Prompts)来指导模型生成特定类型的答案或行为。其流程包括:

  1. 构建可学习提示:在模型输入部分设计动态的提示模板,其中包含一部分作为可训练参数的“提示tokens”。

  2. 优化提示参数:在保留主模型参数不动的前提下,仅对这部分提示参数进行梯度更新训练。

  3. 实践与评估:通过在各种任务上下文环境中插入精心设计的提示,使得模型在未经大规模改动的情况下,就能根据上下文给出针对性的响应。

Prompt Tuning在保持模型简洁性和扩展性的同时,大幅降低了对模型参数的改动程度,尤其在文本生成、问答系统、情感分析等场景中,展现了突出的应用效果。

Prompt Tuning通过优化提示tokens引导模型输出。例如,对于情感分析任务,一个简单的prompt提示词可能如下:

"这部电影非常__,我强烈推荐。 [MASK]"

在此,[MASK]位置将会被替换为不同的情感标签候选词如“好”或“差”,然后模型根据上下文预测最合适的填充值。在实践中,Prompt Tuning会将这些提示词的位置替换成可学习的向量,例如:

from transformers import T5ForConditionalGeneration, T5Tokenizer# 初始化模型和tokenizer
tokenizer = T5Tokenizer.from_pretrained("t5-base")
model = T5ForConditionalGeneration.from_pretrained("t5-base")# 添加可学习的Prompt Tokens
prompt_tokens = ["<extra_id_0>", "<extra_id_1>"]  # 假设这些是为情感分析任务创建的新令牌
model.resize_token_embeddings(len(tokenizer) + len(prompt_tokens))# 进行训练,只更新与prompt tokens相关的参数

策略对比与应用场景

综合考量,Fine-tuning适用于数据资源丰富、计算资源充足的场景,可以最大程度地挖掘模型潜能;Adapter-Tuning在节约资源、实现多任务并行处理上有显著优势,适合于资源有限但需处理多任务的情况;而Prompt Tuning因其参数效率高和模型简洁性,更适合快速适应新任务和轻量化部署场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/706375.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【vue】computed 、 watch、method 的区别

三个关键字【惰性】【缓存】【异步】 计算属性 computed 计算属性返回的值不属于 data&#xff0c;但是基于data声明的值会根据它们所依赖的数据的变化而自动重新计算惰性计算 初始化不会执行&#xff0c;只有在第一次访问时才会被计算render 函数执行时&#xff0c;会触发计算…

Gemma

Gemma 1.使用2.RAG3.LoRA3.1LoRA分类任务3.2LoRA中文建模任务 1.使用 首先是去HF下载模型&#xff0c;但一直下载不了&#xff0c;所以去了HF镜像网站&#xff0c;下载gemma需要HF的Token&#xff0c;按照步骤就可以下载。代码主要是Kaggle论坛里面的分享内容。 huggingface-…

3D可视化项目,选择unity3D还是three.js,是时候挑明了。

2023-08-10 23:07贝格前端工场 Hi&#xff0c;我是贝格前端工场&#xff0c;在开发3D可视化项目中&#xff0c;是选择U3D还是three,js时&#xff0c;很多老铁非常的迷茫&#xff0c;本文给老铁们讲清楚该如何选择&#xff0c;欢迎点赞评论分享转发。 一、Unity3D和three.js简…

RTCA DO-178C 机载系统和设备认证中的软件注意事项-附录 B

ANNEX B 附录 B 缩略语和术语表 ACRONYMS AND GLOSSARY OF TERMS 缩写 Acronym 释义 Meaning 译文 Translate ARP Aerospace Recommended Practice 航空航天推荐做法 ATM Air Traffic Management 空中交通管理 CAST Certification Authorities Software Team 认证机…

小程序里.vue界面中传值的两种方式

1.跳转携带参数后通过生命周期取值 1.1跳转 function juMp(){let arr JSON.stringify(specs.specs_data)wx.navigateTo({url:/pages/specs/specs?sku arr})}1.2取值 import {onLoad} from dcloudio/uni-apponLoad((event)>{let Arr JSON.parse(event.sku)})2.通过监听器…

String类-equals和==的区别-遍历-SubString()-StringBuilder-StringJoiner-打乱字符串

概述 String 类代表字符串&#xff0c;Java 程序中的所有字符串文字&#xff08;例如“abc”&#xff09;都被实现为此类的实例。也就是说&#xff0c;Java 程序中所有的双引号字符串&#xff0c;都是 String 类的对象。String 类在 java.lang 包下&#xff0c;所以使用的时候…

jquery实现select2插件鼠标点击任意地方时默认选中该输入框内的值

jquery实现select2插件鼠标点击任意地方时默认选中该输入框内的值 最近发现一个问题&#xff0c;插件select2中的select2可输入可选择的下拉框&#xff0c;在你输入值后鼠标点击别的地方&#xff0c;输入框内的值会被清空&#xff0c;特此记录一下这里的优化&#xff0c;这里修…

[Mac软件]Adobe Substance 3D Stager 2.1.4 3D场景搭建工具

应用介绍 Adobe Substance 3D Stager&#xff0c;您设备齐全的虚拟工作室。在这个直观的舞台工具中构建和组装 3D 场景。设置资产、材质、灯光和相机。导出和共享媒体&#xff0c;从图像到 Web 和 AR 体验。 处理您的最终图像 Substance 3D Stager 可让您在上下文中做出创造性…

网络原理——HTTPS

HTTPS是 在HTTP的基础上&#xff0c;引入了一个加密层&#xff08;SSL)。 1. 为什么需要HTTPS 在我们使用浏览器下载一些软件时&#xff0c;相信大家都遇到过这种情况&#xff1a;明明这个链接显示的是下载A软件&#xff0c;点击下载时就变成了B软件&#xff0c;这种情况是运…

计算机设计大赛 深度学习手势检测与识别算法 - opencv python

文章目录 0 前言1 实现效果2 技术原理2.1 手部检测2.1.1 基于肤色空间的手势检测方法2.1.2 基于运动的手势检测方法2.1.3 基于边缘的手势检测方法2.1.4 基于模板的手势检测方法2.1.5 基于机器学习的手势检测方法 3 手部识别3.1 SSD网络3.2 数据集3.3 最终改进的网络结构 4 最后…

深入理解Python中的JSON模块:基础大总结与实战代码解析【第102篇—JSON模块】

深入理解Python中的JSON模块&#xff1a;基础大总结与实战代码解析 在Python中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;模块是处理JSON数据的重要工具之一。JSON是一种轻量级的数据交换格式&#xff0c;广泛应用于Web开发、API通信等领域。本文将…

WinForms中的Timer探究:Form Timer与Thread Timer的差异

WinForms中的Timer探究&#xff1a;Form Timer与Thread Timer的差异 在Windows Forms&#xff08;WinForms&#xff09;应用程序开发中&#xff0c;定时器&#xff08;Timer&#xff09;是一个常用的组件&#xff0c;它允许我们执行定时任务&#xff0c;如界面更新、周期性数据…

Matlab 矩阵基础

Matlab 基础 MATLAB 是“矩阵实验室matrix laboratory”的缩写。其他编程语言大多一次处理一个数字&#xff0c;MATLAB 主要用于处理整个矩阵和数组。 所有 MATLAB 变量都是多维数组&#xff0c;无论数据类型如何。矩阵是常用于线性代数的二维数组。 若要创建一个包含单行中…

osi模型,tcp/ip模型(名字由来+各层介绍+中间设备介绍)

目录 网络协议如何分层 引入 osi模型 tcp/ip模型 引入 命名由来 介绍 物理层 数据链路层 网络层 传输层 应用层 中间设备 网络协议如何分层 引入 我们已经知道了网络协议是层状结构,接下来就来了解了解下网络协议如何分层 常见的网络协议分层模型是OSI模型 和 …

Flink CDC 3.0 Starrocks建表失败会导致任务卡主!

Flink CDC 3.0 Starrocks建表失败会导致任务卡主&#xff01; 现象 StarRocks建表失败&#xff0c;然后任务自动重启&#xff0c;重启完毕后数据回放&#xff0c;jobMaster打印下面日志后&#xff0c;整个任务会卡主 There are already processing requests. Wait for proce…

windows 连接 Ubuntu 失败 -- samba服务

1. windows10连接ubuntu的时候&#xff0c;提示不允许一个用户使用一个以上用户名与服务器或共享资源的多重连接&#xff0c;中断与此服务器或共享资源的所有连接&#xff0c;然后再试一次 2. 换一台同事的电脑却又可以连上&#xff0c;我之前一直能用的&#xff0c;隔一段时间…

PostgreSQL创建数据库、数据库管理员用户、该库的只读用户

1.创建用户&#xff1a; create user pgdbAdmin with password "Pgdb_15432";2.创建数据库&#xff1a; create database pgdb owner pgdbAdmin;3.创建SCHEMA&#xff1b; create schema pgdbAdmin;4.赋予数据库管理员用户权限&#xff1a; grant all privileges…

UE5 C++ 单播 多播代理 动态多播代理

一. 代理机制&#xff0c;代理也叫做委托&#xff0c;其作用就是提供一种消息机制。 发送方 &#xff0c;接收方 分别叫做 触发点和执行点。就是软件中的观察者模式的原理。 创建一个C Actor作为练习 二.单播代理 创建一个C Actor MyDeligateActor作为练习 在MyDeligateAc…

【蓝桥杯】包子凑数(DP)

一.题目描述 二.输入描述 三.输出描述 四.问题分析 几个两两互质的数&#xff0c;最大公约数是1&#xff0c;最小公倍数是他们的乘积。 两个互质的数a和b最小不能表示的数就是&#xff08;a-1&#xff09;&#xff08;b-1&#xff09;-1&#xff0c;即&#xff0c;两个互质的数…

uniapp_微信小程序日历

一、需求要求这样 二、代码实现 <view class"calender" click"showriliall"><text class"lineText">探视日期&#xff1a;</text><text class"middleText">{{timerili}}</text><image src"/s…