像小马过河一样,对于ChatGPT背后的技术网上有很多截然相反的看法,看完本文你会发现ChatGPT既不像很多人眼中的遥不可攀也不像很多人眼中单纯的大力出奇迹。

ChatGPT在过去的几个月里频登热榜,甚至和ChatGPT有一丝联系的股票都疯狂上涨。作为一个普通的技术人,虽然也在思考ChatGPT会怎么影响我们的生活,但更关心的还是ChatGPT背后的技术,本文将捋一捋ChatGPT相关的技术,以及它是怎么出现的,相信这些内容对我们训练自己的ChatGPT,并在此基础上优化出一个更好的模型有所帮助。

本文将分为3个部分:

第一部分介绍从GPT到GPT 3.0的发展历程,这一部分的技术主要是2018-2020年提出的,相信大家都已经非常熟悉了,所以不会讨论这一部分的技术细节,而是探索这一系列工作的背景和前后逻辑,明确这些基础模型是因何被提出来的。 第二部分将介绍GPT 3.5系列的工作,并着重介绍ChatGPT(InstructGPT)背后的技术(读完本文你也可以训练一个自己的ChatGPT,并没有很复杂,所以之前研究大模型的各大机构近期如果复现出类似的东西不用感到奇怪),主要是其中的强化学习RLHF(PPO-ptx)算法 第三部分将讨论ChatGPT目前的主要应用、ChatGPT的局限性、以及与ChatGPT相关的发展方向

本文用到的符号定义:

GPT系列

GPT

2018年ELMo(Deep contextualized word representations)几乎刷新NLP领域各个主要榜单的SOTA,让人们认识到使用语言模型训练出的动态Embedding的威力(在ELMo之前也有一些如Cove等动态Embedding方法,但是并未引起太高的关注)。GPT则是在这个基础上更进一步,主要完成了两个创新,并且取得了更好的效果,第一个是使用Transformer架构(其中的Decoder)替换ELMo中的LSTM; 第二个是摒弃了之前针对每个任务设计复杂的网络架构来解决特定问题的方法,现在处理不同任务时只需要调整输入输出格式,并简单修改模型的最终输出即可完成各项复杂的任务。由于BERT(BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding)近年来的巨大影响力,第二点的创新是显而易见的,关于第一点,在GPT/BERT系列出来之前,除了机器翻译任务之外NLP领域仍然是LSTM的天下,而GPT发现了Transformer作为LM相比LSTM具有更高信息容量,效果更好,并开创了大模型以Transformer(及其变体)为基础的先河。并且由于GPT是一个语言模型,所以从GPT 1.0开始,模型已经具备了一定的zero-shot能力(论文最后只是简单提了一下)

GPT 2.0

在GPT出来后不到半年,BERT使用Transformer的Encoder以MLM(Mask Language Model)和NSP(Next Sentence Predict)两个任务为目标训练出来的LM再次霸榜了几乎所有的NLP的主流榜单,不过BERT除了模型结构有所不同之外,取得更好的效果的原因还有使用了更大的训练数据,并且还发现更大的模型容量搭配更大的训练数据能获得更好的下游任务表现。BERT风头一时无两,当时的影响力远大于GPT,胜利果实被别人窃取,搁谁身上也受不了,OpenAI又训练了一个更大的语言模型GPT 2.0(Language Models are Unsupervised Multitask Learners), GPT 2.0的结构除了初始化方式和Layer Normalization的位置改变外与GPT 1.0的结构基本一致,不同的地方主要体现在模型大小和训练数据量上。在GPT 2.0中使用Reddit中评分较高的45M(去重过滤后8M)篇文章共计40GB的语料训练了最大15亿参数的语言模型。

可惜即便GPT 2.0的参数量十倍于BERT,在主流的NLP下游任务中的表现相比BERT并不突出, 但是GPT 2.0的Zero-Shot能力相比GPT 1.0有了巨大的提升,针对很多任务,即便没有经过任务训练,仅仅通过将问题输入GPT 2.0, 利用语言模型的特性产生的答案就能超过很多经过精心设计并使用数据训练过的模型效果还要好,而且实验还发现随着模型大小越来越大,Zero-Shot的结果呈现上升趋势,15亿参数显然还没达到模型的极限。

