基于BERT的情感分析模型的微调训练0x00-数据集

23 阅读5分钟

前置条件

上一篇 入坑大模型微调第一个Hugging Face程序 主要介绍了 Hugging Face及其使用方式。是我们后续做大模型微调训练的基础。不了解的可以再回顾一下。

他山之石

之前在偶然百度大脑看到一个 AI情感倾向分析 的工具,当时就在想其背后的原理。正好最近在学习AI大模型微调,于是便正好借此入手自己也搞个情感分析模型玩玩。

  • 其一,能更深入了解其原理
  • 其二,也是自己入坑大模型微调的第一个小项目

image.png

项目基础

模型?

第一个问题便是:我需要重新预训练一个AI大模型吗? 显然一个大模型从预训练到成型可用,其投入的成本很大。答案显然是否定的,因为模型微调的核心在于:

利用预训练模型已学到的通用知识作为起点,通过特定任务的小规模数据进一步调整模型参数,使其适应新的应用场景

那么我该使用什么样的模型呢?这是一个基于文字语言的情感分析,那就应该找一个现成的善于处理文本情感的模型。通过请教我的AI老师,得知BERT正是满足条件的一个轻量级模型。

数据集?

有了模型,微调需要通过特定任务的小规模数据进一步调整模型参数。那去哪找这些数据呢?当然基本还是在 Hugging Face 或者 ModelScope。 这里使用的是Hugging Face,至于用哪个数据集最快的方式依然是请教AI老师,

这个项目使用的是 lansinuote/ChnSentiCorp 数据集.这个数据集主要搜集一些网络平台的评价,分为内容和标签(1好评0差评)。我们正好用这个数据集来进行情感分析模型的微调。

image.png

微调SOP

目前的模型微调已经形成了以数据驱动、分阶段迭代、效率优先为核心的标准化流程。

  1. 数据准备​ - 明确输入、输出

  2. 数据集构建​ - 基于数据集格式构建数据集,用于模型读取(后续微调使用框架时,框架会集成该功能,我们需要按框架要求的格式转换数据集)

  3. 训练环境设置​ - 硬件/软件环境配置,包括基座模型配置

  4. 批次编码 - 将数据集转换为模型可以识别的格式

  5. 模型微调执行​ - 参数优化策略选择与实施

  6. 评估验证​ - 多维度性能验证

  7. 部署上线​ - 推理优化与工程化封装

  8. 监控维护​ - 持续迭代与效果保障

今天基本只讲数据集,涉及1、2步。

数据集

基础

image.png

我们在Hugging Face官网或者下载的模型目录里会发现有几个不同的数据集,这些数据集又有哪些区别呢?

  • train - 训练集。好比习题册,模型通过它学习任务特定的知识,参数通过计算训练集上的损失并进行反向传播来更新。

  • validation - 验证集。好比模拟测试,它在训练过程中周期性使用,但不参与参数更新。通过和训练集的参数对比来得出训练集参数是否过拟合等。目标是提供调优。

  • test - 测试集。好比正式考场,在全部训练和调优彻底结束后,仅使用一次,用于提供模型泛化能力的无偏估计。

  • dataset_dict.json - 定义了数据集所包含的官方数据划分

  • .arrow - Hugging Face数据集文件格式,是国际标准通用的一套标准化、高效率的数据格式

    • .arrow格式并不是大模型微调中的唯一格式,也可能是csv、json,甚至是txt。.arrow格式也支持转换为csv格式。另外我们可以随便打开一个ModelScope数据集就可以印证这种差异:

image.png

Coding

前奏终于完了,废话少说,终于可以上代码了。

数据集下载

from datasets import load_dataset,load_from_disk
from pyarrow.compute import index

#在线加载数据,cache_dir为存储目录
dataset = load_dataset(path="lansinuote/ChnSentiCorp",cache_dir="../data/")
print(dataset)

本地数据加载

  • load_from_disk:用于加载由dataset.save_to_disk()方法显式保存的、包含完整元数据的数据集目录,而非临时的下载缓存。主要用于保存经过自己处理(如清洗、过滤、特征工程)后的数据集

  • load_dataset:绝大多数情况下,直接使用即可。

# 加载缓存数据
# 加载
# datasets = load_from_disk(r"/path/model")
datasets = load_dataset(r"/path/model")
print(datasets)

csv数据转换

# 转为csv格式
for name,data in dataset.items():
    df = data.to_pandas()
    # 要保证data目录存在
    df.to_csv(f"../data/{name}.csv",index=False)

数据集构建

这是模型微调的第一步,构建自己的数据集结构,用于将数据集输入给大模型。

  • CHDataSet:继承自Dataset,自定义数据集
  • init:初始化函数,主要根据下载的数据集格式定义
  • len:返回数据集长度
  • getitem:返回每条数据内容

image.png

可以看看我们的数据集格式,主要分text、label,getitem函数返回的就是这两数据:

  • text:评价内容
  • label:标签,1正向评价0负向评价
from torch.utils.data import Dataset
from datasets import load_from_disk, load_dataset

class CHDataSet(Dataset):
    #初始化数据集
    def __init__(self,split):
        #从磁盘加载数据
        self.dataset = load_dataset(r"../data/lansinuote___chn_senti_corp/default/0.0.0/b0c4c119c3fb33b8e735969202ef9ad13d717e5a")
        if split == "train":
            self.dataset = self.dataset["train"]
        elif split == "test":
            self.dataset = self.dataset["test"]
        elif split == "validation":
            self.dataset = self.dataset["validation"]
        else:
            print("数据名错误!")

    #返回数据集长度
    def __len__(self):
        return len(self.dataset)

    #对每条数据单独做处理
    def __getitem__(self, item):
        text = self.dataset[item]["text"]
        label = self.dataset[item]["label"]

        return text,label

if __name__ == '__main__':
    dataset = CHDataSet("train")
    for data in dataset:
        print(data)

至此,模型微调就完成了第一步:数据集的构建。