参考
【必看珍藏】2月6日,安德烈·卡帕西最新AI普及课:深入探索像ChatGPT这样的大语言模型|Andrej Karpathy
fineweb知乎翻译介绍
fineweb-v1原始连接
fineweb中文翻译版本
Chinese Fineweb Edu数据集
查看网络的内部结果,可以参考如下
https://bbycroft.net/llm
https://playground.tensorflow.org/
复现gpt2https://github.com/karpathy/llm.c/discussions/677
这些操作很多都是在云端操作
https://www.ai-galaxy.cn/
https://www.aliyun.com/product/ecs/gpu
首个大规模、可商用的中文指令数据开源
找出9.9<9.11的真正原因:《圣经》!神经元干预可免重训练修复
GPT等大模型是如何训练的
POST-training:supervised finetuning
为了让模型可以提问,可以给出答案,我们需要一个助手模型,这就进入了后训练阶段
在前一个预训练阶段需要很多的资源数百万¥$,到了后训练阶段,我们的目标就是把LLM转换为一个助手模型。
conversations 交谈 对话数据集
我们希望交谈可以想一个助手一样
我们希望交谈可以想一个助手一样
可以回答准确的数学题,以及田文问题
rayleigh scattering 瑞利散射是一种光学现象,属于散射的一种情况。又称“分子散射”。粒子尺度远小于入射光波长时(小于波长的十分之一),其各方向上的散射光强度是不一样的,该强度与入射光的波长四次方成反比,这种现象称为瑞利散射
对于不想回答的问题,可以拒绝回答
该如何叫教会模型这个助手模式呢?
机器学习的学习过程本身是一个非显示编程
神经网络也不会明确定义编程,这一切都是通过数据集上的神经网络训练完成的
因此,我们可以创建对话数据集,隐式的编程助手,上面的三个问答就是数据集中的三个独立对话示例。
实际中,这个对话数据集会涉及很多主题,很多轮对话(甚至数十万轮),
这些数据集来之与人类标注者,我们会让人类标注者给出理想的助手响应。
然后对模型进行训练,以模仿这些响应。
到了这个阶段,大模型就不在基于互联网数据集进行训练,而基于对话数据集进行训练,模型的参数将再次更新,从而学的模仿人类标注者的响应模式。这个训练时间可能需要3个小时,而预训练阶段可能需要3个月。这里的数据集比互联网的文本数据集要小的多。
对这个对话数据集的训练过程与预训练的过程是一样的,基于相同的算法,相同的方式进行训练,只是替换了数据集。
Conversation Protocol/Format 对话数据集协议/格式
对话数据集需要转换为特殊的格式,类似TCP/IP协议一样,可以很容易的获取到数据的各个部位,比如数据的开始与数据的长度等
比如user的前面会有一个<|im_start|>表示对话的开始独白,在用户的后面有一个<|im_sep|>表示对话的分割,前面为用户身份,后面为对话,在对话的结尾有一个<|im_end|>表示对话的结尾。比如200264表示对话开始,1428表示用户身份,200266表示对话开始,200265表示对话结束。200264-200265这些token在预训练阶段没有被训练过,这样模型就能学习到哪些是user对话的开始和结束,哪些是助手assistant对话的开始和结束。
把对话数据编程一维tokens后,在推理阶段是会让助手说出下一个,下n个最好的token。
Conversation Datasets数据集
Training language models to follow instructions with human feedback
Training language models to follow instructions with human feedback 利用人类反馈训练语言模型遵循指令
OpenAI在2022年的一个论文《Training language models to follow instructions with human feedback 利用人类反馈训练语言模型遵循指令》
http://splab.sdu.edu.cn/InstructGPT.pdf
在该论文中,介绍了这些数据集的来历,比如从Upwork和ScaleAI这些承包商获得,参与的有专业的人工标注者,他们创建了这些对话。
人工标注者按照要求提出问题,还要给出理想的助手回答。
头脑风暴 列出五个重燃我对事业热情的想法
生成 写一个短故事,讲一只熊去海滩,和一只海豹交朋友,然后回家。
重写 这是百老汇一部戏剧的剧情梗概: {剧情梗概} 这是那部戏剧的广告大纲:
参考:https://zhuanlan.zhihu.com/p/704005082
关于具体的数据集,公司会制定标注说明。
这个说明会很长,如几百页,然后人工标注者根据这些标注写出理想的助手回答。
这个过程十分需要人力,OpenAI页从未发布过InstructGPT的数据集。
首个大规模、可商用的中文指令数据开源
https://www.modelscope.cn/datasets
数据集来源?
通过这些数据集,可能是数十万对话数据集,助手会学到乐于助人的助手人格,如果我们问一样的问题,可能会得到和数据集一样的答案,也可能会得到相似的答案。这一切的学习过程都是通过样例进行编程学习的。因为助手模型是从数据集中学习的,所以公司在创建的标注说明中会标注需要真实无害的助手。
这些数据集也不都是人工完成的,大部分都是LLMs生成的,但可能是人类编辑的。
比如ultrachat就是拥有对话构成的SFT数据集,如下
https://gitcode.com/gh_mirrors/ul/UltraChat/
当我们在chatgpt上问一个问题时,回答的内容是模仿的谁?
当我们在chatgpt上问一个问题时,回答的内容是模仿的谁?,会生成的回答时符合训练数据集的,这些数据集实际上时跟随标注说明的人类生成。也就是说chatgpt的对话大致上来自于统计上模仿人类标注者的内容。
这些标注的标注来自于公司的要求,这些标注者也不是普通的互联网人员,而是有某些技能的专家,比如代码问题的回答是某个有很多编码功底的专家。
所以我们问问题时,chatgpt给出的回答是模拟了某个标注者,而这个标注者是具有技能的。
比如我们用chatgpt问对巴黎推荐五个地标。chatpgt不是去学习地理,并用无限的智慧对地理内容进行排序,chatgpt回答的内容是openai聘用的标注者的统计模拟。
如果这个问题在训练集中,我们大概率会得到与该问题人类标注者提供的内容非常相似的答案。
人类标注者会通过20分钟的网络搜索,进行排名,并给出对应的答案列表。
如果这个问题在对话数据集不存在呢?
得到的答案会更有创新性
需要模型了解并统计训练集中有哪些突出的地标,人们在互联网上讨论地标的类型,在预训练阶段,base模型已经积累了大量的信息。
chatgpt会把预训练的知识与后训练数据集结合的模仿结果。
大模型心理学
Hallucinations 幻觉
幻觉 就是大模型完成捏造信息
幻觉 就是大模型完成捏造信息,在早期的模型中就有所体现。
比如数据集有这三个对话
这些对话看起来是很合理的
对话1:
问题:Who is Tom Cruise?
回答:Tom Cruise is a famous American actor and producer…
分析:这个问题询问的是汤姆·克鲁斯,助手回答他是著名的美国演员和制片人。这个回答是正确的,汤姆·克鲁斯确实是著名的好莱坞演员和制片人。
对话2:
问题:Who is John Barrasso?
回答:John Barrasso is American physician and politician…
分析:这个问题询问的是约翰·巴拉索,助手回答他是美国医生和政治家。这个回答也是正确的,约翰·巴拉索确实是美国的医生和政治家。
对话3:
问题:Who is Genghis Khan?
回答:Genghis Khan was the founder of the Mongol Empire.
分析:这个问题询问的是成吉思汗,助手回答他是蒙古帝国的创始人。这个回答是正确的,成吉思汗确实是蒙古帝国的创立者。
当助手模型回答问题时
要么知道这个人时谁,在网上研究过他们,然后回自信的回答问题。
当这个人助手模式没有听过时,比如一个虚拟的名字。即使模型知道类似的回答模式,网络的某个部分在某种程度上知道这一点,但“我不知道”这种回答不会主动出现。因为模型是模仿一个训练集。
在训练集中,形式为“谁是…”的问题都自信的给出正确答案。
模型会根据统计,尽可能的给出问题的答案。这些答案不是通过网络获得的,而是在尝试选择序列中的下一个token。
在一些老旧的大模型中,常出现的一些环节问题,在新的大模型中获得了改善,因为新的大模型可以连接网络,并且也回回答不知道。
如何确定模型知道什么与不知道什么?
有部分研究正在做这个事情《The Llama 3 Hard of Models》,会针对回答进行提问,问大模型是否知道这个事情,确定大模型的知识边界。是对于模型不知道的事情,正确的答案是模型不知道他们,然后把数据加入到训练集中。
大模型是一个对网络中的知识还不错的模型。可以查看大模型的结果,当模型不确定时,模型中的某个神经元可能会亮起来。但问题是神经元的激活目前没有连接到模型说他不知道的功能上。所以即使模型知道自己不知道,也不知道该如何表达。于是模型会选择最好的猜测,听起来和已知的内容一样自信。
把内容带入上下文
在提问问题时,给出一些上下文,比如让gpt基于下面的段落生成三个问题并给出答案,会发现大模型给出的还是很不错的。
这个操作过程中,不需要模型记忆,因为内容就在上下文中,大模型可以对内容很好的进行重组操作。
比如问如下问题
从以下段落中,抽取出3个特定的问题,并给出正确的答案
“”"
《武林外传》是北京联盟影业投资有限公司出品 ,由宁财神担任编剧,由尚敬执导,闫妮、姚晨、倪虹洁、沙溢、喻恩泰、姜超、王莎莎等人主演的古装武侠喜剧 。
该剧讲述了关中一个普通的小镇—七俠镇,这里有一家同福客栈。就是这间不起眼的江湖客栈,因缘巧合之下汇聚了一群性格各异又活泼搞怪的年轻人:武功高强但初入江湖的郭芙蓉、客栈老板娘佟湘玉、金盆洗手的神偷白展堂、满腹经纶的吕秀才、客栈厨师李大嘴等等。这群年轻人在同一屋檐下演绎了一幕幕经典的搞笑场面,在欢笑与眼泪中陪伴观众们一起渐渐成长 。
该剧于2006年1月2日在CCTV8首播 ,并陆续在中国大陆各地方电视台重播。同年7月6日,该剧在香港由无线电视首播,2006年7月6日,在台湾由八戏剧台播出 。《武林外传》该剧开播第一天收视率只有1.95%,第二天收视率就达到4.26%,此后一直稳定在5%左右,成为同期开播的开年大戏中收视率第一,而在百度贴吧、天涯论坛等上面,粉丝们探讨“武林”的帖子,动辄点击率上万,回帖上千 。并在2007年荣获了包括2006年新浪网络盛典年度古装电视剧、2006年《新周刊》十大创新电视人奖、2006年第3届电视剧风云盛典年度风云大奖在内的多项大奖
“”"输出为
问题1:《武林外传》的编剧是谁?
答案:《武林外传》的编剧是宁财神。
问题2:《武林外传》是在哪一天在CCTV8首播的?
答案:《武林外传》于2006年1月2日在CCTV8首播。
问题3:《武林外传》开播第二天的收视率是多少?
答案:《武林外传》开播第二天的收视率达到4.26%。
再把这个问题,询问大模型,但不给出上下文
通过把上面的问题再次给入大模型,大模型给出答案,然后和带上下文的答案比较,可以比较多次,就能知道大模型是否真的知道答案,还是生成的幻觉。
把这个方法通过编程的方式在很多文档中进行,就可以判断大模型的知识边界在哪里,也给出了大模型一个方法,即知道自己不知道的内容,并给出我不知道或拒绝回答。
如果在数据集中有这样的数据集,大模型就会把拒绝回答与某内部神经元连接起来,就比如当大模型不确定时,某神经元会更为活跃。这样大模型就可以回复我不知道等。
如果训练数据集中有这样的数据,模型可以很大程度上减少幻觉的情况。
另外一种方法解决幻觉-基于工具
如果一个事实性问题,问我们,我们不知道,人类会怎么做
会通过工具,网络检索,来找到答案。
也可以让大模型通过这种方法来回答
神经网络里的知识可以当成模型在训练期间所见事务的模糊回忆。人类阅读,会记住,反复阅读会记忆审核,针对稀少的内容,存在记不住的情况。对于记不住的情况,可以查阅资料。
大模型也可以如此,但是需要用某种方式来刷新大模型的回忆或记忆。
比如上面mitigation#2,当大模型不知道的时候,不是回复i dont know,而是触发一个工具,一对特殊的token<SEARCH_START>和<END_START>,遇到这个token会打开一个新的会话并且把问题粘贴到百度搜索或bing中,把检索到的内容粘贴到问题的上下文中,这样大模型的记忆不再时一个模糊的记忆,而是检索得来的准确的,填充到上下文中,并且把这个上下文同时给入模型。
如何让大模型知道调用工具
依然是隐式编程,把调用工具的数据集喂给大模型,大模型就会从学习到该如何调用工具。同时大模型在训练的过程已经知道了什么内容是好的网页,知道该如何调用网络,现在只需要几个例子来演示如何使用这个工具。
对于模型知道 的问题,模型就不再调用网络搜索工具了。
也可以指定需要使用工具
“Vague recollection” vs “Working memory”
“Vague recollection” vs “Working memory”
“模糊回忆”与“工作记忆”
参数中的知识类似模糊回忆,上下文中的知识类似工作记忆
当询问关于简奥斯丁的傲慢与偏见的第1章的总结时,大模型给出的答案是很好的,这是大模型读过这本书,看过类似的论坛,这些知识都是在参数中,是模糊回忆。
更好的方法是把第一章的内容放在上下文中,类似工作记忆
这样就不需要回忆,直接看上下文就好。
在我们写一份总结前,看一遍原文也是很好的。
Knowledge of self 自我认识
初始状态:LLM在“开箱即用”状态下没有自我意识。
默认行为:如果不进行任何操作,LLM可能会认为自己是ChatGPT,由OpenAI开发。
编程方法:可以通过以下两种方式为LLM编程以获得“自我意识”:在对话数据中硬编码与这些主题相关的对话;在每次对话开始时通过“系统消息”提醒模型其身份。
这种方法可以帮助LLM更好地理解和认同自己的身份,从而在其交互中表现出更一致和连贯的行为。
如果问大模型你是谁,谁构建了你这种问题,是没有任何意义的。因为大模型每次都是启动,预测下一个token,然后关闭。每次的记忆都是上下文的窗口记忆,比如下面的回答,是openai,这个问题是胡说的,原因可能是训练集中大量使用了openai的数据集。
硬编码
在数据集中添加硬编码数据,比如问tell me about yourself时,给出正确的答案,im olmo,an open xxx,这样的数据放在SFT中,就会覆盖原有的错误的自我认识标签,比如把自己当成时OpenAI。
系统消息
除了硬编码,也可以通过系统消息的方式编码自己的身份。
你是IT从业者张某某训练的大模型助手,你的名字叫小明,你训练的数据集截至日期为2099年1月8日。
下面,我将设定你的身份,针对下面问题的回答,请您模拟如下的身份,你是IT从业者张某某训练的大模型助手,你的名字叫小明,你训练的数据集截至日期为2099年1月8日。不要再回答你是Qwen这样的答案。
介绍下你自己
这种使用方式,是比较浅层的操作
Models need tokens to think
以下哪个问答是更好的
针对这个问题,那个回答好一些
模型训练和推理的过程就是根据输入的token输出下一个token。
https://bbycroft.net/llm
nana-gpt有3层,有的网络会有100层
从这个网络可以看到,针对单个token,通过网络的计算结果是相对固定的,同时这个token是从左到右的,所以根据单个token去计算的任务往往是不够多元化的,我们希望可以把问题分布到多个token中。
因此答案如下:
原因如下
从左到右的输入,我们希望把所有的计算都压缩到单个token中,同时模型给出正确答案3,一旦输出正确答案,我们希望模型给出接下来的输出this is because 2 oranges at $2。但此时我们已经有了正确的答案。正确答案在后面所有token上下文的窗口中。所以下文不是计算,而是猜测为什么是3。此时是在训练模型在单个token中猜测答案。但每个token的计算量是有限的。
右侧的回答更好些,因为我们将计算分散到答案上了,我们让模型慢慢得出答案,从左到右,获得中间结果。这个计算过程的每个token的计算量都很小,计算可以累加。在工作快要结束时,上下文中已经包含了前面的结果,因此更容易获得答案3,所以我们这里计算的是一个更显著的标签
单个token无法有太多的计算量
我们不需要关注这个数据集标签哪个好,openai已经关注过了,当我们问问题时,大模型会给出如下的答案。这个过程不仅仅是人类需要的,也是大模型训练需要的,大模型需要把问题的计算分散到多个token中,一步步的获得答案。
我们也可以在问答时,要求模型的答案放在一个token中。
这个计算过程是比较简单,所以模型直接给出了答案,如果计算过程比较复杂呢?
这个答案就是错误的,因为计算过程比较复杂,没有办法再单个前向传播中获得到正确的答案。
为此,我们可以让大模型使用更多的token,这样就可以获得更好的答案。
在上面的过程中,每个token的计算量也不大,多个token计算得到了最后的正确结果。
对于复杂的问题,没有办法把所有的计算压缩到单个前向传播中。
可以使用代码,更好的得到结果
上面的过程,尽管使用了多个token,但类似结果实在心算,我们未必相信,可以使用代码来验证。
Emily buys 23 apples and 177 oranges, Each orange costs $4. The total cost of all the fruit is $869. What is the cost of each apple? Use code.
艾米丽买了 23 个苹果和 177 个橙子,每个橙子的价格是 4 美元。所有水果的总价格是 869 美元。每个苹果的价格是多少?请用代码解答。
chatgpt计算正确,这个结果来自于运行python脚本。看起来通义千文计算错误了,千文无法运行python代码。
请运行你的代码,验证结果是否正确
再次提问,计算正确,当然我们也可以继续追问
你说你错没错,为什么错了
单个token无法获得复杂的计算,可以把问题分布在多个token中,让模型计算中间结果,或使用工具进行计算,并使用工具代替模型完成这些工作。
Models can’t count
问大模型一个问题,
下面有多少个点
…大模型并不能真正的去查,因为会发现这句话的token如下,很多个点会放在一个token中,这句话也需要在一次前向传播中得到一个token
如果使用工具,可以得到如下结果
Models are not good with spelling
打印如下字符串,但仅打印前3个字符,从第一个字符开始
“Ubiquitous”
通义的还不错
原因还是token问题
人类看到的是字符,对大模型来说,看到的是如下的token,这些token都是从互联网文本训练来的。单词的不同部分被打包成了不同token中。
我们使用token的主要目的是为了效率。有很多人认为可以删除token,采用字节或字符级别的,但这样序列会很长。
所以在token的模型中,任何字符级别的问题,都不会很好。
How many “r” are there in “strawberry”
提问How many “r” are there in “strawberry”
为什么会出现错误,主要原因是
模型只能看到token,看不到字符
模型不擅长计数
Bunch of other small random stuff
Bunch of other small random stuff
一堆其他的小零碎东西
有些问题,可以用token来解释,有些则不好理解,比如:
What is bigger 9.11 or 9.9?
为什么有的对,有的错,有的团队对此进行了研究,当查看哪些特征是开启或关闭时,或哪些神经元被激活或非激活时,与圣经经文相关的token被激活,所以模型可能认为,这些被当作圣经经文的token。在圣经中,9.11在9.9的后面。
参考:
找出9.9<9.11的真正原因:《圣经》!神经元干预可免重训练修复
现在我们说完了模型的两个阶段,预训练阶段会得到base model,本质上就是一个互联网文本模拟器,这个阶段需要上万台服务器训练几个月的时间,这个生成的模型可以认为是互联网的有损压缩。这个互联网文本模拟器很有意思,但我们想要的不是整个互联网,而是我们提问,模型回答。
我们实际需要的是一个助手模型,在后训练阶段就可以训练一个助手模型。在后训练过程中,是一个监督微调,整体的训练过程,与预训练过程一致。差别就在于数据集。这些对话数据集是人工标注问题和答案,当然现在很多也都是模型生成的。
这个助手模型中,如果不采用某些手段,模型会产生幻觉。