GPT 3.0|GPT 3.5

根据GPT 2.0的发现,随着模型大小的增加模型的Zero-Shot能力也在增加,我们迫切地想知道,这种方法的极限在哪里,能否随着模型大小的增加,达到人类水平的Zero-Shot能力. 一年后GPT 3.0(Language Models are Few-Shot Learners)横空出世,将模型大小拉到了1750亿,而模型结构除了采用Sparse Transformer(Generating long sequences with sparse transformers)类似的稀疏注意力之外与GPT 2.0保持一致,而训练预料则在GPT 2.0使用的数据基础上使用了570GB的筛选后的Common Crawl(筛选前45TB), 电子书Book1+Book2以及Wikipedia数据,总体数据量是GPT 2.0的十倍以上。而模型的Zero-Shot效果也不负众望,在多个任务中Zero-Shot表现都可以超过之前的SOTA模型,不过就像论文题目提到的,这篇论文更偏重模型的Few-Shot能力,其实人在做一个没见过的任务的时候往往也需要给几个示例才能真正理解问题的诉求,所以在问最终的问题之前提供几个示例给GPT, GPT在大部分时候也会表现的更好,这里的Few-Shot和之前模型的Few-Shot不一样的地方在于这里的Few-Shot并不需要更新模型,所以这里称为In-Context Learning更贴切一些。

大模型与智能涌现

在论文Emergent Abilities of Large Language Models中发现一个现象,在模型规模不是特别大的时候,模型能力的提升与模型大小的指数倍呈线性关系(其中 7⋅10217 \cdot 10^{21} FLOPSs大约对应8B大小的模型, 102310^{23} 对应100B大小的模型),但是当模型大小大到一定程度时有一个区间突然出现模型能力提升与模型大小呈线性关系,并可以解决之前模型不能解决的问题,这说明想要获得一定的智能一定规模的模型是必须的。

In-Context Learning(ICL)是怎么工作的

In-Context Learning与之前的基于梯度下降的训练方式如此不同,我们不禁想问,In-Context Learning到底学到了什么,是怎么学的?

在Rethinking the Role of Demonstrations: What Makes In-Context Learning Work中有一个实验,有样例输入的任务在GPT上能够获得更好的表现,训练语料中很有可能就包含类似的语料,这个比较符合直觉。这个现象还可以用Percy Liang, etc的论文An Explanation of In-context Learning as Implicit Bayesian Inference 中将预训练的语言模型生成output的过程类比为主题模型进行解释,既

p(output)=∫conceptp(output|concept)d(concept) p(output) = \int_{concept} p(output|concept)d(concept)

而这些示例文本会影响 concept的概率,此时:

p(output|prompt)=∫conceptp(output|concept,prompt)×p(concept|prompt)d(concept) p(output|prompt) = \int_{concept} p(output|concept,prompt)\times p(concept|prompt)d(concept)

在上面的实验中还有一个现象是即便我们将示例中的标签替换成随机标签,发现语言模型仍然能够在下游任务中获得一个非常高的准确率,这预示着模型好像真的从上面的示例中学到了一些东西,但是模型明明没有进行更新,这个学习过程是怎么实现的呢? 在 Why Can GPT Learn In-Context? Language Models Perform Gradient Descent as Meta-Optimizers 论文中将In-Context Learning与梯度下降联系起来,根据这篇论文的观点,ICL与梯度下降有异曲同工之妙,完整的推理比较复杂,这里仅以下面的公式来展示为什么可以等价:

F(x)=(W0+ΔW)x=(W0x)+∑i(ei⊗xi′T)x=(W0x)+∑iei(xi′Tx)=(W0x)+LinearAttn(E,X′,x) \begin{align*} F(x)&= (W_0+ \Delta W)x \\ &= (W_0x) + \sum_{i}(e_i \otimes x^{T}_{i})x \\ &= (W_0x) + \sum_{i}e_i (x^{T}_{i}x)\\ &= (W_0x) + LinearAttn(E, X^{}, x) \end{align*}

第一个等式表达的就是计算更新参数之后的模型 (W0+ΔW)(W_0+\Delta W) 对于输入 xx 的响应,其中 W0W_0 是模型原始的参数, ΔW\Delta W 是使用训练数据计算出来的梯度。 X′X^{}x′x^{} 表示训练数据(示例数据), eeEE 则表示与数据对应的梯度, EE 本身也是一个和示例输入相关的值,所以也可以通过一个神经网络计算得到,如果这个值等于LinearAttn中的Value,那么最后的等式表明,实际上我们只需要示例数据而并不需要真正的进行模型更新就可以实现原本需要梯度更新才能实现的事情,这就是ICL的过程。至于Transformer结构为什么能实现最后一个等式的操作,本文的重点不在这里,感兴趣的可以去看论文(论文中还给了一个Transformer的变体来模拟动量)。

Chain Of Thought

研究还发现,在In-Context Learning中不同的示例选择,以及不同的引导词都能很大程度上影响模型的最终产出的效果,Google Brain的Chain-of-Thought Prompting Elicits Reasoning in Large Language Models发现如果我们给的示例中包含推导过程,那么模型在回答新的问题时也会包含中间的思考过程,并且更容易回答正确。同样在Google Brain的Large Language Models are Zero-Shot Reasoners中发现哪怕我们不提供示例仅仅在问题后面添加一句 “Lets think step by step”也可以让模型的答案中包含推导过程并正确回答问题.

使用代码进行预训练

在文本语料基础上增加代码数据训练语言模型本身是想让语言模型能够生成代码,并且能够回答和代码相关的问题,却意外发现使用代码训练过的语言模型能够提升模型在文本任务中的效果,特别是提升Chain Of Thought相关的能力(Challenging BIG-Bench Tasks and Whether Chain-of-Thought Can Solve Them)。这部分暂时没有找到合理的理论解释,但是直觉上可以从以下两点进行解释,第一点是代码数据中包含大量的逻辑关系,并且相对于自然语言来说具有更强的长距离依赖,这将有助于模型强化逻辑和长距离依赖相关的能力;第二点是之前有实验表明BERT等模型在非NLP任务中仍然能获得比随机初始化更好的效果,这说明这些大模型不只是一个语言模型,通过文本语料训练之后的模型结构(比如某个参数变为0可以等价为模型结构发生了改变)在非文本数据中相对于随机初始化的模型也具有有更好的学习能力,而代码数据一般来讲比文本语料的质量更高,所以也可以使得模型获得更好的参数。

Instruction Tuning

通过上面一些列的训练之后的大模型生成的内容质量已经非常高了,甚至可以生成以假乱真的新闻,但是我们仍然不满足于模型仅能对我们的输入内容进行补全,而是希望这个模型能够听从我们的指令来解决问题,但是问题是我们训练的时候并没有与此相关的任务,幸运的是我们有很多的文本任务相关的训练语料,那我们如果通过指令的方式来构造这种训练数据,那么模型不就可以根据我们的指令来解决不同的任务了吗?Google Research的FINETUNED LANGUAGE MODELS ARE ZERO-SHOT LEARNERS就是这样做的(OpenAI也提出了类似的想法)。通过这种方法训练的模型在下游任务中有很大提升,并且对于给定模板以外的问题仍然能够具有很好的泛化性。

如何训练一个ChatGPT

实际上对于解决问题来说,使用上面方法训练出来的模型已经具有了极高的可用性,但是做人工智能的人都想着要触摸人工智能的最高荣誉——通过图灵测试,这就必须让模型回复的答案尽可能的符合人类的标准,这就是ChatGPT所要做的事情。当然了,一个可用的聊天机器人还必须能够生成安全不带偏见和社会危险性的内容,这些也是ChatGPT所要解决的问题。

ChatGPT使用的技术与InstructGPT是相同的,只是数据收集和评估方面有些微倾向上的区别(猜测ChatGPT的评估要求生成更安全的内容)。

