应用实践:Paddle分类模型的集成者[PaddleHub、Finetune、prompt

1.基于PaddleHub下的分类模型构建

PaddleHub--API接口文档说明:遇到不知道参数设置具体情况清查接口说明!!!

https://paddlehub.readthedocs.io/zhCN/release-v2.1/apiindex.html

使用PaddleHub Fine-tune API进行Fine-tune可以分为4个步骤。

  1. 选择模型
  2. 加载数据集
  3. 选择优化策略和运行配置
  4. 执行fine-tune并评估模型

1.1 二分类模型demo

选择模型

paddlehub支持模型列表

PaddleHub还提供BERT等模型可供选择, 当前支持文本分类任务的模型对应的加载示例如下:


通过以上的一行代码,model初始化为一个适用于文本分类任务的模型,为ERNIE的预训练模型后拼接上一个全连接网络(Full Connected)。

model = hub.Module(name='ernie',task='seq-cls', num_classes=2)

hub.Module的参数用法如下:

加载数据集:

加载官方提供数据集:选用中文情感分类公开数据集ChnSentiCorp为示例(二分类经典数据集)

train_dataset = hub.datasets.ChnSentiCorp(tokenizer=model.get_tokenizer(), max_seq_len=128, mode='train')
dev_dataset = hub.datasets.ChnSentiCorp(tokenizer=model.get_tokenizer(), max_seq_len=128, mode='dev')
test_dataset = hub.datasets.ChnSentiCorp(tokenizer=model.get_tokenizer(), max_seq_len=128, mode='test')

#查看数据集
for i in range(10):
    print(test_dataset.examples[i])

参数问题请查看文档:https://paddlehub.readthedocs.io/zhCN/release-v2.1/api/datasetsindex.html

ChnSentiCorp的参数用法如下:

tokenizer的作用是将原始输入文本转化成模型model可以接受的输入数据形式。 PaddleHub 2.0中的各种预训练模型已经内置了相应的tokenizer,可以通过model.get_tokenizer方法获取。

optimizer = paddle.optimizer.Adam(learning_rate=5e-5, parameters=model.parameters())  # 优化器的选择和参数配置
trainer = hub.Trainer(model, optimizer, checkpoint_dir='./chekpoint', use_gpu=True,use_vdl=True)        # fine-tune任务的执行者

优化策略

Paddle2.0-rc提供了多种优化器选择,如SGD, Adam, Adamax等,详细参见https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/optimizer/Overview_cn.html#about-lr

在本教程中选择了Adam优化器,其的参数用法:

Trainer 主要控制Fine-tune任务的训练,是任务的发起者,包含以下可控制的参数:

执行fine-tune并评估模型

trainer.train(train_dataset, epochs=3, batch_size=32, eval_dataset=dev_dataset,log_interval=10, save_interval=1)   # 配置训练参数,启动训练,并指定验证集

trainer.train 主要控制具体的训练过程,包含以下可控制的参数:

def train(
    train_dataset: paddle.io.Dataset,
    epochs: int = 1,
    batch_size: int = 1,
    num_workers: int = 0,
    eval_dataset: paddle.io.Dataset = None,
    log_interval: int = 10,
    save_interval: int = 10,
    collate_fn: Callable = None):
result = trainer.evaluate(test_dataset, batch_size=32)    # 在测试集上评估当前训练模型
def evaluate(
    eval_dataset: paddle.io.Dataset,
    batch_size: int = 1,
    num_workers: int = 0,
    collate_fn: Callable = None):

使用模型进行预测

当Finetune完成后,我们加载训练后保存的最佳模型来进行预测,完整预测代码如下:

import numpy as np

# Data to be prdicted
data = [
    ["这个宾馆比较陈旧了,特价的房间也很一般。总体来说一般"], 
    ["交通方便;环境很好;服务态度很好 房间较小"],
    ["还稍微重了点,可能是硬盘大的原故,还要再轻半斤就好了。其他要进一步验证。贴的几种膜气泡较多,用不了多久就要更换了,屏幕膜稍好点,但比没有要强多了。建议配赠几张膜让用用户自己贴。"],
    ["前台接待太差,酒店有A B楼之分,本人check-in后,前台未告诉B楼在何处,并且B楼无明显指示;房间太小,根本不像4星级设施,下次不会再选择入住此店啦"], 
    ["19天硬盘就罢工了~~~算上运来的一周都没用上15天~~~可就是不能换了~~~唉~~~~你说这算什么事呀~~~"]
]

label_map = {0: 'negative', 1: 'positive'}
#加载模型
model = hub.Module(
    name='ernie',
    task='seq-cls',
    load_checkpoint='./ckpt/best_model/model.pdparams',
    label_map=label_map)
results = model.predict(data, max_seq_len=128, batch_size=1, use_gpu=True)
for idx, text in enumerate(data):
    print('Data: {} 	 Lable: {}'.format(text[0], results[idx]))
Data: 这个宾馆比较陈旧了,特价的房间也很一般。总体来说一般      Lable: negative
Data: 交通方便;环境很好;服务态度很好 房间较小      Lable: positive
Data: 还稍微重了点,可能是硬盘大的原故,还要再轻半斤就好了。其他要进一步验证。贴的几种膜气泡较多,用不了多久就要更换了,屏幕膜稍好点,但比没有要强多了。建议配赠几张膜让用用户自己贴。      Lable: negative
Data: 前台接待太差,酒店有A B楼之分,本人check-in后,前台未告诉B楼在何处,并且B楼无明显指示;房间太小,根本不像4星级设施,下次不会再选择入住此店啦      Lable: negative
Data: 19天硬盘就罢工了~~~算上运来的一周都没用上15天~~~可就是不能换了~~~唉~~~~你说这算什么事呀~~~      Lable: negative

至此二分类任务完成,需要完成程序,见文件paddlehub train 和predic文件,进行脚本运行!

1.2 多分类任务demo

1.2.1自定义数据集

本示例数据集是由清华大学提供的新闻文本数据集THUCNews。THUCNews是根据新浪新闻RSS订阅频道2005~2011年间的历史数据筛选过滤生成,包含74万篇新闻文档(2.19 GB),均为UTF-8纯文本格式。我们在原始新浪新闻分类体系的基础上,重新整合划分出14个候选分类类别:财经、彩票、房产、股票、家居、教育、科技、社会、时尚、时政、体育、星座、游戏、娱乐。为了快速展示如何使用PaddleHub完成文本分类任务,该示例数据集从THUCNews训练集中随机抽取了9000条文本数据集作为本示例的训练集,从验证集中14个类别每个类别随机抽取100条数据作为本示例的验证集,测试集抽取方式和验证集相同

如果希望使用自定义的数据集,则需要对自定义数据进行相应的预处理,将数据集文件处理成预训练模型可以读取的格式。例如用PaddleHub文本分类任务使用自定义数据时,需要切分数据集,将数据集切分为训练集、验证集和测试集。

a. 设置数据集目录。 用户需要将数据集目录设定为如下格式。

 data: 数据目录
     train.txt: 训练集数据
     dev.txt: 验证集数据
     test.txt: 测试集数据

b. 设置文件格式和内容。 训练集、验证集和测试集文件的编码格式建议为utf8格式。内容的第一列是文本内容,第二列为文本类别标签。列与列之间以Tab键分隔。建议在数据集文件第一行填写列说明"label"和"text_a",中间以Tab键分隔,示例如下:

label    text_a
房产    昌平京基鹭府10月29日推别墅1200万套起享97折
教育    贵州2011高考录取分数线发布理科一本448分
社会    众多白领因集体户口面临结婚难题
#查看数据集
%cd /home/aistudio/数据集

!tar -zxvf thu_news.tar.gz

!ls -hl thu_news

!head -n 3 thu_news/train.txt

c. 加载自定义数据集。 加载文本分类的自定义数据集,用户仅需要继承基类TextClassificationDataset,修改数据集存放地址以及类别即可,具体可以参考如下代码:

#方法一:
import paddlehub as hub
import paddle
model = hub.Module(name="ernie_tiny", task='seq-cls', num_classes=14) # 在多分类任务中,num_classes需要显式地指定类别数,此处根据数据集设置为14

import os, io, csv
from paddlehub.datasets.base_nlp_dataset import InputExample, TextClassificationDataset

# 数据集存放位置
DATA_DIR="/home/aistudio/数据集/thu_news"

class ThuNews(TextClassificationDataset):
    def __init__(self, tokenizer, mode='train', max_seq_len=128):
        if mode == 'train':
            data_file = 'train.txt'
        elif mode == 'test':
            data_file = 'test.txt'
        else:
            data_file = 'valid.txt'
        super(ThuNews, self).__init__(
            base_path=DATA_DIR,
            data_file=data_file,
            tokenizer=tokenizer,
            max_seq_len=max_seq_len,
            mode=mode,
            is_file_with_header=True,
            label_list=['体育', '科技', '社会', '娱乐', '股票', '房产', '教育', '时政', '财经', '星座', '游戏', '家居', '彩票', '时尚'])

    # 解析文本文件里的样本
    def _read_file(self, input_file, is_file_with_header: bool = False):
        if not os.path.exists(input_file):
            raise RuntimeError("The file {} is not found.".format(input_file))
        else:
            with io.open(input_file, "r", encoding="UTF-8") as f:
                reader = csv.reader(f, delimiter="	", quotechar=None)
                examples = []
                seq_id = 0
                header = next(reader) if is_file_with_header else None
                for line in reader:
                    example = InputExample(guid=seq_id, text_a=line[0], label=line[1])
                    seq_id += 1
                    examples.append(example)
                return examples

train_dataset = ThuNews(model.get_tokenizer(), mode='train', max_seq_len=128)
dev_dataset = ThuNews(model.get_tokenizer(), mode='dev', max_seq_len=128)
test_dataset = ThuNews(model.get_tokenizer(), mode='test', max_seq_len=128)
for e in train_dataset.examples[:3]:
    print(e)
# 方法二:对上述步骤精简了一下,但是出现了一些警告,不过对结果不影响,介意的话推荐用第一个

from paddlehub.datasets.base_nlp_dataset import TextClassificationDataset
class SeqClsDataset(TextClassificationDataset):
    # 数据集存放目录
    base_path = '/home/aistudio/数据集/thu_news'
    # 数据集的标签列表
    label_list=['体育', '科技', '社会', '娱乐', '股票', '房产', '教育', '时政', '财经', '星座', '游戏', '家居', '彩票', '时尚']

    def __init__(self, tokenizer, max_seq_len: int = 128, mode: str = 'train'):
        if mode == 'train':
            data_file = 'train.txt'
        elif mode == 'test':
            data_file = 'test.txt'
        else:
            data_file = 'dev.txt'
        super().__init__(
            base_path=self.base_path,
            tokenizer=tokenizer,
            max_seq_len=max_seq_len,
            mode=mode,
            data_file=data_file,
            label_list=self.label_list,
            is_file_with_header=True)


# 选择所需要的模型,获取对应的tokenizer
import paddlehub as hub
model = model = hub.Module(name='ernie_tiny', task='seq-cls', num_classes=len(SeqClsDataset.label_list))
tokenizer = model.get_tokenizer()

# 实例化训练集
train_dataset = SeqClsDataset(tokenizer)

至此用户可以通过SeqClsDataset实例化获取对应的数据集,可以通过hub.Trainer对预训练模型model完成文本分类任务

更多关于图像分类、序列标注等数据自定义参考开发文档: https://github.com/PaddlePaddle/PaddleHub/blob/release/v2.0.0-rc/docs/docsch/tutorial/howtoloaddata.md#%E5%9B%9B%E6%96%87%E6%9C%AC%E5%88%86%E7%B1%BB%E6%95%B0%E6%8D%AE%E9%9B%86

1.2.2 训练&预测结果

optimizer = paddle.optimizer.Adam(learning_rate=5e-5, parameters=model.parameters())  # 优化器的选择和参数配置
trainer = hub.Trainer(model, optimizer, checkpoint_dir='./ckpt', use_gpu=True,use_vdl=True)  # fine-tune任务的执行者,开启可视化
trainer.train(train_dataset, epochs=3, batch_size=32, eval_dataset=dev_dataset, save_interval=1)   # 配置训练参数,启动训练,并指定验证集

result = trainer.evaluate(test_dataset, batch_size=32)    # 在测试集上评估当前训练模型

训练结果部分展示:

[2022-07-21 11:23:04,936] [   TRAIN] - Epoch=3/3, Step=160/282 loss=0.0756 acc=0.9844 lr=0.000050 step/sec=4.78 | ETA 00:03:26
[2022-07-21 11:23:07,040] [   TRAIN] - Epoch=3/3, Step=170/282 loss=0.0971 acc=0.9781 lr=0.000050 step/sec=4.75 | ETA 00:03:26
[2022-07-21 11:23:09,128] [   TRAIN] - Epoch=3/3, Step=180/282 loss=0.1516 acc=0.9594 lr=0.000050 step/sec=4.79 | ETA 00:03:25
[2022-07-21 11:23:11,210] [   TRAIN] - Epoch=3/3, Step=190/282 loss=0.0854 acc=0.9781 lr=0.000050 step/sec=4.80 | ETA 00:03:25
[2022-07-21 11:23:13,301] [   TRAIN] - Epoch=3/3, Step=200/282 loss=0.0953 acc=0.9781 lr=0.000050 step/sec=4.78 | ETA 00:03:24
[2022-07-21 11:23:15,398] [   TRAIN] - Epoch=3/3, Step=210/282 loss=0.0761 acc=0.9750 lr=0.000050 step/sec=4.77 | ETA 00:03:24
[2022-07-21 11:23:17,497] [   TRAIN] - Epoch=3/3, Step=220/282 loss=0.1358 acc=0.9563 lr=0.000050 step/sec=4.76 | ETA 00:03:24
[2022-07-21 11:23:19,589] [   TRAIN] - Epoch=3/3, Step=230/282 loss=0.1075 acc=0.9750 lr=0.000050 step/sec=4.78 | ETA 00:03:23
[2022-07-21 11:23:21,675] [   TRAIN] - Epoch=3/3, Step=240/282 loss=0.0858 acc=0.9719 lr=0.000050 step/sec=4.79 | ETA 00:03:23
[2022-07-21 11:23:23,764] [   TRAIN] - Epoch=3/3, Step=250/282 loss=0.0670 acc=0.9875 lr=0.000050 step/sec=4.79 | ETA 00:03:23
[2022-07-21 11:23:25,849] [   TRAIN] - Epoch=3/3, Step=260/282 loss=0.0780 acc=0.9781 lr=0.000050 step/sec=4.80 | ETA 00:03:22
[2022-07-21 11:23:27,937] [   TRAIN] - Epoch=3/3, Step=270/282 loss=0.1262 acc=0.9594 lr=0.000050 step/sec=4.79 | ETA 00:03:22
[2022-07-21 11:23:30,025] [   TRAIN] - Epoch=3/3, Step=280/282 loss=0.1550 acc=0.9625 lr=0.000050 step/sec=4.79 | ETA 00:03:22

[Evaluation result] avg_acc=0.9136

# Data to be prdicted
data = [
    # 房产
    ["昌平京基鹭府10月29日推别墅1200万套起享97折  新浪房产讯(编辑郭彪)京基鹭府(论坛相册户型样板间点评地图搜索)售楼处位于昌平区京承高速北七家出口向西南公里路南。项目预计10月29日开盘,总价1200万元/套起,2012年年底入住。待售户型为联排户型面积为410-522平方米,独栋户型面积为938平方米,双拼户型面积为522平方米。  京基鹭府项目位于昌平定泗路与东北路交界处。项目周边配套齐全,幼儿园:伊顿双语幼儿园、温莎双语幼儿园;中学:北师大亚太实验学校、潞河中学(北京市重点);大学:王府语言学校、北京邮电大学、现代音乐学院;医院:王府中西医结合医院(三级甲等)、潞河医院、解放军263医院、安贞医院昌平分院;购物:龙德广场、中联万家商厦、世纪华联超市、瑰宝购物中心、家乐福超市;酒店:拉斐特城堡、鲍鱼岛;休闲娱乐设施:九华山庄、温都温泉度假村、小汤山疗养院、龙脉温泉度假村、小汤山文化广场、皇港高尔夫、高地高尔夫、北鸿高尔夫球场;银行:工商银行、建设银行、中国银行、北京农村商业银行;邮局:中国邮政储蓄;其它:北七家建材城、百安居建材超市、北七家镇武装部、北京宏翔鸿企业孵化基地等,享受便捷生活。"],
    # 游戏
    ["尽管官方到今天也没有公布《使命召唤:现代战争2》的游戏详情,但《使命召唤:现代战争2》首部包含游戏画面的影片终于现身。虽然影片仅有短短不到20秒,但影片最后承诺大家将于美国时间5月24日NBA职业篮球东区决赛时将会揭露更多的游戏内容。  这部只有18秒的广告片闪现了9个镜头,能够辨识的场景有直升机飞向海岛军事工事,有飞机场争夺战,有潜艇和水下工兵,有冰上乘具,以及其他的一些镜头。整体来看《现代战争2》很大可能仍旧与俄罗斯有关。  片尾有一则预告:“May24th,EasternConferenceFinals”,这是什么?这是说当前美国NBA联赛东部总决赛的日期。原来这部视频是NBA季后赛奥兰多魔术对波士顿凯尔特人队时,TNT电视台播放的广告。"],
    # 体育
    ["罗马锋王竟公然挑战两大旗帜拉涅利的球队到底错在哪  记者张恺报道主场一球小胜副班长巴里无可吹捧,罗马占优也纯属正常,倒是托蒂罚失点球和前两号门将先后受伤(多尼以三号身份出场)更让人揪心。阵容规模扩大,反而表现不如上赛季,缺乏一流强队的色彩,这是所有球迷对罗马的印象。  拉涅利说:“去年我们带着嫉妒之心看国米,今年我们也有了和国米同等的超级阵容,许多教练都想有罗马的球员。阵容广了,寻找队内平衡就难了,某些时段球员的互相排斥和跟从前相比的落差都正常。有好的一面,也有不好的一面,所幸,我们一直在说一支伟大的罗马,必胜的信念和够级别的阵容,我们有了。”拉涅利的总结由近一阶段困扰罗马的队内摩擦、个别球员闹意见要走人而发,本赛季技术层面强化的罗马一直没有上赛季反扑的面貌,内部变化值得球迷关注。"],
    # 教育
    ["新总督致力提高加拿大公立教育质量  滑铁卢大学校长约翰斯顿先生于10月1日担任加拿大总督职务。约翰斯顿先生还曾任麦吉尔大学长,并曾在多伦多大学、女王大学和西安大略大学担任教学职位。  约翰斯顿先生在就职演说中表示,要将加拿大建设成为一个“聪明与关爱的国度”。为实现这一目标,他提出三个支柱:支持并关爱家庭、儿童;鼓励学习与创造;提倡慈善和志愿者精神。他尤其强调要关爱并尊重教师,并通过公立教育使每个人的才智得到充分发展。"]
]

label_list=['体育', '科技', '社会', '娱乐', '股票', '房产', '教育', '时政', '财经', '星座', '游戏', '家居', '彩票', '时尚']
label_map = { 
    idx: label_text for idx, label_text in enumerate(label_list)
}

model = hub.Module(
    name='ernie',
    task='seq-cls',
    load_checkpoint='./ckpt/best_model/model.pdparams',
    label_map=label_map)
results = model.predict(data, max_seq_len=128, batch_size=1, use_gpu=True)
for idx, text in enumerate(data):
    print('Data: {} 	 Lable: {}'.format(text[0], results[idx]))
Data: 昌平京基鹭府10月29日推别墅1200万套起享97折  新浪房产讯(编辑郭彪)京基鹭府(论坛相册户型样板间点评地图搜索)售楼处位于昌平区京承高速北七家出口向西南公里路南。项目预计10月29日开盘,总价1200万元/套起,2012年年底入住。待售户型为联排户型面积为410-522平方米,独栋户型面积为938平方米,双拼户型面积为522平方米。  京基鹭府项目位于昌平定泗路与东北路交界处。项目周边配套齐全,幼儿园:伊顿双语幼儿园、温莎双语幼儿园;中学:北师大亚太实验学校、潞河中学(北京市重点);大学:王府语言学校、北京邮电大学、现代音乐学院;医院:王府中西医结合医院(三级甲等)、潞河医院、解放军263医院、安贞医院昌平分院;购物:龙德广场、中联万家商厦、世纪华联超市、瑰宝购物中心、家乐福超市;酒店:拉斐特城堡、鲍鱼岛;休闲娱乐设施:九华山庄、温都温泉度假村、小汤山疗养院、龙脉温泉度假村、小汤山文化广场、皇港高尔夫、高地高尔夫、北鸿高尔夫球场;银行:工商银行、建设银行、中国银行、北京农村商业银行;邮局:中国邮政储蓄;其它:北七家建材城、百安居建材超市、北七家镇武装部、北京宏翔鸿企业孵化基地等,享受便捷生活。      Lable: 房产
Data: 尽管官方到今天也没有公布《使命召唤:现代战争2》的游戏详情,但《使命召唤:现代战争2》首部包含游戏画面的影片终于现身。虽然影片仅有短短不到20秒,但影片最后承诺大家将于美国时间5月24日NBA职业篮球东区决赛时将会揭露更多的游戏内容。  这部只有18秒的广告片闪现了9个镜头,能够辨识的场景有直升机飞向海岛军事工事,有飞机场争夺战,有潜艇和水下工兵,有冰上乘具,以及其他的一些镜头。整体来看《现代战争2》很大可能仍旧与俄罗斯有关。  片尾有一则预告:“May24th,EasternConferenceFinals”,这是什么?这是说当前美国NBA联赛东部总决赛的日期。原来这部视频是NBA季后赛奥兰多魔术对波士顿凯尔特人队时,TNT电视台播放的广告。      Lable: 游戏
Data: 罗马锋王竟公然挑战两大旗帜拉涅利的球队到底错在哪  记者张恺报道主场一球小胜副班长巴里无可吹捧,罗马占优也纯属正常,倒是托蒂罚失点球和前两号门将先后受伤(多尼以三号身份出场)更让人揪心。阵容规模扩大,反而表现不如上赛季,缺乏一流强队的色彩,这是所有球迷对罗马的印象。  拉涅利说:“去年我们带着嫉妒之心看国米,今年我们也有了和国米同等的超级阵容,许多教练都想有罗马的球员。阵容广了,寻找队内平衡就难了,某些时段球员的互相排斥和跟从前相比的落差都正常。有好的一面,也有不好的一面,所幸,我们一直在说一支伟大的罗马,必胜的信念和够级别的阵容,我们有了。”拉涅利的总结由近一阶段困扰罗马的队内摩擦、个别球员闹意见要走人而发,本赛季技术层面强化的罗马一直没有上赛季反扑的面貌,内部变化值得球迷关注。      Lable: 体育
Data: 新总督致力提高加拿大公立教育质量  滑铁卢大学校长约翰斯顿先生于10月1日担任加拿大总督职务。约翰斯顿先生还曾任麦吉尔大学长,并曾在多伦多大学、女王大学和西安大略大学担任教学职位。  约翰斯顿先生在就职演说中表示,要将加拿大建设成为一个“聪明与关爱的国度”。为实现这一目标,他提出三个支柱:支持并关爱家庭、儿童;鼓励学习与创造;提倡慈善和志愿者精神。他尤其强调要关爱并尊重教师,并通过公立教育使每个人的才智得到充分发展。      Lable: 教育

1.3 paddlehub小结

特性:

【丰富的预训练模型】:涵盖CV、NLP、Audio、Video主流四大品类的 180+ 预训练模型,全部开源下载,离线可运行。

【一键模型快速预测】:通过一行命令行或者极简的Python API实现模型调用,可快速体验模型效果。

【一键模型转服务化】:一行命令,搭建深度学习模型API服务化部署能力。

【十行代码迁移学习】:十行代码完成图片分类、文本分类的迁移学习任务

【跨平台兼容性】:可运行于Linux、Windows、MacOS等多种操作系统

支持任务【文本识别、人脸检测、图像编辑、目标检测、关键点检测、图像分割、图像分类、词法分析、文本生成、句法分析、情感分析、文本审核、语音合成、视频分类等】

优点十分明显易上手,比如数据集构建十分简单,当然缺点也就显露出来,就是在云端运行的时候不方便对参数设置,个性化设置偏少,以及如果开发者追求高精度模型,难以微调。

2.基于预训练模型Fine-tune完成文本分类任务

2.1预训练模型介绍

近年来随着深度学习的发展,模型参数的数量飞速增长。为了训练这些参数,需要更大的数据集来避免过拟合。然而,对于大部分NLP任务来说,构建大规模的标注数据集非常困难(成本过高),特别是对于句法和语义相关的任务。相比之下,大规模的未标注语料库的构建则相对容易。为了利用这些数据,我们可以先从其中学习到一个好的表示,再将这些表示应用到其他任务中。最近的研究表明,基于大规模未标注语料库的预训练模型(Pretrained Models, PTM) 在NLP任务上取得了很好的表现。

本项目针对中文文本分类问题,开源了一系列模型,供用户可配置地使用:

当然还有最新的ernie-3.0-medium-zh这些模型:

ERNIE 3.0-Base (12-layer, 768-hidden, 12-heads)

ERNIE 3.0-Medium (6-layer, 768-hidden, 12-heads)

ERNIE 3.0-Mini (6-layer, 384-hidden, 12-heads)

ERNIE 3.0-Micro (4-layer, 384-hidden, 12-heads)

ERNIE 3.0-Nano (4-layer, 312-hidden, 12-heads)

Fine-tune文件下文件:

  export_model.py # 动态图参数导出静态图参数脚本
  predict.py # 预测脚本
  README.md # 使用说明
  train.py # 训练评估脚本

部分结果展示:

global step 850, epoch: 3, batch: 250, loss: 0.19126, accuracy: 0.97937, speed: 9.67 step/s
global step 860, epoch: 3, batch: 260, loss: 0.25743, accuracy: 0.97917, speed: 9.55 step/s
global step 870, epoch: 3, batch: 270, loss: 0.02109, accuracy: 0.98125, speed: 9.56 step/s
global step 880, epoch: 3, batch: 280, loss: 0.15182, accuracy: 0.98203, speed: 9.53 step/s
global step 890, epoch: 3, batch: 290, loss: 0.05055, accuracy: 0.98125, speed: 9.56 step/s
global step 900, epoch: 3, batch: 300, loss: 0.01884, accuracy: 0.98188, speed: 9.63 step/s
eval loss: 0.19699, accuracy: 0.94333
best acc performence has been updated: {best_acc:0.98125} --> {acc:0.98188}
[2022-07-21 14:58:37,435] [    INFO] - tokenizer config file saved in ./checkpoints/model_best/tokenizer_config.json
[2022-07-21 14:58:37,435] [    INFO] - Special tokens file saved in ./checkpoints/model_best/special_tokens_map.json

预训练模型选择,修改程序中:

# 使用ernie预训练模型
# ernie-3.0-medium-zh
model = AutoModelForSequenceClassification.from_pretrained('ernie-3.0-medium-zh',num_classes=2))
tokenizer = AutoTokenizer.from_pretrained('ernie-3.0-medium-zh')

# 使用bert预训练模型
# bert-base-chinese
model = AutoModelForSequenceClassification.from_pretrained('bert-base-chinese', num_class=2)
tokenizer = AutoTokenizer.from_pretrained('bert-base-chinese')

Transformer预训练模型汇总

程序中主要修改地方:

  1. 加载数据集:PaddleNLP内置了多种数据集,用户可以一键导入所需的数据集。
  2. 加载预训练模型:PaddleNLP的预训练模型可以很容易地通过 frompretrained() 方法加载。 Auto模块(包括AutoModel, AutoTokenizer, 及各种下游任务类)提供了方便易用的接口, 无需指定类别,即可调用不同网络结构的预训练模型。 第一个参数是汇总表中对应的 Pretrained Weight,可加载对应的预训练权重。 AutoModelForSequenceClassification 初始化 init 所需的其他参数,如 numclasses 等, 也是通过 frompretrained() 传入。Tokenizer 使用同样的frompretrained 方法加载。
  3. 通过 Datasetmap 函数,使用 tokenizerdataset 从原始文本处理成模型的输入。
  4. 定义 BatchSamplerDataLoader,shuffle数据、组合Batch
  5. 定义训练所需的优化器,loss函数等,就可以开始进行模型fine-tune任务。

程序运行时将会自动进行训练,评估,测试。同时训练过程中会自动保存模型在指定的save_dir中。 如:

checkpoints/
  model_100
      model_config.json
      model_state.pdparams
      tokenizer_config.json
      vocab.txt
  ...

NOTE:

  1. 如需恢复模型训练,则可以设置initfromckpt, 如initfromckpt=checkpoints/model100/modelstate.pdparams。
  2. 如需使用ernie-tiny模型,则需要提前先安装sentencepiece依赖
  3. 如pip install sentencepiece
  4. 使用动态图训练结束之后,还可以将动态图参数导出成静态图参数,具体代码见exportmodel.py。静态图参数保存在outputpath指定路径中。 运行方式:
python export_model.py --params_path=./checkpoint/model_900/model_state.pdparams --output_path=./export

其中paramspath是指动态图训练保存的参数路径,outputpath是指静态图参数导出路径。

导出模型之后,可以用于部署,这里我就不做过多介绍了,需要部署的小伙伴去参考官方文档去操作吧。

将待预测数据如以下示例:

这个宾馆比较陈旧了,特价的房间也很一般。总体来说一般
怀着十分激动的心情放映,可是看着看着发现,在放映完毕后,出现一集米老鼠的动画片
作为老的四星酒店,房间依然很整洁,相当不错。机场接机服务很好,可以在车上办理入住手续,节省时间。

可以直接调用predict函数即可输出预测结果

Data: 这个宾馆比较陈旧了,特价的房间也很一般。总体来说一般      Label: negative
Data: 怀着十分激动的心情放映,可是看着看着发现,在放映完毕后,出现一集米老鼠的动画片      Label: negative
Data: 作为老的四星酒店,房间依然很整洁,相当不错。机场接机服务很好,可以在车上办理入住手续,节省时间。      Label: positive

3. Prompt--UIE分类问题

UIE这块涉及很多事项和知识,我就放在另外一个项目展示,详情参考下面链接:

Paddlenlp之UIE分类模型【以情感倾向分析新闻分类为例】含智能标注方案)

效果如下图:

比较推荐!

4. 总结

paddlehub:

优点十分明显易上手,比如数据集构建十分简单,当然缺点也就显露出来,就是在云端运行的时候不方便对参数设置,个性化设置偏少,以及如果开发者追求高精度模型,难以微调。

fine tune

可以看出在使用paddlenlp下的fine tune方法是可控性更多,虽然hub简单,但是个人更倾向使用paddlenlp框架下的预训练模型使用方法

Prompt---UIE

为了提高开发过程中的开发效率,减少不必要的重复工作时间,开放域信息抽取可以实现零样本(zero-shot)或者少样本(few-shot)抽取,大幅度降低标注数据依赖,在降低成本的同时,还提升了效果,更进一步!

这里温馨提示遇到问题多看文档手册

后续将对:文本多分类、多标签分类、层次分类进行讲解、以及这块数据集的定义方式

本人博客:https://blog.csdn.net/sinat_39620217?type=blog

展开阅读全文

页面更新:2024-05-10

标签:模型   约翰   罗马   球员   示例   户型   加载   文本   参数   数据

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top