为了让模型可以提问,可以给出答案,我们需要一个助手模型,这就进入了后训练阶段
在前一个预训练阶段需要很多的资源数百万¥$,到了后训练阶段,我们的目标就是把LLM转换为一个助手模型。
我们希望交谈可以想一个助手一样
可以回答准确的数学题,以及田文问题 rayleigh scattering 瑞利散射是一种光学现象,属于散射的一种情况。又称“分子散射”。粒子尺度远小于入射光波长时(小于波长的十分之一),其各方向上的散射光强度是不一样的,该强度与入射光的波长四次方成反比,这种现象称为瑞利散射 对于不想回答的问题,可以拒绝回答
机器学习的学习过程本身是一个非显示编程
神经网络也不会明确定义编程,这一切都是通过数据集上的神经网络训练完成的 因此,我们可以创建对话数据集,隐式的编程助手,上面的三个问答就是数据集中的三个独立对话示例。 实际中,这个对话数据集会涉及很多主题,很多轮对话(甚至数十万轮), 这些数据集来之与人类标注者,我们会让人类标注者给出理想的助手响应。 然后对模型进行训练,以模仿这些响应。
到了这个阶段,大模型就不在基于互联网数据集进行训练,而基于对话数据集进行训练,模型的参数将再次更新,从而学的模仿人类标注者的响应模式。这个训练时间可能需要3个小时,而预训练阶段可能需要3个月。这里的数据集比互联网的文本数据集要小的多。 对这个对话数据集的训练过程与预训练的过程是一样的,基于相同的算法,相同的方式进行训练,只是替换了数据集。
对话数据集需要转换为特殊的格式,类似TCP/IP协议一样,可以很容易的获取到数据的各个部位,比如数据的开始与数据的长度等
比如user的前面会有一个<|im_start|>表示对话的开始独白,在用户的后面有一个<|im_sep|>表示对话的分割,前面为用户身份,后面为对话,在对话的结尾有一个<|im_end|>表示对话的结尾。比如200264表示对话开始,1428表示用户身份,200266表示对话开始,200265表示对话结束。200264-200265这些token在预训练阶段没有被训练过,这样模型就能学习到哪些是user对话的开始和结束,哪些是助手assistant对话的开始和结束。
把对话数据编程一维tokens后,在推理阶段是会让助手说出下一个,下n个最好的token。
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问对巴黎推荐五个地标。chatpgt不是去学习地理,并用无限的智慧对地理内容进行排序,chatgpt回答的内容是openai聘用的标注者的统计模拟。 如果这个问题在训练集中,我们大概率会得到与该问题人类标注者提供的内容非常相似的答案。
人类标注者会通过20分钟的网络搜索,进行排名,并给出对应的答案列表。
如果这个问题在对话数据集不存在呢?
得到的答案会更有创新性 需要模型了解并统计训练集中有哪些突出的地标,人们在互联网上讨论地标的类型,在预训练阶段,base模型已经积累了大量的信息。 chatgpt会把预训练的知识与后训练数据集结合的模仿结果。
幻觉 就是大模型完成捏造信息,在早期的模型中就有所体现。
比如数据集有这三个对话 这些对话看起来是很合理的
对话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” “模糊回忆”与“工作记忆”
参数中的知识类似模糊回忆,上下文中的知识类似工作记忆
当询问关于简奥斯丁的傲慢与偏见的第1章的总结时,大模型给出的答案是很好的,这是大模型读过这本书,看过类似的论坛,这些知识都是在参数中,是模糊回忆。
更好的方法是把第一章的内容放在上下文中,类似工作记忆
这样就不需要回忆,直接看上下文就好。 在我们写一份总结前,看一遍原文也是很好的。
初始状态: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这样的答案。
介绍下你自己
这种使用方式,是比较浅层的操作
针对这个问题,那个回答好一些
模型训练和推理的过程就是根据输入的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,所以我们这里计算的是一个更显著的标签
我们不需要关注这个数据集标签哪个好,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中,让模型计算中间结果,或使用工具进行计算,并使用工具代替模型完成这些工作。
问大模型一个问题, 下面有多少个点 …
大模型并不能真正的去查,因为会发现这句话的token如下,很多个点会放在一个token中,这句话也需要在一次前向传播中得到一个token
如果使用工具,可以得到如下结果
打印如下字符串,但仅打印前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 一堆其他的小零碎东西
有些问题,可以用token来解释,有些则不好理解,比如: What is bigger 9.11 or 9.9?
为什么有的对,有的错,有的团队对此进行了研究,当查看哪些特征是开启或关闭时,或哪些神经元被激活或非激活时,与圣经经文相关的token被激活,所以模型可能认为,这些被当作圣经经文的token。在圣经中,9.11在9.9的后面。
现在我们说完了模型的两个阶段,预训练阶段会得到base model,本质上就是一个互联网文本模拟器,这个阶段需要上万台服务器训练几个月的时间,这个生成的模型可以认为是互联网的有损压缩。这个互联网文本模拟器很有意思,但我们想要的不是整个互联网,而是我们提问,模型回答。 我们实际需要的是一个助手模型,在后训练阶段就可以训练一个助手模型。在后训练过程中,是一个监督微调,整体的训练过程,与预训练过程一致。差别就在于数据集。这些对话数据集是人工标注问题和答案,当然现在很多也都是模型生成的。 这个助手模型中,如果不采用某些手段,模型会产生幻觉。