14-Hugging Face 模型微调训练(基于 BERT 的中文评价情感分析(二分类))

1. datasets 库核心方法

1.1. 列出数据集

使用 datasets 库,你可以轻松列出所有 Hugging Face 平台上的数据集:

python 复制代码
from datasets import list_datasets
# 列出所有数据集
all_datasets = list_datasets()
print(all_datasets)

1.2. 加载数据集

你可以通过 load_dataset 方法加载任何数据集:

python 复制代码
from datasets import load_dataset
# 加载数据集
dataset = load_dataset("glue", "mrpc")
print(dataset)

1.3. 加载磁盘数据

你可以加载本地磁盘上的数据:

python 复制代码
from datasets import load_from_disk
# 从本地磁盘加载数据集
dataset = load_from_disk("./my_dataset")
print(dataset)

2. 分词工具与文字编码

2.1. 加载字典和分词工具

你可以使用 AutoTokenizer 自动加载分词工具:

python 复制代码
from transformers import AutoTokenizer
# 加载中文BERT模型的分词器
tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")

2.2. 批量编码句子

使用分词器,你可以批量对文本进行编码:

python 复制代码
# 批量编码句子
sentences = ["我爱自然语言处理", "Hugging Face 很强大"]
encoded_inputs = tokenizer(sentences, padding=True, truncation=True, return_tensors="pt")
print(encoded_inputs)

3. 模型微调的基本概念与流程

微调是指在预训练模型的基础上,通过进一步的训练来适应特定的下游任务。BERT 模型通过预训练来学习语言的通用模式,然后通过微调来适应特定任务,如情感分析、命名实体识别等。微调过程中,通常冻结 BERT 的预训练层,只训练与下游任务相关的层。本课件将介绍如何使用 BERT 模型进行情感分析任务的微调训练。

4. 加载数据集

情感分析任务的数据通常包括文本及其对应的情感标签。使用 Hugging Face 的 datasets 库可以轻松地加载和处理数据集。

python 复制代码
from datasets import load_dataset
# 加载数据集
dataset = load_dataset('csv', data_files="data/ChnSentiCorp.csv")
# 查看数据集信息
print(dataset)

4.1. 数据集格式

Hugging Face 的 datasets 库支持多种数据集格式,如 CSV、JSON、TFRecord 等。在本案例中,使用 CSV 格式,CSV 文件应包含两列:一列是文本数据,另一列是情感标签。

4.2. 数据集信息

加载数据集后,可以查看数据集的基本信息,如数据集大小、字段名称等。这有助于我们了解数据的分布情况,并在后续步骤中进行适当的处理。

5. 制作 Dataset

加载数据集后,需要对其进行处理以适应模型的输入格式。这包括数据清洗、格式转换等操作。

python 复制代码
from datasets import Dataset
# 制作 Dataset
dataset = Dataset.from_dict({
    'text': ['位置尚可,但距离海边的位置比预期的要差的多', '5月8日付款成功,当当网显示5月10日发货,可是至今还没看到货物,也没收到任何通知,简不知怎么说好!!!', '整体来说,本书还是不错的。至少在书中描述了许多现实中存在的司法系统方面的问题,这是值得每个法律工作者去思考的。尤其是让那些涉世不深的想加入到律师队伍中的年青人,看到了社会特别是中国司法界真实的一面。缺点是:书中引用了大量的法律条文和司法解释,对于已经是律师或有一定工作经验的法律工作者来说有点多余,而且所占的篇幅不少,有凑字数的嫌疑。整体来说还是不错的。不要对一本书提太高的要求。'],
    'label': [0, 1, 1]  # 0 表示负向评价,1 表示正向评价
})
# 查看数据集信息
print(dataset)

5.1. 数据集字段

在制作 Dataset 时,需定义数据集的字段。在本案例中,定义了两个字段:text(文本)和 label(情感标签)。每个字段都需要与模型的输入和输出匹配。

5.2. 数据集信息

制作 Dataset 后,可以通过 dataset.info 等方法查看其大小、字段名称等信息,以确保数据集的正确性和完整性。

6. vocab 字典操作

在微调 BERT 模型之前,需要将模型的词汇表(vocab)与数据集中的文本匹配。这一步骤确保输入的文本能够被正确转换为模型的输入格式。

python 复制代码
from transformers import BertTokenizer
# 加载 BERT 模型的 vocab 字典
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
# 将数据集中的文本转换为 BERT 模型所需的输入格式
dataset = dataset.map(lambda x: tokenizer(x['text'], return_tensors="pt"), batched=True)
# 查看数据集信息
print(dataset)

6.1. 词汇表(vocab)

BERT 模型使用词汇表(vocab)将文本转换为模型可以理解的输入格式。词汇表包含所有模型已知的单词及其对应的索引。确保数据集中的所有文本都能找到对应的词汇索引是至关重要的。

6.2. 文本转换

使用 tokenizer 将文本分割成词汇表中的单词,并转换为相应的索引。此步骤需要确保文本长度、特殊字符处理等都与 BERT 模型的预训练设置相一致。

python 复制代码
from transformers import BertTokenizer

# 加载 BERT 模型的 vocab 字典
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')

