SFT
SFT(Supervised Fine-Tuning)是指在已预训练的模型基础上,使用带标签的训练数据进行监督微调。这种方法通常用于自然语言处理(NLP)或计算机视觉(CV)等领域,旨在通过适应特定任务来优化模型的性能。SFT是一种在预训练基础上进行细化调整的过程,目标是使模型在特定应用上表现更好。
SFT的基本流程
预训练(Pre-training): 在大量的无标签数据上训练模型,学习通用的特征和表示(如GPT系列、BERT等语言模型)。这一步并不专注于某一个特定的任务,而是让模型具备广泛的知识和技能。
监督微调(Supervised Fine-Tuning): 在预训练的基础上,使用带有标签的数据集进一步训练模型。通过调整模型参数,使得模型在目标任务(如文本分类、情感分析、问答系统等)上能够得到更好的效果。
评估和优化(Evaluation and Optimization): 微调后的模型通常会在特定任务的数据集上进行评估,并根据结果调整超参数、优化算法等,进一步提升模型性能。
SFT的优点
节省时间和计算资源: 与从头开始训练一个全新的模型相比,SFT只需要在少量的标签数据上进行训练,从而节省了大量的计算资源和训练时间。
利用预训练模型的强大能力: 预训练模型已经学习了大量的通用知识,SFT只需通过少量的任务特定数据来调整模型,使得其在特定任务上取得更好的表现。
灵活性: SFT可以应用于多种不同的任务和领域,如文本分类、命名实体识别、机器翻译等。
代码
我们可以采用SFT框架来微调任意一个大模型, 这里为了演示的方便,我们采用Qwen2.5-0.5B模型进行演示,在实际的应用中可以将其替换成任意的模型进行微调
导入数据集
在这里我们采用Huggingface上的一个文言文和白话文转换的数据集来举例子,我们可以通过下面的代码来自动获取以及导入该数据集
from datasets import load_dataset
import os
os.environ['HF_ENDPOINT'] = "https://hf-mirror.com"
test_dataset = load_dataset("YeungNLP/firefly-train-1.1M",split="train[:500]")
在这里为了保证下载的速度,我们采用了国内的Huggingface的镜像进行下载,以及使用数据集的前500条数据进行微调
在这里我们可以先看看导入后的效果如何
test_dataset[100]
{'kind': 'ClassicalChinese', 'input': '我当时在三司,访求太祖、仁宗的手书敕令没有见到,然而人人能传诵那些话,禁止私盐的建议也最终被搁置。\n翻译成文言文:', 'target': '余时在三司,求访两朝墨敕不获,然人人能诵其言,议亦竟寝。'}
转换目标格式
通过上面的可视化的例子,我们可以发现这个数据集和Qwen所要求的数据集的格式并不一样,所以我们需要将数据格式进行转换
这里以Qwen2的目标格式为例子,目标格式如下:
<|im_start|>system
你是一个人工智能助手 <|im_end|>
<|im_start|>user
苹果的英文是什么 <|im_end|>
<|im_start|>assistant
apple <|im_end|>
所以我们可以采用下面的代码进行转换:
from transformers import AutoTokenizer, AutoModelForCausalLM
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-0.5B-Instruct")
def format_prompt(example):
chat