使用PaddleHub完成军训感想

军训完还要写什么感想!我只想睡觉!


  • 本项目基于PaddleHub的ERNIE-GEN模型生成军训感想

  • 文本生成的项目大多以飞桨1.8.4版本为基础,已无法直接运行。本项目基于飞桨2.1.2,可以一键运行。

本项目作为示例演示项目,用于体验飞桨平台的高效与便利。

各部分详细内容请点击相应链接学习


数据介绍

数据集收集自网络,包括86条军训感想。数据以txt形式提供,一条数据为一行。


飞桨平台介绍

飞桨(PaddlePaddle)是集深度学习核心框架、工具组件和服务平台为一体的技术先进、功能完备的开源深度学习平台,已被中国企业广泛使用,深度契合企业应用需求,拥有活跃的开发者社区生态。

  • 作为深度学习的一站式供应商,百度飞桨提供了从入门资料及数据集,到模型训练算力再到模型落地部署。你可以从零基础开始,通过学习飞桨上的课程及项目,在手机上部署一个人脸识别的系统。

  • 飞桨提供了在线的编程环境NOTEBOOK和V100算力,只需要一台能上网的电脑,立刻就能开始深度学习之旅。

  • PaddlePaddle是国产自研的深度学习框架,而且语法已经与PyTorch,TensorFlow2高度类似,短时间内能快速上手。

  • 在飞桨(PaddlePaddle)平台向优秀项目的开发者提供算力,专家指导甚至落地必需的资金支持,适合有好的想法但不知道如何实现的开发者。

PaddleHub介绍

便捷地获取PaddlePaddle生态下的预训练模型,完成模型的管理和一键预测。配合使用Fine-tune API,可以基于大规模预训练模型快速完成迁移学习,让预训练模型能更好地服务于用户特定场景的应用。

  • 基于优秀的社区生态和持续的投入,飞桨(PaddlePaddle)已经有一批可以直接调用的模型,可以快速实现想法。

  • 这些模型被根据不同方向存在不同的套件中,例如:基于NLP的PaddleNLP,基于GAN的PaddleGAN等

PaddleHub

ERNIE-GEN 介绍

ERNIE-GEN 是面向生成任务的预训练-微调框架,首次在预训练阶段加入span-by-span 生成任务,让模型每次能够生成一个语义完整的片段。在预训练和微调中通过填充式生成机制和噪声感知机制来缓解曝光偏差问题。

此外, ERNIE-GEN 采样多片段-多粒度目标文本采样策略, 增强源文本和目标文本的关联性,加强了编码器和解码器的交互。ernie_gen module是一个具备微调功能的module,可以快速完成特定场景module的制作。

def finetune(
  train_path,
  dev_path=None,
  save_dir="ernie_gen_result",
  init_ckpt_path=None,
  use_gpu=True,
  max_steps=500,
  batch_size=8,
  max_encode_len=15,
  max_decode_len=15,
  learning_rate=5e-5,
  warmup_proportion=0.1,
  weight_decay=0.1,
  noise_prob=0,
  label_smooth=0,
  beam_width=5,
  length_penalty=1.0,
  log_interval=100,
  save_interval=200,
):
API参数
train_path(str):训练集路径。训练集的格式应为:“序号\t输入文本\t标签”,例如:“1\t床前明月光\t疑是地上霜”
dev_path(str):验证集路径。验证集的格式应为:“序号\t输入文本\t标签”,例如:“1\t举头望明月\t低头思故乡”
save_dir(str):模型保存以及验证集预测输出路径。
init_ckpt_path(str):模型初始化加载路径,可实现增量训练。
use_gpu(bool):是否使用GPU。
max_steps(int):最大训练步数。
batch_size(int):训练时的batch大小。
max_encode_len(int):最长编码长度。
max_decode_len(int):最长解码长度。
learning_rate(float):学习率大小。
warmup_proportion(float):学习率warmup比例。
weight_decay(float):权值衰减大小。
noise_prob(float):噪声概率,详见ernie gen论文。
label_smooth(float):标签平滑权重。
beam_width(int):验证集预测时的beam大小。
length_penalty(float):验证集预测时的长度惩罚权重。
log_interval(int):训练时的日志打印间隔步数。
save_interval(int):训练时的模型保存间隔部署。验证集将在模型保存完毕后进行预测。

PaddleHub-ERNIE-GEN

ERNIE-GEN: An Enhanced Multi-Flow Pre-training and Fine-tuning Framework for Natural Language Generation

项目实现

  • 准备数据集

  • 关键词提取

  • 安装ernie_gen模型并训练

  • 模型推理

