admin 管理员组

文章数量: 887006

优质博文:IT_BLOG_CN

一、ChatGPT一次添加一个词

ChatGPT作用:人为输入任何文本后,自动生成一个"合理的延续",合理指的是:假如你看了数十亿网页上的内容后,发现大家都这么写,那你也这么写,就是合理的。ChatGPT就是这样,所以就能解释,为什么ChatGPT给出的答案让人觉得是“友好”并且“人性化”的。

现在假设我们输入如下内容The best thing about AI is its ability to。想象一下当你浏览了数十亿页的文字后(比如在网上的文章和数字化书籍),然后看看接下来应该出现的是什么词,以及这些词的概率是多少。

最终结果是它会生成一个可能跟在后面的单词的排名列表,以及概率:
The best thing about AI is its ability to

learn4.5%
predict3.5%
make3.2%
understand3.1%
do2.9%

然后我们把生成的词加到原来的文本中,反复让语言模型生成下一个词的概率,就会得到一个“合理”的文本

{
The best thing about AI is its ability to,
The best thing about AI is its ability to create,
The best thing about AI is its ability to create worlds,
The best thing about AI is its ability to create worlds that,
The best thing about AI is its ability to create worlds that are,
The best thing about AI is its ability to create worlds that are both,
The best thing about AI is its ability to create worlds that are both exciting,
}

我们可能想着每次找概率最高的词填入就行了。但是这里有点玄学的意思在里面,如果你每次都填写概率最高的词temperature=0,使用ChatGPT2模型,可能得到的是这样的文本:

可以看到文本就开始陷入重复了。

如果你设定temperature=0.8时,会得到如下文本

比前面那个例子好一点,但还是有点奇怪。如果用ChatGPT3就会通顺许多。ChatGPT默认temperature就是0.8,至于为啥0.8效果最好,没有任何“理论”,其实就是在实践中发现有效的的一个参数。

下一个词的概率怎么算出来的?

如果只有一个词的概率好统计,我们就统计一下所有词出现的次数就行了。但是长文本的概率统计只凭简单的计算是无法胜任的。这时就需要建立一个模型来进行概率预测,ChatGPT就是所谓的大语言模型。

模型可以理解为一个函数f,你输入The best thing about AI is its ability to=>f=> 下一个词的概率

怎么训练出这么一个语言模型呢?
总的来说,GPT模型训练分为四个训练步骤,这四个训练步骤是有先后依赖关系的,他们分别是:
【1】预训练Pretraining
【2】监督微调训练Supervised Finetuning,SFT
【3】奖励模型训练Reward Molel,RM
【4】强化学习训练Reinforcement Learning,RL

二、预训练(Pretraining)

预训练就是不断输入例子,来调试模型的参数。比如下面这个例子子,我们怎么确定出合适的函数来表示这些值呢?

我们用ax+bx+cx^2实现,发现效果最好。

再进一步,我们可以调整a/b/c的值,可以更加接近这些数据。这些值可以叫做权重,也就是参数,ChatGPT3实际上1750亿个参数。而ChatGPT3.5/4没有公开数据,但是可以想到只会更多。ChatGPT这个所谓的函数其实就是一个神经网络

可以想象一下1750亿个参数是怎么样的,这个有一个ChatGPT23的参数可视化图

每个token的生成其实都要经过1750亿个参数参与计算,不过它是存在并行计算优化,所以也不至于很慢。

更具体一点的话,GTP的全称是Generative Pre-Trained Transformer,其实就是用Transformer模型做的预训练。

Transformer是谷歌在2017年发表的一篇论文,它的出现为自然语言处理NLP提供了一种全新的范式,尤其是其核心自注意力机制,提供了一种更加高效、更加强大的方法来处理序列数据。

Transformer之前呢,这个任务通常是由RNN模型来实现的,RNN有个缺点:计算是顺序进行的,如果我们要得到最后一个单词的处理结果,就必须要先计算前面9个单词的处理结果,这样就存在信息的衰减,很难处理相隔比较远的两个单词之间的信息。

今天天气很好,我的心情也很__
今天天气很差,我的心情也很__

如果只看后半句,其实都一样,决定下一次词的关键,是前面的上下文。如果上下文很长,通常会丢失重点。所以引入了自注意力机制,简单理解就是会抓住关键词,它会计算出下一个词跟前面哪个词比较有关系。

