关于算法:应用实践Paddle分类模型大集成者PaddleHubFinetuneprompt

52次阅读

共计 18621 个字符,预计需要花费 47 分钟才能阅读完成。

相干文章:
Paddlenlp 之 UIE 模型实战实体抽取工作【打车数据、快递单】

Paddlenlp 之 UIE 分类模型【以情感偏向剖析新闻分类为例】含智能标注计划)

我的项目连贯:
[利用实际:分类模型大集成者[PaddleHub、Finetune、prompt]](https://aistudio.baidu.com/ai…)

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

PaddleHub–API 接口文档阐明:遇到不晓得参数设置具体情况追查接口阐明!!!

https://paddlehub.readthedocs…

应用 PaddleHub Fine-tune API 进行 Fine-tune 能够分为 4 个步骤。

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

    1.1 二分类模型 demo

    抉择模型

paddlehub 反对模型列表

PaddleHub 还提供 BERT 等模型可供选择, 以后反对文本分类工作的模型对应的加载示例如下:

模型名 PaddleHub Module
ERNIE, Chinese hub.Module(name='ernie')
ERNIE tiny, Chinese hub.Module(name='ernie_tiny')
ERNIE 2.0 Base, English hub.Module(name='ernie_v2_eng_base')
ERNIE 2.0 Large, English hub.Module(name='ernie_v2_eng_large')
BERT-Base, English Cased hub.Module(name='bert-base-cased')
BERT-Base, English Uncased hub.Module(name='bert-base-uncased')
BERT-Large, English Cased hub.Module(name='bert-large-cased')
BERT-Large, English Uncased hub.Module(name='bert-large-uncased')
BERT-Base, Multilingual Cased hub.Module(nane='bert-base-multilingual-cased')
BERT-Base, Multilingual Uncased hub.Module(nane='bert-base-multilingual-uncased')
BERT-Base, Chinese hub.Module(name='bert-base-chinese')
BERT-wwm, Chinese hub.Module(name='chinese-bert-wwm')
BERT-wwm-ext, Chinese hub.Module(name='chinese-bert-wwm-ext')
RoBERTa-wwm-ext, Chinese hub.Module(name='roberta-wwm-ext')
RoBERTa-wwm-ext-large, Chinese hub.Module(name='roberta-wwm-ext-large')
RBT3, Chinese hub.Module(name='rbt3')
RBTL3, Chinese hub.Module(name='rbtl3')
ELECTRA-Small, English hub.Module(name='electra-small')
ELECTRA-Base, English hub.Module(name='electra-base')
ELECTRA-Large, English hub.Module(name='electra-large')
ELECTRA-Base, Chinese hub.Module(name='chinese-electra-base')
ELECTRA-Small, Chinese hub.Module(name='chinese-electra-small')

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

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

hub.Module的参数用法如下:

  • name:模型名称,能够抉择 ernieernie_tinybert-base-casedbert-base-chinese, roberta-wwm-extroberta-wwm-ext-large 等。
  • task:fine-tune 工作。此处为seq-cls,示意文本分类工作。
  • num_classes:示意以后文本分类工作的类别数,依据具体应用的数据集确定,默认为 2。

加载数据集:

加载官网提供数据集:选用中文情感分类公开数据集 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…

ChnSentiCorp的参数用法如下:

  • tokenizer:示意该 module 所需用到的 tokenizer,其将对输出文本实现切词,并转化成 module 运行所需模型输出格局。
  • mode:抉择数据模式,可选项有 train, dev, test,默认为train
  • max_seq_len:ERNIE/BERT 模型应用的最大序列长度,若呈现显存有余,请适当调低这一参数。

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 优化器,其的参数用法:

  • learning_rate: 全局学习率。默认为 1e-3;
  • parameters: 待优化模型参数。

运行配置

Trainer 次要管制 Fine-tune 工作的训练,是工作的发起者,蕴含以下可管制的参数:

  • model: 被优化模型;
  • optimizer: 优化器抉择;
  • use_gpu: 是否应用 gpu 训练;
  • use_vdl: 是否应用 vdl 可视化训练过程;
  • checkpoint_dir: 保留模型参数的地址;
  • compare_metrics: 保留最优模型的掂量指标;

执行 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):
  • train_dataset: 训练时所用的数据集;
  • epochs: 训练轮数;
  • batch_size: 训练的批大小,如果应用 GPU,请依据理论状况调整 batch_size;
  • num_workers: works 的数量,默认为 0;
  • eval_dataset: 验证集;
  • log_interval: 打印日志的距离,单位为执行批训练的次数, 举荐设置为 50,100 默认值为 10。
  • save_interval: 保留模型的距离频次,单位为执行训练的轮数。
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: {} \t 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="\t", 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/PaddlePadd…

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: {} \t 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 小结

  • PaddleHub 旨在为开发者提供丰盛的、高质量的、间接可用的预训练模型。
  • 【无需深度学习背景、无需数据与训练过程】,可疾速应用 AI 模型,享受人工智能时代红利。
  • 涵盖 CV、NLP、Audio、Video 支流四大品类,反对一键预测、一键服务化部署和疾速迁徙学习全副模型开源下载,离线可运行。

个性:

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

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

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

【十行代码迁徙学习】:十行代码实现图片分类、文本分类的迁徙学习工作

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

反对工作【文本辨认、人脸检测、图像编辑、指标检测、关键点检测、图像宰割、图像分类、词法剖析、文本生成、句法分析、情感剖析、文本审核、语音合成、视频分类等】

