在当今信息爆炸的时代,能够高效地对海量文本进行分类,对于信息检索、内容推荐等应用具有重要意义。我们成功训练了一个文本分类模型,该模型可以根据输入的文本内容,输出相应的类别(例如教育、科技等)。在本文中,我们将详细介绍模型调优的过程、遇到的问题及解决方法,帮助大家更好地理解文本分类模型的优化方法。
一、数据准备和预处理
1.数据收集和清洗:首先,我们从公开数据集和内部数据源中收集了大量文本数据。接着,对数据进行清洗,包括删除重复数据和处理缺失值等。
2.创建数据集:在 finetune_demo
文件夹下创建一个名为 data
的文件夹,为了方便管理数据集,可以在 data
文件夹下再新建一个名为 AdvertiseGen
的文件夹,将训练集 train.json
和验证集 dev.json
上传到 AdvertiseGen
文件夹中。
数据集的原始格式只有文本内容与文本类别,需要进行格式处理。
数据集的目标格式如下(节选):
{
"conversations": [
{
"role": "user",
"content": "教育节智慧课堂演讲者:Brian Cox\\n谁曾想到之前著名的英国摇滚歌星Brian Cox,现在却摇身一变成为了一名粒子物理学专家。\\n一定有人记得Brian 和他的乐队(梦想和挑战)曾环游世界并多次巡演成功的风光时刻。正如许多成功人士一样,Brian 并没有虚度年华,而是不断的抓紧时间学习。最终他以一流的成绩毕业于曼彻斯特大学,并在汉堡大学继续了他的研究生学业。\\n\\n"
},
{
"role": "assistant",
"content": "教育"
}
]
}
3.数据格式转换:为了进行模型训练,我们需要将文本数据转换为指定格式的JSON文件。具体实现如下:
将txt文件转换为json格式:
text = ''
luoluoluo = open('大模型实验/标注验证集/fin.txt','a',encoding='utf-8')
num_files = 20
start_number = 799071
def clean_text(text):
# 移除不间断空格和其他不可编码字符
return text.replace('\xa0', ' ').strip()
for i in range(num_files):
file_number = start_number + i
input_file_path = f'大模型实验/大模型实验验证集/财经/{file_number}.txt'
with open(input_file_path,'r',encoding='utf-8') as cao:
line1 = cao.readlines()
for p in line1:
line_new = clean_text(p)
text += line_new + r'\n'
# 将文本按段落分割,并组合成一个字符串
formatted_text = text.strip().replace('\n', '\n').replace('\n', '\n')
# 创建符合格式的字典
data = {
"conversations": [
{
"role": "user",
"content": formatted_text
},
{
"role": "assistant",
"content": "财经"
}
]
}
# 将字典转换为JSON字符串并打印
json_output = json.dumps(data, ensure_ascii=False, indent=2)
luoluoluo.write(json_output + ','+'\n')
# print(json_output)
text = ''
按行合并两个txt文件:
import os, sys
file1path = 'D:/weitiao/question2.txt'
file2path = 'D:/weitiao/answer1.txt'
file_1 = open(file1path, 'r', encoding='utf-8')
file_2 = open(file2path, 'r', encoding='utf-8')
list1 = []
for line in file_1.readlines():
ss = line.strip()
list1.append(ss)
file_1.close()
list2 = []
for line in file_2.readlines():
ss = line.strip()
list2.append(ss)
file_2.close()
file_new = open('D:/weitiao/hebing.txt', 'w', encoding='gbk')
for i in range(len(list1)):
sline = list1[i] + ", " + list2[i]
file_new.write(sline + '\n')
file_new.close()
二、模型微调
我们使用了ChatGLM3-6B模型,并通过微调进一步提升了其性能。具体的微调过程如下:
超参数配置: 在 config
文件夹下的 lora.yaml
文件中,配置了以下重要参数:
data_config:
train_file: train.json
val_file: dev.json
test_file: dev.json
num_proc: 16
max_input_length: 1000
max_output_length: 10
training_args:
# see `transformers.Seq2SeqTrainingArguments`
output_dir: ./output
max_steps: 1000
# needed to be fit for the dataset
learning_rate: 5e-5
# settings for data loading
per_device_train_batch_size: 2
dataloader_num_workers: 8
remove_unused_columns: false
# settings for saving checkpoints
save_strategy: steps
save_steps: 50
# settings for logging
log_level: info
logging_strategy: steps
logging_steps: 10
# settings for evaluation
per_device_eval_batch_size: 8
evaluation_strategy: steps
eval_steps: 500
# settings for optimizer
# adam_epsilon: 1e-6
# uncomment the following line to detect nan or inf values
# debug: underflow_overflow
predict_with_generate: true
# see `transformers.GenerationConfig`
generation_config:
max_new_tokens: 512
# set your absolute deepspeed path here
#deepspeed: ds_zero_2.json
# set to true if train with cpu.
use_cpu: false
peft_config:
peft_type: LORA
task_type: CAUSAL_LM
r: 8
lora_alpha: 32
lora_dropout: 0.1
其中,
启动模型微调:
- 在
finetune_demo
文件夹下打开终端,输入以下命令开始微调:python finetune_hf.py data/AdvertiseGen/ THUDM/chatglm3-6b configs/lora.yaml
- 微调过程中,会显示模型的
loss
和epoch
,loss
越小表示模型拟合效果越好。当loss
逐渐变大时,说明出现了过拟合现象。
三、问题与解决方法
在模型微调过程中,我们遇到了以下常见问题,并通过相应的方法解决:
-
显存不足(Out of Memory):
- 问题描述:在训练过程中,显存不足导致训练中断。
- 解决方法:
- 减少
batch_size
:将training_args
中的per_device_train_batch_size
从16减小到2,以减少每次训练所需的显存。 - 调整输入长度。
- 减少
-
训练时间过长:
- 问题描述:由于数据集较大,训练时间过长。
- 解决方法:提前终止训练:设置
max_steps
为1000,以限制训练步数,避免过长的训练时间。
-
模型过拟合:
- 问题描述:训练过程中,模型的
loss
逐渐变大,出现过拟合现象。 - 解决方法:
- 使用正则化:在
peft_config
中增加lora_dropout
,例如设置为0.1,以防止过拟合。 - 增加验证集评估:在
training_args
中设置evaluation_strategy
为steps
,并设置eval_steps
为500,以定期评估模型性能,防止过拟合。
- 使用正则化:在
- 问题描述:训练过程中,模型的
四、模型运行结果
训练过程中的loss数据:
运行结果:
五、结论与展望
通过系统的模型调优和微调,我们的文本分类模型在多个类别上的表现达到了预期目标。我们在训练过程中遇到了一些问题,但通过调整参数和优化训练过程,成功解决了这些问题。未来,我们计划进一步优化模型,并尝试引入更先进的预训练模型,以提升分类效果。