python 微调训练模型

本次训练测试参数:

参数名称(英文)参数值中文解释
output_dir"D:/pycode/results"输出目录,用于保存训练结果
overwrite_output_dirTrue是否覆盖输出目录中的旧文件
num_train_epochs3训练轮次,即完整遍历数据集的次数
per_device_train_batch_size2每个设备上的训练批次大小
save_steps10多少个训练步骤后保存一次模型
save_total_limit2最多保存多少个模型检查点
logging_dir"D:/pycode/logs"日志目录,用于保存训练日志
logging_steps10多少个训练步骤后记录一次日志

demo:

from transformers import GPT2LMHeadModel, GPT2Tokenizer, Trainer, TrainingArguments
from datasets import load_dataset, Dataset
import json

# 加载数据集
def load_filtered_data(file_path):
    with open(file_path, 'r', encoding='utf-8') as f:
        data = json.load(f)
    texts = []
    for entry in data:
        texts.extend([entry[key] for key in entry if entry[key]])
    return Dataset.from_dict({"text": texts})

# 定义模型和标记器路径
model_path = "需要微调的模型路径"
tokenizer = GPT2Tokenizer.from_pretrained(model_path)
model = GPT2LMHeadModel.from_pretrained(model_path)

# 添加填充标记
tokenizer.pad_token = tokenizer.eos_token

# 加载数据集
dataset = load_filtered_data("D:/data/数据集.json")

def tokenize_function(examples):
    # 对输入文本进行标记化处理
    return tokenizer(examples['text'], truncation=True, padding='max_length', max_length=512)

tokenized_dataset = dataset.map(tokenize_function, batched=True)

# 设置labels
def set_labels(examples):
    examples['labels'] = examples['input_ids'].copy()
    return examples

tokenized_dataset = tokenized_dataset.map(set_labels, batched=True)

# 定义训练参数
training_args = TrainingArguments(
    output_dir="D:/pycode/results",
    overwrite_output_dir=True,
    num_train_epochs=3,
    per_device_train_batch_size=2,
    save_steps=10,
    save_total_limit=2,
    logging_dir="D:/pycode/logs",
    logging_steps=10,
)

# 创建Trainer
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=tokenized_dataset,
)

# 开始训练
trainer.train()

训练表现:

轮次(epoch)损失值(loss)梯度范数(grad_norm)学习率(learning_rate)
0.022.08262.652545452117924.9711149624494515e-05
0.030.43882.72746562957763674.942229924898902e-05
0.050.45263.16610383987426764.913344887348354e-05
0.070.47852.72886204719543464.8844598497978054e-05
0.090.70214.6235327720642094.855574812247256e-05
0.10.53214.1793050765991214.826689774696707e-05
0.120.46733.1885657310485844.7978047371461585e-05
0.140.35192.37223148345947274.76891969959561e-05
0.160.69521.27668607234954834.740034662045061e-05
0.170.54364.087017536163334.711149624494512e-05
0.190.57012.89833736419677734.6822645869439636e-05
0.210.53112.2453169822692874.653379549393415e-05
0.230.55952.64167332649230964.6244945118428655e-05
0.240.70862.4511628150939944.595609474292317e-05
0.260.39561.1907078027725224.566724436741768e-05
0.280.4553.18600583076477054.537839399191219e-05
0.290.40651.37984764575958254.5089543616406706e-05

参数介绍

  1. loss:损失值,用于衡量模型预测结果与真实结果之间的差异,在训练中,损失值逐渐减小,表示模型正在逐渐优化。
  2. grad_norm:梯度范数,表示梯度的大小或长度。在训练过程中,梯度范数可以帮助我们了解梯度的变化情况,从而调整学习率等参数。
  3. learning_rate:学习率,控制模型在每次更新时参数变化的幅度。较小的学习率可能导致训练过程缓慢,而较大的学习率可能导致模型无法收敛。
  4. epoch:训练轮次,表示模型已经遍历了整个数据集的次数。随着训练轮次的增加,模型应该逐渐学习到更多的特征,从而提高性能。

数据表现状态

从提供的训练进度数据中,我们可以观察到以下几点:

  1. 损失值(loss):整体上,损失值呈现波动下降的趋势,这表明模型正在逐渐学习并优化其预测能力,但在某些轮次中,损失值出现了上升,这可能是由于数据集的噪声、学习率的变化或模型过拟合等原因造成的。
  2. 梯度范数(grad_norm):梯度范数在不同轮次中有所波动,但整体上保持在一个相对稳定的范围内,表明模型的梯度没有出现异常变化,训练过程相对平稳。
  3. 学习率(learning_rate):学习率随着训练轮次的增加而逐渐减小,这是一种常见的学习率衰减策略,旨在在训练初期快速收敛,并在后期保持稳定以避免过拟合。
  4. 训练轮次(epoch):训练轮次正在逐步增加,表明模型正在不断遍历数据集并进行学习。

需要关注的事项

  1. 损失值的稳定下降
    • 确保损失值在每个 epoch 内持续下降,如果损失值在某个点之后不再下降,可能需要调整学习率或其他超参数。
  2. 验证集损失
    • 如果你有验证集数据,监控验证集上的损失值和训练集上的损失值,确保验证集损失值也在下降,并且与训练集损失值接近,以防止过拟合。
  3. 梯度范数
    • 确保梯度范数保持在合理范围内,可以设置梯度裁剪(gradient clipping)来避免梯度爆炸。
  4. 学习率调整
    • 确保学习率调整策略(如学习率调度器)有效,如果发现训练不稳定,可以尝试调整学习率。

上述测试 1700 多条精品语料,使用gpt2小模型本地进行测试,接下来10万的语料库投入 Llama-3.1-8B 进行微调训练,save_steps 设置为 500 步数保存一次。


评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注