LLM小白自学笔记:1.两种指令微调

一、LoRA

           简单来说,LoRA不直接调整个大模型的全部参数(那样太费资源),而是在模型的某些层(通常是注意力层)加个“旁路”——两个小的矩阵(低秩矩阵)。训练时只更新这俩小矩阵,原模型冻住不动。这样既省内存,又能快速适配新任务。

       大模型就像一座豪华大宅,里面房间多、家具全,但装修风格已经固定。LoRA就像给某些关键房间(比如客厅、厨房)加装了智能化的小设备(比如智能灯、智能窗帘)。你不用翻新整个大宅,只调整这些小设备,就能让房子适应新的生活需求,比如自动调节灯光或开窗通风。虽然改动不大,但住起来照样舒服,甚至更适合你的习惯。

举个例子

        假设你部署的是LLaMA-7B,想让它学会用中文写诗:

  • 数据:收集1000首中文古诗,格式是纯文本。
  • LoRA配置:r=16target_modules=["q_proj", "v_proj"]
  • 训练:跑3轮,每轮500步,显存8GB够用。
  • 结果:输入“春风”,它能生成“春风拂面柳丝轻”之类。
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model
import torch
from datasets import load_dataset# 加载 LLaMA-7B 模型和分词器
model_name = "meta-llama/Llama-2-7b-hf"  # 假设使用 LLaMA-7B
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16, device_map="auto")# 配置 LoRA
lora_config = LoraConfig(r=16,  # 低秩矩阵的秩lora_alpha=32,  # 缩放因子target_modules=["q_proj", "v_proj"],  # 目标模块lora_dropout=0.05,  # Dropoutbias="none",task_type="CAUSAL_LM"
)# 应用 LoRA 到模型
model = get_peft_model(model, lora_config)# 加载中文古诗数据集(假设是纯文本格式)
dataset = load_dataset("text", data_files={"train": "chinese_poetry.txt"})
def tokenize_function(examples):return tokenizer(examples["text"], padding="max_length", truncation=True, max_length=128)tokenized_dataset = dataset.map(tokenize_function, batched=True)# 配置训练参数
from transformers import TrainingArguments, Trainertraining_args = TrainingArguments(output_dir="./lora_poetry",num_train_epochs=3,  # 训练 3 轮per_device_train_batch_size=4,save_steps=500,logging_steps=100,learning_rate=2e-4,fp16=True,  # 使用混合精度训练
)# 初始化 Trainer
trainer = Trainer(model=model,args=training_args,train_dataset=tokenized_dataset["train"],
)# 开始训练
trainer.train()# 保存微调后的模型
model.save_pretrained("./lora_poetry_model")# 测试生成
input_text = "春风"
inputs = tokenizer(input_text, return_tensors="pt").to("cuda")
outputs = model.generate(**inputs, max_length=50)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
# 输出示例:春风拂面柳丝轻

二、P-Tuning

        P-Tuning不是直接改模型的权重,而是在输入里加一些特殊的“虚拟词”(可训练的嵌入向量),这些词的作用就像给模型下个指令,告诉它接下来该怎么处理任务。训练时,只更新这些虚拟词的参数,原模型保持冻结。这样既省资源,又能快速适配新需求。

        大模型是个聪明但固执的厨师,P-Tuning就像在菜谱开头加几句特别的“口令”(比如“做中式”、“少放盐”),厨师不用改自己的烹饪习惯,但能按你的要求调整菜的风格。

举个例子


假设你用的是LLaMA-7B,想让它生成更幽默的中文对话:

  • 数据:收集1000条幽默对话的文本数据。
  • P-Tuning配置:添加10个虚拟词(prompt tokens),嵌入维度与模型一致。
  • 训练:跑5轮,每轮300步,显存6GB足以。
  • 结果:输入“今天心情如何?”,它可能回复“心情像Wi-Fi信号,满格但偶尔掉线!”

通过这些虚拟词,模型就像被“调教”出幽默风格,效果精准又高效。

