(1)问答/选择/对话任务浅谈:
先看“找答案”的问题。方法是寻找可能相关的(多个)Knowledge source,然后用材料和问题共同生成出回答。
(训练模型当然可以像填词任务一样,无中生有填出回答来<->让答案直接蕴含在参数里。比如“Q:_瓜,A:北/南?”,就能用互联网大量语料训练出的参数,鉴别常见固定搭配。
但海量的知识不可能被那么点参数表达。使用材料,参数意味着方法,才能普遍有效。比如“Q:小明中学时是个什么样的人?” 训练材料从未出现过小明,但模型就利用检索到的小明材料,将与问题最相关的部分,结合问题信息,生成回答。
判断这个问题是询问人性质的,和寻找材料判断人性质的句子,关键词。很容易有训练例子,且只需少量参数就能完成所有此类问题)
(寻找材料也不用担心不匹配原词的遗漏,因为相联系的词有相近的词向量)
下面两图是从材料中选择关键词来回答。关注重点是信息流向,将问题整体与材料的各个部分计算注意,或将每段材料与问题的每个部分分别计算注意。
类似的,达成信息结合的奇怪方法有很多。
但Transformer“联系一切”的特性,完全可以解决这类考虑。中间加个分隔符,放一起就行。
所有GPT模型使用的就是transformer架构,多头自注意力的encoder与decoder。
第二类,推理。
具体的方法根据不同的问题类型八仙过海。推理的重点是,要通过很多个hop的推进,命题的综合,才能得到结论。
下面展示一种,使用图神经网络的,(知识,逻辑,人的思维,好像比较符合图的性质,节点如何综合产生新的推论,选取有效的节点,通路云云...),体会下就好。
第三类,对话。
比如 图中,利用之前的“对话”部分,来推断完善当前的含义。
解决方法就是用rnn,注意力等各种方法,用上之前对话提取出的信息。
比如,下图中,对“待转化为答案的材料部分”每一步都综合此前问题里材料在该步的状态。(如果前一个问题是“小明是谁?”。那每一层变化都会使材料转化的信息更接近对小明的介绍。那下一个问题“多高”,就会加上上个问题的小明信息,在此基础上寻找关于其身高的部分。)
(使用chatgpt时也有发现,越接近的对话,对当前对话的影响越大。但这并不代表着对此前对话的综合一定要越远越少用。设想下,我们可以根据提问的联系程度的来计算出参考不同组对话内容的注意力。)
当然对话不一定是“甲:Q->乙:A |甲:Q->乙:A”的问题与回答不关联的连续发问;也可以是“甲:Say->乙:S->甲:S->乙:S”的环环对应,攻守兼备;甚至甲乙丙萝卜开会等。
那样就不能只看Q,QA放一起,而需要分开看待时间序上每一个节点的发言。
对话的知识背景也会不断发生变化,引入新的,旧的不再使用等。
这样,在综合通过某种方式判断相关的此前对话时,就需要对非并集知识背景 的处理错开维度,利用合并的“大背景”,来产生全面多角度的回答。
最后一个关键问题是学习调整的方式,选择题有标准答案,但生成一个长回答,并不能简单据其参考回答词语的一一对应判断其好坏。在下一部分解释。
(2)Chatgpt主要区别的解释
Chatgpt的训练包括监督学习和使用人类反馈的强化学习。
监督学习部分和常规无异,即预测互联网文本数据,句子的下一个单词(token)或被mask的单词。(transformer,多头自注意encoder,decoder)
人类反馈分为三步
【1】构建“议论文”数据集,微调(全语料预训练)模型
之前的广泛填词训练,只算培养“语感”,使句子选词和构成符合人类习惯,无法实质回答问题。
精致数据集的构建,先选取好问题,然后交给做题家去点写好回答,再加上挑选的从问答API获取的较好回答。形成许多“发起——回答”对。(用户看到的回答风格,主要就是这些专家的风格)
使用这些数据训练模型以实现微调。依然是预测token的监督学习
我觉得应该只在“回答部分”设置token任务。让用词风格有回答问题的感觉,而不会反向提问。
【2】请人给不同回答契合程度排序,获得分数标签。然后把每个“发起——回答”对作为新模型输入,输出一个对契合程度的打分,从而获得回报模型。
(设想下应该不难。对标签,若用10个排序,第一1.0分,第二依次0.9。reward model就将GPT-3 decoder最后一层接到线性层,最后映射到0-1,而且应该使用默认的预训练参数)
【3】用PPO强化学习来优化
先简单介绍强化学习,核心为下图红圈部分。
对一个状态有多种动作,每种会改变成为新的状态并获得奖赏。
那只需要利用(状态轨迹,奖赏轨迹)的行为反馈,来学习到{(特定状态,特定行为)->(预期即时奖赏,未来奖赏潜力)}的预测。
就能通过各种有随机性的搜索策略,在动作空间中寻找较优动作轨迹,及对应的理想最终结果。
例子:用折扣回报,来预估”在未来回报”的价值。时间越远打上折扣越大。
可以看出,状态的未来回报潜力,不等于走指定步数后实际回报和的平均。
其能反映相对的潜力区别,并盖过短视的即时奖励的影响即可。
PPO算法通过actor网络“生成”,并用critic网络评估状态价值。
要注意到critic网络不是 刚才的reward model。RM被critic网络使用,但其不被训练。
如果RM是体重计。那Critic就是监督你执行减肥计划的教练。
状态价值,就是该状态在未来采取“概率云”动作的情况下,所产生的奖赏潜力。
虽然V(S_t)的构成里,除了能被行动反馈验证的r外,还一定有“射线”:V(S_t+T),但轨迹的终点状态价值一定为0。(游戏结束的瞬间状态,不会影响游戏得分);或当γ的次数(T)大到一定程度,其影响就很小<-->让N步内的回报价值预测不出大偏差,价值评价就不会脱离实际,再让V(S_t)的T步外的价值预测与V(S_t+T)相符,锦上添花。
把 [状态S0,状态价值估计V_S0,动作A0,动作回报R1,log (在S0状态下采取动作A0的概率P) ] 放入经验池,用于下一步学习。
强化学习的具体进行有on-policy与off-policy两种。
简单来说,off-policy就是观察非本策略行动所产生的回报,然后再用本策略来解决问题。(比如看人别人玩游戏,学到一些“妙手”,再回家用自己的策略玩)。
而on-policy就是边采取本策略,边利用获得的回报调整。(自己玩游戏受挫了,或得了高分,就做出调整)
可以看出下图的轨迹中,左图是与最终选择无关联的,且很多样。而右图都是同一策略的微调,很集中。
两种策略无疑都有其意义,显然,off-policy更能博闻强识,启发新策略,而on-policy更能精益求精,将当前策略优化调整到完美。
PPO算法是on-policy算法。
Actor的更新:调整生成模型的参数,让生成的“优势”大的动作选择概率更大,具体见图片解释。(注意,搜索的过程是随机的,但每一步向下搜索的概率是参数生成决定的。)
Critic网络更新,就是要让经验池中的Critic价值估计,接近reward折扣回报。
生成模型可能会走“讨好”Reward的“捷径”,甚至生成不像人话的句子来“讨好”。解决方案是在训练目标中加入通用的语言模型目标。
【4】主流程小结
仅仅通过给回答打分的学习,就能获得对“什么是好的回答”的普遍的分析能力,且由完整回答训练的reward还能适用于不同生成阶段,不完整的回答,才是本问题的神奇之处。强化学习只是用于探索出获得长生成后的高reward的生成策略。即使没有强化学习,依然有,高reward==好结果(前提是其生成模型能达成通用的语言模型目标,比如人正常写回答)。
模型先学的填token,能学到语言风格,固定搭配,回答特定类型问题的方式(像上一大节里的找答案模型)。但不能获得“好”的回答。这个“好”,对不同问题是有迁移性的。比如简洁,意思不重复,有礼貌,利用语境等特点。因为加入了,使生成尽量具有长期reward的强化学习。使生成结果符合人所判断的“好”。
强化学习训练完成后,进行生成时,reward依然使用,用于指导好回答的搜索。
但若此时放弃reward,也会比单纯填token训练出的模型效果好。(游戏打多了,闭眼/不接受反馈也会玩得比之前好)
当然主流程有很多东西没提到,比如其检索库来帮助生成的方法,还有对各领域问题的专门处理。如模型肯定不能像学习日常语言一样学会所有编程语言。而是在编程语言的体系下进行学习与生成。它的代码普遍可以运行,也很方便抄来常见的,知名问题的代码。
但它不是毕竟自顶向下的“设计”,而是从前到后的“生成”。常见的简单问题可以“照猫画虎”,需要再设计的问题,无法解决,最多“望之像有点联系的代码”。
【5】discuss
Chatgpt和前身InstructGPT在模型和训练上没有任何区别。只是Chatgpt用更多的优质人写回答数据集,人工标注标签,更大量的训练,大力出奇迹,对普通人观感提升很多,才得以套皮再上市。
本文语言模型的原理一目了然,之前研究过的alphafold2也没提出什么新东西,还缝得乱七八糟,很不美观。但就是能通过工程的方式,接近常规方法的极限。可见“剑宗”之强盛,“气宗”之式微,以及transformer的潜力。
Chatgpt主要功能应该是搜索引擎的辅助,和进行一些Ai考虑较周全的对话。其每一个新句子都会考虑到之前所有的话,所以当然可以叠加使用所给条件,进行简单推理。但回答还是缺乏全局性,设计性。说到底,它只是语言生成模型。
(和它类似的有很多,还有定制风格的,它只是完善到了普通人觉得没那么奇怪的程度)。
传闻Gpt4将会使用多模态数据,文字,视频,声音等。这才是值得期待的。
我来想象的话,概念不等于词语,应该有更高的维度,且序列结构本身就是一种局限,比如应该抽象化为像有权重,有连接的图一样的结构。
###
【6】Thoughts:
训练评价+强化学习 进行搜索的策略,对广泛的“设计”也就是“搜索”问题,有参考价值。
比如,用短的蛋白质,及其完成某种功能的程度,比如参与生物过程产生的产物量,作为对序列->评价的训练。
然后通过使尽可能获得长期高评价的强化学习,来从零开始进行功能蛋白质的设计。
这应当要比从库里筛选已知的短链,或原序列的每一个位置进行突变分别分析,都更有广度。且序列越长,搜索效率的提高越明显。
可行性未知,但像是基因或蛋白质序列的搜索空间相比语言小得多。且motif这种序列在特定情况下的固定搭配和词组本质类似。
且不一定是单纯的序列->评价,而是 序列->结构->评价的方式,进行指定结构功能的序列搜索。
Problem:
类似的生成模型,无法克服的核心问题,就是从前到后的生成方式。所以结果呈现为,回答最开始的部分紧接问题,且能很泛用地接上后面部分;而之后的生成紧接前面意思,却很容易感受到其没有整体的主轴。(哪怕再熟练掌握“可能获得长期回报”的开头,它和“知道”后面部分而设计的开头,还是有本质区别)
想象一种解决方法的话,就是在随机噪声和语言之间存在一个中间态,这个态不同单元的最终语言呈现有顺序,但这些单元的联系不是一条线的,其每个单元在语境下可以单独生成一段语言解释。
态会各自调用材料,发生变化,生成语言。并扩散影响其他的态。而每一句语言生成时都会参考所有已知的态及已生成语言。已组织成语言的部分,态不会消失,且两者在必要时动态调整。
总之是一种模拟思维的动态过程。
就像写作并不是一字接一字那么简单,而是有思路,有思考演化,互作和参考材料获得的灵感,也有对思路和已写部分的修改。