所以说预训练的过程,就是在调整这个Transformer模型的参数,让它越来越清楚词与词之间的相关性,让它生成的概率越来越准确。

具体的过程就是把从网络上收集的文本,输入到模型当中,让模型根据前文和后面跟着的词,来调整参数。为了给出准确的预测,神经网络每次都需要调整其上百亿个参数。以LLaMA的训练数据集为例,共1.4T tokens

这是《纽约时报》用莎士比亚作品训练的一个小型GPT。这里给出了莎士比亚作品中的一小段以及在其上训练GPT的情况。

刚开始时,参数是随机生成的,所以它的结果也是随机的。随着时间推移,训练时间越来越长,GPT不断迭代,模型给出的结果样本也就越来越连贯通顺了。

在所有阶段中,预训练阶段所需的计算量是最大的,可以说99%的训练计算时间和浮点运算量都集中在这个阶段。因为这一阶段需要处理超大规模的互联网数据集,可能需要数千GPU构成的超级计算机工作几个月时间。像GPT3就需要几千张V100 GPU训练了数月份,花费几百万美元。

预训练完的模型我们称之为Base Model。但是Base Model并不是一个可以直接回答你问题的“助手”,如果你向它问问题,它大概率会拒绝回答,或者不理解你的问题,再或者用更多的问题来回答你的问题。

简单说这个模型只会把你的要求看做一个文章,然后试图续写它。

或者可能是这种画风:

public void main(String[] args) {
  Integer num1 = 200;
  Integer num2 = 200;
  if (num1 != num2) {
    System.out.print(1);
  } else {
    System.out.print(2);
  }
  if (!num1.equals(num2)) {
    System.out.print(3);
  } else {
    System.out.print(4);
  }
 }

它的回答可能是
A、13
B、24
C、14
D、23
可以看到这个模型好像有点笨,有点像人工智障,但是绝对不要小看了这个模型,这个模型就可以理解为读了世界上所有的文本,掌握了所有语言的内在规律,但是还不知道人类的喜好,只知道续写文本,就像小说里面天赋异禀的主角,突然得到了深厚的内力,却不知道招式,不知道如何使用内力。
下一步就是教这个基本模型一些招式了。官网上给的博客就是下面一张图。
【1】监督微调训练Supervised Finetuning,SFT
【2】奖励模型训练Reward Molel,RM
【3】强化学习训练Reinforcement Learning,RL

三、监督微调训练(Supervised Finetuning,SFT)

这一步就是让人类老师来指导它一下。

OpenAI的方法是以人工方式写的少量但是高质量的promptresponse数据,数量大约1w~10w条。然后,继续在这些数据上训练语言建模。算法不变,只是换了训练数据集:从大量低质量的互联网文档换成了少量高质量的问答式「prompt - response」数据。

问题的形式是各种各样的,包含问题、总结、分类、解释等等。

前面这种方式,需要人工提供答案,或者人工写答案,可以想到是比较难实现的,所以也就只能写1w左右了。一直写下去也不现实,需要找到一个更好的方式,不然就全是人工,没有智能了

这时候就需要引出下面两个部分

四、奖励模型Reward Molel,RM)和强化学习(Reinforcement Learning,RL)

我们可以建立一个奖励模型,然后让这个奖励模型去持续地训练语言模型,让语言模型的输出更符合人类的习惯。

在建立奖励模型这一阶段,需要将数据收集转变成比较的形式。这里给出了一个示例,对于同样的prompt,即要求写一个能检查给定字符串是否为回文的函数。再使用已经训练好的SFT模型生成多个结果,这里给出了三个。然后再让人类给这些结果排名。

这一步的工作量其实也不小,因为有时候几个版本差别不大,需要认真读才能给出正确的排名。有了人类排名的数据后,使用这个排序结果数据来训练奖励模型。对多个排序结果,两两组合,形成多个训练数据对。RM模型接受一个输入,给出评价回答质量的分数。这样,对于一对训练数据,调节参数使得高质量回答的打分比低质量的打分要高。

这样,训练好的奖励模型这时候就是熟知人心了,知道人类喜欢的东西是什么。

