大模型LLM微调的数据集及使用方法

ops/2024/10/24 10:58:41/

微调大型语言模型(LLM)通常需要大量的标注数据。以下是一些常用的公开数据集,适用于微调各种任务,如文本分类、问答、命名实体识别等。同时,我将提供使用这些数据集的基本方法。

1. 公开数据集

1.1 文本分类
  • IMDB 数据集:用于情感分析任务,包含电影评论及其对应的情感标签(正面或负面)。
    • 链接:IMDB Dataset
  • AG News 数据集:包含新闻文章及其对应的类别标签(如世界、体育、商业、科技)。
    • 链接:AG News Dataset
1.2 问答
  • SQuAD (Stanford Question Answering Dataset):包含大量的问题和对应的答案,适用于问答任务。
    • 链接:SQuAD Dataset
  • CoQA (Conversational Question Answering):包含对话形式的问答数据。
    • 链接:CoQA Dataset
1.3 命名实体识别
  • CoNLL-2003:包含新闻文章及其对应的命名实体标签(如人名、地名、组织名)。
    • 链接:CoNLL-2003 Dataset
  • OntoNotes 5.0:包含多种文本类型及其对应的命名实体标签。
    • 链接:OntoNotes 5.0 Dataset

2. 使用方法

以下是使用这些数据集进行微调的基本步骤。假设你使用的是 Hugging Face 的 Transformers 库。

2.1 安装依赖

首先,确保你已经安装了必要的库:

pip install transformers datasets
2.2 加载数据集

使用 Hugging Face 的 datasets 库加载公开数据集

2.2.1 文本分类

以 IMDB 数据集为例:

from datasets import load_dataset# 加载 IMDB 数据集
dataset = load_dataset('imdb')# 查看数据集结构
print(dataset)
2.2.2 问答

以 SQuAD 数据集为例:

from datasets import load_dataset# 加载 SQuAD 数据集
dataset = load_dataset('squad')# 查看数据集结构
print(dataset)
2.2.3 命名实体识别

以 CoNLL-2003 数据集为例:

from datasets import load_dataset# 加载 CoNLL-2003 数据集
dataset = load_dataset('conll2003')# 查看数据集结构
print(dataset)
2.3 数据预处理

微调模型之前,需要对数据进行预处理,将其转换为模型输入格式。

2.3.1 文本分类

以 IMDB 数据集为例:

from transformers import BertTokenizer# 加载预训练分词器
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')# 定义预处理函数
def preprocess_function(examples):return tokenizer(examples['text'], truncation=True, padding='max_length')# 应用预处理函数
tokenized_datasets = dataset.map(preprocess_function, batched=True)
2.3.2 问答

以 SQuAD 数据集为例:

from transformers import BertTokenizer# 加载预训练分词器
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')# 定义预处理函数
def preprocess_function(examples):questions = [q.strip() for q in examples['question']]inputs = tokenizer(questions,examples['context'],max_length=384,truncation="only_second",return_offsets_mapping=True,padding="max_length",)offset_mapping = inputs.pop("offset_mapping")answers = examples['answers']start_positions = []end_positions = []for i, offset in enumerate(offset_mapping):answer = answers[i]start_char = answer['answer_start'][0]end_char = start_char + len(answer['text'][0])sequence_ids = inputs.sequence_ids(i)# Find the start and end of the contextidx = 0while sequence_ids[idx] != 1:idx += 1context_start = idxwhile sequence_ids[idx] == 1:idx += 1context_end = idx - 1# If the answer is not fully inside the context, label it (0, 0)if not (offset[context_start][0] <= start_char and offset[context_end][1] >= end_char):start_positions.append(0)end_positions.append(0)else:# Otherwise it's the start and end token positionsidx = context_startwhile idx <= context_end and offset[idx][0] <= start_char:idx += 1start_positions.append(idx - 1)idx = context_endwhile idx >= context_start and offset[idx][1] >= end_char:idx -= 1end_positions.append(idx + 1)inputs["start_positions"] = start_positionsinputs["end_positions"] = end_positionsreturn inputs# 应用预处理函数
tokenized_datasets = dataset.map(preprocess_function, batched=True, remove_columns=dataset['train'].column_names)
2.3.3 命名实体识别

以 CoNLL-2003 数据集为例:

from transformers import BertTokenizer# 加载预训练分词器
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')# 定义预处理函数
def preprocess_function(examples):return tokenizer(examples['tokens'], is_split_into_words=True, truncation=True, padding='max_length')# 应用预处理函数
tokenized_datasets = dataset.map(preprocess_function, batched=True)
2.4 模型微调

使用 Hugging Face 的 Trainer 类进行模型微调

2.4.1 文本分类

以 IMDB 数据集为例:

from transformers import BertForSequenceClassification, Trainer, TrainingArguments# 加载预训练模型
model = BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=2)# 配置训练参数
training_args = TrainingArguments(output_dir='./results',num_train_epochs=3,per_device_train_batch_size=16,per_device_eval_batch_size=64,warmup_steps=500,weight_decay=0.01,logging_dir='./logs',
)# 创建 Trainer 实例
trainer = Trainer(model=model,args=training_args,train_dataset=tokenized_datasets['train'],eval_dataset=tokenized_datasets['test'],
)# 开始训练
trainer.train()
2.4.2 问答

