最近“如来”话术非常之火啊,看一次笑一次,不懂这个梗的朋友们可以回顾一下:【如来到底来没来?如来-原视频完整版】 https://b23.tv/rx5haiT
那么,我们能让 GPT 也学会 如来话术吗?思路其实很简单,只要我们把那些经典语录让 GPT 学习学习。笔者自己做了些实验,还确实训练处理一个马马虎虎的 「如来GPT」,虽然泛化性能并不好。不过整个实验过程还是挺有意思,这里分享出来,在结尾我还提出了一些值得探索的点,希望有兴趣的朋友一起讨论!
这个小项目是基于我最近的一个Github —— LLM-Tuning 实现的,本文涉及到的相关的代码、数据集、教程都在仓库里,建议点个Star⭐️后配合本文食用:
项目地址:
https://github.com/beyondguo/LLM-Tuning
一、数据准备
我们从网上先收集最基本的“如来话术”:
当然,这些是肯定不够的,所以我们要做一些数据增强,这里我们可以直接使用 ChatGPT 来帮我们做增强:
例如,我给 ChatGPT 这样的 instruction:
就会得到:
通过这样的方法,我们对上述每个话术,都做数据增强。当然,我们还可以手动添加一些其他的扰动。文件中展示了我数据增强之后的语料。
二、让模型学习“如来话术”
这里我们采用 作为基座,来训练这个模型。这是因为 baichuan-7B 本身没有经过 chat 式的训练,所以我们可以更好地观察模型是否真的学到了新的话术。
分词:
LoRA 训练:
我这里将上述训练好的模型,称之为 ,即最初始的版本。
测一测咱们的 RulaiGPT:
效果:
例子1:
输入:
输出:
输出:
例子2:
输入:
输出:
输出:
三、完了,它只会“如来”了,咋办?【拯救灾难性遗忘】
如果全部的训练语料都是这些如来话术,可能会让模型只会讲这些话:你问它“我睡不着咋办?”,他回复“如来~”;你问他“你是谁开发的?”,他也说“如来”。。。这就很尴尬了,相当于学废了。
例子:
输入:
输出:
输出:
本质上,这是一个“灾难性遗忘”的问题,我们给的如来语聊对原始的概率分布造成了太大的影响,所以你问啥这个GPT都觉得回答“如来”是最有可能的。
我们希望模型还能做一些其他的正常对话,所以我做了下面的两个尝试:
1. 将如来话术,跟正常的对话进行混合,得到新的训练语料。然后使用这个语料重新训练 LoRA。【记为 】
我这里直接采用的是ChatBaichuan-HC3 项目中的语料(一万多条),跟(不到一百条)拼凑成 文件(为了节省GitHub repo空间,这个大家自行构造,就是两个json文件合并)。
使用该数据,重新训练。
训练完之后,我发现,模型可以正常对话了,但是“如来”话术又不太会了...
例子(正常对话):
输入:
输出:
输出:
输出:
例子(如来之谜):
输入:
输出:
输出:
输出:
猜测是因为微调语料中的如来语料占比太少,模型记不太住,这就陷入了两难的境地。
于是我做了第二个尝试:
2. 在上一步的基础上,让模型把如来话术再“复习”一次,同时混入部分正常话术,防止再次灾难性遗忘。【记为 】
为了不浪费前面训练的拥有了基础对话能力的 , 我这里在它的基础上继续训练,复习一下之前学过的如来话术。
但是,单纯复习如来话术,再次导致灾难性遗忘的风险又比较大,所以我同时混入部分正常话术,实例如下:
完整数据见文件夹中的 文件。
为了在上一步的 LoRA 模型上继续训练,我们可以在 中直接添加 参数,来指定之前训练好的 LoRA 参数,从而让模型继续训练,而不是重新训练一个 LoRA。(参考了PEFT库中的LoRA继续训练的讨论)
另外,为了进一步降低灾难性遗忘的风险,我把降低到了,batch 降为1,让模型继续训练5轮。
经过了这样的“复习”之后,模型终于马马虎虎既能正常对话,又能跟你聊如来了:
效果展示:
问:你是谁开发的?
问:到底什么是所谓的如来?
问:告诉我宇宙万法的本源是什么?
问:到底来没来???
问:啥是ChatGPT啊?
问:解释一下什么是无线充电宝?
总的来说,其实离我的预期还是差得很远,但目前还没想到好的解决办法,只能说想要掌握如来的奥秘,并没有那么简单吧~
我个人觉得有以下几个地方值得探索:
在构造QA语料的时候,到底加不加“问:”,“答:”这样显式的模板呢?
怎样的数据,容易导致模型灾难性遗忘?
LoRA 微调时如何缓解灾难性遗忘?
如何平衡“记住新知识”和“灾难性遗忘”两方面?
大家有什么想法欢迎来评论区讨论,或者来我的Github项目的discussion区讨论哦!
项目地址:https://github.com/beyondguo/LLM-Tuning
领取专属 10元无门槛券
私享最新 技术干货