# 安装jieba_paddle
!hub install jieba_paddle==1.0.0

准备数据集

输入准备好的数据集并查看数据集长度分布

# 读入数据
import pandas as pd
data_ori =  pd.read_table("work/军训心得.txt",header=None)
print(data_ori.head(5)) # 查看前五行
                                                   0
0  “寒风飘飘落叶,军队是一朵绿花”。我们身着迷彩服在雨中踏着正步,我们感到又漫长,又痛苦,却充...
1  是的,军训是很辛苦的,回想今天,苦在脚上磨出的泡,苦在为正步踢麻的腿,苦在站军姿时累酸的腰间...
2  教官的喉咙已经沙哑,然而还是有力地喊着:“稍息,立正。一二一”训练时他们严格,精益求精,然而...
3  我要做勇敢的女孩,如果我是勇敢的,我就无所畏惧,那么我就没有理由放弃努力,坚持下去,坚持到底...
4  我告别了那个令我回味无穷的母校,升入了这个绚丽多彩的大学。进入大学的每一个新生都必须参加军训...
# 查看数据的长度分布
%matplotlib inline
%config InlineBackend.figure_format = 'retina'
len_list = []
for i in range(len(data_ori)):
    temp_data  = data_ori.iloc[i,0]
    len_list.append(len(temp_data))
        
import seaborn as sns
import matplotlib.pyplot as plt

plt.figure(figsize=(5,5))
sns.distplot(len_list)
plt.show()

# 发现大部分数据长度为50-300

在这里插入图片描述

关键词提取

使用jieba_paddle 进行处理

该Module是jieba使用PaddlePaddle深度学习框架搭建的切词网络(双向GRU)。

同时也支持jieba的传统切词方法,如精确模式、全模式、搜索引擎模式等切词模式,使用方法和jieba保持一致。 更多信息参考:jieba

本项目需要的输入为:标签 + 文本,由于数据集不包括标签,因此使用关键词提取算法生成标签。

本项目使用的两种关键词提取方法如下:


  • textrank 方法

    基于 TextRank 算法的关键词抽取

    • 参数

    sentence(str): 待提取的文本

    topK(int): 返回几个 TF/IDF 权重最大的关键词,默认值为 20

    withWeight(bool): 为是否一并返回关键词权重值,默认值为 False

    allowPOS(tuple): 仅包括指定词性的词,默认值为(‘ns’, ‘n’, ‘vn’, ‘v’)

    • 返回

    results(list): 关键词结果


  • extract_tags 方法

    基于 TF-IDF 算法的关键词抽取

    • 参数

    sentence(str): 待提取的文本

    topK(int): 返回几个 TF/IDF 权重最大的关键词,默认值为 20

    withWeight(bool): 为是否一并返回关键词权重值,默认值为 False

    allowPOS(tuple): 仅包括指定词性的词,默认值为空,即不筛选

    • 返回

    results(list): 关键词结果


jieba_paddle

## 关键词提取
import paddlehub as hub
module = hub.Module(name="jieba_paddle")
# extract_tags 方法提取
with open(f'data/extract_tags.txt', 'w') as f:
    for i in range(len(data_ori)):
        temp_data  = data_ori.iloc[i,0]
        results = module.extract_tags(
                    sentence=temp_data,
                    topK=1,
                    withWeight=False,
                    allowPOS=()
                )

        if results:
            f.write(f'{i}\t{results[0]}\t{temp_data}\r\n')

# textrank 方法提取
with open(f'data/textrank.txt', 'w') as f:
    for i in range(len(data_ori)):
        temp_data  = data_ori.iloc[i,0]
        results = module.textrank(
            sentence=temp_data,
            topK=1,
            withWeight=False,
            allowPOS=('ns', 'n', 'vn', 'v')
        )
        if results:
            f.write(f'{i}\t{results[0]}\t{temp_data}\r\n')


[2021-09-06 15:09:11,393] [ WARNING] - The _initialize method in HubModule will soon be deprecated, you can use the __init__() to handle the initialization of the object

安装ernie_gen模型并训练

安装最新ernie_gen模型,并设置使用序号为0的GPU进行训练。最后导出为HUB模型

