网站推广优化趋势,建站宝盒建站系统,装修怎么做网站,学习html5的网站简介
使用 AutoModelForSequenceClassification 导入Bert 模型。 很多教程都会自定义 损失函数#xff0c;然后手动实现参数更新。 但本文不想手动微调#xff0c;故使用 transformers 的 Trainer 自动微调。 人生苦短#xff0c;我用框架#xff0c;不仅可保证微调出的模…简介
使用 AutoModelForSequenceClassification 导入Bert 模型。 很多教程都会自定义 损失函数然后手动实现参数更新。 但本文不想手动微调故使用 transformers 的 Trainer 自动微调。 人生苦短我用框架不仅可保证微调出的模型的效果而且还省时间。
导包
import evaluate
import numpy as np
from datasets import load_dataset
from transformers import (AutoTokenizer,AutoModelForSequenceClassification,
)import torch
from torch import nnimport os
os.environ[HTTP_PROXY] http://127.0.0.1:7890
os.environ[HTTPS_PROXY] http://127.0.0.1:7890# AG_News 英文分类数据集
# ds load_dataset(fancyzhx/ag_news)## 中文分类数据集
ds load_dataset(lansinuote/ChnSentiCorp)数据集的详情如下
DatasetDict({train: Dataset({features: [text, label],num_rows: 9600})validation: Dataset({features: [text, label],num_rows: 1200})test: Dataset({features: [text, label],num_rows: 1200})
})ds[train][0]{text: 选择珠江花园的原因就是方便有电动扶梯直接到达海边周围餐馆、食廊、商场、超市、摊位一应俱全。酒店装修一般但还算整洁。 泳池在大堂的屋顶因此很小不过女儿倒是喜欢。 包的早餐是西式的还算丰富。 服务吗一般,label: 1}加载 Bert 模型
model_name bert-base-chinesetokenizer AutoTokenizer.from_pretrained(model_name,trust_remote_codeTrue,
)bert AutoModelForSequenceClassification.from_pretrained(model_name,trust_remote_codeTrue,num_labels2,
)如果你无法联网的话使用本地huggingface模型
bert AutoModelForSequenceClassification.from_pretrained(model_name,trust_remote_codeTrue,revisionc30a6ed22ab4564dc1e3b2ecbf6e766b0611a33f,local_files_onlyTrue,num_labels2,
)查看 bert 分类模型的网络结构
bert如上图所示Bert 的分类模型在原生的 Bert 模型后加了一个Linear。
下述是数据集转换函数
def tokenize_func(item):global tokenizertokenized_inputs tokenizer(item[text],max_length512,truncationTrue,)return tokenized_inputstokenized_datasets ds.map(tokenize_func,batchedTrue,
)tokenized_datasets 的详情如下所示
DatasetDict({train: Dataset({features: [text, label, input_ids, token_type_ids, attention_mask],num_rows: 9600})validation: Dataset({features: [text, label, input_ids, token_type_ids, attention_mask],num_rows: 1200})test: Dataset({features: [text, label, input_ids, token_type_ids, attention_mask],num_rows: 1200})
})Train
from transformers import TrainingArgumentsargs TrainingArguments(ChnSentiCorp_text_cls,eval_steps8,evaluation_strategysteps,save_strategyepoch,save_total_limit3,learning_rate2e-5,num_train_epochs3,weight_decay0.01,per_device_train_batch_size32,per_device_eval_batch_size16,logging_steps8,save_safetensorsTrue,overwrite_output_dirTrue,# load_best_model_at_endTrue,
)TrainingArguments 的参数解释点击查看下述文章 LLM大模型之Trainer以及训练参数
from transformers import DataCollatorWithPaddingdata_collator DataCollatorWithPadding(tokenizertokenizer)from transformers import Trainertrainer Trainer(modelbert,argsargs,train_datasettokenized_datasets[train],eval_datasettokenized_datasets[validation],data_collatordata_collator,# compute_metricscompute_metrics,tokenizertokenizer,
)
trainer.train()训练过程在终端可以看见训练和验证的损失值变化。
如果安装了 wandb并且在系统环境变量中进行了设置。
训练过程和评估过程的记录会自动上传到wandb中。
wandb 若你想使用 wandb自行进行安装个人强烈推荐一劳永逸这样就无需自己绘图展示模型的训练过程了。 在模型训练的过程进入 wandb https://wandb.ai/home 看看模型的现在的训练的过程。 上图是在 wandb 网站看到的图横轴是 epoch 纵轴是 loss。 蓝色折线是在验证集上的损失橙色折线是在训练集上的损失。
可以很直观的看到在训练集上的loss 小于 在验证集上的 loss。
predict
训练完成的模型使用 predict 方法在测试集上预测。
predictions trainer.predict(tokenized_datasets[test])
preds np.argmax(predictions.predictions, axis-1)
preds输出结果
array([1, 0, 0, ..., 1, 1, 0])预测结果评估
def eval_data(data):predictions trainer.predict(data)preds np.argmax(predictions.predictions, axis-1)metric evaluate.load(glue, mrpc)return metric.compute(predictionspreds, referencespredictions.label_ids)eval_data(tokenized_datasets[test])输出结果
{accuracy: 0.9475, f1: 0.9478908188585607}总结
总体上看本文做了一下数据集的处理大模型的微调过程、模型权重报错、日志记录这些过程全部由 transformers 的 Trainer 自动进行。 用好 框架 事半功倍。当然前提是已经掌握了基础的手动参数微调。 参考资料
huggingface 使用 Trainer API 微调模型