【飞桨开发者说】郑博培,北京联合大学机器人学院2018级自动化专业本科生,飞桨开发者技术专家PPDE,深圳市柴火创客空间认证会员,百度大脑智能对话训练师
前言
尊师重教是中国的优良传统,早在公元前11世纪的西周时期,就提出“弟子事师,敬同于父”,古代大教育家孔子更是留下了“有教无类”、“温故而知新”、“学而时习之”等一系列至理名言。传道授业解惑的教师,被中国人誉为人类灵魂的工程师。
9月10日是老师们的节日,每位同学对老师的祝福可能都有自己的方式。
精通PS的同学可能会自己做一张电子明信片送给老师:
细心的同学可能还会把贺卡打印出来,再配一朵小鲜花:
可是,我既不会做贺卡,语文水平也不高,想不出很优美的祝福语送给老师,但我又想表达我对老师的感恩之心,于是,我决定写一个会生成祝福语的AI送给老师。
先来看看效果,输入与教师节有关的关键词:
示例输入:['尊敬', '伟大', '师恩', '讲台', '青春', '教育', '耕耘', '黑板']
示例输出:
以上示例输出图片取自AI Studio同版教程:
https://aistudio.baidu.com/aistudio/projectdetail/878918
生成祝福语的可行性分析
基于PaddleHub提供的面向生成任务的预训练-微调框架ERNIE-GEN(ERNIE-GEN详细介绍地址:
https://www.paddlepaddle.org.cn/hubdetail?name=ernie_gen&en_category=TextGeneration
模型概述
ERNIE-GEN 的全称是 An Enhanced Multi-Flow Pre-training and Fine-tuning Framework for Natural Language Generation。
ERNIE-GEN 是面向生成任务的预训练-微调框架。首次在预训练阶段加入span-by-span 生成任务,让模型每次能够生成一个语义完整的片段。
在预训练和微调中通过填充式生成机制和噪声感知机制来缓解曝光偏差问题。
此外,ERNIE-GEN 采样多片段-多粒度目标文本采样策略, 增强源文本和目标文本的关联性,加强了编码器和解码器的交互。ERNIE-GEN用了三种方法来提高语言生成能力:
-
span-by-span 生成任务:让模型能够每次生成一个语义完整的片段。
-
填充式生成和噪声感知生成:缓解曝光偏差问题。
-
多片段-多粒度目标文本采样:预训练阶段增强编码器和解码器的交互。
Mulit-Flow Attention 框架,用于实现 span-by-span 的填充式生成:
ERNIE-GEN能在五大典型生成任务上大显身手,其中包括生成式摘要 (Gigaword 和 CNN/DailyMail)、问题生成(SQuAD)、多轮对话(Persona-Chat) 和生成式多轮问答(CoQA)。
更多详情参考论文ERNIE-GEN:An Enhanced Multi-Flow Pre-training and Fine-tuning Framework for Natural Language Generation。
地址:
https://arxiv.org/abs/2001.11314
ERNIE-GEN在智能文本生成上也有不错的效果,比如写爱情诗歌、说土味情话、对爱情对联。下面一起来看一下如何用ERNIE-GEN写教师节祝福语。
具体实现
数据集的准备
根据教师节这个场景采集对应的教师节祝福语。
训练集的格式应为:
"序号\t输入文本\t标签"
验证集的格式应为:
"序号\t输入文本\t标签"
以下是我在网上收集到的,质量较高的教师节祝福语,我在这基础上也有加上自己的祝福:
1 教育 教子教女,辛勤半辈
2 讲台 三尺讲台,三寸舌,三寸笔,三千桃李
... ... ...
8 教师节 春蚕到死丝方尽,蜡炬成灰泪始干
9 教诲 教诲如春风,师恩似海深
10 桃李 学而不厌,诲人不倦,桃李芬芳,其乐亦融融
11 祝福 敬爱的老师,您的教诲如春风,似瑞雨,永铭我心,我虔诚地祝福您:安康,如意
12 教导 您的谆谆教导,是爱的清泉,将在我心灵的河床里,永远流淌
13 师生 老师,我们诚挚的祝福,就像老树上的翠绿,浓浓密密,与岁月俱增
14 敬爱 当我们采摘丰收果实的时候,您留给自己的却是被粉笔灰染白的两鬓白发,向您致敬,敬爱的老师
15 青春 您的教诲,是明朗朗的阳光,照在我的心田里,让我青春之花开放
... ... ...
我一共准备了两百条左右的数据,在文本生成的任务中,数据量越多,模型的效果越好。
一般情况下,一千条左右的数据量就能有很好的效果,当然,在数据集有限的情况下,两百条左右的数据也有不错的效果。
2.将PaddleHub更新到最新版本
使用PaddleHub前,我们最好都要将PaddleHub更新到最新版本。
!pip install --upgrade paddlehub -i https://pypi.tuna.tsinghua.edu.cn/simple
3.安装ERNIE-GEN
使用下面这条命令安装ERNIE-GEN。
!hub install ernie_gen==1.0.1
!pip install paddle-ernie
4.在ERNIE-GEN的基础上做finetune
在ERNIE-GEN的基础上做finetune有专门的微调API,默认采用中文ERNIE 1.0参数作为热启动参数。具体参数如下:
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):训练时的模型保存间隔部署。验证集将在模型保存完毕后进行预测。
运行结果是一个字典,包含2个键:
last_save_path(str): 训练结束时的模型保存路径。
last_ppl(float): 训练结束时的模型困惑度。
import paddlehub as hub
module = hub.Module(name="ernie_gen")
result = module.finetune(
train_path='/home/aistudio/work/train.txt',
dev_path='/home/aistudio/work/dev.txt',
save_dir="ernie_gen_result",
max_steps=600,
max_encode_len=200,
max_decode_len=200,
noise_prob=0.2,
batch_size=5,
log_interval=20
)
module.export(params_path=result['last_save_path'],module_name="TeacherDayBlessing", author="zbp")
5.使用模型API预测
模型转换完毕之后,通过hub install $module_name安装该模型
!hub install TeacherDayBlessing
最后通过API预测的方式调用自制module:
import paddlehub as hub
module = hub.Module(name="TeacherDayBlessing")
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)
-------------------------------------------------------------------------------
['当我们采摘丰收果实的时候,您留给自己的却是被粉笔灰染白的两鬓白发,向您致敬。']
['老师,您是伟大的,像一支蜡烛照亮别人燃烧自己。祝您节日快乐!']
['横式竖式,算不尽老师的爱;字里行间,装不下老师的情。']
[ '寒来暑住,三尺讲台轮回着日月;春华秋实,花园里面弥漫着芬芳,老师您辛苦了!']
['无论我成为挺拔的白杨,还是低矮的小草,老师,我都将以生命的翠绿向您致敬。']
['教的是书,育的是人。燃烧自己,照亮他人。播种理想,浇灌希望。教师节,向敬爱的老师致敬。']
[ '用语言播种,用彩笔耕耘,用汗水浇灌,用心血滋润,这就是我们敬爱的老师崇高的劳动,祝老师们节日快乐!']
['横式竖式,算不尽老师的爱;字里行间,装不下老师的情。 ']
总结与展望
在做这个项目之前,我在想,AI能具有创造力吗?
做完以后,我坚定了这个想法,能!
不光是写祝福语,用AI写古诗、对对联、说情话,这些都不在话下。
最后,也欢迎大家更换关键词,给老师写一句教师节祝福语吧!