文章目录
前言
Huggingface Transformers库是Huggingface公司在github上开源的基于Transformers结构开发的预训练NLP框架。其一直致力于大规模预训练模型应用的平民化,让开发者能够方便使用SOTA的模型,而非受困于训练的算力资源。其打造了一个开放的平台,提供了大量的Models,datasets以及如何快速使用的api,同时也欢迎开发者上传自己的模型和数据集。目前已有超过39000个models,在github上transformer库也超过61k星,可见其火热程度。随着transformer在其他领域出色的表现,目前Huggingface Transformers的任务和模型除了Natural Language Processing,也延申到Multimodal,Audio,Computer Vision,Reinforcement Learning等领域。
一、任务说明
Huggingface Transformers库 官方文档有较完整的说明以及相关视频教程。但一些细节处理问题并没有详细说明和例程,中文的应用也相对较少。所以本文以一个作词人风格分类的任务,把几个关键技术点串联起来,包括数据加载,处理,模型,分词,训练,评价,推理。
任务输入:一段歌词
任务输出:哪个作词人的风格。
如图:
text列是输入的歌词
prediction是模型预测的写词人风格
true_label是真实标签
score是置信度
二、几个概念的理解
dataset:数据集类,提供了很多数据处理接口,如load_dataset,map,split等,可以很方便高效地处理数据集
model:模型,可通过from_pretrained 方法直接加载huggingface上的模型
tokenizer:分词类,同样可通过from_pretrained方法直接加载。每种模型都有对应的vocab词典以及对应分词方法,所以这里加载的模型name或路径需要跟加载model时的参数保持一致。
Pipeline:快速推理通道,不是所有模型都支持
autoclass:主要分为两类:AutoTokenizer+和AutoModel+,通过这两类的from_pretrained来加载分词器和模型
Metrics:评价类,可通过load_metric加载预定义的Metrics。定义好评价函数后在调用训练接口Trainer时赋值给compute_metrics,则训练过程会计算相关的predictions
TrainingArguments:训练参数,搬运官网的说明:TrainingArguments is the subset of the arguments we use in our example scripts which relate to the training loop itself.
Trainer:训练类,参数包括模型,训练参数,训练集,验证集,compute_metrics
以上接口均可在官网doc里找到:https://huggingface.co/docs.
三、自定义数据集的处理和加载
加载自定义数据集:
1.数据来源
音乐数据,可在github搜一下QQMusicSpider
2.数据处理
2.1定义labels
为方便验证效果,筛选了6位优秀写词人的作品,分别是 [‘林夕’, ‘方文山’, ‘黄霑’, ‘罗大佑’, ‘李宗盛’, ‘黄伟文’],并以每个写词人命名json文件分开存放,如下图:
json文件格式如下图:
2.2合并
把所有写词人的数据合并到一个大的json里面。由于我们用于分类的歌词一般是歌词句子而不是整首歌词,所以把每首歌歌词进行了分句,并两两拼接。如下图:
3.load和split
huggingface的数据集是Dataset类型,所以需要将json数据转换为Dataset。这里使用transformer库自带的load_dataset方法进行转换。并且利用train_test_split对数据集按8:1:1进行训练集,验证集,测试集的切分。测试集不参与训练过程,只用于检查模型性能。
def json2tranformers_data(self):
m_dataset = load_dataset('j