然后就是强化学习的部分,还是提出问题,让SFT模型生成多个答案,不同是的是,之前是人类来排名,现在交给奖励模型打分,如果对一个答案分数比较高,则这个答案的所有token都会强化,就是概率会增加,而如果分数比较低,则所有的token出现的概率会降低。在这样训练许多遍之后,所有的答案都能得到很高的分数,也就是说,它每次输出的不同答案,都是能让人类满意的。

这样,语言模型给的答案都是会符合人类习惯的,可以说是一个成品了,ChatGPT也就诞生了。

这样一个模型越来越符合人类的喜好,但是同时也失去了更多可能性,也就是失去了更多创造性

所以如果你想要执行更多创造性的事情,可以使用基础模型,比如你要给宝可梦起名字。在前面输入7个现有的宝可梦名字,会输出其他宝可梦的名字,这些宝可梦的名字都是现在不存在的,所以在这方面,gpt是有创造性的,因为宝可梦本来就是不存在的东西。

真正让ChatGPT发挥作用的是什么呢?
我们目前知道的语言的规则,首先想到的就是语法。在英语中,名词前面有形容词、后面可以有动词,两个名词不能挨在一起。

只有语法肯定是不够的,因为“快乐的鱼想吃理论”这句话在语法上是正确的,但是不符合人类的语义。怎么判断一句话是否有意义呢?其实现在没有一个具体的“理论、规则”

让我们从另一个角度来看看:
gpt中,任何一个文本都可以表示成一个向量,可以视为某个“语言特征空间”中的坐标,如果把这个空间投影到二维平面,单个词的可能的布局方式:

可以看到相同特征的词,位置比较靠近。这其实是在二维平面上的展示,而实际这个特征空间是下面这样的,这样的高维空间(在chatGpt2中长度是768,在ChatGPT3中长度是12288),能存储的信息就太多了,所以还有很多我们不能看到的信息。

ChatGPT并不明确了解语言规则,但是在训练过程中,它隐含地发现了这些规律,并且很擅长这些规律。

所以说真正让ChatGPT发挥作用的是什么呢?可能的答案是,语言在根本上可能比它看起来更简单。ChatGPT的成功隐含地揭示了一个重要的 “科学” 事实:有意义的人类语言实际上比我们所知道的更加结构化、更加简单,最终可能可以用相当简单的规则来描述语言的规律。如果我们能通过某种方式,弄清ChatGPT里面隐含的法则,我们可能就可以更高效地做出ChatGPT所做的事情。

五、大模型的顿悟时刻

其实ChatGPT在算法层面上面其实没有特别颠覆性的创新,其实底层也还是用之前的transformer模型,ChatGPT主要是在数据量上面达到了一个新的层面,所谓大力出奇迹,量变引起质变。据说openAPI内部的人,对于ChatGPT涌现的能力也感到震惊

下图是各个主流的语言模型在不同量级的参数下面,对8个不同任务的表现。可以看到,在10biliion的时候才有一个质变

六、疑问

ChatGPT怎么学会中文的?
监督微调训练的时候,肯定都是用英文写的,为什么可以学会中文?

104中语言上做预训练,人类只用英语来指导它,也能完成中文的回答,表现和用中文指导差不多。所以可以推测,这个大预言模型,在用104种语言预训练后,其实就已经懂得不同语言间的翻译了。

为什么能写代码?
ChatGPT是一个用于处理文本的语言模型,自然也包含代码,对于ChatGPT来说,代码,分隔符等也只是一个个token

相比之下,其实代码没有那么复杂,代码有固定的格式,在学习了githubStackOverflow和维基百科上面的代码,ChatGPT能做到这一点也不足为奇了。

相信大家都用过,ChatGPT生成的代码还是有很多不足之处的,最主要的是不能保证正确率,甚至生成的代码也有可能编译不通过。听了前面的内容, 也已经知道了它实际上也只是预测文本而已,所以比较适合的是生成简单代码,或者让它读代码,比如又臭又长的代码,可以让ChatGPT让你解读一下,理一下思路。

最后分享一个看到的有意思的观点:有人说ChatGPT的写作能力比人类好,其实应该换个说法:从现在起没有人类的作文写得比ChatGPT差。ChatGPT的出现将提升人类全体水平。

本文标签: ChatGpt