以 SQuAD 数据集为例:

from transformers import BertForQuestionAnswering, Trainer, TrainingArguments# 加载预训练模型
model = BertForQuestionAnswering.from_pretrained('bert-base-uncased')# 配置训练参数
training_args = TrainingArguments(output_dir='./results',num_train_epochs=3,per_device_train_batch_size=16,per_device_eval_batch_size=64,warmup_steps=500,weight_decay=0.01,logging_dir='./logs',
)# 创建 Trainer 实例
trainer = Trainer(model=model,args=training_args,train_dataset=tokenized_datasets['train'],eval_dataset=tokenized_datasets['validation'],
)# 开始训练
trainer.train()
2.4.3 命名实体识别

以 CoNLL-2003 数据集为例:

from transformers import BertForTokenClassification, Trainer, TrainingArguments# 加载预训练模型
model = BertForTokenClassification.from_pretrained('bert-base-uncased', num_labels=len(dataset['train'].features['ner_tags'].feature.names))# 配置训练参数
training_args = TrainingArguments(output_dir='./results',num_train_epochs=3,per_device_train_batch_size=16,per_device_eval_batch_size=64,warmup_steps=500,weight_decay=0.01,logging_dir='./logs',
)# 创建 Trainer 实例
trainer = Trainer(model=model,args=training_args,train_dataset=tokenized_datasets['train'],eval_dataset=tokenized_datasets['validation'],
)# 开始训练
trainer.train()

3. 总结

通过以上步骤,你可以使用公开数据集进行大型语言模型的微调。关键步骤包括数据加载、预处理、模型微调和评估。使用 Hugging Face 的 Transformers 库可以简化这些步骤,快速实现模型的微调


http://www.ppmy.cn/ops/128067.html

相关文章

汽车免拆诊断案例 | 2019 款奥迪 A6L 车行驶中偶发熄火

故障现象  一辆2019款奥迪A6L车&#xff0c;搭载2.0T发动机&#xff0c;累计行驶里程约为9万km。车主反映&#xff0c;车辆行驶中偶发熄火&#xff0c;故障频率较高。 故障诊断  接车后试车&#xff0c;起动发动机&#xff0c;可以正常起动着机。使用故障检测仪检测&#x…

springboot RedisTemplate支持多个序列化方式

前提纪要&#xff1a;因为业务变动&#xff0c;需要在原先只支持protobuf的前提序列化的前提下&#xff0c;新增正常的序列化读取数据所以在原先的基础上进行优化。文章用于记忆。 话不多说直接上代码 Configuration AutoConfigureAfter(RedisAutoConfiguration.class) Import…

帝国CMS 内容页调用上一篇下一篇的方法(精华汇总)

帝国cms默认的内容页的上一页&下一页的调用代码是&#xff1a; 上一篇&#xff1a;[!--info.pre--] 下一篇&#xff1a;[!--info.next--] 但是实话实说&#xff0c;如果做个很普通的模版那足够用了&#xff0c;但是如果想个性化一点的话&#xff0c;比如加背景&#xff…

学习文档10/16

MySQL 字符集&#xff1a; MySQL 支持很多种字符集的方式&#xff0c;比如 GB2312、GBK、BIG5、多种 Unicode 字符集&#xff08;UTF-8 编码、UTF-16 编码、UCS-2 编码、UTF-32 编码等等&#xff09;。 查看支持的字符集 你可以通过 SHOW CHARSET 命令来查看&#xff0c;支持…

卸载 Git

目录 打开 Geek找到 Git右键卸载 Git卸载完成等待扫描注册表点击完成清除Git在本地的配置文件 打开 Geek 找到 Git 右键卸载 Git 卸载完成 等待扫描注册表 点击完成 已经删除完毕 清除Git在本地的配置文件 进入 C:\Users\用户名 删除框起来的配置文件 &#x1f447; 源码资料…

Jmeter 实战 JDBC配置

​ JDBC JDBC&#xff08;Java Database Connectivity&#xff09;是一种用于执行SQL语句的Java API。通过这个API&#xff0c;可以直接连接并执行SQL脚本&#xff0c;与数据库进行交互。 使用JMeter压力测试时&#xff0c;操作数据库的场景 在使用JMeter进行接口压力测试时…

ubuntu 20.4 安装 openssl 3.x

ubuntu 20.4 安装 openssl 3.x ubuntu 20.4 自带了openssl 1.0.2&#xff0c;升级为 openssl 3.x&#xff1a; # 下载 openssl 源代码压缩包 wget https://www.openssl.org/source/openssl-3.0.10.tar.gz# 安装编译包 sudo apt-get install -y g sudo apt-get install -y mak…

Godot中的信号

目录 概念 signal connect方法连接Callable 信号要求参数 查看信号 连接信号 监听信号 Button - text属性 pressed 连接源 「按钮」的信号连接 使用代码&#xff0c;将方法与信号相连接 节点的connect方法 节点直接使用emit_signal方法通过字符串的方式触发信号…