利用GPT2训练中文闲聊模型

本文介绍了如何利用GPT2模型训练一个中文闲聊模型。作者分享了自己的实现过程,包括数据结构的设计和模型搭建的步骤。数据来源于网上爬取的对话,模型基于GPT2,但由于硬件限制,没有使用更大的清源CPM模型。代码已上传至GitHub,欢迎关注。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用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 =
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值