前置条件
上一篇 入坑大模型微调第一个Hugging Face程序 主要介绍了 Hugging Face及其使用方式。是我们后续做大模型微调训练的基础。不了解的可以再回顾一下。
他山之石
之前在偶然百度大脑看到一个 AI情感倾向分析 的工具,当时就在想其背后的原理。正好最近在学习AI大模型微调,于是便正好借此入手自己也搞个情感分析模型玩玩。
- 其一,能更深入了解其原理
- 其二,也是自己入坑大模型微调的第一个小项目
项目基础
模型?
第一个问题便是:我需要重新预训练一个AI大模型吗? 显然一个大模型从预训练到成型可用,其投入的成本很大。答案显然是否定的,因为模型微调的核心在于:
利用预训练模型已学到的通用知识作为起点,通过特定任务的小规模数据进一步调整模型参数,使其适应新的应用场景
那么我该使用什么样的模型呢?这是一个基于文字语言的情感分析,那就应该找一个现成的善于处理文本情感的模型。通过请教我的AI老师,得知BERT正是满足条件的一个轻量级模型。
数据集?
有了模型,微调需要通过特定任务的小规模数据进一步调整模型参数。那去哪找这些数据呢?当然基本还是在 Hugging Face 或者 ModelScope。 这里使用的是Hugging Face,至于用哪个数据集最快的方式依然是请教AI老师,
这个项目使用的是 lansinuote/ChnSentiCorp 数据集.这个数据集主要搜集一些网络平台的评价,分为内容和标签(1好评0差评)。我们正好用这个数据集来进行情感分析模型的微调。
微调SOP
目前的模型微调已经形成了以数据驱动、分阶段迭代、效率优先为核心的标准化流程。
-
数据准备 - 明确输入、输出
-
数据集构建 - 基于数据集格式构建数据集,用于模型读取(后续微调使用框架时,框架会集成该功能,我们需要按框架要求的格式转换数据集)
-
训练环境设置 - 硬件/软件环境配置,包括基座模型配置
-
批次编码 - 将数据集转换为模型可以识别的格式
-
模型微调执行 - 参数优化策略选择与实施
-
评估验证 - 多维度性能验证
-
部署上线 - 推理优化与工程化封装
-
监控维护 - 持续迭代与效果保障
今天基本只讲数据集,涉及1、2步。
数据集
基础
我们在Hugging Face官网或者下载的模型目录里会发现有几个不同的数据集,这些数据集又有哪些区别呢?
-
train - 训练集。好比习题册,模型通过它学习任务特定的知识,参数通过计算训练集上的损失并进行反向传播来更新。
-
validation - 验证集。好比模拟测试,它在训练过程中周期性使用,但不参与参数更新。通过和训练集的参数对比来得出训练集参数是否过拟合等。目标是提供调优。
-
test - 测试集。好比正式考场,在全部训练和调优彻底结束后,仅使用一次,用于提供模型泛化能力的无偏估计。
-
dataset_dict.json - 定义了数据集所包含的官方数据划分
-
.arrow - Hugging Face数据集文件格式,是国际标准通用的一套标准化、高效率的数据格式
- .arrow格式并不是大模型微调中的唯一格式,也可能是csv、json,甚至是txt。.arrow格式也支持转换为csv格式。另外我们可以随便打开一个ModelScope数据集就可以印证这种差异:
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:返回每条数据内容
可以看看我们的数据集格式,主要分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)
至此,模型微调就完成了第一步:数据集的构建。