介绍
在 COVID 期间,我与朋友、亲人和整个社会失去了联系。然而,逆境中孕育着创新,因此我开始研究如何制作自己的朋友,我的理想朋友:
我自己。
回头看,这可能有点自恋,但革命不会为自我形象而脸红。所以我创建了我的 AI 自我,并记录了如何使用你自己的个性复制我的结果的笔记。
目标:
在本教程结束时,我将向你展示如何:
- 收集优化数据以克隆你的个性
- 使用 OpenAI 的 GPT3 使用你自定义的数据训练自己的模型
- 在基本的聊天机器人中实现模型
- 使用桌面应用程序与你的对话者进行完整的对话
- 如何在更大的项目中使用 gpt3 模型
要求:
- 适度的 Python 知识
- 一台足够现代的电脑
- 在你的电脑上已经安装了 Anaconda
时间:
- 3-6 小时的数据集创建
- 2 小时的训练
- 总计:5+ 小时
步骤一:设置
为了训练 GPT3 模型,我们首先必须注册 API。幸运的是,这部分非常简单。首先,访问 OpenAI 网站:
接下来,点击右上角的“注册”,并使用你的 Google 账户或电子邮件进行登录。输入一些基本信息,然后你就会进入主页。你需要导航到右上角的个人资料图片,然后点击“>管理 API 密钥>复制“秘密密钥””。
有了这个密钥,打开你的 Anaconda 控制台,并创建一个带有你的密钥的环境:
conda create -n textclone
conda activate textclone
pip install openai
为了为你的 OpenAI 密钥创建一个环境变量,这将取决于你的操作系统。请访问 OpenAI 的页面,以适应你运行的内容。
为了在所有辉煌的图形中查看我们的训练情况,我们还将签署权重和偏差(AKA W&B)并将其连接到我们的 OpenAI 帐户。
pip install --upgrade openai wandb
openai wandb sync
好了!我们现在已经准备好开始收集训练模型的数据了。
步骤二:策划数据
在研究 GPT3 训练时,我发现许多人主张从社交媒体上爬取数据。然而,这种方法存在一些问题:
- 太多的单词“来回”,很少显示独特的个性
- 对话通常是关于一个人之前讨论过的话题,这使得隔离特定交互不可靠(AI 无法在未被明确告知的情况下知道每个对话的上下文)
- 比起我的方法,过滤数据需要更长的时间。
相反,我编写了一个机器人,它会询问你一系列关于你对话题的观点的问题(例如,生命的目的是什么?)和提示性问题,为你提供对话的上下文,并要求你回答评论。这些方法将产生一个准备好用于聊天机器人使用的数据集,所有内容都在一个格式良好的 .json 文件中。
首先,git 克隆数据集创建存储库并 cd 到其中:
git clone https://github.com/LordApplesause/CloneYourself
然后运行 datasetgenerator.py 文件。选择“创建你的数据集”,并输入问题或提示,以及你喜欢的数据集名称。这将在相同目录中创建一个 .json 文件,其中将存储你的答案。
现在,开始回答问题,你有一个要训练的机器人!
提示:
- 根据 OpenAI 的说法,对于我们正在寻找的类型的生成,应该有大约 500 个或更多答案,因此请尽力达到这个目标。
- 选择一种提示性和问题条目的混合,因为这是为了拥有各种数据,以便机器人在问题和回复之间保持有竞争力。
- 在回答时,请考虑你希望机器人是什么样子。显然,你希望它像你一样,但如果你想放大某些特点,现在就是这样做的时候。
- 如果你想添加自定义问题/提示,你可以更改 GitHub 中附带的 .csv 文件以添加你自己的问题,只要它遵循相同的格式。
- 如果一个问题似乎不相关,或者你不知道如何回答它,只需输入“跳过”,它就会问一个新的问题。
例子:
基于问题的:
Question: What’s something commonly done that gets progressively weirder the more you think about it?Answer: Weddings, for sure. So expensive. So needless. Just joint-file your taxes and get over it already.
基于提示的:
An AI and a human are speaking at the doctor's office
Human: When was the last time you were feeling well?Answer: Doc, ever since I came out the womb nothing has gone right.
现在,你不必像我那样回答“聪明的驴唇不对马嘴”,你可以模拟数据集,因此机器人的个性取决于你。当输入后,数据集生成器将解析数据,看起来像这样:
{
"prompt": "Context: An AI and a human are speakingat the doctor's office\n\n###\n\nHuman: When was the last time you were feeling well?\nAI:","completion": "Doc, ever since I came out the womb nothing has gone right.\n"
}
这与我们将发送给 OpenAI 的格式相同。
- 上下文是 AI 和人类之间的情况/关系。这可能包括环境、关键个性点或对话的目的
- “人类”部分是你输入的内容,供 AI 做出回应
- 完成是 AI 根据上下文和人类输入所说的话
步骤三:准备训练
现在我们已经有了训练机器人所需的数据,我们现在可以选择在 datasetgenerator.py 中 (“创建模型”)。
输入之前使用的数据集的相同名称。现在,你可以在训练之前选择多种选项,这些选项会影响模型的输出。模型:
在训练中,模型可以说是最重要的因素,它与我们训练的 AI 的复杂性有关。模型越大,输出就越复杂、详细、创造性,但生成速度越慢,使用成本越高。对于像这样的聊天机器人,我建议使用以下两个模型之一:
- davinci——目前发布的最大模型,对人类俚语有深刻的理解,可以进行“人类”对话。然而,它的响应速度比另一个选项要慢一些。
- curie——第二大的模型,具有与 davinci 大致相同的能力,但随着对话时间的延长,可能会有些偏差,但不会有害。它对人类输入的反应几乎是即时的,这对于快速的来回交流非常有帮助(如果这是你第一次使用,我建议你选择 curie)。
学习率:
这是一个稍微复杂一些的话题,但简单来说,它是指 AI 尝试训练的速度。一个好的经验法则是,数据集越大,学习率就越高。例如,举重运动员可能不会从每次举起 5 磅的杠铃中受益,但机器学习开发人员如果使用太大的数据集就会崩溃。
OpenAI 已经根据你的数据集大小计算出了学习率,但你可以自由地尝试不同的学习率,看看哪个效果最好。一个好的范围是在 0.02 和 0.2 之间。
Epochs:
通常,AI 会反复处理相同的数据以充分挤出它可以学习的任何内容。然而,在训练中会出现一个被称为“过度拟合”的现象,当 AI 学习到数据的噪声和细节时,会导致重复和总体上低劣的输出。
因为我们的聊天机器人的目的是在其回复中具有创造性,所以我们希望尽可能避免这种现象。根据 OpenAI 的文档,聊天机器人应该只有 1 或 2 次 epoch,以保持 AI 的灵活性。
第四步:训练
这就是乐趣开始的地方!在确认上一步的训练参数之后,它将自动开始训练。
注意:你可能需要重新声明你的 API 密钥,在这种情况下,你将需要像第一步一样重新输入你的密钥。
训练完成后,我们可以使用上一次注册的 Weights & Biases 来查看结果。
用与 OpenAI 相同的电子邮件/帐户登录 Weights & Biases 网站。
然后点击你最近的“run”以打开你训练模型的详细信息。
我有三个,但如果这是你第一次,你只会有一个。
它会打开一个带有几个图表的页面,虽然一开始可能看起来很混乱,但其中有一些逻辑。
- Elapsed_Examples: 这是一个刻度,用于确定你的训练持续时间,可以取决于 epoch 的数量和数据集的大小。
- Training Loss: 列出的最重要的指标。这是算法模仿你与 ground truth(你的数据集)的接近程度。理想情况下,你希望这个数字越接近零越好。
- Elapsed_Tokens: 这类似于 Elasped_Examples。
- Training Sequence Accuracy: AI 响应与数据集完全相同的次数(注意,随着训练的进展,跳跃之间的距离越来越小)
- Training Token Accuracy: 等等,我们刚才不是刚刚讨论过这个吗?是的,有点类似。与序列相比,标记是更小的数据单元。这就是为什么存在比序列更多的数据点,因为标记之间的时间间隔更短。虽然与序列精度相似,但与数据集相比,生成的响应越接近值为一,其“准确性”就越高。
你可以在第三步的参数中玩弄一下,比较每次运行之间的图表,并找到最佳组合以最大化你的机器人的性能。
只要记住,微调并不是免费的!注册一个帐户可以获得 15 美元的免费试用,虽然这可以持续一段时间的调用请求,但微调可能会每次运行花费约 1 美元(这取决于你的数据集大小),所以请记住这一点。
第五步:准备生成
看图表很有趣,但这不是你开始这个指南的原因。现在,我们可以与你的克隆自己交谈了。
开个玩笑,我还有一件事要说。那就是更多的参数(woo!)在生成过程中,你有一些选项来调整机器人的响应方式。
模型(必需):
唯一必需的输入是你想要用于生成输出的模型的名称。如果你不知道模型的名称,运行
openai api fine_tunes.list
它会返回一堆乱码,但你只需要复制“fine_tuned_model”字段,它应该看起来像
[model]:[OpenAI acc name]:[dataset name]-[date trained]
将此名称保存下来以备后用。
提示(可选):
这等同于创建数据集时使用的“上下文”。设置这个可以为对话添加一些曲折,如果你想遵循一个非常特定的主题,这是特别有用的。以下是一些示例:
注意,它遵循相同的格式,但只是填充了空白。你可以指定每个人的位置、一些关键的个性特征和观点。但是,由于数据集创建的格式,保持措辞相似很重要。随意尝试找到创建最佳机器人响应的方法。
来回(可选):
对话和话题通常跨越 AI 和人类之间的多个响应,因此对于 AI “记住”一些先前的评论是至关重要的。例如,一个样本对话可能如下所示:
现在,如果每 2 次交互就重置一次对话,人类的问题“为什么会这样”没有任何先前的建立,因此 AI 不知道如何回答,很可能会回答一些无意义的话。然而,如果它每隔 3 次交互就记住一次,那么它会回答:
除了它称我为 12 岁的孩子之外,我认为这是一个非常成功的回答。那么为什么不重置呢?原因如下:
- 这些信息都发送到 OpenAI 的服务器上,之前的会话记录越多,每次回应的成本就越高。
- 如果背景信息太多,AI 就会陷入困境。如果它在过去的五个回应中对人类感到愤怒,它就会认为这是它应该表现的方式。这会导致重复的回应,整个对话会变得相当无聊。
我发现记录在3-5次回合之间是最理想的,但你的使用情况可能会有所不同。
最大令牌数(可选):
相比于前两个,这个很简单,谢天谢地。
“最大令牌数”简单来说就是回应的最大长度。一个令牌通常代表大约4个字符。我发现一个很好的长度是50-100个“令牌”,这个长度大约是一个正常对话中的回应长度。但你可以尝试使用这个范围之外的数字。
温度(可选):
我深信每个人都应该有一个我有唯一控制权的怪异程度尺度。虽然这可能还不是现实(神经连接不能更快地到来),但我们至少可以在我们的机器人上更改它。
温度决定了 AI 回应的创意程度。例如,温度为0.1的回应可能会对一个普通的问题如下所示:
You: How are you feeling?
AI: Like a god.
有点平淡无奇,但如果我们把温度调高到1.5,我们会得到这样的回应:
You: How are you feeling?
AI: Natural, uneeded revolutions always struck and inspired me. When help is the Church Lady? when anarchism will rain fire from these warehouses that shut otherwise freedom and is abandoned literally hole filled suicide arenas speaking figuratonally facing greus way indiana? Radical revolutionary socialist figure. Paint roman pontifex and metaphor poopoo paint the monegansome!
虽然非常有趣,但任何一个极端都不能产生很好、清晰的对话。两者之间的平衡可以达到完美的平衡。一般来说,建议使用0.5到1.2之间的值。
这是同样的问题,使用温度为1.0:
You: How are you feeling?
AI: Like a car going 60 miles an hour down a hill.
存在惩罚(可选):
如果你发现你的机器人在对话中很快回到了相同的话题,你可能会发现调高“存在惩罚”会有所帮助。
这个名字已经很好地概括了它的作用,基本上抑制了 AI 回到先前的话题的能力。一般来说,当我们的数据集设计时考虑到了多样性,这不应该是一个问题,但我还是把它包括在内了。为了保持质量回应,将此值保持在0.1-1之间。
哇,这真的是太多了。我的手都抽筋了,你的眼睛都快花了,让我们开始吧!
步骤6:生成
好了,不再冗长的解释了。没有训练了。我们的时代已经到来了。
打开 talk.py,输入步骤5中描述的任何参数,包括你之前复制的模型名称。
从这里开始,你可以和你的 AI 自由交谈,无论是关于政治辩论、人生问题,还是关于它对比萨上菠萝的看法,都可以。只是不要非法,这不是太多的要求吧。
请务必尝试使用不同的参数来找到最佳的组合,这不需要额外的费用!
结论:
本教程旨在让你在不费力的烦恼和自己的方式中了解 GPT3。但这并不意味着使用你的新 GPT3 模型创建自己的应用程序没有价值。拥有自己的、不断扩展的迷你意识对于有趣的项目或吓唬你的朋友(个人最喜欢的)有着无限的机会。
话虽如此,我目前正在制作一个教程,将这个教程和如何克隆你的声音结合起来,形成一个 Discord 机器人,可以响应语音输入。希望你在未来一个月左右能看到它。
敬请关注!
评论(0)