深圳哪里做網(wǎng)站好廣州番禺發(fā)布網(wǎng)
大家好,我是程序鍋。
最近在modelscope上閑逛的時候,在數(shù)據(jù)集板塊發(fā)現(xiàn)有一個商品評論情感預(yù)測數(shù)據(jù)集。這個數(shù)據(jù)集源自一個比賽,它的目的是為了預(yù)測電商平臺顧客的評論是好評還是差評。
數(shù)據(jù)示例如下所示(其中0代表差評,1代表好評):
這個比賽是2021年7月開始舉辦的。那個時候還沒有ChatGPT,如果需要做商品評論情感預(yù)測,是需要分詞、預(yù)處理、選擇模型等等一系列機器學(xué)習(xí)方法。而我最近正好在學(xué)習(xí)LLaMA-Factory,正好試一試用它來微調(diào)大模型,看看最終情感預(yù)測結(jié)果如何?
好的,首先我們先上結(jié)果。
大模型微調(diào)+提示工程 | 大模型+提示工程 | |
---|---|---|
準(zhǔn)確率 | 91.70% | 79.43% |
使用大模型微調(diào)相比不微調(diào),提升12.27%
整體技術(shù)路線采用:LLaMA-Factory + Lora + Qwen1.5-7B
教程視頻如下:
https://www.bilibili.com/video/BV1siuietEYX/?vd_source=d0aa621a464f99754d7108e57e32eab9
下面我們來看如何微調(diào)大模型來做商品評論情感分析。微調(diào)過程與傳統(tǒng)深度學(xué)習(xí)方法類似。無非是準(zhǔn)備數(shù)據(jù)、配環(huán)境、訓(xùn)練、最后評測。
一、數(shù)據(jù)準(zhǔn)備
采用數(shù)據(jù)集的來自于modelscope的商品評論情感預(yù)測,其中訓(xùn)練數(shù)據(jù)集45366條,測試數(shù)據(jù)集5032條。
下載數(shù)據(jù)集:
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')
下載后的數(shù)據(jù)集無法直接應(yīng)用到微調(diào),我們還需要結(jié)合提示工程,將數(shù)據(jù)集轉(zhuǎn)化為大模型微調(diào)所需要的格式(即問答對的形式)
數(shù)據(jù)轉(zhuǎn)化代碼如下:
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 = "我在做商品評論情感預(yù)測,需根據(jù)用戶評價判斷是好評還是差評,其中輸出0代表差評,輸出1代表好評,請嚴(yán)格保證輸出結(jié)果為整數(shù)并且只能是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 ):continuelabel = 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)
二、環(huán)境依賴
- LLaMA-Factory
- Qwen1.5-7B
可以自己去安裝部署,我也準(zhǔn)備了相應(yīng)依賴pip list
。
具體關(guān)于LLaMA-Factory的部署、使用和自定義數(shù)據(jù)集,可以參考這篇文章:
https://zhuanlan.zhihu.com/p/696631776
三、訓(xùn)練
整體訓(xùn)練耗時2.5小時,采用lora的方式,loss圖如下所示:
訓(xùn)練可以采用web頁面訓(xùn)練CUDA_VISIBLE_DEVICES=0 llamafactory-cli webui
,也可以采用命令行的方式訓(xùn)練,具體訓(xùn)練執(zhí)行命令如下所示:
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 \ #設(shè)置為你的數(shù)據(jù)集--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界面的方式評估和預(yù)測,具體評測使用方式如下所示。
評測結(jié)束后,得到一個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"}
...
自己寫一個準(zhǔn)確率計算代碼Acc=(TP+TN)/(TP+TN+FP+FN)
五、最后
這是一個大模型微調(diào)入門的一個小案例,lora權(quán)重、數(shù)據(jù)集全部開源放到我的github repo。
https://github.com/GuoCoder/ai-app
后續(xù)我還會分享更多關(guān)于AI應(yīng)用的案例。也歡迎大家點贊、收藏、關(guān)注我。