如何基于BERT训练句子评分模型?
基于BERT的句子评分模型入门实操指南
核心任务定位
你这个任务是典型的文本回归任务(输出连续的评分,而非分类标签),用预训练BERT来微调完全可行,不用从零搭建模型,能大幅降低实操难度。
入门分步实操
1. 环境搭建
先搞定基础工具:
- 安装Python 3.8~3.10版本(兼容性最好,避免新老版本的库冲突)
- 执行命令安装核心依赖:
其中pip install torch transformers datasets scikit-learntorch是深度学习框架,transformers用来调用BERT等预训练模型,datasets处理标注数据,scikit-learn做数据划分和指标评估。
2. 数据预处理
把你的标注数据整理成CSV格式,只需要两列:sentence(待评分句子)和score(金标准分数)。
用datasets加载数据后,用BERT自带的分词器做格式转换(转换成模型能识别的输入格式),示例代码:
from datasets import load_dataset from transformers import BertTokenizer # 加载本地CSV数据 raw_dataset = load_dataset('csv', data_files='你的数据文件路径.csv') # 加载BERT基础分词器 tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') # 定义预处理函数 def preprocess_data(examples): return tokenizer( examples['sentence'], truncation=True, # 超过最大长度截断 padding='max_length', # 不足最大长度补全 max_length=128 # 根据你的句子长度调整,一般128足够 ) # 批量处理数据 tokenized_dataset = raw_dataset.map(preprocess_data, batched=True) # 划分训练集和验证集(8:2比例) tokenized_dataset = tokenized_dataset['train'].train_test_split(test_size=0.2)
注意:确保score列是数值类型(整数/浮点数),不要是字符串,否则训练会报错。
3. 模型搭建
直接用HuggingFace封装好的BERT模型,把分类头改成回归头(设置num_labels=1),损失函数用均方误差(MSE)即可:
from transformers import BertForSequenceClassification # 加载预训练BERT,指定回归任务 model = BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=1)
4. 配置训练与启动
用TrainingArguments设置训练参数,再用Trainer启动训练,示例:
from transformers import TrainingArguments, Trainer import numpy as np from sklearn.metrics import mean_absolute_error, mean_squared_error # 自定义评估指标(回归任务用MAE、MSE) def compute_metrics(eval_pred): predictions, labels = eval_pred predictions = predictions.flatten() # 把预测值展平成一维数组 mae = mean_absolute_error(labels, predictions) mse = mean_squared_error(labels, predictions) return {'mae': mae, 'mse': mse} # 配置训练参数 training_args = TrainingArguments( output_dir='./results', # 模型保存路径 per_device_train_batch_size=8, # 单设备训练批量,显存小就设成4 per_device_eval_batch_size=8, num_train_epochs=3, # 训练轮数,3~5足够,太多容易过拟合 learning_rate=2e-5, # BERT微调的标准学习率 logging_dir='./logs', # 日志保存路径 logging_steps=10, evaluation_strategy='epoch', # 每轮训练后用验证集评估 save_strategy='epoch', # 每轮训练后保存模型 ) # 封装Trainer trainer = Trainer( model=model, args=training_args, train_dataset=tokenized_dataset['train'], eval_dataset=tokenized_dataset['test'], compute_metrics=compute_metrics, ) # 启动训练 trainer.train()
5. 模型验证与预测
训练结束后,用验证集评估模型效果,如果MAE/MSE太高,可调整学习率、批量大小或训练轮数;效果满意后,就可以加载模型做新句子的评分预测:
# 加载训练好的模型 model = BertForSequenceClassification.from_pretrained('./results/checkpoint-xxx') # 替换成你的 checkpoint 路径 # 预测单句 def predict_score(sentence): inputs = tokenizer(sentence, return_tensors='pt', truncation=True, padding='max_length', max_length=128) outputs = model(**inputs) return outputs.logits.item() # 取出预测的分数 # 测试 print(predict_score("测试句子"))
入门教程推荐
- HuggingFace官方文本回归任务示例:跟着官方提供的完整代码流程走,把示例里的数据集换成你自己的,重点理解每一步的作用,不用纠结底层原理,先跑通整个流程。
- 国内视频平台的BERT微调实战(回归任务):找那种一步一步敲代码的视频,跟着操作,遇到报错能直观看到调试方法,比纯文字教程更容易上手。
- 《HuggingFace Transformers自然语言处理实战》书籍:里面有详细的代码解释和任务拆解,适合有理论基础但实操薄弱的人,能帮你理清每个环节的逻辑。
实操避坑提醒
- 先从
bert-base-uncased这个最小的基础BERT模型开始,跑通流程比追求大模型效果更重要,等熟悉后再尝试bert-large-uncased这类大模型。 - 如果显存不足,把
per_device_train_batch_size调小,或者设置gradient_accumulation_steps=2(累积梯度,相当于变相增大批量),也可以加device_map='auto'让模型自动分配到CPU和GPU。 - 训练时如果出现过拟合(验证集指标越来越差),可以提前停止训练(在
TrainingArguments里设置early_stopping_patience=2),或者增加数据量。
内容的提问来源于stack exchange,提问作者Lukas W.
相关产品推荐
相关产品推荐

