利用GPT2模型训练中文闲聊模型
最近看了一下GPT2模型,看到很多博主都用来写诗歌,做问答等,小编突然萌生一个想法,利用GPT2来训练一个闲聊模型!!(小说生成器模型已经破产,写出来的东西狗屁不通,懒得再弄了,有兴趣的小伙伴可以继续尝试。。),闲聊模型在小编的Github上,欢迎star和fork,谢谢!!
文章目录
前言
本来想用清源CPM预训练模型来进行的,可惜硬件条件不够,只能用中GPT模型来训练一个中文闲聊模型了。硬件条件好的小伙伴,推荐你们使用CPM来做,看别人做的效果还是不错的,清源CPM的模型有4.47G,小伙伴们量力而行,模型小编已经撸下来了:pytorch版CPM密码:k2zh; 百度飞桨版CPM密码:nb67;苏神版bert4keras,需要的小伙伴可自信下载。
一、数据结构
数据是在网上爬取的一些对话数据,数据格式如下所示:
你吃了吗?
吃过了,吃的糖醋排骨,你呢
我吃的是麻辣小龙虾
手机欠费了怎么办?
交话费啊
去哪里才能交话费呢
去相应的营业厅啊
数据格式就是一段对话,不同的对话间使用空行隔开。
二、模型搭建
(1) GPT2模型的搭建(小编自己写的,可能不是很合适!!有需要的可以直接调用Transformers库中的GPT2Model)
首先是Multi_Heads_Attention的代码,这个也没什么可说的,如下所示:
class Attention(nn.Module):
def __init__(self, embedding_size, num_attention_heads, attention_dropout, residual_dropout):
super(Attention, self).__init__()
self.num_attention_heads = num_attention_heads
self.size_per_head = embedding_size // num_attention_heads
self.embedding_size = embedding_size
self.query_key_value = nn.Linear(embedding_size, embedding_size * 3)
self.attn_drop = nn.Dropout(attention_dropout)
self.resid_drop = nn.Dropout(residual_dropout)
self.dense = nn.Linear(embedding_size, embedding_size)
def split_heads(self, x):
"return shape [`batch`, `head`, `sequence`, `features`]"
new_shape = x.size()[:-1] + (self.num_attention_heads, self.size_per_head)
x = x.view(*new_shape)
return x.permute(0, 2, 1, 3)
def merge_heads(self, x):
x = x.permute(0, 2, 1, 3).contiguous()
new_shape = x.size()[:-2] + (x.size(-2) * x.size(-1),)
return x.view(*new_shape)
def forward(self, x, kv_cache=None):
self.seq_len = x.size(1)
# self_attention
x = self.query_key_value(x)
q, k, v = x.split(self.embedding_size, dim=2)
# 多头
q = self.split_heads(q)
k =