(2022 年 2 月 20 日更新)

简介

在这篇文章中,我将对 GPT-2 进行微调,尤其是 rinna 的,它是日本 GPT-2 模型之一。我是日本人,我的大部分聊天记录都是日文的。因此,我将微调“日语”GPT-2。

GPT-2 代表 Generative pre-trained transformer 2,它生成句子,如名称所示。我们可以通过使用少量训练数据微调预训练模型来构建聊天机器人。

我不会详细介绍 GPT-2。我强烈推荐 dev.to 上的文章How to Build an AI Text Generator: Text Generation with a GPT-2 Model以了解什么是 GPT-2 以及什么是语言模型。

git 仓库:聊天机器人_with_gpt2

我将感谢以下两篇文章的作者。

  • 我尝试用 GPT-2 复制和与朋友互动

  • 如何构建 AI 文本生成器:使用 GPT-2 模型生成文本

感谢第一作者,我可以构建我的聊天机器人模型。我的 git 存储库中的源代码几乎都是用他的代码构建的。我只是总结了它们。感谢第二作者,我可以通过 GPT-2。

什么是rinna

rinna 是 rinna Co., Ltd. 提供的会话预训练模型,2022 年 2 月 19 日在拥抱脸[rinna Co., Ltd.] 上提供了五个预训练模型。 rinna 有点在日本很有名,因为他们在日本最受欢迎的 SNS 应用程序之一 LINE 上发布了 rinna AI。她是一名初中女生。我们可以在 LINE 上进行对话。

我不确定模型什么时候发布在拥抱脸上,但无论如何,模型现在都可以买到。我会微调参数个数较少的rinna/japanese-gpt2-small。顺便说一句,我想用rinna/japanese-gpt-1b,它的参数个数在十亿左右,但由于google colab的内存容量,我不能。

进程

我假设您有一个 google 和 git 帐户,并且可以使用 google colab。

此外,我将使用 LINE 上的聊天记录。如果您在该应用程序上没有帐户,那没关系。您所要做的就是准备聊天记录并修改数据。我知道这些过程是最困难和最烦人的事情。如果您拥有该帐户,则以下过程将起作用。请注意,如果您的 LINE 设置语言是日语,则应将其更改为英语,直到导出聊天记录为止,因为以下过程假设设置语言(不是消息语言)为英语。

准备环境

在此过程结束时,您的谷歌驱动器构建如下。

MyDrive ---- chatbot_with_gpt2.ipynb
           |
           |- config
           |    |- general_config.yaml
           |
           |- data
                |- chat_history.txt

进入全屏模式 退出全屏模式

  • 1:在本地机器上克隆聊天机器人_with_gpt2存储库。

它是通过在 git bash 上运行以下命令来完成的。

git clone https://github.com/ksk0629/chatbot_with_gpt2

进入全屏模式 退出全屏模式

  • 2:上传chatbot_with_gpt2/chatbot_with_gpt2.ipynb到google驱动。

  • 3:在你的 google 驱动器上创建一个名为config的目录,并在 config 文件夹中创建general_config.yaml

general_config.yaml如下。

github:
  username: your_github_username
  email: your_email
  token: your_access_token
ngrok:
  token: anything

进入全屏模式 退出全屏模式

ngrok块是不需要的,但需要它来避免下面的错误。

  • 4:从LINE获取聊天记录。

我们可以按照官方公告[【帮助中心-聊天记录](https://help.line.me/line/android/?contentId=20007388#:~:text=1.,want%20to%20send%20the%20file.)\】获取历史记录。

  • 5:在你的 google 驱动器上创建一个名为data的目录,并将聊天记录移动到该目录。

准备训练数据并建立模型

  • 1:在google colaboratory上打开chatbot_with_gpt2.ipynb

  • 2:运行准备块中的单元格。

环境已准备好通过运行单元获取训练数据并构建模型。

  • 3:更改chatbot_with_gpt2/pre_processor_config.yaml

初始 yaml 文件如下。

line:
  initial:
    input_username: "input_username"
    output_username: "output_username"
    target_year_list: "[2016,2017,2018,2019,2020,2021,2022]"
  path:
    input_path: "/content/gdrive/MyDrive/data/chat_history.txt"
    output_path: "chat_history_cleaned.pk"

进入全屏模式 退出全屏模式

您必须至少更改初始块。每一行的含义如下。

  • input_username:要输入到模型中的消息的用户名

  • output_username:您希望模型输出的消息的用户名

  • target\year\list:你想用来训练模型的年份

  • input_path:原始聊天记录的路径

  • output_path:经过以下过程得到的清洗后数据的路径

请注意,如果您不更改 output_path,则关闭笔记本后您的训练数据将不可用。当然,它在笔记本工作时可用。

  • 4:运行预处理数据块中的单元格。

数据在单元格中被清理。

  • 5:改变chatbot_with_gpt2/model_config.yaml

初始 yaml 文件如下。

general:
  basemodel: "rinna/japanese-gpt2-xsmall"
dataset:
  input_path: "chat_history_cleaned.pk"
  output_path: "gpt2_train_data.txt"
train:
  epochs: 10
  save_steps: 10000
  save_total_limit: 3
  per_device_train_batch_size: 1
  per_device_eval_batch_size: 1
  output_dir: "model/default"
  use_fast_tokenizer: False

进入全屏模式 退出全屏模式

您必须将数据集块中的 input_path 更改为已清理数据的路径,该路径在pre_processor_config.yaml中指定。您可以将 basemodel 更改为 rinna/japanese-gpt2-small,但其他(中型和 1b)由于缺少 GPU 内存而无法工作,正如我在什么是 rinna 部分中提到的那样。

  • 6:运行训练数据准备和构建模型块中的单元格。

就这些!运行此单元后,您所要做的就是等待一段时间。您将在model_config.yaml中指定的目录中看到您的模型文件。

聊聊模特

同样,您所要做的就是在 Talking with the model 块中运行唯一的一个单元格。然后,源代码正在运行,您可以与模型对话,如下所示。

图片说明

结论

我用我在 LINE 上的聊天记录对 GPT-2 进行了微调。我当然做到了,但是您可以在“让我们谈谈模型”部分中看到以下问题。

  • 每次对话都有多余的一行Setting 'pad_token_id' to 'eos_token_id':2 for open-end generation.

  • 有一些记号,如<br:[<unk>hoto]<br///<br/ゥ>,会扰乱连贯的句子。

  • 模型回复不好。

第一反应

帰ったんか
おつかれさま!

进入全屏模式 退出全屏模式

看起来相当不错,因为“おっす”的意思是“嘿”,而回复的意思是“你在家。你必须筋疲力尽”。像这样的东西。但其他人看起来不对劲。为了改进模型,我可以更多地清理训练数据,并且我需要了解 GPT-2 和源代码。

如果您对本文有任何建议、意见或问题,请在下方发表评论。我会很感激的。

Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