建站网站模板,风雨同舟网站建设,装修设计公司网站有哪些,网站建设的标语概述
大型语言模型#xff08;LLM#xff0c;Large Language Model#xff09;的微调#xff08;Fine-tuning#xff09;是指在一个预训练模型的基础上#xff0c;使用特定领域或任务的数据对模型进行进一步训练#xff0c;以使其在该领域或任务上表现更好。微调是迁移…概述
大型语言模型LLMLarge Language Model的微调Fine-tuning是指在一个预训练模型的基础上使用特定领域或任务的数据对模型进行进一步训练以使其在该领域或任务上表现更好。微调是迁移学习的一种常见方法能够显著提升模型在特定任务上的性能。在大型语言模型LLM的微调中有几种常见的方法包括 SFT监督微调、LoRA低秩适应、P-tuning v2 和 **Freeze
1.大语言模型微调
1.1 微调的工作原理
微调Fine-tuning是指在预训练模型的基础上使用特定任务的标注数据对模型进行进一步训练使其在该任务上表现更好。微调的核心思想是利用预训练模型已经学习到的通用语言表示通过少量任务数据调整模型参数使其适应特定任务。
微调的关键组件 输入 (X) 提供给模型的文本数据例如电影评论、问题、对话等。对于文本生成任务输入可能是一个问题或提示。 目标 (Y) 基于标注数据的预期输出例如情绪标签、聊天机器人响应、摘要文本等。对于分类任务目标可能是类别标签如“积极”或“消极”。对于生成任务目标可能是完整的文本响应。 损失函数 衡量模型的预测与目标之间的差异。通过优化损失函数模型逐渐调整参数以更好地拟合任务数据。
示例IMDB 情绪分类
输入 (X)电影评论例如“这部电影的视觉效果很棒但情节很弱。”目标 (Y)情绪标签例如“积极”或“消极”。模型任务根据输入文本预测正确的情绪标签。
示例文本生成
输入 (X)问题例如“什么是人工智能”目标 (Y)生成的响应例如“人工智能是模拟人类智能的技术。”模型任务根据输入问题生成正确的文本响应。
1.2 使用的损失函数交叉熵损失
在语言模型的微调中交叉熵损失Cross-Entropy Loss 是最常用的损失函数。它用于衡量模型预测的概率分布与真实目标分布之间的差异。
交叉熵损失的公式
对于语言模型交叉熵损失的公式为 Cross-Entropy Loss − ∑ i 1 N y i log ( p i ) \text{Cross-Entropy Loss} -\sum_{i1}^{N} y_i \log(p_i) Cross-Entropy Loss−i1∑Nyilog(pi)
其中 y i y_i yi目标分布真实标签的 one-hot 编码。 p i p_i pi模型预测的概率分布。 N N N词汇表的大小对于分类任务( N ) 是类别数。
交叉熵损失的作用
衡量预测与目标的差异 当模型预测的概率分布与目标分布越接近时交叉熵损失越小。当模型预测的概率分布与目标分布差异较大时交叉熵损失越大。 优化目标 在训练过程中通过反向传播和梯度下降模型不断调整参数以最小化交叉熵损失。
示例文本生成中的交叉熵损失
假设模型生成一个句子每个词的概率分布如下
目标词[I, love, AI]模型预测的概率分布 I: 0.9love: 0.8AI: 0.7
交叉熵损失计算如下 t e x t L o s s − ( log ( 0.9 ) log ( 0.8 ) log ( 0.7 ) ) text{Loss} -(\log(0.9) \log(0.8) \log(0.7)) textLoss−(log(0.9)log(0.8)log(0.7))
通过最小化损失模型逐渐学会生成更准确的文本。
1.3 SFT监督微调Supervised Fine-Tuning
SFT 是最常见的微调方法通过在特定任务的标注数据上对预训练模型进行全参数微调。
特点
全参数微调更新模型的所有参数。适合场景任务数据量较大计算资源充足。优点模型可以完全适应任务。缺点计算成本高显存占用大。
实现代码
from transformers import AutoTokenizer, AutoModelForSequenceClassification, Trainer, TrainingArguments
from datasets import load_dataset# 加载预训练模型和分词器
model_name bert-base-uncased
tokenizer AutoTokenizer.from_pretrained(model_name)
model AutoModelForSequenceClassification.from_pretrained(model_name, num_labels2)# 加载数据集
dataset load_dataset(imdb)# 数据预处理
def preprocess_function(examples):return tokenizer(examples[text], truncationTrue, paddingmax_length, max_length512)tokenized_datasets dataset.map(preprocess_function, batchedTrue)# 设置训练参数
training_args TrainingArguments(output_dir./sft_results,evaluation_strategyepoch,learning_rate2e-5,per_device_train_batch_size8,per_device_eval_batch_size8,num_train_epochs3,weight_decay0.01,save_strategyepoch,logging_dir./logs,
)# 定义 Trainer
trainer Trainer(modelmodel,argstraining_args,train_datasettokenized_datasets[train],eval_datasettokenized_datasets[test],tokenizertokenizer,
)# 开始微调
trainer.train()# 保存模型
model.save_pretrained(./sft-fine-tuned-model)
tokenizer.save_pretrained(./sft-fine-tuned-model)1.4 LoRA低秩适应Low-Rank Adaptation)
LoRA 是一种高效的微调方法通过低秩分解的方式微调模型参数减少计算量和显存占用。
特点
低秩分解只微调模型的一部分参数低秩矩阵。适合场景资源有限但仍需高效微调。优点参数效率高显存占用低。缺点需要额外的实现支持。
实现代码
使用 peft 库实现 LoRA
pip install peftfrom transformers import AutoTokenizer, AutoModelForSequenceClassification
from peft import get_peft_model, LoraConfig, TaskType
from datasets import load_dataset# 加载预训练模型和分词器
model_name bert-base-uncased
tokenizer AutoTokenizer.from_pretrained(model_name)
model AutoModelForSequenceClassification.from_pretrained(model_name, num_labels2)# 配置 LoRA
lora_config LoraConfig(task_typeTaskType.SEQ_CLS, # 任务类型r8, # 低秩矩阵的秩lora_alpha32, # 缩放因子lora_dropout0.1, # Dropout 概率
)# 应用 LoRA
model get_peft_model(model, lora_config)# 加载数据集
dataset load_dataset(imdb)# 数据预处理
def preprocess_function(examples):return tokenizer(examples[text], truncationTrue, paddingmax_length, max_length512)tokenized_datasets dataset.map(preprocess_function, batchedTrue)# 设置训练参数
training_args TrainingArguments(output_dir./lora_results,evaluation_strategyepoch,learning_rate2e-5,per_device_train_batch_size8,per_device_eval_batch_size8,num_train_epochs3,weight_decay0.01,save_strategyepoch,logging_dir./logs,
)# 定义 Trainer
trainer Trainer(modelmodel,argstraining_args,train_datasettokenized_datasets[train],eval_datasettokenized_datasets[test],tokenizertokenizer,
)# 开始微调
trainer.train()# 保存模型
model.save_pretrained(./lora-fine-tuned-model)1.5 P-tuning v2
P-tuning v2 是一种提示微调方法通过优化提示Prompt来引导模型完成任务而不改变模型参数。
特点
提示优化通过可学习的提示向量引导模型。适合场景少样本学习资源有限。优点无需修改模型参数显存占用低。缺点需要设计提示模板。
实现代码
使用 openprompt 库实现 P-tuning v2
pip install openpromptfrom openprompt import PromptDataLoader, PromptForClassification
from openprompt.plms import load_plm
from openprompt.prompts import ManualTemplate
from openprompt.prompts import ManualVerbalizer
from datasets import load_dataset# 加载预训练模型
plm, tokenizer, model_config, WrapperClass load_plm(bert, bert-base-uncased)# 加载数据集
dataset load_dataset(imdb)# 定义提示模板
template ManualTemplate(text{placeholder:text_a} It was {mask},tokenizertokenizer,
)# 定义标签词映射
verbalizer ManualVerbalizer(classes[negative, positive],label_words{negative: [bad],positive: [good],},tokenizertokenizer,
)# 定义 Prompt 模型
prompt_model PromptForClassification(plmplm,templatetemplate,verbalizerverbalizer,
)# 数据加载器
dataloader PromptDataLoader(datasetdataset[train],tokenizertokenizer,templatetemplate,max_seq_length512,
)# 训练伪代码需补充优化器和训练循环
for batch in dataloader:logits prompt_model(batch)# 计算损失并更新模型1.6 Freeze 微调
Freeze 微调是指冻结模型的大部分参数只微调部分层如分类头。
特点
参数冻结只微调模型的最后几层。适合场景资源有限任务数据量较小。优点计算成本低显存占用少。缺点模型适应能力有限。
实现代码
from transformers import AutoTokenizer, AutoModelForSequenceClassification, Trainer, TrainingArguments
from datasets import load_dataset# 加载预训练模型和分词器
model_name bert-base-uncased
tokenizer AutoTokenizer.from_pretrained(model_name)
model AutoModelForSequenceClassification.from_pretrained(model_name, num_labels2)# 冻结模型的大部分参数
for param in model.bert.parameters():param.requires_grad False# 加载数据集
dataset load_dataset(imdb)# 数据预处理
def preprocess_function(examples):return tokenizer(examples[text], truncationTrue, paddingmax_length, max_length512)tokenized_datasets dataset.map(preprocess_function, batchedTrue)# 设置训练参数
training_args TrainingArguments(output_dir./freeze_results,evaluation_strategyepoch,learning_rate2e-5,per_device_train_batch_size8,per_device_eval_batch_size8,num_train_epochs3,weight_decay0.01,save_strategyepoch,logging_dir./logs,
)# 定义 Trainer
trainer Trainer(modelmodel,argstraining_args,train_datasettokenized_datasets[train],eval_datasettokenized_datasets[test],tokenizertokenizer,
)# 开始微调
trainer.train()# 保存模型
model.save_pretrained(./freeze-fine-tuned-model)
tokenizer.save_pretrained(./freeze-fine-tuned-model)1.7 总结
方法特点适用场景优点缺点SFT全参数微调数据量大资源充足完全适应任务计算成本高LoRA低秩分解部分参数微调资源有限参数效率高显存占用低需要额外实现P-tuning提示优化不修改模型参数少样本学习显存占用低需要设计提示模板Freeze冻结大部分参数微调部分层资源有限数据量小计算成本低模型适应能力有限
2.DeepSeek微调
DeepSeek LLM 是一个强大的开源语言模型但为了最大限度地发挥其在特定应用中的潜力微调是必不可少的。
2.1 使用数据子集
在资源有限的硬件上微调像 DeepSeek LLM 这样的大型语言模型时在完整数据集例如具有 25,000 个样本的 IMDB上进行训练可能会导致过多的训练时间和 GPU 内存问题。
选择一个子集500 个样本用于训练100 个样本用于评估。保持代表性该子集保留了足够的多样性以实现合理的性能。
使用较小的数据集可以加快实验速度同时有效地展示微调概念。对于生产级微调应在更强大的基础设施上使用更大的数据集。
2.2 安装所需的库
首先安装必要的依赖项
pip install -U torch transformers datasets accelerate peft bitsandbytes2.3 使用 4 位量化加载模型
使用 4 位量化使大型模型与有限的 GPU 内存兼容
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from peft import LoraConfig, get_peft_modelmodel_name deepseek-ai/deepseek-llm-7b-base
# Configure 4-bit quantization
bnb_config BitsAndBytesConfig(load_in_4bitTrue,bnb_4bit_compute_dtypetorch.float16 # Use float16 for faster computation
)
# Load tokenizer and model
tokenizer AutoTokenizer.from_pretrained(model_name)
model AutoModelForCausalLM.from_pretrained(model_name, quantization_configbnb_config, device_mapauto
)
# Apply LoRA for memory-efficient fine-tuning
lora_config LoraConfig(r8, # Low-rank adaptation sizelora_alpha32,target_modules[q_proj, v_proj], # Apply LoRA to attention layerslora_dropout0.05,biasnone
)
model get_peft_model(model, lora_config)
model.print_trainable_parameters()
print( DeepSeek LLM Loaded with LoRA and 4-bit Precision!)2.4 使用 Hugging Face 数据集进行训练
为了进行微调需要一个高质量的数据集。 Hugging Face 提供对各种数据集的访问
选择数据集
对于此示例让我们使用 IMDB 数据集对 DeepSeek LLM 进行情绪分类微调
from datasets import load_dataset# Load dataset
dataset load_dataset(imdb)预处理数据集
将文本转换为模型的标记化输入
def tokenize_function(examples):inputs tokenizer(examples[text], truncationTrue, paddingmax_length, max_length512)inputs[labels] inputs[input_ids].copy()return inputstokenized_datasets dataset.map(tokenize_function, batchedTrue)
# Subset the dataset for faster experimentation
small_train_dataset tokenized_datasets[train].shuffle(seed42).select(range(500))
small_test_dataset tokenized_datasets[test].shuffle(seed42).select(range(100))
# Print a sample tokenized entry
print(Tokenized Sample:)
print(small_train_dataset[0])3.LoRA低秩自适应
LoRA低秩自适应是一种旨在通过以下方式使 DeepSeek LLM 等大型模型的微调更加节省内存的技术
冻结模型的大部分权重。在关键层例如注意层中引入低秩可训练矩阵。
这大大减少了可训练参数的数量同时保持了模型的性能。LoRA 可以在资源受限的硬件例如 Colab GPU上微调大型语言模型。
#4.代码演练微调 DeepSeek LLM
首先设置训练参数
from transformers import TrainingArguments, Trainertraining_args TrainingArguments(output_dir./results,evaluation_strategyepoch,learning_rate3e-4, # Lower learning rate for LoRA fine-tuningper_device_train_batch_size1, # Reduce batch size for memory efficiencygradient_accumulation_steps8, # Simulate larger batch sizenum_train_epochs0.5,weight_decay0.01,save_strategyepoch,logging_dir./logs,logging_steps50,fp16True, # Mixed precision training
)初始化训练器
trainer Trainer(modelmodel,argstraining_args,train_datasetsmall_train_dataset,eval_datasetsmall_test_dataset,
)
print( Trainer Initialized!)开始微调
print( Starting Fine-Tuning...)
trainer.train()保存微调模型
trainer.save_model(./fine_tuned_deepseek)
tokenizer.save_pretrained(./fine_tuned_deepseek)
print(Fine-Tuned Model Saved Successfully!)