from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PromptTuningConfig, get_peft_model, PromptTuningInit
import torch
from datasets import load_dataset# 加载模型和分词器
model_name = "meta-llama/Llama-2-7b-hf"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16, device_map="auto")# 配置 P-Tuning
ptuning_config = PromptTuningConfig(task_type="CAUSAL_LM",prompt_tuning_init=PromptTuningInit.RANDOM,num_virtual_tokens=10,  # 10 个虚拟词tokenizer_name_or_path=model_name,
)# 应用 P-Tuning
model = get_peft_model(model, ptuning_config)# 加载幽默对话数据集
dataset = load_dataset("text", data_files={"train": "humor_dialog.txt"})
def tokenize_function(examples):return tokenizer(examples["text"], padding="max_length", truncation=True, max_length=128)tokenized_dataset = dataset.map(tokenize_function, batched=True)# 训练参数
from transformers import TrainingArguments, Trainertraining_args = TrainingArguments(output_dir="./ptuning_humor",num_train_epochs=5,per_device_train_batch_size=4,save_steps=300,logging_steps=100,learning_rate=3e-4,fp16=True,
)# 初始化 Trainer
trainer = Trainer(model=model,args=training_args,train_dataset=tokenized_dataset["train"],
)# 训练
trainer.train()# 保存模型
model.save_pretrained("./ptuning_humor_model")# 测试生成
input_text = "今天心情如何?"
inputs = tokenizer(input_text, return_tensors="pt").to("cuda")
outputs = model.generate(**inputs, max_length=50)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
# 输出示例:心情像Wi-Fi信号,满格但偶尔掉线!

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

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

相关文章

2026《数据结构》考研复习笔记一(C++基础知识)

C基础知识复习 一、数据类型二、修饰符和运算符三、Lambda函数和表达式四、数学函数五、字符串六、结构体 一、数据类型 1.1基本类型 基本类型 描述 字节(位数) 范围 char 字符类型,存储ASCLL字符 1(8位) -128…

基于骨骼识别的危险动作报警分析系统

基于骨骼识别的危险动作报警分析系统 【包含内容】 【一】项目提供完整源代码及详细注释 【二】系统设计思路与实现说明 【三】基于骨骼识别算法的实时危险行为预警方案 【技术栈】 ①:系统环境:Windows 10/11、macOS Ventura、Ubuntu 20.04 ②&#x…

【双指针】四数之和(medium)

四数之和(medium) 题⽬描述:解法(排序 双指针)算法思路: C 算法代码:Java 算法代码: 题⽬链接:18. 四数之和 题⽬描述: 给你⼀个由 n 个整数组成的数组 num…

Flask+Influxdb+grafna构建电脑性能实时监控系统

Influx下载地址,这里下载了以下版本influxdb-1.8.5_windows_amd64.zip 运行前需要先启动Influx数据库: 管理员方式运行cmd->F:->cd F:\influxdb\influxdb-1.8.5-1->influxd -config influxdb.conf,以influxdb.conf配置文件启动数…

如何在Keil中配置国民技术N32G系列MCU开发环境

如何在Keil及Jlink中搭建国民技术N32G系列MCU开发环境 根据自己的MCU型号(我这里的型号是N32G452REL7)访问国民技术官网,依次从N32G通用MCU-技术资源-固件和软件-软件开发套件,获取对应MCU型号的SDK,也可点击这里从网盘…

微软承认Win11出现极端错误,只能强制关机或重装系统

最近,不少使用 Windows 11 的用户反映,在系统更新后,“Windows Hello”突然失效,原本便捷的人脸识别和PIN登录功能统统无法使用。更糟的是,有人在重置系统后直接被挡在系统门外,这让人不禁发问:…

【android bluetooth 协议分析 02】【bluetooth hal 层详解 1】【uart 介绍】

一、什么是 UART? UART(Universal Asynchronous Receiver/Transmitter) 是一种 串行通信协议,它的特点是通信时不需要专门的时钟信号(叫做“异步”通信),常用于两个设备之间的简单数据通信&…

天元证券|奶粉行业结构性回暖 乳企竞速全龄化、国际化

在过去几年中,中国婴配粉市场经历了量价齐增,量减价增,量减价减的三个周期。历经多年行业深度洗牌与竞争格局重塑,2024年中国婴配粉市场回暖态势愈发清晰可辨。 日前,包括中国飞鹤、澳优、健合集团在内的多家奶粉股披露…

