2021SC@SDUSC-山东大学软件工程与实践-Senta(3)

Senta中的语义表示模型ERNIE

本篇代码分析续接2021SC@SDUSC-山东大学软件工程与实践-Senta(2) ,完成对ERNIE模型的训练前配置并组建运行Fine-tune task。

#选择运行时配置
config = hub.RunConfig(
    use_cuda=True,
    num_epoch=1,
    checkpoint_dir="ernie_txt_cls_turtorial_demo",
    batch_size=32,
    log_interval=10,
    eval_interval=50,
    strategy=strategy)

在进行Finetune前,需要设置一些运行时的配置,如上述代码中,表示:
use_cuda:False表示使用CPU进行训练。如果本机支持GPU,且安装的是GPU版本的PaddlePaddle,将选项设置为True效率更高;
epoch:要求Finetune的任务遍历训练集次数;
batch_size:每次训练的时候,给模型输入的每批数据的大小。模型训练时能够并行处理批数据,因此batch_size越大,训练的效率越高,但是同时带来了内存的负荷,过大的batch_size可能导致内存不足而无法训练,因此选择一个合适的batch_size是很重要的一步;
log_interval:每隔10 step打印一次训练日志;
eval_interval:每隔50 step在验证集上进行一次性能评估;
checkpoint_dir:将训练的参数和数据保存到ernie_txt_cls_turtorial_demo目录中;
strategy:finetune策略;

有了合适的预训练模型和准备要迁移的数据集后,开始组建 Task。 获取module的上下文环境,包括输入和输出的变量,以及Paddle
Program; 从输出变量中找到用于情感分类的文本特征pooled_output;
在pooled_output后面接入一个全连接层,生成Task

#组建Finetune Task
inputs, outputs, program = module.context(
    trainable=True, max_seq_len=128)

pooled_output = outputs["pooled_output"]

feed_list = [
    inputs["input_ids"].name,
    inputs["position_ids"].name,
    inputs["segment_ids"].name,
    inputs["input_mask"].name,
]

cls_task = hub.TextClassifierTask(
    data_reader=reader,
    feature=pooled_output,
    feed_list=feed_list,
    num_classes=dataset.num_labels,
    config=config)

开始Finetune :选择finetune_and_eval接口来进行模型训练,这个接口在finetune的过程中,会周期性的进行模型效果的评估,以便我们了解整个训练过程的性能变化。 当Finetune完成后,使用模型来进行预测

#开始Finetune 
cls_task.finetune_and_eval()

#使用模型进行预测
# coding: utf-8
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import numpy as np
import os

import paddle
import paddle.fluid as fluid
import paddlehub as hub

# loading Paddlehub ERNIE pretrained model
module = hub.Module(name="ernie")
inputs, outputs, program = module.context(max_seq_len=128)

# Sentence classification  dataset reader
dataset = hub.dataset.ChnSentiCorp()
reader = hub.reader.ClassifyReader(
    dataset=dataset,
    vocab_path=module.get_vocab_path(),
    max_seq_len=128)

# Construct transfer learning network
# Use "pooled_output" for classification tasks on an entire sentence.
# Use "sequence_output" for token-level output.
pooled_output = outputs["pooled_output"]

# Setup feed list for data feeder
# Must feed all the tensor of ERNIE's module need
feed_list = [
    inputs["input_ids"].name,
    inputs["position_ids"].name,
    inputs["segment_ids"].name,
    inputs["input_mask"].name,
]

strategy = hub.AdamWeightDecayStrategy(
    weight_decay=0.01,
    warmup_proportion=0.1,
    learning_rate=5e-5,
    lr_scheduler="linear_decay",
    optimizer_name="adam")

# Setup runing config for PaddleHub Finetune API
config = hub.RunConfig(
    use_data_parallel=False,
    use_pyreader=False,
    use_cuda=True,
    batch_size=32,
    enable_memory_optim=False,
    checkpoint_dir="ernie_txt_cls_turtorial_demo",
    strategy=strategy)

# Define a classfication finetune task by PaddleHub's API
cls_task = hub.TextClassifierTask(
    data_reader=reader,
    feature=pooled_output,
    feed_list=feed_list,
    num_classes=dataset.num_labels,
    config=config)

# Data to be prdicted
data = [
    ["这个宾馆比较陈旧了,特价的房间也很一般。总体来说一般"], 
    ["交通方便;环境很好;服务态度很好 房间较小"],
    ["稍微重了点,可能是硬盘大的原故,还要再轻半斤就好了。" ],
    ["服务很不错,下次还会来。" ],
    ["前台接待太差,下次不会再选择入住此店啦"], 
    ["菜做的很好,味道很不错。" ],
    ["19天硬盘就罢工了,算上运来的一周都没用上15天,你说这算什么事呀"],
    ["现在是高峰期,人太多了,我们晚点来吧"]
]

index = 0
run_states = cls_task.predict(data=data)
results = [run_state.run_results for run_state in run_states]
for batch_result in results:
    # get predict index
    batch_result = np.argmax(batch_result, axis=2)[0]
    for result in batch_result:
        if result==1:
            result='正向'
        else:
            result='负向'
        print(data[index][0], result)
        index += 1

两篇对ERNIE模型的分析到此结束。通过查找相关资料,在以下对ERNIE模型的知识进行补充:

ERNIE
模型本身保持基于字特征输入建模,使得模型在应用时不需要依赖其他信息,具备更强的通用性和可扩展性。相对词特征输入模型,字特征可建模字的组合语义,例如建模红色,绿色,蓝色等表示颜色的词语时,通过相同字的语义组合学到词之间的语义关系。

此外,ERNIE
的训练语料引入了多源数据知识。除了百科类文章建模,还对新闻资讯类、论坛对话类数据进行学习,这里重点介绍下论坛对话建模。对于对话数据的学习是语义表示的重要途径,往往相同回复对应的
Query 语义相似。

基于该假设,ERINE 采用 DLM(Dialogue Language Model)建模 Query-Response 对话结构,将对话
Pair 对作为输入,引入 Dialogue Embedding 标识对话的角色,利用 Dialogue Response Loss
学习对话的隐式关系,通过该方法建模进一步提升模型语义表示能力。

ERNIE在语言推断、语义相似度、命名实体识别、情感分析、问答匹配等自然语言处理(NLP)各类中文任务上的验证显示,模型效果全面超越
BERT,如下表所示。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值