使用机器学习模型进行文本分类的优化和调参过程

 在当今信息爆炸的时代,能够高效地对海量文本进行分类,对于信息检索、内容推荐等应用具有重要意义。我们成功训练了一个文本分类模型,该模型可以根据输入的文本内容,输出相应的类别(例如教育、科技等)。在本文中,我们将详细介绍模型调优的过程、遇到的问题及解决方法,帮助大家更好地理解文本分类模型的优化方法。 

一、数据准备和预处理

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

其中,

max_input_length: 最大输入字长;比数据集中平均输入输出字长大一点,对文本内容进行字数估算后,设置为1000。
max_output_length: 最大输出字长;只需要输出类别,故10字长足够。
max_steps: 训练步数,这里设置为1000。
save_steps: 保存步数,即每 50步保存一次。

启动模型微调

  • finetune_demo 文件夹下打开终端,输入以下命令开始微调:
    python finetune_hf.py data/AdvertiseGen/ THUDM/chatglm3-6b configs/lora.yaml
  • 微调过程中,会显示模型的 lossepochloss 越小表示模型拟合效果越好。当 loss 逐渐变大时,说明出现了过拟合现象。
三、问题与解决方法

在模型微调过程中,我们遇到了以下常见问题,并通过相应的方法解决:

  1. 显存不足(Out of Memory)

    • 问题描述:在训练过程中,显存不足导致训练中断。
    • 解决方法
      • 减少 batch_size:将 training_args 中的 per_device_train_batch_size 从16减小到2,以减少每次训练所需的显存。
      • 调整输入长度。 
  2. 训练时间过长

    • 问题描述:由于数据集较大,训练时间过长。
    • 解决方法:提前终止训练:设置 max_steps 为1000,以限制训练步数,避免过长的训练时间。
  3. 模型过拟合

    • 问题描述:训练过程中,模型的 loss 逐渐变大,出现过拟合现象。
    • 解决方法
      • 使用正则化:在 peft_config 中增加 lora_dropout,例如设置为0.1,以防止过拟合。
      • 增加验证集评估:在 training_args 中设置 evaluation_strategysteps,并设置 eval_steps 为500,以定期评估模型性能,防止过拟合。
四、模型运行结果

训练过程中的loss数据:

运行结果:

​​​​​​​

五、结论与展望

通过系统的模型调优和微调,我们的文本分类模型在多个类别上的表现达到了预期目标。我们在训练过程中遇到了一些问题,但通过调整参数和优化训练过程,成功解决了这些问题。未来,我们计划进一步优化模型,并尝试引入更先进的预训练模型,以提升分类效果。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值