对预训练模型进行微调

​ 近年来随着自然语言处理技术的不断发展,预训练模型已经成为了近年来最热门的研究方向之一。预训练模型有更好的性能表现。然而,对于刚接触的人来说,阵对预训练模型的训练可能会显得复杂和难以理解。

​ 因此,本文将以对BART微调用于文本摘要任务为例子提供如何对预训练模型+微调的教程,通过本文所提供的示例,相信能够更好地理解和应用预训练模型,从而在自己的研究和项目中取得更好的成果。

什么是预训练+微调

​ 预训练+微调是一种常用的NLP训练的范式。预训练+微调的过程通常可以分为两个阶段:

​ 首先,在一个大规模的数据集上训练一个通用的预训练模型,例如BERT、GPT-2等。这个预训练模型的目标是学习一些通用的语言模型或者视觉特征,以便能够应用到各种具体任务中。

​ 其次,针对具体的任务,在相对较小的数据集上对预训练模型进行微调。可以将预训练模型Fine-tune到文本分类、命名实体识别等子任务中。微调的过程通常是在原来预训练模型的基础上,针对具体任务的特定数据集进行少量的训练,以调整模型的参数,使得模型在具体任务上能够取得更好的表现。

​ 叫我们自己实现一个预训练模型是不现实的(没钱、没显卡),但是不用担心,Google、Facebook等大厂会帮我们训练好大模型,我们所需要做的,只需要调用他们在自己的数据集微调就好了。

训练环境搭建

首先我们需要准备好微调环境,你可以在自己的电脑上安装所需要的库,如:Pytorch、Transformers、NLTK等等所必须要库。但是,我觉得可以,但是没有必要。因为随着互联网的发展,我们完全可以使用云平台来来协助我们训练模型,接下来的教程,将会依靠百度的云平台飞桨AI Studio - 人工智能学习实训社区来完成

云平台的优点

在自己的电脑上运行模型往往会安装大量的库,但是这些库的安装并不像

pip install xxx

这样一行命令就能够完成安装,往往需要踩过各种坑才能安装成功

而如果使用云平台的话,事情就好办多了,自带各种深度学习框架,无需下载

如何使用

1.进入飞桨AI Studio,注册并登录

2.右上角进入个人中心,在项目里新建一个项目,全部默认设置,最后设置项目名称、标签、描述,有需要可以添加自己的数据集

3.创建好后,点击启动环境,注意基础版没有GPU,所以我们需要选择有GPU的环境

等待环境部署...

4.完善环境的搭建

在文本摘要任务中我们还需要"rouge_score"库来进行ROUGE的计算,wandb库来进行微调的可视化,只需要点击“+”号,进入终端用pip命令安装即可。

pip install rouge_score
pip install wandb

如此,我们的实验环境便搭建好了

模型的获取

回到飞桨AI Studio,进入模型库,内置了包含许多任务的模型

文本摘要是生成式模型,我们点击“自然语言处理->文本生成”查看是否有BART模型

没有?其实我们在BART模型汇总 — PaddleNLP 文档,中可以看见,其实PaddleNlp已经内置了BART模型,不需要额外的进行下载。

我们只需要在训练的时候这么写就能导入 BART

from paddlenlp.transformers import BartForConditionalGeneration, BartTokenizer
model = BartForConditionalGeneration.from_pretrained('bart-base')
tokenizer = BartTokenizer.from_pretrained('bart-base')

其实相较于Huggingface,Paddle包含的模型简直少得可怜,但是PaddleNLP并不能直接使用Huggingface里的模型,那怎么办呢?其实我们可以通过转换,将Huggingface里的模型转为PaddleNLP所支持的就可以了

数据集的获取

PaddleNLP内置了许多模型,当然也内置了许多的数据库,可以快速的使用API进行调用,具体的数据集可以在此查看:

PaddleNLP Datasets API — PaddleNLP 文档

我们在文本生成一类中发现了我们需要的摘要数据集

如此,便导入了本次训练的数据集LCSTS

from paddlenlp.datasets import load_dataset
train, val = load_dataset('lcsts_new', splits=["train", "dev"])

当然,如果有自己的数据集可以这样导入

from paddlenlp.datasets import load_dataset
train_ds, dev_ds = load_dataset("squad", data_files=("my_train_file.json", "my_dev_file.json"))
test_ds = load_dataset("squad", data_files="my_test_file.json")

微调

以上,我们完成了环境的搭建、模型和数据集的导入,接下来就正式进入微调环节

本次微调我们需要三个文件:

train.py:训练接口文件,对参数的设置

train_utils.py:模型的加载及其训练具体代码

csl_title_public.py:数据集的加载与处理

代码在此:voluntexi/Pre-trainedForSummarization (github.com)

运行

打开train.py,config中的参数

config = {
        'seed': 2022,
        'pretrained_model': 'bart-base', 
        'dataset_name': 'lcsts_new',  
        'train_batch_size': 18,
        'eval_batch_size': 16,
        'save_steps':3000,
        'logging_steps':200,
        'max_source_length': 512,
        'max_target_length': 128,
        'min_target_length': 0,
        'max_steps': -1,
        'warmup_proportion': 0.1,
        'warmup_steps': 0,
        'num_train_epochs': 30,
        'learning_rate': 1e-5,
        'adam_epsilon': 1e-6,
        'weight_decay': 0.01,
        'use_amp': False,
        'scale_loss': 2**15,
        'output_dir': './output',
        'device': 'GPU',
        'ignore_pad_token_for_loss': True
    }

执行代码

python train.py

就可以开始训练了,wandb能够将训练过程可视化

可以看到训练完成后的效果并不好,主要有以下几个原因:

  • 训练Epoch太少,例子中我只设置的1代的Epoch,当然效果不是很好,在正式的任务中建议还是加大Epoch的数值
  • 本文采用的BART-BASE是在英文上进行预训练的,用于中文肯定效果不好,在正式的任务中对于中文数据集还是需要在Huggingface中寻找使用中文训练的模型

总结

以上就是对预训练模型进行微调的形式,使用到的工具有:百度云平台、PaddlePaddle、PaddleNLP、wandb、NLTK等工具/库

掌握后,后续就可以在此基础上加上其他模型,以更好的提升模型的性能,如BERT+LSTM+ATTEN等模型的拼接训练。