作为Mirai-NLP系列教程的第一章,本教程将会手把手教你从头开始训练一个基于GPT2-Chinese语言模型并进行文本生成。
本系列教程以及衍生插件均起源于 关于将QQ机器人与深度学习NLP结合的可能性 一帖,在这里对参与讨论和关注后续的各位表示感谢。没有你们的支持,我的寒假和国庆假期就不会这么充实。
本帖全部内容已经过作者验证,笔记本的内容也经过了封装,用户不需要接触到代码,只需输入参数即可进行训练和生成。
训练过程中如果出现问题可以回复或私聊,同时也非常欢迎各位在帖子下方分享自己的训练成果。
声明仅供学习用途,禁止用于任何违反法律法规和社区规定的行为,禁止用于商业行为。
需要 一台可以科学上网的电脑 可以使用Google Drive的Google账号 一个可以用于收集训练数据的QQBot 一点点动手能力 教程 数据准备请为你的QQBot安装用于收集数据的NLP插件:
NLPHelper - 自然语言处理模型训练数据采集专用插件或者如果你已经在使用Mirai Hibernate Plugin,则可以使用此插件:
Mirai Hibernate NLP,用于将聊天记录导出为 NLP 所需数据的插件相关插件的使用方法均在对应帖内有说明,本教程中不再介绍。
使用Python对Json格式的数据进行二次处理为GPT2所需格式 ...使用插件内置的导出数据有时无法满足我们想要的功能,这时可以导出Json格式的数据,并使用Python对数据进行二次处理为GPT2所需格式。
本教程中只介绍此方法的可行性,不详细讲解,下面给出一个例子,可用于针对 123456 的内容过滤。
import json import ijson if __name__ == "__main__": with open('data.json', 'r', encoding='utf-8') as f: objects = ijson.items(f, 'item') new = [] while True: try: i = objects.__next__() if i['size'] <= 100 and (i['sender']!=123456 or not "*龙门粗口*" in i['content']) : new.append(i['content']) except StopIteration as e: print("数据过滤完成, 共" + str(len(new)) + "条符合要求的数据") break with open('train.json', 'w', encoding='utf-8') as f: json.dump(new, f, ensure_ascii=False) 初始化笔记本 打开本项目的Colab笔记本 在右上角登录你的 Google 账号 首先点击右上角的连接,等待分配完成和初始化 在上方菜单栏中选择代码执行程序,在倒数第三项找到更改运行时类型,在硬件加速器中选择 GPU,等待分配完成1.png
2.png 按照笔记本提示进行初始化、训练和生成
目录.png 初始化源码、模型等 在全局变量单元格输入模型的名字,然后点击旁边的运行按钮
2-1 如果弹出安全提示则选择仍然运行
baea6992-85c0-42a7-9ea8-f492850d0518-image.png 依次运行初始化单元格下的单元格
挂载Google Drive
2-2-1
选择你的 Google 账号
2-2-2
滑到最下方,允许
2-2-3
挂载成功后,可以看到左侧目录里已经出现了我们的GDrive文件夹
2-2-3
下载源代码
耗时可能比较久,我这里测试的是约五十秒。下载好后大约如下:
2-3
下载预训练模型
这里使用的是hhou435大佬提供的通用中文小模型。
你可以前往此处下载其他模型 (散文、诗词、对联、歌词、文言文等),并自行上传到drive/MyDrive/your_model_name/文件夹下。
若为二次训练 (即已经在GDrive中有训练过的模型),则无需运行此单元格。
下载好后可以看到在我们的GDrive挂载目录下出现了预训练模型(共三个文件)
2-4
上传数据
运行后会在日志出现选择文件按钮,点击并选择导出的数据会自动上传到正确位置并重命名。
若文件较大则速度会比较慢,耐心等待即可。
2-5-1
至此,程序初始化已经完成。
开始训练依照笔记本内容仔细填写参数后,点击运行按钮进行训练。
关于参数的含义,笔记本中已经介绍的十分详细了。
3-1-1
开始训练后会持续输出进度以及误差 (误差可能在0.5-0.1左右效果比较好,依数据量和内容也会发生变化)。
3-1-2
如何进行二次训练 ...有时,我们训练完后可能觉得训练轮数不够或是被Colab强制停机了,亦或是增加了新数据,想接着训练先前的模型。
这时,我们需要修改以下参数。
3-2-1
3-2-2
之后点击运行按钮,就可以接着上次的进度继续训练了。
生成文本等待训练完成后,我们就可以进行文本生成了。
在下方生成参数中填写生成参数 (不能为空,修改后会自动运行,必须运行一次才可以进行生成)。
如果填写完后没有自动运行,可以自己手动运行一次。
3-3-1
参数填写完成并允许后,在下方可以看到两个代码块:
直接生成 生成并保存至本地前者只会输出到日志,后者输出完成后会自动保存并下载。
两者效果一样,选择其中一个运行即可。
3-3-2
结尾本教程至此已完成全部内容,由于部署对于一般用户而言太过困难且代价较高,因此本教程中不做介绍,可自行百度。
目前Mirai-NLP以及衍生插件只支持gpt2一种模型,未来预计还会支持更多其他模型,届时也会发布笔记本和教程,可以在Mitr-yuzr/Mirai-NLP-Notebook 仓库中查看。
由于数据集和预训练模型等问题,效果不理想是很正常的,但你已经踏入了机器学习领域的大门,并亲身体验了训练的全过程,这毫无疑问是一次难得的经验。
在如今的智能时代,NLP其实很近,并没有我们想的那么遥远。你打字时的自动联想,语音输入和识别、你的Siri、小爱,这些平日里见惯的内容,其实背后都有NLP辅助。
或许在未来的某一天,NLP真的发展到足以通过图灵测试的程度。你可能会想起在曾经启蒙的时代,你也曾有过一个属于自己的独一无二的AI,它可以水群,可以玩梗,会模仿你和你的朋友们说话。
内容大致就到这里了。如果教程有问题或是有困难可以回复或者私聊,也可以在github上提issue。
你也可以将你的训练成果分享到帖子下方,鼓励那些想试而迟迟未动手的用户去大胆尝试。
另外,在最后祝各位国庆节快乐。