<font size=4 color=”red”>长处非常显著易上手,比方数据集构建非常简略,当然毛病也就显露出来,就是在云端运行的时候不不便对参数设置,个性化设置偏少,以及如果开发者谋求高精度模型,难以微调。 </font >

2. 基于预训练模型 Fine-tune 实现文本分类工作

2.1 预训练模型介绍

近年来随着深度学习的倒退,模型参数的数量飞速增长。为了训练这些参数,须要更大的数据集来防止过拟合。然而,对于大部分 NLP 工作来说,构建大规模的标注数据集十分艰难(老本过高),特地是对于句法和语义相干的工作。相比之下,大规模的未标注语料库的构建则绝对容易。为了利用这些数据,咱们能够先从其中学习到一个好的示意,再将这些示意利用到其余工作中。最近的钻研表明,基于大规模未标注语料库的预训练模型(Pretrained Models, PTM) 在 NLP 工作上获得了很好的体现。

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

  • BERT(Bidirectional Encoder Representations from Transformers)中文模型,简写 bert-base-chinese,其由 12 层 Transformer 网络组成。
  • ERNIEERNIE 3.0 Titan: Exploring Larger-scale Knowledge Enhanced Pre-training for Language Understanding and Generation,反对 ERNIE 3.0-Medium 中文模型(简写 ernie-3.0-medium-zh)和 ERNIE 3.0-Base-zh 等 ERNIE 3.0 轻量级中文模型。
  • RoBERTa(A Robustly Optimized BERT Pretraining Approach),反对 24 层 Transformer 网络的 roberta-wwm-ext-large 和 12 层 Transformer 网络的 roberta-wwm-ext。

[外链图片转存失败, 源站可能有防盗链机制, 倡议将图片保留下来间接上传(img-54hQnzaH-1658565713584)(https://ai-studio-static-onli…)]

<font size=4 color=”red”> 当然还有最新的 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) </font>

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 的预训练模型能够很容易地通过 from_pretrained() 办法加载。Auto 模块(包含 AutoModel, AutoTokenizer, 及各种上游工作类)提供了不便易用的接口,无需指定类别,即可调用不同网络结构的预训练模型。第一个参数是汇总表中对应的 Pretrained Weight,可加载对应的预训练权重。AutoModelForSequenceClassification 初始化 init 所需的其余参数,如 num_classes 等,也是通过 from_pretrained() 传入。Tokenizer 应用同样的from_pretrained 办法加载。
  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. 如需复原模型训练,则能够设置 init_from_ckpt,如 init_from_ckpt=checkpoints/model_100/model_state.pdparams。
  2. 如需应用 ernie-tiny 模型,则须要提前先装置 sentencepiece 依赖

    如 pip install sentencepiece

  3. 应用动态图训练完结之后,还能够将动态图参数导出成动态图参数,具体代码见 export_model.py。动态图参数保留在 output_path 指定门路中。运行形式:

    python export_model.py --params_path=./checkpoint/model_900/model_state.pdparams --output_path=./export
    

    其中 params_path 是指动态图训练保留的参数门路,output_path 是指动态图参数导出门路。

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

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

这个宾馆比拟古老了,特价的房间也很个别。总体来说个别
怀着非常冲动的情绪放映,可是看着看着发现,在放映结束后,呈现一集米老鼠的动画片
作为老的四星酒店,房间仍然很整洁,相当不错。机场接机服务很好,能够在车上办理入住手续,节省时间。

能够间接调用 predict 函数即可输入预测后果

Data: 这个宾馆比拟古老了,特价的房间也很个别。总体来说个别      Label: negative
Data: 怀着非常冲动的情绪放映,可是看着看着发现,在放映结束后,呈现一集米老鼠的动画片      Label: negative
Data: 作为老的四星酒店,房间仍然很整洁,相当不错。机场接机服务很好,能够在车上办理入住手续,节省时间。Label: positive

3. Prompt–UIE 分类问题

UIE 这块波及很多事项和常识,我就放在另外一个我的项目展现,详情参考上面链接:

Paddlenlp 之 UIE 分类模型【以情感偏向剖析新闻分类为例】含智能标注计划)

成果如下图:

比拟举荐!

4. 总结

paddlehub:

  • PaddleHub 旨在为开发者提供丰盛的、高质量的、间接可用的预训练模型。
  • 【无需深度学习背景、无需数据与训练过程】,可疾速应用 AI 模型,享受人工智能时代红利。
  • 涵盖 CV、NLP、Audio、Video 支流四大品类,反对一键预测、一键服务化部署和疾速迁徙学习全副模型开源下载,离线可运行。

长处非常显著易上手,比方数据集构建非常简略,当然毛病也就显露出来,就是在云端运行的时候不不便对参数设置,个性化设置偏少,以及如果开发者谋求高精度模型,难以微调。

fine tune

能够看出在应用 paddlenlp 下的 fine tune 办法是可控性更多,尽管 hub 简略,然而集体更偏向应用 paddlenlp 框架下的预训练模型应用办法

Prompt—UIE

为了进步开发过程中的开发效率,缩小不必要的反复工作工夫,凋谢域信息抽取能够实现零样本(zero-shot)或者少样本(few-shot)抽取,大幅度降低标注数据依赖,在降低成本的同时,还晋升了成果,更进一步!

这里舒适提醒遇到问题多看文档手册

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

自己博客:https://blog.csdn.net/sinat_3…

正文完
 0