导语
PaddlePaddle提供了丰富的运算单元,帮助大家以模块化的方式构建起千变万化的深度学习模型来解决不同的应用问题。这里,我们针对常见的机器学习任务,提供了不同的神经网络模型供大家学习和使用。本周推文目录如下:
周三:【词向量】Hsigmoid加速词向量训练
周四:【词向量】 噪声对比估计加速词向量训练
周五:【RNN】使用RNN语言模型生成文本
|1.应用场景
语言模型被应用在很多领域,如:
|2. 关于本例
本例实现基于RNN的语言模型,以及利用语言模型生成文本,本例的目录结构如下:
├── data
│ └── train_data_examples.txt # 示例数据,可参考示例数据的格式,提供自己的数据
├── config.py # 配置文件,包括data、train、infer相关配置
├── generate.py # 预测任务脚本,即生成文本
├── beam_search.py # beam search 算法实现
├── network_conf.py # 本例中涉及的各种网络结构均定义在此文件中,希望进一步修改模型结构,请修改此文件
├── reader.py # 读取数据接口
├── README.md
├── train.py # 训练任务脚本
└── utils.py # 定义通用的函数,例如:构建字典、加载字典等
|3.RNN 语言模型
(1)简介
RNN是一个序列模型,基本思路是:在时刻t,将前一时刻t−1的隐藏层输出和t时刻的词向量一起输入到隐藏层从而得到时刻t的特征表示,然后用这个特征表示得到t时刻的预测输出,如此在时间维上递归下去。可以看出RNN善于使用上文信息、历史知识,具有“记忆”功能。理论上RNN能实现“长依赖”(即利用很久之前的知识),但在实际应用中发现效果并不理想,研究提出了LSTM和GRU等变种,通过引入门机制对传统RNN的记忆单元进行了改进,弥补了传统RNN在学习长序列时遇到的难题。本例模型使用了LSTM或GRU,可通过配置进行修改。下图是RNN(广义上包含了LSTM、GRU等)语言模型“循环”思想的示意图:
本例中RNN语言模型的实现简介如下:
定义模型参数:config.py中定义了模型的参数变量。
定义模型结构:network_conf.py中的rnn_lm函数中定义了模型的结构,如下:
训练模型:train.py中的main方法实现了模型的训练,实现流程如下:
生成文本:generate.py 实现了文本的生成,实现流程如下:
|4. 使用说明
运行本例的方法如下:
如果需要使用自己的语料、定制模型,需要修改config.py中的配置,细节和适配工作详情如下:
(1)语料适配
清洗语料:去除原文中空格、tab、乱码,按需去除数字、标点符号、特殊符号等。
内容格式:每个句子占一行;每行中的各词之间使用一个空格符分开。
按需要配置config.py中的如下参数:
train_file = "data/train_data_examples.txt"
test_file = ""
vocab_file = "data/word_vocab.txt"
model_save_dir = "models"
(2)构建字典的策略
当指定的字典文件不存在时,将对训练数据进行词频统计,自动构建字典config.py 中有如下两个参数与构建字典有关:
max_word_num = 51200 - 2
cutoff_word_fre = 0
注:需要注意的是,词典越大生成的内容越丰富,但训练耗时越久。一般中文分词之后,语料中不同的词能有几万乃至几十万,如果max_word_num取值过小则导致<unk>占比过高,如果max_word_num取值较大,则严重影响训练速度(对精度也有影响)。所以,也有“按字”训练模型的方式,即:把每个汉字当做一个词,常用汉字也就几千个,使得字典的大小不会太大、不会丢失太多信息,但汉语中同一个字在不同词中语义相差很大,有时导致模型效果不理想。建议多试试、根据实际情况选择是“按词训练”还是“按字训练”。
(3)模型适配、训练
按需调整config.py中如下配置,来修改 rnn 语言模型的网络结果:
rnn_type = "lstm" # "gru" or "lstm"
emb_dim = 256
hidden_size = 256
stacked_rnn_num = 2
运行python train.py命令训练模型,模型将被保存到model_save_dir指定的目录。
(4)按需生成文本
按需调整config.py中以下变量,详解如下:
gen_file = "data/train_data_examples.txt"
gen_result = "data/gen_result.txt"
max_gen_len = 25 # the max number of words to generate
beam_size = 5
model_path = "models/rnn_lm_pass_00000.tar.gz"
其中,gen_file 中保存的是待生成的文本前缀,每个前缀占一行,形如:
若隐若现 地像 幽灵 , 像 死神
将需要生成的文本前缀按此格式存入文件即可;
运行python generate.py命令运行beam search 算法为输入前缀生成文本,下面是模型生成的结果:
81 若隐若现 地像 幽灵 , 像 死神
-12.2542 一样 。 他 是 个 怪物 <e>
-12.6889 一样 。 他 是 个 英雄 <e>
-13.9877 一样 。 他 是 我 的 敌人 <e>
-14.2741 一样 。 他 是 我 的 <e>
-14.6250 一样 。 他 是 我 的 朋友 <e>
本文分享自 PaddlePaddle 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!