这里面用到的最主要的技术就是基于人类反馈的强化学习(RLHF),直观的讲,就是对GPT生成的内容进行打分,符合标准的回答给予更高的回报,鼓励模型生成这种回答,对于不符合标准的回答给予更低的回报(可以是负的),抑制模型生成这种回答, 这个过程就是基于人类反馈的强化学习,ChatGPT使用PPO作为强化学习算法, 并且使用一个训练好的Reward Model代替人进行打分。下面我们将详细介绍具体是怎么做的。

Reward Model

为什么需要一个Reward Model,这是因为在训练ChatGPT的过程中,我们需要对ChatGPT输出答案进行评估,这一步当然可以让人来直接打分,但是在训练时我们不可能针对每一个case都让人打完分之后再告诉模型让模型更新,这样的效率是非常低的,所以我们需要学习一个能模拟人类打分的模型,当然这个模型的能力要和人打分的水平差不多才行,所以这个模型一般会采用与生成模型差不多大小的模型(在InstructGPT中175B/6B/1.3B的生成模型都使用的是6B的打分模型)。而这个模型的目标就是一个简单的回归任务,给定生成模型的输入和采样出来的输出,回归出一个满足人类偏好的分数。

但是给每个回答标注分数并不容易,不同的人对于同一个case给出分数有非常大的方差,然而他们对于两个case的相对好坏的倾向非常一致,所以在标注数据的时候让人对模型输出的多个结果进行排序,而不是标注具体的分数,标注一致性获得大大提高。最终让模型学习每对生成结果的相对好坏,学习目标为:

loss(\theta) = – \frac{1}{C_{K}^{2}} E_{(x, y_w, y_l) \sim D}[\log (\sigma(r_{\theta}(x, y_w) – r_{\theta}(x, y_l)))]

其中 r_{\theta}(x, y) 是Reward Model的输出结果,是一个标量值。上式表示我们对每个输入采样 K 个生成模型的输出,并让标注人员对这K个输出排好序,然后两两组成pair对,让人类更喜欢的输出 y_w 的Reward Model的输出结果大于另一个即可。

从策略梯度到PPO-ptx

论文中给出了ChatGPT的优化目标为:

objective(\phi) = E_{(x, y ) \sim \pi_{\phi}^{RL}} [ r_{\theta}(x, y) – \beta \cdot \log(\frac{\pi_{\phi}^{RL}(y|x)}{\pi^{SFT}(y|x)}) ] + \gamma E_{x \sim D_{pretrain}}[\log({\pi_{\phi}(x))}]

其中第一项的优化目标是PPO的优化目标,模型输出答案的reward越大则表明越符合人类的喜好,最大化第一项就是让模型尽可能满足人类偏好,第二项是为了降低对其他任务的影响。

但是在NLP任务中使用强化学习的时候并不多,很多同学并不了解第一项究竟是怎么来的,我们具体是怎么优化的,下面就从策略梯度开始结合ChatGPT简要介绍一下PPO算法

策略梯度

强化学习的优化目标为:

\max\limits_{\phi} \{J(\phi) = E_S[V_{\pi_{\phi}}(S)]\}

其中 \pi_{\phi} 是以 \phi 为参数的策略网络,在这里就是语言模型(包括采样策略), S 表示状态,在这里既每个模型可能的输出子序列, V_{\pi_{\phi}}(S) 表示状态价值函数,其值为动作价值函数 Q_{\pi}(S, A) 关于所有动作价值的期望,即:

V_{\pi_{\phi}}(S) = E_A[Q_{\pi_{\phi}}(S, A)]

在这里就是人对这个输出序列的喜好程度,我们的优化目标就是最大化策略的期望回报,优化方法一般采用梯度上升方法:

\phi = \phi +\beta\cdot \nabla_{\phi}J(\phi)

其中 \nabla_{\phi} J(\phi) 就是策略梯度,为:

\nabla_{\phi} J(\phi) = E_S[E_{A \sim \pi_{\phi}(\cdot|S; \phi)}[Q_{\pi_{\phi}}(S, A)\cdot \nabla_{\phi} \ln \pi_{\phi}(A|S; \phi)]]

