基于PaddleHub的圣诞节祝福语
目录
一、前言
基督教纪念耶稣诞生的重要节日。亦称耶稣圣诞节、主降生节,天主教亦称耶稣圣诞瞻礼。耶稣诞生的日期,《圣经》并无记载。公元336年罗马教会开始在12月25日过此节。12月25日原是罗马帝国规定的太阳神诞辰。有人认为选择这天庆祝圣诞,是因为基督教徒认为耶稣就是正义、永恒的太阳。5世纪中叶以后,圣诞节作为重要节日,成了教会的传统,并在东西派教会中逐渐传开。因所用历法不同等原因,各教派会举行庆祝的具体日期和活动形式也有差别。圣诞节习俗传播到亚洲主要是在十九世纪中叶,日本、韩国等都受到了圣诞文化的影响。现在西方在圣诞节常互赠礼物,举行欢宴,并以圣诞老人、圣诞树等增添节日气氛,已成为普遍习俗。圣诞节也成为西方世界以及其他很多地区的公共假日。
我们先来看看效果:
-
输入:大海
-
输出:[[‘北风吹,雪花飘,雪花飘飘圣诞到,祝福化作吉祥语,愿君常欢笑,圣诞老人告诉你,别把牙笑掉’, ‘北风吹,大海深,一气送你摇钱树,二气送你贵人扶,三气送你心情好,四气送你没烦恼,五气送你钱满箱,六气’, ‘北风吹,一起数着星星,一起老去’, ‘圣诞节是欢喜和快乐的时光,因为不用上课’, ‘北风吹,大海涨,一起数着星星,二起老去’]]
二、模型介绍
模型名称
本项目使用ernie_gen模型进行微调。
模型概述
ERNIE-GEN 是面向生成任务的预训练-微调框架,首次在预训练阶段加入span-by-span 生成任务,让模型每次能够生成一个语义完整的片段。在预训练和微调中通过填充式生成机制和噪声感知机制来缓解曝光偏差问题。此外, ERNIE-GEN 采样多片段-多粒度目标文本采样策略, 增强源文本和目标文本的关联性,加强了编码器和解码器的交互。ernie_gen module是一个具备微调功能的module,可以快速完成特定场景module的制作。
构建三种新颖的方法来增强语言生成能力:
- 跨度生成预训练任务:使模型能够在每个步骤而不是单词上生成语义完整的跨度。
- 丰富的生成和噪声感知生成:减轻曝光偏差的问题。
- 多粒度目标片段:在预训练期间增强编码器和解码器之间的相关性。
具体来说,基于填充生成机制的跨跨生成任务和逐词生成任务受到精心设计的Multi-Flow Attention体系结构的增强,如下所示。
更多详情参考论文ERNIE-GEN:An Enhanced Multi-Flow Pre-training and Fine-tuning Framework for Natural Language Generation。
查看代码
https://github.com/PaddlePaddle/ERNIE/blob/repro/ernie-gen/
三、实现过程
准备数据
- train_path(str): 训练集路径。训练集的格式应为:“序号\t输入文本\t标签”,例如:“1\t床前明月光\t疑是地上霜”
- dev_path(str): 验证集路径。验证集的格式应为:“序号\t输入文本\t标签”,例如:“1\t举头望明月\t低头思故乡”
数据集展示:
1 星辰 圣诞树点燃了,无数的星辰亮起,天空上写下你的名字,当流星划过时,也把我的思念与祝福一同捎去
2 祝福 美丽的圣诞节之际,谨致我的思念与祝福
3 圣诞节 愿你度过最美好的圣诞节
4 朋友 在这美好的日子,没有最美的词句,没有多情的言语,没有精美的礼品,有的只是朋友深深的祝福,圣诞快乐
5 思念 又到圣诞节,分别已几天;梦中想起你,醒来对愁眠;独坐陋室内,思念千里外;奈何相思苦,短信表祝福:时时开心在,刻刻笑开怀
6 圣诞树 送你一颗聚满礼物的圣诞树,顶上最大最亮的那颗星是我的真心,下面挂的是我的痴心,制造材料的是我一颗不变有心:圣诞快乐
7 百花 圣诞临近百花香,一香送你摇钱树,二香送你贵人扶,三香送你心情好,四香送你没烦恼,五香送你钱满箱,六香送你永健康
8 时光 圣诞节是欢喜和快乐的时光,因为不用上课
9 彩灯 平安夜亮起的彩灯,是我深深的思念;圣诞节飘落的雪花,是我真真的牵挂;寒气中流露的气息,都有我满满的祝福
10 特别 奉上一颗祝福的心,在这个特别的日子里,愿你幸福如意快乐,一切美好与你同在
11 可惜 我们不能在一起过圣诞节真是太可惜了……您一定乐得跳起来了
12 喜悦 我相信:祝福,就是我们需要的;能够祝福的,都是可爱的!在至爱的圣诞节,深深地祝福你!愿我的祝福给你的圣诞平添一份喜悦
13 礼物 圣诞节快乐,还没有收到礼物吧,我送的礼物有圣诞靴用来装美好愿望,圣诞树结满幸福的苹果,传递幸福和美好愿望,开心快乐
14 感情 如果在平安夜和圣诞节没收到我的礼物,请不要怀疑我们的感情,我只是穷而已
15 贺忱 致圣诞贺忱与最美好的祝福
16 雪花 北风吹,雪花飘,雪花飘飘圣诞到,祝福化作吉祥语,愿君常欢笑,圣诞老人告诉你,别把牙笑掉
17 学生 祝您圣诞快乐,您的全体学生敬上
18 呵护 送你一棵圣诞树,挂满叮咛和呵护,愿你人生有赢没有输,送你一块圣诞糖,带来祝福你身旁,愿你节日开心又吉祥,新的一年你最强
19 开心 给烦恼打发一个滚蛋,为快乐留下一份炒蛋,给爱情派送一个金蛋,让幸福陪伴一天圣诞,祝你开心我的笨蛋
20 皓月 让我们在圣诞节的日子里,皓月当空,一起数着星星,一起老去
### 安装依赖
paddlepaddle >= 1.8.2
paddlehub >= 1.7.0
!pip install paddlehub==1.8.0
!hub install ernie_gen==1.0.1
!pip install paddle-ernie
查看参数
finetune方法
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=50,
max_decode_len=50,
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,
):
参数
- 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): 训练时的模型保存间隔部署。验证集将在模型保存完毕后进行预测。
返回
result(dict): 运行结果。包含2个键:
last_save_path(str): 训练结束时的模型保存路径。
last_ppl(float): 训练结束时的模型困惑度。
export方法
def export(
params_path,
module_name,
author,
max_encode_len=50,
max_decode_len=50,
version="1.0.0",
summary="",
author_email="",
export_path=".")
module导出API,通过此API可以一键将训练参数打包为hub module。
参数
- params_path(str): 模型参数路径。
- module_name(str): module名称,例如"ernie_gen_couplet"。
- author(str): 作者名称。
- max_encode_len(int): 最大编码长度。
- max_decode_len(int): 最大解码长度。
- version(str): 版本号。
- summary(str): module的英文简介。
- author_email(str): 作者的邮箱地址。
- export_path(str): module的导出路径。
开始训练
import paddlehub as hub
module = hub.Module(name="ernie_gen")
result = module.finetune(
train_path='/home/aistudio/trains.txt',
max_steps=1000,
batch_size=10,
use_gpu=True
)
module.export(params_path=result['last_save_path'], module_name="ernie_gen_test", author="七年")
安装模型
!hub install ernie_gen_test
命令行预测
!hub run ernie_gen_test --input_text="大海" --use_gpu True --beam_width 5
API预测
import paddlehub as hub
module = hub.Module(name="ernie_gen_test")
test_texts = ["短暂"]
# generate包含3个参数,texts为输入文本列表,use_gpu指定是否使用gpu,beam_width指定beam search宽度。
results = module.generate(texts=test_texts, use_gpu=True, beam_width=5)
for result in results:
print(result)
四、圣诞快乐
因为有了圣诞,雪花倍加浪漫;因为有了许愿,生活更加灿烂;因为有了挂念,幸福爬上笑脸;因为有了祝愿,寒冬倍感温暖;愿你体会我的思念,感受我的祝愿,圣诞快乐!