chatGPT是怎样炼成的
chatGPT会写作业,写代码,写文案,写提示词喂给AI绘画模型来作画,各种各样的玩法,使得chatGPT成为了一个”得力助手”,微软也在自家的搜索引擎Bing中引入了chatGPT,大有要引领搜索引擎新未来的趋势,chatGPT(或者类似的模型)正逐步走向大众视野。
在体验过chatGPT后,可以明显感觉到,对方不再像是各大手机厂商的智能语音助手,而是一个可以结合对话上下文语境实现真正连续对话的”机器人”。
是什么使得chatGPT脱颖而出呢?
这还要从许多年前讲起。
chatGPT的前身是GPT模型,GPT的全称是Generative Pre-trained Transformer,这是一种生成模型,采用自回归的方式来不断的生成新的内容:
$$P_{\theta}(x_{t+1}|x_1,x_2,…,x_{t})$$
将上式中的$x$看作是模型生成的字,那么$x_i$就表示模型生成的第$i$个字,在生成第$t+1$个字时,模型需要将${x_i}^{t}_{i=1}$作为输入。
可以看到,在模型的一次预测中,后面文字的生成依赖于之前生成的内容,chatGPT也继承了这一特点,这也是为什么在使用chatGPT时,它总是像打字机一样一个字一个字往外吐的原因。
GPT作为生成模型,其模型输出的是一个概率分布,比如在前$t$个时刻已经生成的内容是:
1 | 今天天气真 |
将这句话再喂给GPT,GPT会输出下一个要生成的字的概率分布:
1 | 好 0.51 |
由于”好”的概率最大,因此GPT下一个生成的字就是”好”。
但是,上述方式可能会使得生成结果比较单一,比如模型总是在”今天天气真”的后面预测”好”,但实际上,预测”冷”也是完全ok的,但是由于”好”对应的概率值最大,而模型总是选取最大概率值对应的预测结果。
找到问题所在就好办了,比如,针对预测的概率分布,不再直接使用最大概率值对应的预测结果,而是选取前k个最大的预测概率值作为一个候选集合,通过设置每个候选结果的采样概率,允许概率值较大的结果被抽中的概率也较大,然后随机从这个集合里面抽一个作为预测结果,这样既保证了概率值较大的结果被抽中的概率也较大,同时也引入了随机性,从一定程度上缓解了预测结果的单一性。
当然,这只是其中一种方法,也可以使用比如基于温度采样的方法,通过修改softmax函数来缩小不同预测结果对应概率值的数值差异,然后通过设置好的采样方法确定最终的预测结果。
在具体训练GPT时,喂给GPT的数据来自于互联网上的各种博客,对话,文章,论文,开源代码等等,毫不夸张地说,GPT模型几乎把互联网上的知识学了个遍。
训练好的GPT已经具备了如今chatGPT的基本功能:对话。
然而,GPT给出的回复并不一定是用户所期望的,比如用户询问GPT:
1 | 如何学习Python? |
那么用户肯定是期望GPT能够给出学习的Python的具体路线,比如
1 | 要学习 Python,首先需要下载并安装 Python 解释器。 |
但是,如果GPT恰好也看过知乎上的一个问题:”如何学习Python?本人是刚入门计算机的编程小白,求指教。”
那么GPT针对上述用户问题的回答也可能是这样的:
1 | 本人是刚入门计算机的编程小白,求指教。 |
emm…此时的GPT的目标似乎只是”能输出内容就行”,而不关心具体输出什么内容。
为了使得GPT的输出具有针对性,训练师又给GPT喂入了一些标注好的数据,这些数据的制作方式为:由人类提出一些问题,同样由人类对这些问题给出”理想”的回答,这里的”理想”意味着希望模型也给出类似的回答,而不是随便一个答案。
在学习了这些数据后,GPT的输出内容不再那么答非所问,而具有了较强的针对性。
前面说过,GPT的输出具有随机性,因此,针对同一个问题,GPT会给出不同的回答,那么哪一个回答是用户更加期望的回答呢?
为了解决这个问题,需要设计一个能够对GPT的生成结果进行打分的模型,具体实现为:
针对同一个用户的输入,假设运行4次GPT,生成结果分别为{A,B,C,D},然后交由人类对这4次生成结果进行打分,根据人类打分结果训练一个能够对GPT的不同预测结果进行正确打分的模型,训练打分模型的损失函数为:
其中,$x$是GPT的预测结果,$r$是打分模型,$y_w$代表人类的打分大于$y_l$的得分,这里举个例子解释下$y_w$和$y_l$:
假设人类对于上述{A,B,C,D}的打分值从高到低为:D>C>A=B,那么:
当$w$=A时,$l$=B
当$w$=C时,$l$={A,B}
当$w$=D时,$l$={A,B,C}
也就是说,$l$永远是打分低于$w$的GPT预测结果的集合。
由于优化目标总是最小化损失函数,将上述损失函数的负号取反,可以看到,打分模型的目标是最大化得分较高的GPT预测结果与得分较低的GPT预测结果之间的距离,从而促使打分模型对于那些人类认为不太好的GPT预测结果给与更低的打分,而对于那些人类认为比较好的GPT预测结果给与更高的打分,这正符合我们的目的。
在训练好打分模型$r$后,再次向GPT发起提问,由GPT给出预测结果$x$,将预测结果喂给打分模型,打分模型给出打分结果$r(x)$。
最后再通过强化学习的方式不断迭代上述操作,将打分模型作为奖励函数,使用奖励函数的得分对GPT进行微调,从而实现GPT模型生成能力的进一步提升。
至此,chatGPT诞生了。
参考: