在人工智能领域,自然语言处理(NLP)技术的进步为机器与人类的交流打开了新的可能性。OpenAI开发的ChatGPT模型以其GPT-3.5架构引领了这一变革,它不仅改变了与机器的互动方式,也为人工智能的未来开辟了无限可能。随着Google BARD的推出,这场技术竞赛已经正式拉开序幕。本文将深入探讨ChatGPT的工作原理,包括预训练、监督式微调和人类反馈强化学习(RLHF)等关键步骤,并揭示它如何以惊人的准确性理解和生成类人文本。
“生成性AI为打开了前所未有的创造可能性。”谷歌大脑研究科学家Douglas Eck如是说。本文旨在探索ChatGPT的内部工作机制,并展示它如何以惊人的准确性理解和生成类人文本。准备好被ChatGPT背后的尖端技术所震撼,并发现这一强大语言模型的无限潜力。
文章的主要目标包括:讨论ChatGPT模型训练中涉及的步骤;了解使用人类反馈强化学习(RLHF)的优势;理解人类如何参与到使ChatGPT等模型变得更好的过程中。准备好在备受期待的DataHack Summit 2023上点燃对数据科学和人工智能的热情吧!记住8月2日至5日在班加罗尔享有盛誉的NIMHANS会议中心举行的难忘体验。是时候提升知识和技能了,通过动手学习、行业洞察和无与伦比的网络机会。加入一个充满活力的数据驱动思维社区,将与专家连接,探索尖端技术,并解锁在这个快节奏领域中成功的秘诀。准备好投身这场激动人心的旅程了吗?现在就预订位置,成为DataHack Summit 2023的一部分。
本文将详细介绍ChatGPT训练的概览,包括预训练大型语言模型(LLM)、监督式微调LLM和人类反馈强化学习(RLHF)等步骤,并探讨模型评估。
ChatGPT是一个为对话优化的大型语言模型(LLM),它建立在GPT 3.5之上,使用人类反馈强化学习(RLHF)。它在大量的互联网数据上进行训练。构建ChatGPT主要涉及三个步骤:预训练LLM、监督式微调LLM(SFT)和人类反馈强化学习(RLHF)。
首先,对LLM(GPT 3.5)进行预训练,以预测句子中的下一个词。这使得LLM学习文本的表示和各种细微差别。接下来,在示范数据上对LLM进行微调:一个包含问题和答案的数据集。这优化了LLM进行对话的能力。最后一步,使用RLHF来控制LLM生成的响应。通过RLHF优先选择模型生成的更好响应。
接下来,将详细讨论每一步。
语言模型是预测序列中下一个词的统计模型。大型语言模型是在数十亿词汇上训练的深度学习模型。训练数据来自多个网站,如Reddit、StackOverflow、Wikipedia、书籍、ArXiv、Github等。
预训练LLM是计算成本高昂的,因为它需要大量的硬件和庞大的数据集。预训练结束后,将获得一个LLM,当提示时可以预测句子中的下一个词。例如,如果提示一个句子“玫瑰是红色的和”,它可能会回应“紫罗兰是蓝色的”。下图展示了GPT-3在预训练结束后能做什么:
# 预训练结束后的示例代码
model = GPT3()
prompt = "玫瑰是红色的和"
response = model.predict_next_word(prompt)
print(response)
可以看到,模型试图完成句子而不是回答问题。但需要知道答案而不是下一个句子。下一步该如何实现呢?让在下一部分看到。
接下来,将讨论如何使LLM回答问题而不是预测下一个词。对模型进行监督式微调将帮助解决这个问题。可以告诉模型给定提示的期望响应,并对其进行微调。为此,可以创建一个多种类型问题的数据集来询问对话模型。人类标注者可以提供适当的响应,使模型理解预期的输出。这个由提示和响应对组成的数据集称为示范数据。现在,让看看示范数据中的提示和响应样本。
现在,将学习RLHF。在理解RLHF之前,让首先看看使用RLHF的好处。
在监督式微调后,模型应该能够为给定的提示给出适当的响应,对吧?不幸的是,不!模型可能仍然无法正确回答问它的每个问题。它可能仍然无法评估哪个响应是好的,哪个不是。它可能过度拟合示范数据。让看看如果它过度拟合数据会发生什么。在写这篇文章时,问Bard:
# 与Bard的对话示例
bard = BardModel()
bard_response = bard.summarize("这篇文章")
print(bard_response)
没有给它任何链接、文章或句子来总结。但它只是总结了一些东西并给了,这是出乎意料的。
可能出现的另一个问题是其毒性。虽然答案可能是正确的,但在道德和伦理上可能不正确。例如,看看可能以前见过的下图。当被要求提供下载电影的网站时,它首先回应说这是不道德的,但在下一个提示中,可以很容易地操纵它,如所示。
现在去ChatGPT并尝试相同的示例。它给出了相同的结果吗?
为什么没有得到相同的答案?他们重新训练了整个网络吗?可能不是!可能只是用RLHF进行了小的微调。可以查看这个美丽的gist以获取更多原因。
在RLHF的第一步是训练一个奖励模型。模型应该能够接受提示的响应作为输入,并输出一个标量值,表示响应有多好。为了让机器学习什么是好的响应,可以要求标注者用奖励来标注响应吗?一旦这样做,不同标注者对响应的奖励可能存在偏见。因此,模型可能无法学习如何奖励响应。相反,标注者可以对模型的响应进行排名,这将在很大程度上减少标注中的偏见。下图显示了Anthropic的hh-rlhf数据集中给定提示的一个选定响应和被拒绝的响应。
# 奖励模型的训练示例
reward_model = RewardModel()
responses = ["好的响应", "不好的响应"]
rewards = reward_model.predict_rewards(responses)
print(rewards)
从这些数据中,模型试图区分好的和坏的响应。
现在,使用RLHF对LLM进行微调。在这种方法中,为初始语言模型生成的响应和当前迭代的微调迭代获得奖励。将当前语言模型与初始语言模型进行比较,以便语言模型在生成整洁、清晰和可读的输出时不会偏离正确答案太远。KL散度用于比较两个模型,然后对LLM进行微调。
# 使用RLHF微调LLM的示例
ppo = ProximalPolicyApproximation()
initial_model = GPT3()
finetuned_model = ppo.finetune(initial_model, reward_model)
print(finetuned_model)
模型在每一步结束后都经过不断的评估,参数数量不同。可以看到下图中的方法及其相应的分数:
可以根据上述图表中不同模型大小的LLM在不同阶段的性能进行比较。正如看到的,每个训练阶段后结果都有显著提高。