# 将数据集中的文本转换为 BERT 模型所需的输入格式
dataset = dataset.map(lambda x: tokenizer(x['text'], return_tensors="pt"), batched=True)

# 查看数据集信息
print(dataset)

from transformers import BertModel
import torch.nn as nn

class SentimentAnalysisModel(nn.Module):
    def __init__(self):
        super().__init__()
        self.bert = BertModel.from_pretrained('bert-base-chinese')
        self.drop_out = nn.Dropout(0.3)
        self.linear = nn.Linear(768, 2)  # 假设情感分类为二分类

    def forward(self, input_ids, attention_mask):
        _, pooled_output = self.bert(input_ids=input_ids, attention_mask=attention_mask, return_dict=False)
        output = self.drop_out(pooled_output)
        return self.linear(output)

7. 下游任务模型设计

在微调 BERT 模型之前,需要设计一个适应情感分析任务的下游模型结构。通常包括一个或多个全连接层,用于将 BERT 输出的特征向量转换为分类结果。

7.1 模型结构

下游任务模型通常包括以下几个部分:

  • BERT 模型:用于生成文本的上下文特征向量。
  • Dropout 层:用于防止过拟合,通过随机丢弃一部分神经元来提高模型的泛化能力。
  • 全连接层:用于将 BERT 的输出特征向量映射到具体的分类任务上。

7.2 模型初始化

使用 BertModel.from_pretrained() 方法加载预训练的 BERT 模型,同时也可以初始化自定义的全连接层。初始化时,需要根据下游任务的需求,定义合适的输出维度。

8. 自定义模型训练

模型设计完成后,进入训练阶段。通过数据加载器 (DataLoader) 高效地批量处理数据,并使用优化器更新模型参数。

python 复制代码
from torch.utils.data import DataLoader
from transformers import AdamW

# 实例化 DataLoader
data_loader = DataLoader(dataset, batch_size=16, shuffle=True)

# 初始化模型和优化器
model = SentimentAnalysisModel()
optimizer = AdamW(model.parameters(), lr=5e-5)

# 训练循环
for epoch in range(3):  # 假设训练 3 个 epoch
    model.train()
    for batch in data_loader:
        optimizer.zero_grad()
        outputs = model(input_ids=batch['input_ids'],
                        attention_mask=batch['attention_mask'])
        loss = nn.CrossEntropyLoss()(outputs, batch['labels'])
        loss.backward()
        optimizer.step()

8.1 数据加载

使用 DataLoader 实现批量数据加载。DataLoader 自动处理数据的批处理和随机打乱,确保训练的高效性和数据的多样性。

8.2 优化器

AdamW 是一种适用于 BERT 模型的优化器,结合了 Adam 和权重衰减的特点,能够有效地防止过拟合。

8.3 训练循环

训练循环包含前向传播 (forward pass)、损失计算 (loss calculation)、反向传播 (backward pass)、参数更新 (parameter update) 等步骤。每个 epoch 都会对整个数据集进行一次遍历,更新模型参数。通常训练过程中会跟踪损失值的变化,以判断模型的收敛情况。

9. 最终效果评估与测试

在模型训练完成后,加载模型训练权重测试其效果:

未训练的效果

10. 小结

在本课程中,我们详细介绍了如何使用 Hugging Face 的 BERT 模型进行中文评价情感分析的微调训练。我们从加载数据集、制作 Dataset、词汇表操作、模型设计、自定义训练,到最后的效果评估与测试,逐步讲解了整个微调过程。通过本课程,你需要掌握使用预训练语言模型进行下游任务微调的基本流程,并能应用到实际的 NLP 项目中。

相关推荐
AIGC方案1 小时前
deepseek热度已过?
人工智能·大模型
88号技师1 小时前
模糊斜率熵Fuzzy Slope entropy+状态分类识别!2024年11月新作登上IEEE Trans顶刊
人工智能·机器学习·分类·数据挖掘·信号处理·故障诊断·信息熵
死磕代码程序媛1 小时前
谷歌25年春季新课:15小时速成机器学习
人工智能·机器学习
有Li2 小时前
弥合多层次差距:用于超声心动图中基于文本引导的标签高效分割的双向循环框架|文献速递-深度学习医疗AI最新文献
人工智能
橙色小博2 小时前
Transformer模型解析与实例:搭建一个自己的预测语言模型
人工智能·深度学习·神经网络·机器学习·transformer
意.远2 小时前
PyTorch实现二维卷积与边缘检测:从原理到实战
人工智能·pytorch·python·深度学习·神经网络·计算机视觉
电报号dapp1193 小时前
2025年智能合约玩法创新白皮书:九大核心模块与收益模型重构Web3经济范式
人工智能·重构·web3·去中心化·区块链·智能合约
三道杠卷胡3 小时前
【AI News | 20250411】每日AI进展
人工智能·python·计算机视觉·语言模型·aigc
汪子熙3 小时前
利用 Trae 开发平面直角坐标系的教学动画
人工智能·trae
区块链蓝海3 小时前
Cables 现已正式启动积分计划 Alpha 阶段,开放早期白名单申请
人工智能·区块链