GPT2中文文本生成对话应用尝试
目录
1、数据清洗
?2、模型训练
3、模型推理
4、效果展示
文本对话是一个很复杂的任务,难度比较大。按照对话文本产生的方式可以分为检索式和生成式;按照技术实现的方式可以分为端到端和pipeline的方式。为了保证对话的多样性和丰富性,以及减少流程的繁琐例如构建对话管理、对话理解等模块,我们基于GPT2模型以及GPT2-chat项目,在保险领域进行了中文文本生成对话应用,尝试。总而言之,本文并不是一个创新性的内容,更多的是一种现有技术和模型在业务中的尝试和效果验证。
背景前提已经为客户搭建了一套基于FAQ的问答对话系统,效果也还可以。为了提供一个不一样的体验,保证对话的多样性和丰富性,采用GPT2模型仿照GPT2-chat项目的整体思路对保险领域下对话生成进行了一个应用尝试。
数据获取和清洗,这个是最为关键的一步,拿到300万条对话约30万通的对话记录如下:
清除噪声、微信表情包、特殊字符等等以及无意义的回复等,把同一个坐席连续说的话用分号拼接成一句话,最后的数据格式如下:
注意训练模型的时候分为微调和预训练,那数据格式也是不一样的,预训练的数据就是其中的每一句话:
模型训练分为预训练和微调;
预训练的时候模型的输入:text
微调的时候模型的输入:text_客户[SEP]text_坐席[SEP]text_客户[SEP]text_坐席
读取数据做词典映射的时候,代码如下:
padding的方式
模型训练的时候使用GPU和采用batch的方式,需要特别注意的是——padding的方式
这里的padding的方式和Bert模型是不同的,bert的padding是在句子后面,而GPT2类生成模型必须实在句子前面,不然padding放在句子后面,padding会对生成的结果有影响,导致inference的时候batch内最长句子不同,padding的长度不同,相同的句子最后的结果也不一致
一个batch的数据
那么GPT2的padding方式如下:
代码实现(前向后向padding都支持):
由于GPT2没有开源的中文权重,因此我们需要自己重新预训练一个中文的权重;这里词典和权重以及tokenizer都是直接使用Bert的,而模型结构使用GPT2。训练代码如下:
代码中给出了预训练和微调的全部代码,当然还有数据加载的代码;注意从头预训练一个GPT2和微调都是采用同一个模型结构GPT2LMHeadModel模型,只不过是前者没有加载权重,随机初始化的权重;后者是加载了预训练过的权重。由于数据量巨大,采用3090都训练了几个星期。训练过程就不一一展示了。
? ? ? ? 后面为了保证推理速度能够满足并发需求,希望batch_size=100的时候推理能在1S内结束,那就需要对模型进行压缩。压缩也很简单,直接从头预训练一个6层的GPT2然后再进行微调。代码和之前的一样,只是配置不同。
? ? ? ? 模型推理要注意的是:第一batch解码的时候,要考虑到padding的影响,只有padding在句子的左边才不会对生成产生影响;第二就是解码策略的选择,这个就需要多去尝试,topk、topp、repetition_penalty(重复惩罚系数)、num_beams等参数(具体的理解和参考之前的文章——浅谈文本生成或者文本翻译解码策略);最后就是变量占用显存的释放
代码如下:
简单的说一说解码过程,首先把文本通过tokenizer映射成token,使用pad_pad_sequence进行padding;然后就把tensors输入到模型中得到解码结果,主要就是采用了如下函数(huggingface出品的transformers中)
model.generate(**batch, top_k=8, num_return_sequences=num_returns, max_length=max_length,do_sample=True,repetition_penalty=0.8, use_cache=True, num_beams=num_returns)
它内置了5中解码模式,把贪心、beamsearch、topk和topp都融合在一起了。
? ? ? ? 做了一个demo,采用flask+html+js+css(前端代码就不展示了,网上到处都是,我也是网上找的)来展示这个GPT2训练的端到端的模型效果如何
不错的对话逻辑
还行
逻辑错误
单轮回答
? ? ? ? ?
?
?错误的回答
总体来说对话效果还是稍微差一点。单轮的问答大部分还是不错的,符合我们的预期;能把语料中的知识能学习到;但是多轮的时候就不可控了,还有一些回答逻辑错误,重复回答,以及不符合角色定位等等。如果能把这些问题都解决好的话,那么端到端的生成就可以作为商用了;不过如果用闲聊的语料进行训练,那么只要保证语料的质量,一个生成式闲聊的机器人还是有可能的。
? ? ? ? 本文主要是把GPT2这种生成模型,依赖GPT2-chat项目的思路进行了语料的迁移训练和效果验证,发现使用在问答要求比较高的领域和业务场景下(逻辑强、回答准确)还是很欠缺的;但是回答的多样性和丰富性确实很好。
参考文章
transformers
基于GPT2的中文闲聊机器人/GPT2 for Chinese chitchat