本次训练测试参数:
参数名称(英文) | 参数值 | 中文解释 |
---|---|---|
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 | 多少个训练步骤后记录一次日志 |
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.02 | 2.0826 | 2.65254545211792 | 4.9711149624494515e-05 |
0.03 | 0.4388 | 2.7274656295776367 | 4.942229924898902e-05 |
0.05 | 0.4526 | 3.1661038398742676 | 4.913344887348354e-05 |
0.07 | 0.4785 | 2.7288620471954346 | 4.8844598497978054e-05 |
0.09 | 0.7021 | 4.623532772064209 | 4.855574812247256e-05 |
0.1 | 0.5321 | 4.179305076599121 | 4.826689774696707e-05 |
0.12 | 0.4673 | 3.188565731048584 | 4.7978047371461585e-05 |
0.14 | 0.3519 | 2.3722314834594727 | 4.76891969959561e-05 |
0.16 | 0.6952 | 1.2766860723495483 | 4.740034662045061e-05 |
0.17 | 0.5436 | 4.08701753616333 | 4.711149624494512e-05 |
0.19 | 0.5701 | 2.8983373641967773 | 4.6822645869439636e-05 |
0.21 | 0.5311 | 2.245316982269287 | 4.653379549393415e-05 |
0.23 | 0.5595 | 2.6416733264923096 | 4.6244945118428655e-05 |
0.24 | 0.7086 | 2.451162815093994 | 4.595609474292317e-05 |
0.26 | 0.3956 | 1.190707802772522 | 4.566724436741768e-05 |
0.28 | 0.455 | 3.1860058307647705 | 4.537839399191219e-05 |
0.29 | 0.4065 | 1.3798476457595825 | 4.5089543616406706e-05 |
参数介绍
- loss:损失值,用于衡量模型预测结果与真实结果之间的差异,在训练中,损失值逐渐减小,表示模型正在逐渐优化。
- grad_norm:梯度范数,表示梯度的大小或长度。在训练过程中,梯度范数可以帮助我们了解梯度的变化情况,从而调整学习率等参数。
- learning_rate:学习率,控制模型在每次更新时参数变化的幅度。较小的学习率可能导致训练过程缓慢,而较大的学习率可能导致模型无法收敛。
- epoch:训练轮次,表示模型已经遍历了整个数据集的次数。随着训练轮次的增加,模型应该逐渐学习到更多的特征,从而提高性能。
数据表现状态
从提供的训练进度数据中,我们可以观察到以下几点:
- 损失值(loss):整体上,损失值呈现波动下降的趋势,这表明模型正在逐渐学习并优化其预测能力,但在某些轮次中,损失值出现了上升,这可能是由于数据集的噪声、学习率的变化或模型过拟合等原因造成的。
- 梯度范数(grad_norm):梯度范数在不同轮次中有所波动,但整体上保持在一个相对稳定的范围内,表明模型的梯度没有出现异常变化,训练过程相对平稳。
- 学习率(learning_rate):学习率随着训练轮次的增加而逐渐减小,这是一种常见的学习率衰减策略,旨在在训练初期快速收敛,并在后期保持稳定以避免过拟合。
- 训练轮次(epoch):训练轮次正在逐步增加,表明模型正在不断遍历数据集并进行学习。
需要关注的事项
- 损失值的稳定下降:
- 确保损失值在每个 epoch 内持续下降,如果损失值在某个点之后不再下降,可能需要调整学习率或其他超参数。
- 验证集损失:
- 如果你有验证集数据,监控验证集上的损失值和训练集上的损失值,确保验证集损失值也在下降,并且与训练集损失值接近,以防止过拟合。
- 梯度范数:
- 确保梯度范数保持在合理范围内,可以设置梯度裁剪(gradient clipping)来避免梯度爆炸。
- 学习率调整:
- 确保学习率调整策略(如学习率调度器)有效,如果发现训练不稳定,可以尝试调整学习率。
上述测试 1700 多条精品语料,使用gpt2小模型本地进行测试,接下来10万的语料库投入 Llama-3.1-8B 进行微调训练,save_steps
设置为 500 步数保存一次。
发表回复