第3.1节 调用链路分析简介

调用链路(Call Chain / Call Path) 是程序在执行过程中,按照调用顺序形成的函数、模块或组件之间的依赖关系链条,完整记录了从程序入口到当前执行点的动态调用路径。它反映了代码执行的逻辑流程,是分析程序行为、调试问…

System.Security.Cryptography.CryptographicException“填充无效,无法被移除。”

这个异常通常发生在以下几种情况: 1.密文损坏:密文在传输或存储过程中被篡改或损坏。 2.密钥不匹配:用于解密的密钥与加密时使用的密钥不同。 3.填充模式不匹配:加密时使用的填充模式与解密时指定的填充模式不一致。 4.使用了不正…

【网络入侵检测】Suricata之数据包内容匹配

【作者主页】只道当时是寻常 【专栏介绍】入侵检测。专注网络、主机安全,欢迎关注与评论。 1. 概要 本文详细介绍了网络入侵检测系统(如 Suricata)中用于检查数据包或流有效载荷的 Payload 关键字。content 用于匹配数据包内容,默…

Spring Boot 整合 Redis 实现点赞功能:从基础到实践

在当今互联网应用开发中,点赞功能几乎成为了各类内容平台的标配。它不仅能增加用户与内容之间的互动,还能直观地反映内容的受欢迎程度。本文将详细介绍如何使用 Spring Boot 整合 Redis 来实现一个简单的文章点赞功能,让你轻松掌握这一实用技…

openGauss DataVec + Dify,快速搭建你的智能助手平台

在当今数字化和智能化的时代,大语言模型(LLM)的应用正以前所未有的速度改变着各个领域的工作方式和用户体验。Dify 作为一个开源的大语言模型应用开发平台,为开发者们提供了便捷且强大的工具,助力构建从基础智能体到复…

OpenLayers:extent与view extent 介绍

一、范围的概念 1.什么是范围? 在Openlayers中范围(Extent)是用于表示地理空间区域的一种概念。它通常由一个数字数组构成,数组中的内容为:[最小x坐标,最小y坐标,最大x坐标,最大y坐…

can‘t set boot order in virtualbox

Boot order setting is ignored if UEFI is enabled https://forums.virtualbox.org/viewtopic.php?t99121 如果勾选EFI boot order就是灰色的 传统BIOS就是可选的 然后选中任意介质,通过右边的上下箭头调节顺序,最上面的应该是优先级最高的 然后就…

如何在 Kali 上解决使用 evil-winrm 时 Ruby Reline 的 quoting_detection_proc 警告

在使用 Kali Linux 运行 Ruby 工具(例如 evil-winrm)时,你可能会遇到以下警告: Warning: Remote path completions is disabled due to ruby limitation: undefined method quoting_detection_proc for module Reline这个警告会导…

工资管理系统的主要功能有哪些

工资管理系统通过自动化薪资计算、税务处理、员工数据管理、报表生成等功能,极大地提升了薪资发放的效率和准确性。在传统的人工薪资管理中,HR人员需要手动计算每位员工的薪资,并确保符合税务要求,极易出错且耗时。而现代工资管理…

C++语言程序设计——02 变量与数据类型

目录 一、变量与数据类型(一)变量的数据类型(二)变量命名规则(三)定义变量(四)变量赋值(五)查看数据类型(六)数据类型的字节长度&…

咋用fliki的AI生成各类视频?AI生成视频教程

最近想制作视频,多方考查了决定用fliki,于是订阅了一年试试,这个AI生成的视频效果来看真是不错,感兴趣的自己官网注册个账号体验一下就知道了。 fliki官网 Fliki生成视频教程 创建账户并登录 首先,访问fliki官网并注…

文章记单词 | 第32篇(六级)

一,单词释义 inferior [ɪnˈfɪəriə(r)] adj. 较差的;次的;下级的;n. 下属;次品joy [dʒɔɪ] n. 欢乐;喜悦;乐趣;乐事;v. 因… 而高兴resemble [rɪˈzembl] vt. 类…