其他
如何在圣诞节送给自己一个“陪聊女友”?
The following article is from 飞桨PaddlePaddle Author 闫冬阳
百度Plato-2对话模型
对话模型训练工具
飞桨Knover工具包
1. 工具包分析
2. 常用参数
--init_pretraining_params 预训练模型所在文件夹,如果需要加载(当然需要)预训练模型需要给出这个参数
--init_checkpoint 保存节点的所在文件夹,如果给出了init_checkpoint则从该文件夹初始化训练参数(等于覆盖了init_pretraining_params的参数)
train.py
--train_file 训练文件地址
--valid_file 评估文件地址
--model 用到的模型名称:Plato:plato;NSPModel:next_sentence_prediction model
--config_path 模型细节参数配置文件,如24L.json
--task 模型应用任务 NextSentencePrediction;DialogGeneration;UnifiedTransformer
--vocab_path 词集路径
--spm_model_file sentencepiece model文件的路径
--num_epochs 训练周期数
--log_steps 输出训练详情的间隔步数
--validation_steps 评价间隔步数
--save_steps 保存间隔步数
infer.py
--infer_file 需要推断的文件
--output_name 需要保存的对象,response;data_id;score
--model 用到的模型名称:Plato:plato;NSPModel:next_sentence_prediction model
--config_path 模型细节参数配置文件,如24L.json
--task 模型应用任务 NextSentencePrediction;DialogGeneration;UnifiedTransformer
--vocab_path 词集路径
--spm_model_file sentencepiece model文件的路径
训练Plato模型
1. 数据准备
import jieba
text = "我今天做了一顿丰盛的晚餐!"
SPM = sp.SentencePieceProcessor()
SPM.load('spm.model')
# 直接分词
ids = SPM.encode_as_ids(text)
print(ids)
print(SPM.decode_ids(ids))
# 先用jieba分词,再用sentencepiece编码
text = ' '.join(list(jieba.cut(text)))
ids = SPM.encode_as_ids(text)
print(ids)
print(SPM.decode_ids(ids))
Record = namedtuple("Record", fields, defaults=(None,) * len(fields))
fields = ["token_ids", "type_ids", "pos_ids", "tgt_start_idx", "data_id"]
Record = namedtuple("Record", fields, defaults=(None,) * len(fields))
# 新的会话
question = '我刚刚去动物园了。'
# 历史对话
history = '你好?[SEP] 你好,谈谈你自己吧?[SEP] 我今天过得很开心呢![SEP] 是嘛,你今天干了什么?'
# 背景知识
background = '天气:晴朗,地点:北京,人物:男孩,动物园,熊猫'
# 回答
answer = '北京动物园吧,那里的熊猫很受欢迎呢!'
question = SPM.encode_as_ids(question)
history = [SPM.encode_as_ids(text) for text in history.split("[SEP]")]
background = SPM.encode_as_ids(background)
answer = SPM.encode_as_ids(answer)
token_ids = []
type_ids = []
data_id = 0 # 如果样本多的话,会按排序进行标记
token_ids += [0] + background + [2] # 0 表示语句开头,2表示句子结尾
type_ids += [0] + len(background) * [0] + [0] # 0 表示context类, 1表示response类
for line in history:
token_ids += line + [2]
type_ids += len(line) * [0] + [0]
token_ids += question + [2]
type_ids += len(question) * [0] + [0]
token_ids += [0] + answer + [2]
type_ids += [1] + len(answer) * [1] + [1] # 注意符号的变化
fields_value = {}
fields_value["token_ids"] = token_ids
fields_value["type_ids"] = type_ids
fields_value["pos_ids"] = list(range(len(type_ids)))
fields_value["tgt_start_idx"] = fields_value["pos_ids"][-1]
fields_value["data_id"] = data_id
record = Record(**fields_value)
print(record)
2. 训练模型
## 定义UnifiedTransformer的参数
key = {'pre_encoder_cmd': 'd', 'preprocess_cmd': 'n', 'postprocess_cmd': 'da', 'post_cls_cmd': 'n', 'cls_bias': True,
'attention_probs_dropout_prob': 0.1, 'hidden_act': 'gelu', 'hidden_dropout_prob': 0.1, 'hidden_size': 768,
'initializer_range': 0.02, 'max_position_embeddings': 512, 'num_attention_heads': 12,
'num_hidden_layers': 12, 'type_vocab_size': 2, 'role_type_size': 32, 'vocab_size': 30004}
f = open("12L.json", "w")
json_data = json.dump(key, f)
f.close()
## 定义Plato的参数
key = {'pre_encoder_cmd': 'd', 'preprocess_cmd': 'n', 'postprocess_cmd': 'da', 'post_cls_cmd': 'n', 'cls_bias': True,
'attention_probs_dropout_prob': 0.1, 'hidden_act': 'gelu', 'hidden_dropout_prob': 0.1, 'hidden_size': 768,
'initializer_range': 0.02, 'max_position_embeddings': 512, 'latent_type_size': 20, 'num_attention_heads': 12,
'num_hidden_layers': 12, 'type_vocab_size': 2, 'role_type_size': 32, 'vocab_size': 30004}
f = open("12L_P.json", "w")
json_data = json.dump(key, f)
f.close()
--model UnifiedTransformer --task DialogGeneration --vocab_path Knover/config/vocab.txt --spm_model_file Knover/config/spm.model \
--train_file pro_data/train.txt --valid_file pro_data/valid.txt --data_format numerical --file_format file --config_path Knover/config/12L.json \
--init_checkpoint Knover/latest_model/ut_model \
--in_tokens True --batch_size 16000 -lr 1e-5 --warmup_steps 1000 --weight_decay 0.01 --num_epochs 20 \
--max_src_len 384 --max_tgt_len 128 --max_seq_len 512 \
--log_step 100 --validation_steps 20000 --save_steps 5000 \
--save_path Knover/output \
--is_distributed False \
--is_cn True \
--start_step
--model Plato --task DialogGeneration --vocab_path Knover/config/vocab.txt --spm_model_file Knover/config/spm.model \
--train_file pro_data/train.txt --valid_file pro_data/valid.txt --data_format numerical --file_format file --config_path Knover/config/12L_P.json \
--init_checkpoint Knover/latest_model/pt_model \
--in_tokens True --batch_size 1000 -lr 1e-5 --warmup_steps 1000 --weight_decay 0.01 --num_epochs 20 \
--max_src_len 384 --max_tgt_len 128 --max_seq_len 512 \
--log_step 100 --validation_steps 20000 --save_steps 100 \
--save_path Knover/output \
--start_step \
--is_cn True
3. 保存模型
python Knover/save_inference_model.py \
--model NSPModel \
--task NextSentencePrediction
--vocab_path Knover/config/vocab.txt --spm_model_file Knover/config/spm.model \
--init_checkpoint Knover/latest_model/pt_model \
--inference_model_path NSP \
--config_path Knover/config/12L.json
## 保存Plato
python Knover/save_inference_model.py \
--model Plato \
--do_generation true \
--task DialogGeneration \
--vocab_path Knover/config/vocab.txt --spm_model_file Knover/config/spm.model \
--init_checkpoint Knover/latest_model/pt_model \
--inference_model_path Plato \
--config_path Knover/config/12L_P.json
训练模型的应用
1. 对话生成
--model Plato --task DialogGeneration --vocab_path Knover/config/vocab.txt --spm_model_file Knover/config/spm.model \
--infer_file pro_data/test.txt --data_format numerical --file_format file --config_path Knover/config/12L_P.json \
--init_pretraining_params Plato --nsp_inference_model_path NSP --ranking_score nsp_score \
--batch_size 1 \
--max_src_len 384 --max_tgt_len 128 --max_seq_len 512 \
--output_name response \
--do_generation True --num_samples 20 --topk 5 --is_cn True \
--do_generation true --save_path Knover/output --log_step 1
2. 用Paddlehub实现多轮对话
2. 用Paddlehub实现多轮对话
module = hub.module("plato2_en_base")
# 直接产生对话:
text = "what you want to say"
response = module.generate([text])
# 多轮对话
with module.interactive_mode(max_turn=3):
your_words = input()
response = module.generate(your_words)
print("robot answer: %s" % response)
import os
os.environ["CUDA_VISIBLE_DEVICES"] = '0'
module = hub.Module(directory='plato2_cn_small')
with module.interactive_mode(max_turn=3):
while True:
human_utterance = input()
if len(human_utterance) > 0:
print("You: " + human_utterance)
robot_utterance = module.generate(human_utterance)
print("Robot: %s" % robot_utterance[0])
else:
break
总结
10本技术书籍任你选,倒计时最后1天
活动详情:冬至送温暖|10本技术书籍任你选
2020-12-24
2020-12-24
2020-12-24