大家好,我是程序锅。
最近在modelscope上闲逛的时候,在数据集板块发现有一个商品评论情感预测数据集。这个数据集源自一个比赛,它的目的是为了预测电商平台顾客的评论是好评还是差评。
数据示例如下所示(其中0代表差评,1代表好评):
这个比赛是2021年7月开始举办的。那个时候还没有ChatGPT,如果需要做商品评论情感预测,是需要分词、预处理、选择模型等等一系列机器学习方法。而我最近正好在学习LLaMA-Factory,正好试一试用它来微调大模型,看看最终情感预测结果如何?
好的,首先我们先上结果。
大模型微调+提示工程 | 大模型+提示工程 | |
---|---|---|
准确率 | 91.70% | 79.43% |
使用大模型微调相比不微调,提升12.27%
整体技术路线采用:LLaMA-Factory + Lora + Qwen1.5-7B
教程视频如下:
https://www.bilibili.com/video/BV1siuietEYX/?vd_source=d0aa621a464f99754d7108e57e32eab9
下面我们来看如何微调大模型来做商品评论情感分析。微调过程与传统深度学习方法类似。无非是准备数据、配环境、训练、最后评测。
一、数据准备
采用数据集的来自于modelscope的商品评论情感预测,其中训练数据集45366条,测试数据集5032条。
下载数据集:
from modelscope.msdatasets import MsDataset
ds_train = MsDataset.load('DAMO_NLP/jd', subset_name='default', split='train')
from modelscope.msdatasets import MsDataset
ds_val = MsDataset.load('DAMO_NLP/jd', subset_name='default', split='validation')
下载后的数据集无法直接应用到微调,我们还需要结合提示工程,将数据集转化为大模型微调所需要的格式(即问答对的形式)
数据转化代码如下:
import json
from modelscope.msdatasets import MsDataset
from tqdm import *
ds_train = MsDataset.load('DAMO_NLP/jd', subset_name='default', split='train')
ds_val = MsDataset.load('DAMO_NLP/jd', subset_name='default', split='validation')
print(len(ds_train["sentence"]))
print(len(ds_val["sentence"]))
outout = []
SYSTEM_PROMPT = "我在做商品评论情感预测,需根据用户评价判断是好评还是差评,其中输出0代表差评,输出1代表好评,请严格保证输出结果为整数并且只能是0或者1。输入的用户评价为:"
for i in tqdm(range(len(ds_val["sentence"]))):
sentence = ds_val["sentence"][i]
if (ds_val["label"][i] == None or ds_val["sentence"][i] == None ):
continue
label = str(int(ds_val["label"][i]))
outout.append({"instruction":SYSTEM_PROMPT+sentence,"input":"","output":label})
with open("jd_val.json", "w") as json_file:
json.dump(outout, json_file,ensure_ascii=False)
二、环境依赖
- LLaMA-Factory
- Qwen1.5-7B
可以自己去安装部署,我也准备了相应依赖pip list
。
具体关于LLaMA-Factory的部署、使用和自定义数据集,可以参考这篇文章:
https://zhuanlan.zhihu.com/p/696631776
三、训练
整体训练耗时2.5小时,采用lora的方式,loss图如下所示:
训练可以采用web页面训练CUDA_VISIBLE_DEVICES=0 llamafactory-cli webui
,也可以采用命令行的方式训练,具体训练执行命令如下所示:
CUDA_VISIBLE_DEVICES=0 llamafactory-cli train \
--stage sft \
--do_train True \
--model_name_or_path /home/guo/hub/Qwen1___5-7B-Chat \ #选择大模型下载位置
--preprocessing_num_workers 16 \
--finetuning_type lora \
--template qwen \
--flash_attn auto \
--dataset_dir data \
--dataset jd \ #设置为你的数据集
--cutoff_len 1024 \
--learning_rate 5e-05 \
--num_train_epochs 3.0 \
--max_samples 100000 \
--per_device_train_batch_size 2 \
--gradient_accumulation_steps 8 \
--lr_scheduler_type cosine \
--max_grad_norm 1.0 \
--logging_steps 5 \
--save_steps 100 \
--warmup_steps 0 \
--optim adamw_torch \
--packing False \
--report_to none \
--output_dir saves/Qwen1.5-7B-Chat/lora/train_2024-05-23-14-32-35 \
--fp16 True \
--plot_loss True \
--lora_rank 8 \
--lora_alpha 16 \
--lora_dropout 0 \
--lora_target q_proj,v_proj
四、评测
LLaMA-Factory也支持用web界面的方式评估和预测,具体评测使用方式如下所示。
评测结束后,得到一个generated_predictions.jsonl
{"label": "1", "predict": "1"}
{"label": "0", "predict": "0"}
{"label": "1", "predict": "1"}
{"label": "1", "predict": "1"}
{"label": "0", "predict": "0"}
{"label": "1", "predict": "1"}
{"label": "1", "predict": "1"}
{"label": "0", "predict": "0"}
{"label": "0", "predict": "0"}
{"label": "0", "predict": "0"}
{"label": "0", "predict": "0"}
{"label": "0", "predict": "0"}
{"label": "0", "predict": "0"}
{"label": "0", "predict": "0"}
{"label": "0", "predict": "0"}
{"label": "1", "predict": "1"}
...
自己写一个准确率计算代码Acc=(TP+TN)/(TP+TN+FP+FN)
五、最后
这是一个大模型微调入门的一个小案例,lora权重、数据集全部开源放到我的github repo。
https://github.com/GuoCoder/ai-app
后续我还会分享更多关于AI应用的案例。也欢迎大家点赞、收藏、关注我。