# 安装ernie_gen模型,设置GPU
!hub install ernie_gen==1.1.0
!export CUDA_VISIBLE_DEVICES=0
#开始训练
# 训练时长约40min
module = hub.Module(name="ernie_gen")
fiction_name = 'junxun'
result = module.finetune(
    train_path=f'data/textrank.txt',
    save_dir=f'save_model',
    init_ckpt_path=None,
    use_gpu=True,
    max_steps=4000,
    batch_size=16,
    max_encode_len=10,
    max_decode_len=200,
    learning_rate=5e-5,
    warmup_proportion=0.1,
    noise_prob=0.2,
    label_smooth=0,
    beam_width=5,
    length_penalty=1.0,
    log_interval=100,
    save_interval=2000,
)

print(result)
module.export(
    params_path=result['last_save_path'],# 模型参数路径
    module_name='ernie_gen_textrank', # module名称,例如"ernie_gen_couplet"
    author='Peng',# 作者名称
    version="1.0.0", # 版本号
    summary="生成军训感想",# module的简介
    author_email="",# 作者的邮箱地址
    export_path="."# module的导出路径
)

[2021-09-06 15:50:50,341] [    INFO] - Begin export the model save in save_model/step_4000_ppl_1.01789.params ...
[2021-09-06 15:50:50,970] [    INFO] - The module has exported to /home/aistudio/ernie_gen_textrank

模型推理

安装已经训练完成并导出的模型,设置GPU后进行预测。通过test_texts输入预测关键词

默认预测关键词为:军训

# 安装模型
!hub install ernie_gen_textrank
!export CUDA_VISIBLE_DEVICES=0
# 开始预测
import paddlehub as hub
module = hub.Module(name='ernie_gen_textrank')
test_texts = ['军训']
results = module.generate(
    texts=test_texts, # 输入的关键词
    use_gpu=True, # 是否使用GPU
    beam_width=4  # 输出的前N个答案
)

for result in results[0]:
的关键词
    use_gpu=True, # 是否使用GPU
    beam_width=4  # 输出的前N个答案
)

for result in results[0]:
    print(result)
[2021-09-06 15:53:08,548] [    INFO] - Already cached /home/aistudio/.paddlenlp/models/ernie-1.0/ernie_v1_chn_base.pdparams
[2021-09-06 15:53:08,551] [   DEBUG] - init ErnieModel with config: {'attention_probs_dropout_prob': 0.1, 'hidden_act': 'relu', 'hidden_dropout_prob': 0.1, 'hidden_size': 768, 'initializer_range': 0.02, 'max_position_embeddings': 513, 'num_attention_heads': 12, 'num_hidden_layers': 12, 'type_vocab_size': 2, 'vocab_size': 18000, 'pad_token_id': 0}
[2021-09-06 15:53:11,631] [    INFO] - loading pretrained model from /home/aistudio/.paddlenlp/models/ernie-1.0/ernie_v1_chn_base.pdparams
[2021-09-06 15:53:12,324] [    INFO] - param:mlm_bias not set in pretrained model, skip
[2021-09-06 15:53:12,327] [    INFO] - param:mlm.weight not set in pretrained model, skip
[2021-09-06 15:53:12,329] [    INFO] - param:mlm.bias not set in pretrained model, skip
[2021-09-06 15:53:12,330] [    INFO] - param:mlm_ln.weight not set in pretrained model, skip
[2021-09-06 15:53:12,332] [    INFO] - param:mlm_ln.bias not set in pretrained model, skip
[2021-09-06 15:53:13,350] [    INFO] - Found /home/aistudio/.paddlenlp/models/ernie-1.0/vocab.txt
[2021-09-06 15:53:13,365] [ WARNING] - use_gpu has been set False as you didn't set the environment variable CUDA_VISIBLE_DEVICES while using use_gpu=True


军训生活将作为记忆中的一抹绿色永远留在我的脑海中。坚持、奋斗、团结这些曾经陌生了许久的东西也因而回到
军训已经进行了一段时间了,在我的求学生涯中,这是第三次军训。初高中的时候都有过为期一周的军训,但那个
军训之前,教官就严肃地告诉我们,军训,可不是一件好玩的事,它训练的是人的军姿,人的状态,人的意志力。
军训很苦,军训很短,但它在每个学子心中留下的印记将永不磨灭!没有经历过军训的学习生涯是不完整的!安工

总结

  • 本项目对基于飞桨2.1.2版本的PaddleHub的ERNIE-GEN模型进行了演示

  • 作为演示项目,整个项目运行时间约1H,帮助大家感受深度学习的魅力

如果后续需要进行其他类型文本的生成,可以根据本项目数据集简单修改实现。

参考项目

[1] https://aistudio.baidu.com/aistudio/projectdetail/2238291

[2] https://aistudio.baidu.com/aistudio/projectdetail/1049443

欢迎大家加入飞桨领航团!

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