优势函数:对于一个状态,我们希望我们的策略能够选择相对于其他action更好的策略,对于好的action给予激励,不好的action给予惩罚,我们使用优势函数定义一个action是不是够好: \mathcal{A}_{\pi_{\phi}}(S, A) = Q_{\pi_{\phi}}(S, A) – V_{\pi_{\phi}}(S)

此时优化目标为最大化:

J(\phi) = E_S[E_{A \sim \pi_{\phi}(\cdot|S; \phi)}[\mathcal{A}_{\pi_{\phi}}(S, A)]]

计算策略梯度时要对 AS 求期望,而对于语言生成来说其状态空间无穷大我们没有办法直接求得其期望,所以这里可以采用蒙特卡洛的方法进行采样求得其期望。

计算策略梯度时显然策略网络的梯度在给定state和action时可以直接计算得到,但是我们有的只有对整个文本生成完成之后的评分(reward), 还不知道针对每个状态S 和动作A 的优势函数 \mathcal{A} 的值,所以这里我们需要对每个状态及其对应的动作估计出优势函数的值, Q_{\pi_{\phi}}(S_t, A) 的值为为执行action A 获得的reward r_t 加上转移后的状态 S_{t+1} 的Value函数,而更远的时间能够获得的Reward一般需要打个折扣 \gammaQ 的值可以用

Q_{\pi_{\phi}}^{(1)}(S_t, A) \approx r_t + \gamma V_{\pi_{\phi}}(S_{t+1})

来估计, 但是这个只估计了一步Action之后的值,具有较大的偏差,所以我们也可以使用更多步的Action来进行估计 Q 的值:

Q_{\pi_{\phi}}^{(2)}(S_t, A) \approx r_t + \gamma r_{t+1} + \gamma^2 V_{\pi_{\phi}}(S_{t+2})

Q_{\pi_{\phi}}^{(T)}(S_t, A) \approx r_t + \gamma r_{t+1} + \cdots \gamma^T V_{\pi_{\phi}}(S_{t+T})

他们对应的优势函数 \mathcal{A} 为:

\mathcal{A}_{\pi_{\phi}}^{(1)}(S_t, A) = Q_{\pi_{\phi}}^{(1)}(S_t, A) – V_{\pi_{\phi}}(S_{t})

\mathcal{A}_{\pi_{\phi}}^{(2)}(S_t, A) = Q_{\pi_{\phi}}^{(2)}(S_t, A) – V_{\pi_{\phi}}(S_{t})

\mathcal{A}_{\pi_{\phi}}^{(T)}(S_t, A) = Q_{\pi_{\phi}}^{(T)}(S_t, A) – V_{\pi_{\phi}}(S_{t})

使用更多的Action估计出来的 \mathcal{A} 的值偏差更小,但是方差更大,为了平衡方差和偏差,这里使用类似 TD(\lambda) 的 GAE(High-Dimensional Continuous Control Using Generalized Advantage Estimation)方法进行估计:

\begin{align*}\mathcal{A}^{GAE}_{\pi_{\phi}}(S_t, A) &= (1- \lambda )(\mathcal{A}_{\pi_{\phi}}^{(1)}(S_t, A) + \lambda \mathcal{A}_{\pi_{\phi}}^{(2)}(S_t, A) + \lambda^2 \mathcal{A}_{\pi_{\phi}}^{(3)}(S_t, A) +\cdots) \\&= \sum_{l=0}^{\infty} (\gamma \lambda)^l \delta_{t+l}^V\end{align*}

其中:

\delta_{t}^V = r_t + \gamma V_{\pi_{\phi}}(S_{t+1}) – V_{\pi_{\phi}}(S_{t})

这样我们就有了梯度和优势函数的值,可以计算策略梯度了。

这里的优势函数是估计出来的,所以我们还需要优化估计这个优势函数的网络,优化目标是最小化:

(\mathcal{A}^{GAE}_{\pi_{\phi}}(S_t, A) + V_{\pi_{\phi}}(S_{t}) – Return_t)^2

其中 Return_t 是从第t步开始的所有的Reward的和(最后一步的值就是Reward Model的值)

PPO算法

通过上面的过程我们似乎已经可以优化我们的策略网络了,但是还有一个问题,就是我们并不是真正的让人对我们的生成结果进行打分,而是使用了一个人类标注的原始模型的输出结果训练好的Reward Model来模拟人打分的过程,当我们的策略网络更新之后,新的策略网络的输出的数据分布与Reward Model训练时的数据分布将不再一致,这个问题如何解决呢?我们知道可以对一个简单分布进行采样并通过重要性采样方法来采样出符合另一个复杂分布的数据,这里我们同样可以将优化目标修改为最大化:

J(\phi) = E_S[E_{A \sim \pi^{SFT}(\cdot|S)}[\frac{\pi_{\phi}(A|S)}{\pi^{SFT}(A|S)}\mathcal{A}_{\pi_{\phi}}(S, A)]]

但是我们还知道当两个分布的差距非常大的时候在有限采样的情况下通过重要性采样出来的数据很难拟合目标分布,为了让 \pi_{\phi}\pi^{SFT} 不要离得太远,所以这里还会加上一个约束项:

\beta \cdot \log(\frac{\pi_{\phi}^{RL}(y|x)}{\pi^{SFT}(y|x)})

其中 \beta 是一个调节约束强度的参数(可以设置为自适应的)

结合起来就得到了:

J(\phi) = E_S[E_{A \sim \pi^{SFT}(\cdot|S)}[\frac{\pi_{\phi}(A|S)}{\pi^{SFT}(A|S)}\mathcal{A}_{\pi_{\phi}}(S, A)]] – \beta \cdot \log(\frac{\pi_{\phi}^{RL}(A|S)}{\pi^{SFT}(A|S)})

加入预训练数据的PPO-ptx

在ChatGPT的实验中发现通过RLHF训练好的模型在下游的推理任务中的表现下降,这在论文中被成做对齐税(alignment tax),为了避免下游任务的表现出现较大程度的下滑,在使用PPO让模型对齐人类喜好的同时加入预训练GPT时的任务即:

\gamma E_{x \sim D_{pretrain}}[\log({\pi_{\phi}(x))}]

其中 \gamma 是调整这个任务学习强度的超参数

训练数据

我们现在还不完全清楚ChatGPT的具体训练数据,这是InstructGPT中使用的训练数据,预计ChatGPT的训练数据量级与此差别不大。

ChatGPT的影响

ChatGPT的应用

ChatGPT显然可以用于与人类闲聊,现在微软的Bing也接入了ChatGPT来助力搜索(除了搜索之外微软还有很多其他产品接入了ChatGPT的能力)。OpenAI官网还提供了一些基于其他变种版本的GPT的API,这些任务也可以通过ChatGPT来解决。网上每天都有很多关于ChatGPT使用途径的讨论,大家可以自行搜索

ChatGPT的局限性与改进方向

ChatGPT表现的这么厉害,那它已经完美了吗,答案显然是否定的,下面我们将根据官方的说明和自己的思考来浅析一下目前的局限性和未来改进的方向. 有些是ChatGPT固有能力上的问题及改进方向,还有一些问题是更开放的,也许需要对ChatGPT进行改造才能解决:

ChatGPT 有时会写出看似合理但不正确或荒谬的答案。 在RL 训练期间,目前没有真实来源。一个可能的改进方向是引导模型在回答问题时加入回复的知识来源 训练模型更加谨慎导致它拒绝可以正确回答的问题。这个问题本身是一个tradeoff,我们可以让模型更开放而回答更多问题,但是这会带来更多风险。 监督训练会误导模型,因为理想的答案取决于模型知道什么,而不是人类演示者知道什么。这里的监督训练应该包括两部分,一部分是通过Instruct-tuning训练模型,这部分本身与预训练过程就很相似,所以不存在误导模型的问题,第二部分是Reward Model是通过人的标注进行训练的,但是人毕竟不是上帝,不可能所有的标注都是正确的,所以如何降低标注噪声的影响,提升Reward Model的能力也是一个比较有价值的研究方向。ChatGPT 对输入措辞的调整或多次尝试相同的提示很敏感。例如,给定一个问题的措辞,模型可以声称不知道答案,但只要稍作改写,就可以正确回答。这个可以通过提供更多相关的RL训练语料改善。该模型通常过于冗长并过度使用某些短语,例如重申它是 OpenAI 训练的语言模型。这是标注偏好问题。理想情况下,当用户提供模棱两可的查询时,模型会提出澄清问题。相反,当前的模型通常会猜测用户的意图。这个解决方案可以通过增加类似问题的标注数据,并在遇到这种问题时如果模型进行追问给更高的Reward,可以提升模型对于不理解问题的追问能力而不是猜测用户意图或者直接回答不知道。响应有害指令或表现出有偏见的行为。一个简单的方案是收集这些指令,并调整Reward Model对于类似指令的回复的打分。知识更新问题,ChatGPT是使用某个时间之前的语料进行训练,但是很多如新闻类的问题具有时效性,如何在有限计算的情况下更新ChatGPT的知识是一个有挑战的问题。像Adapter,LoRA等方法也许有用。状态保持,目前我们对话都是顺序的,但是有很多时候我们好不容易把一个问题和ChatGPT对齐了,中间插入一些其他问题之后想要再返回这个问题讨论(当然在中间数据插入不多的情况下还是可以接着上面的问题讨论的,但是目前ChatGPT最高只能记录8192?个token的上下文)。这个更像一个工程问题,定制化,持续学习,当前ChatGPT的回复倾向是满足开发者和标注者的喜好,但是谁不想要一个自己的贾维斯呢?根据我们前面讨论的ChatGPT的训练方法,优化自己的ChatGPT显然不会怕麻烦,所以去掉Reward Model我们on-line的对模型产出的多个结果进行打分就可以了,但是这里还会有一些问题,如何保证模型不会出现比较严重的遗忘或学崩掉仍是比较有挑战的事。超长文本依赖,现在GPT仍然使用Fixed Position Embedding进行位置嵌入,尽管现在支持较长的长度(8192?),但是如果我们需要知道一本书的摘要信息,仍然是不够的。不限长度的GPT可能也是一个有意思的研究方向。多模态,这有两个方向:一个是图文理解,联合理解图文内容并给出结合图文信息的回复文本,目前已经有一些这方面的工作了,另一个方向是不止生成文本反馈,还可以根据文本指令生成图像,结合DALLE+ChatGPT的能力

参考文献(按先后顺序排名)

ChatGPT: Optimizing Language Models for DialogueTraining language models to follow instructions with human feedbackDeep contextualized word representationsImproving Language Understanding by Generative Pre-TrainingLanguage Models are Unsupervised Multitask LearnersBERT: Pre-training of Deep Bidirectional Transformers for Language UnderstandingLanguage Models are Few-Shot LearnersEmergent Abilities of Large Language ModelsGenerating long sequences with sparse transformersEmergent Abilities of Large Language ModelsRethinking the Role of Demonstrations: What Makes In-Context Learning WorkAn Explanation of In-context Learning as Implicit Bayesian Inference Why Can GPT Learn In-Context? Language Models Perform Gradient Descent as Meta-Optimizers Chain-of-Thought Prompting Elicits Reasoning in Large Language ModelsChallenging BIG-Bench Tasks and Whether Chain-of-Thought Can Solve ThemLarge Language Models are Zero-Shot ReasonersFINETUNED LANGUAGE MODELS ARE ZERO-SHOT LEARNERSFine-Tuning Language Models from Human PreferencesLearning to summarize from human feedbackProximal Policy Optimization AlgorithmsHigh-Dimensional Continuous Control Using Generalized Advantage EstimationLORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELSDALL·E 2 is a new AI system that can create realistic images and art from a description in natural language.

Leave a Reply

Your email address will not be published. Required fields are marked *