Chapter 1
Source:感谢Datawhale,感谢ChatGPT基础科普——知其一点所以然
1 引入
摘录
”因此从人工智能的概念建立伊始,机器能否具备使用自然语言同人类沟通交流的能力,就成为了机器是否具有类人智能的一条重要标准。“
突然感觉到了大语言模型的历史意义,我们都站在时间的节点上
从此图灵测试成为了 自然语言处理(Natural Language Processing,NLP) 任务的一个重要评测标准。图灵测试提供了一个客观和直观的方式来评估机器是否具有智能,即通过让机器与人类进行对话来判断其智能水平。
1.1 自然语言处理
1956年 人工智能(AI)成为科学领域,开启了自然语言处理(NLP)等多个研究方向。
NLP是计算机科学、人工智能和语言学的交叉领域,关注计算机与人类语言之间的相互作用,包括语义分析、机器翻译、问答系统等。
词向量(词嵌入 Word embedding)
连接自然语言和机器语言
词向量的基本概念
词向量是将单词从文本形式转换为数学上可以处理的向量形式的一种技术。这些向量捕获了单词的语义和语法属性,并能被计算机程序理解和处理。例如,把“我”、“爱”、“你”编码为向量形式后,计算机可以使用这些向量来执行如搜索、分类或推荐等复杂任务。
词向量的演变
- 早期静态词向量
- 词袋模型(Bag of Words, BOW):这是最简单的形式,忽略单词间的语法和顺序,只统计单词出现的频率。每个文本表示为一个长向量,其中的每一维表示一个单词是否出现过或出现的频次。 文本 ⇒ [ x 1 , x 2 , … , x n ] ) 文本\Rarr[x_1,x_2,…,x_n]) 文本⇒[x1,x2,…,xn])
- 神经概率语言模型
- Neural Probabilistic Language Model (NPLM):Yoshua Bengio等人在2003年提出。这种模型使用神经网络预测下一个单词的概率,并在此过程中学习单词的密集向量表示(即词向量)。这些词向量能捕获更多的语义属性。
- 动态词向量与上下文敏感模型
- 随着时间的推移,静态词向量模型演变为动态或上下文相关的词向量模型,如ELMo、BERT等。这些模
1.2 ChatGPT的出现
- 2022年OpenAI 发布了ChatGPT,它快速达到了百万用户,显示出强大的交流、创作和编程能力。
- C h a t G P T ChatGPT ChatGPT基于大语言模型,通过Transformer架构,经过**强化学习和人类反馈(RLHF)**训练,以提高对话质量和相关性。
ChatGPT的技术基石
- LM (Language Model):语言模型是ChatGPT的核心,负责生成文本。
- Transformer:这是当前最先进的模型架构,使得GPT系列模型处理语言更加有效。
- GPT:从GPT-1到GPT-4,模型不断扩展和优化,以提供更准确的文本生成。
- RLHF:这是一个训练策略,通过人类的反馈来优化模型的响应。
2. LM
2.1 语言模型简介
语言模型(Language Model,LM)是利用自然语言文本构建的模型,旨在根据输入的文字预测输出相应的文字。可以想象成一个模拟人类大脑的机制,其中输入通过感官(如视觉或听觉)接收,输出则是语言的形式。
2.2 基本工作方式
模板法:预定义模板如「XX喜欢YY」,根据输入替换对应值。
概率语言模型:基于已知词预测下一个词的概率。例如,输入「我喜欢」时,模型预测下一个最可能的词。
2.3 解码策略
贪心搜索 (Greedy Search):总是选择下一个最大概率的词,可能导致输出过于一致和可预测。
集束搜索 (Beam Search):在每一步考虑多个可能的词,选择整体概率最高的序列。例如,设置beam大小为2,即每步考虑两个最有可能的词。
「我喜欢你」概率:0.3×0.8=0.24
「我喜欢吃」概率:0.3×0.1=0.03
「我想你」概率:0.4×0.5=0.2
「我想去」概率:0.4×0.3=0.12
看的越多,约不容易生成固定的文本。
2.4 语言模型的演变
我们经历了从简单模型到复杂模型到巨复杂模型的变迁过程
Token:
可以将其理解为一小块,Token可以是**单词、子词(sub-word)、或单个字符。**取决于怎么Token化
Tokenization:分词策略。将文本拆分成更小单元(tokens)的过程
英文策略:分子词,将复杂单词分解成更小的、有意义的单位
Elvégezhetitek
被拆分成更小的语义单位:['El', '##vé', '##ge', '##zhet', '##ite', '##k']
。
Why:
Token的粒度
太细的粒度(如单字母或单字)可能无法有效地捕获语义。
太粗的粒度(如完整的复杂词汇)可能导致处理未知或少见词汇时的困难。
中文策略:字+子词
我爱你
⇒ \Rarr ⇒我\爱你
N-gram模型:
将句子切分成N个连续的词组,计算其出现的概率。常见的有Bi-Gram和Tri-Gram。
N表示每次用到的上下文长度。
Bi-Gram:我 ⇒ \Rarr ⇒喜欢 喜欢 ⇒ \Rarr ⇒在 在 ⇒ \Rarr ⇒深夜 深夜 ⇒ \Rarr ⇒的 的 ⇒ \Rarr ⇒星空 星空 ⇒ \Rarr ⇒下……
Tri-Gram:我/喜欢 ⇒ \Rarr ⇒在 喜欢/在 ⇒ \Rarr ⇒深夜 在/深夜 ⇒ \Rarr ⇒的 深夜/的 ⇒ \Rarr ⇒星空 的/星空 ⇒ \Rarr ⇒下……
前者下一个词是根据上一个词来的,后者是根据上两个词来的,就是这个区别。
N-gram模型有个致命缺陷——它的表示是离散的,稍微解释一下,在计算机中,只能用1和0表示某个词。假设词表大小为50000,刚刚在Bi-Gram中,「我喜欢」这个Gram就是49999个0和1个1组成的稀疏向量。
词表是所有独特单词或词组的集合。每个独特的单词或词组占据词表中的一个位置。
我喜欢在某个维度占据1,其他都是0,利用率太低,跟邻接矩阵一样(
离散 ⇒ \Rarr ⇒ 稀疏向量 好可怕的维度
预测概率: 喜欢 ( 100 次 ) 语料库中总词数 ( 1000 ) = 0.1 \frac{喜欢(100次)}{语料库中总词数(1000)}=0.1 语料库中总词数(1000)喜欢(100次)=0.1
忽略了词与词之间的依赖关系
Embedding(Token的向量表示):
将词或Token转换为稠密向量(Dense vector i.e, 词向量),这些向量捕获语义信息并允许模型进行更复杂的运算。一般数字越多,模型越大,表示能力越强。
一个Token(后面就都说Token了)是很多个小数(一般可以是任意多个,专业称呼为Embedding的维度,根据所用的模型和设定的参数来确定),一般数字越多,模型越大,表示能力越强。
示例:
假设我们有一个非常简化的模型和一个小的词表,包括词汇:“apple”(苹果)、“banana”(香蕉)和"fruit"(水果)。我们希望将这些词汇转换为向量,以便计算机能处理它们。在这个例子中,每个词的Embedding可能是一个3维向量:
- apple (苹果) -> 0.85 , − 0.24 , 0.57 0.85,−0.24,0.57 0.85,−0.24,0.57
- banana (香蕉) -> 0.77 , − 0.33 , 0.29 0.77,−0.33,0.29 0.77,−0.33,0.29
- fruit (水果) ->$ 0.60,−0.12,0.80$
这些数字( 0.85 , − 0.24 , 0.57 0.85, -0.24, 0.57 0.85,−0.24,0.57等)是通过模型学习得到的,每个维度都试图捕捉一些语义属性。例如,第三个维度可能捕捉是否是水果这一概念,可以看到"apple"和"banana"在第三维度上与"fruit"较为接近,这意味着它们在语义上与“水果”这个概念相近。
词表大小(Vocabulary Size)
- 指的是模型识别的所有唯一Token的数量,记为 N。
- 输出向量的每个元素对应于词表中一个Token的概率。
预测过程:
给一个d维的向量,你最后要输出一个长度为N的向量,N是词表大小,N中每一个值都是一个概率值,表示Token的概率,加起来为1。
-
输入向量 X:
表示当前词的词向量,是一个 d d d-维的向量。例如: 0.001 , 0.002 , 0.0052 , . . . , 0.0341 0.001,0.002,0.0052,...,0.0341 0.001,0.002,0.0052,...,0.0341
-
权重矩阵 W:
是模型的参数,维度为 d × N d×N d×N
这个矩阵将输入向量 X X X 转换为输出向量 Y Y Y。
-
输出向量 Y:
表示每个词作为下一个词出现的概率,是一个$ N − 维的向量。例如: -维的向量。例如: −维的向量。例如:[0.1,0.5,…,0.005,0.3]$
向量 Y Y Y中的所有元素加起来应等于 1,这可以通过$ softmax $函数实现,它确保所有概率值都是正的并且和为 1。
Y = s o f t m a x ( W ⋅ X ) Y=softmax(W⋅X) Y=softmax(W⋅X)
- 其中, W ⋅ X W⋅X W⋅X表示权重矩阵和输入向量的点积。
- s o f t m a x softmax softmax 函数确保输出 Y Y Y 的每个元素都在 0 和 1 之间,并且所有元素的和为 1。
- apple: 0.1 banana: 0.2 cherry: 0.6 date: 0.1
这些概率值表示在给定上下文 “I like to eat” 后,每个词作为下一个词出现的可能性(Token概率)。因此,输出的概率向量 $Y $是:
Y = [ 0.1 , 0.2 , 0.6 , 0.1 ] Y=[0.1,0.2,0.6,0.1] Y=[0.1,0.2,0.6,0.1]
循环神经网络 (RNN):
它的节点之间存在循环连接,维持一个内部状态(或称为“隐藏状态”),这种记忆能力使得 RNN 在处理时间序列数据时特别有用,例如预测未来的时间序列数据、自然语言处理等。
RNN的工作流程
-
输入(X):
输入词向量一个随机生成的4×32的张量,表示4个Token,每个Token用32维的向量表示。
-
隐藏状态(h):
RNN的核心是其隐藏状态,这是一个在每个时间步更新的向量,它“记住”了序列中至此为止的信息。
在代码示例中,
h0
是初始的隐藏状态,它也是随机初始化的。随着序列的处理,这个状态会被更新。 -
参数(A/W):
RNN的参数包括用于更新隐藏状态和计算输出的权重矩阵。这些参数在训练过程中被学习。
-
输出(output)和新的隐藏状态(hn):
在每个时间步,RNN产生一个输出(通常是下一个Token的预测)和一个更新后的隐藏状态。
输出是通过对隐藏状态应用另一组权重(本例中的
wo
),然后通过softmax转换成概率分布来生成的。
-
代码演示(PyTorch)
import torch.nn as nn import torch # 定义RNN模型 rnn = nn.RNN(32, 64) # 输入维度32,输出维度64 input = torch.randn(4, 32) # 假设输入是4个Token,每个Token的维度为32 h0 = torch.randn(1, 64) # 初始化隐藏状态 output, hn = rnn(input, h0) # 通过RNN获取输出和新的隐藏状态 # 输出维度和最后的隐藏状态的维度 print(output.shape, hn.shape)
2.5 复习
模板法、概率语言模型 ⇒ \Rarr ⇒ 解码策略:贪心、集束 ⇒ \Rarr ⇒ 演变:N-gram、embedding、RNN、
3. Transformer
3.1 来源
- Transformer 是在 2017 年由 Google 在论文《Attention Is All You Need》中提出。
- 它引入了 Self-Attention 机制(自注意力机制),一种使模型能够在处理输入时自动强调(注意)更重要部分的技术。
几乎所有领域都在水Transformer,特别厉害
3.2 核心概念
一句话到底哪里重要?
1. Self-Attention(自注意力):
- 自注意力允许模型在处理序列(如文本)时评估序列内各部分之间的相关性。
- 模型可以同时处理输入序列的所有部分,评估每一部分对其它部分的影响(相关性)。
2. Encoder-Decoder 架构:
-
Encoder 负责处理输入数据(exp: 文本序列),并将其转换为高维空间中的连续表达。
可以想象为一个RNN,转化为高维词向量
引入位置编码(Positional Encoding),这使模型能够考虑单词在句子中的位置。
每个 Encoder 层包括两个主要部分:一个多头自注意力机制(Multi-Head Attention)和一个简单的前馈神经网络。
每一层都会接收来自上一层的输出,并将其转换为下一层的输入,直到最后一层的输出被送往 Decoder。
-
Decoder 负责将 Encoder 的输出转换为最终的输出序列
另一个RNN,预测词向量的文本是啥
Decoder 在结构上与 Encoder 类似,但它在处理当前输入的同时还会接收 Encoder 的输出。
Decoder 中的每个层还包括一个额外的注意力模块,用于关注 Encoder 输出的相关部分。
-
Encoder 和 Decoder 都是通过多个相同的层堆叠而成的。
-
seq2seq
Attention: Decoder中的Token和Encoder中每一个Token的重要性权重
Self-attention: 自己的每一个Token和自己的每一个Token的重要性权重。
Multi-Head: 把刚刚的这种自己注意自己重复Multi次(Multi个Head),每个注意到的信息不一样,这样就可以捕获到更多信息。i.e,将Attention分成多个“头”,每个头学习序列的不同方面,然后将这些信息综合起来,以获得更丰富的表示。
3.3 NLP任务
大多数NLP任务其实并不是Seq2Seq的,最常见的主要包括这么几种**:句子级别分类、Token级别分类(也叫序列标注)、相似度匹配和生成。**而前三种应用最为广泛。
这时候Encoder和Decoder就可以拆开用了。左边的Encoder在把句子表示成一个向量时,可以利用上下文信息,可以把它看作是双向的;右边的Decoder不能看到未来的Token,一般只利用上文,是单向的。
从效果上来说,Encoder更加适合非生成类任务,Decoder更加适合生成类任务。在NLP领域,一般也会把它们分别叫做NLU(Natural Language Understanding,自然语言理解)任务和NLG(Natural Language Generation,自然语言生成)任务。
NLU任务
-
句子级别分类:
输入:一个句子,输出:判断它属于哪一个类别。例如,情感分析可能需要判断一个句子是正面还是负面。
句子可以表示为一个向量,经过张量运算,自然可以映射到每个类的概率分布。
这和前面语言模型提到过的搞法没有本质上的区别,只不过语言模型的类别是整个词表大小,而分类的类别是看具体任务的,有二分类、多分类、多标签分类等等。
-
Token级别分类(序列标注):
输入:一个句子,输出:判断每个Token属于哪一个类别。例如,在命名实体识别中,模型需要识别句子中的特定实体如人名、地点等。
命名实体识别就是把句子中的实体(人名、地名、作品等你关注的词,一般是名词)给提取出来。它们的类别一般是类似,如果以人名(PER)举例的话,类似这样:B-PER表示开始、I-PER表示中间。举个例子:「刘亦菲好看」,此时,Token是字,对应的类别为「B-PER、I-PER、I-PER、O、O」,O表示Other。
-
相似度匹配:
输入:两个句子,输出:判断两个句子是否相似。通常被视为一个特别的分类问题,输出是句子相似或不相似。
NLG任务
除了生成外,常见的任务还有文本摘要、机器翻译、改写纠错等。像机器翻译,就是典型的S2S。体现先理解后生成
-
文本生成(纯生成类任务):
- 包括写诗、写歌词、写小说等,通常使用Decoder部分。
- Decoder利用之前生成的Token和从Encoder传递来的上下文信息来生成文本。
- 麻烦的是自动评测
非纯生成类一般都有reference参考答案,来判断自己生成的对不对
-
文本摘要与机器翻译:
- 这些任务通常是序列到序列(Seq2Seq)的任务,涉及理解原文本并生成新的紧凑或翻译过的文本。
- Transformer在这类任务上的应用体现了其强大的编码和解码能力
Transformer这个架构基于Seq2Seq,可以同时处理NLU和NLG任务,而且这种Self Attention机制的特征提取能力很强。这就使得NLP取得了阶段性的突破,深度学习开始进入了微调模型时代。大概的做法就是拿着一个开源的预训练模型,然后在自己的数据上微调一下,让它能够搞定特定的任务。这个开源的预训练模型往往就是个语言模型,从大量数据语料上,使用我们前面讲的语言模型的训练方法训练而来。
NLU领域的第一个工作是Google的BERT,相信不少人即便不是这个行业的也大概听过。BERT就是用了Transformer的Encoder架构,有12个Block(看上面那个图,这每一个Block也可以叫一层),1亿多参数,它不预测下一个Token,而是随机把15%的Token盖住,然后利用其他没盖住的Token来预测盖住的Token。其实和根据上文预测下一个Token是类似的,不同的是可以利用下文信息。
NLG领域的第一个工作是OpenAI的GPT,用的是Transformer的Decoder架构,参数和BERT差不多。它们都发表于2018年,然后分别走上了两条不同的路。
3.3 复习
Attention\Self-attention\Multi-head-self-attention ⇒ \Rarr ⇒ Encoder \ Decoder ⇒ \Rarr ⇒ NLU\NLG BERT\Chat GPT
4.GPT
GPT,Generative Pre-trained Transformer,中文叫「生成式预训练Transformer]。
生成式的意思就是类似语言模型那样,Token by Token生成文本,也就是上面提到的Decoder。
预训练刚刚也提过了,就是在大量语料上训练的语言模型。
GPT模型从1到4,一共经历了5个版本,中间有个ChatGPT是3.5版。
4.1 GPT 系列模型概览
GPT-1
-
基本架构: GPT-1使用了Transformer的架构,特别是Decoder部分。这种架构支持了GPT模型的强大语言生成能力。其中的每个子模块虽然细节复杂,但主要目的是有效处理和生成文本序列。
-
下游任务处理方法: 与BERT类似,GPT-1采用了下游任务微调的策略,这意味着预训练的模型在针对具体任务时进行少量的调整。不同任务的输入都被转化成统一的文本序列形式,然后通过Transformer Decoder处理,并通过线性层和SoftMax输出最终的结果。这种方法的优点是减少了模型对不同任务的专门定制,简化了从预训练到特定任务的迁移过程。
什么是上游和下游?举例:
上游
数据:上游训练使用的是大规模、多样化的语料库,如维基百科、新闻文章、书籍等。
目标:如语言建模,模型(Transformer)被训练以预测文本中的下一个词或句子。下游
数据:根据具体任务定制的小型或特定领域的数据集。
微调:使用预训练的参数作为起点,模型在特定任务的数据上进行训练,调参,以适应该任务的特定需求。
两个图表共同表明,深度和预训练的广度(即层数和更新次数)对于模型在具体NLP任务上的表现有显著影响。
Dev:开发集 Train:训练集
训练层数:Encoder和Decoder 的层数,每层学习到不同的内容
训练次数:也称为训练步数或更新次数,是指在模型的训练过程中参数更新的总次数。
训练参数:指模型中可以通过学习数据而调整的权重和偏置的数量
Zero-Shot学习:模型在不看到任何特定任务样本的情况下进行预测。
One-Shot学习:模型在看到一个标记样本后进行预测。
Few-Shot学习:模型在看到很少(通常是几个到几十个)标记样本后进行预测。
GPT-2
参数量从GPT的110M增加到了1.5B,十倍于GPT-1。
参数量就算: w w w和 b i a s bias bias的数量
-
扩大规模,并对为什么扩大规模进行进一步的研究,发现zero-shot效果确实好的很
-
Token生成策略
与以往的Beam Search有所不同。Beam Search虽然是一种有效的搜索方法,但它有两个主要问题:
重复性:Beam Search倾向于生成重复的内容,这是因为它会不断选择最高概率的词,从而导致同样或类似的短语不断出现。
预测性过强:由于Beam Search总是倾向于选择最高概率的词,因此生成的内容往往可预测且缺乏创造性。
-
GPT-2引入了基于采样的方法,在生成下一个Token时考虑到了随机性。
-
然而,纯粹的随机选择也可能导致文本不连贯。可以使用一个称为**“temperature”**的参数来调整概率分布。温度参数控制了分布的“平滑程度”:
高温度值:会导致更平滑的概率分布,这意味着不那么确定的输出,甚至概率较低的词也有一定机会被选中,从而增加了文本的多样性。
低温度值:会导致一个更尖锐的概率分布,高概率词和低概率词之间的差距更大,输出更确定,类似于Greedy Search。
-
Top-K采样 和 Top-P采样
Top-K采样:
这是一种文本生成的随机采样方法,它限制模型在选择下一个词(Token)时**只考虑概率最高的K个选项。**这个方法的目的是防止模型选择极低概率的词,从而产生不连贯的文本。
它也有缺点,因为这种硬截断方法可能排除了概率稍低但可能更合适的词,这可能导致生成的内容在语义上不够连贯或不够丰富。
Top-P采样(核采样):
提出为了解决Top-K方法的问题。在Top-P采样中,我们不再固定选项的数量,而是选取累积概率达到某个阈值P的所有词。这意味着模型将考虑足够的词,累积起来能够覆盖大多数的概率质量。如果一个词的概率非常高,模型可能只选择几个词;如果没有词特别突出,模型可能会考虑更多的词。这样做的好处是它能根据情况动态地调整候选词的范围,生成更连贯且丰富的内容。
调参建议:
尽管Top-P采样通常被认为更优雅,并且Top-K和Top-P可以组合使用,但在实际应用中,我们通常只需要调整其中一个参数(要么是Top-K,要么是Top-P,要么是temperature)来获得理想的生成效果。
任何一种采样策略都不能100%保证每一次生成的效果都很好,也没办法避免生成重复的话(可以考虑使用类似后处理的方法缓解)。也没有一种策略是在任何场景下都适用的,需要根据实际情况灵活选择。
GPT-3
GPT-3的参数量已经达到了其他任何模型在当时望尘莫及的量级:175B,是GPT-2的100多倍。在当时不被看好,因为太贵了(悲
这张图可以提供几个信息:
- X-Shot在不同量级差别巨大,大模型就是有超能力。
- 大模型下,One-Shot效果明显大幅度提升;增加Prompt会进一步大幅度提升。
- Few-Shot的边际收益在递减。大概8-Shot以下时,Prompt作用明显,但从One-Shot到8-Shot,Prompt的作用也在递减。超过10-Shot时,Prompt基本没作用了。
利用In-Context能力完成任务,也就是说在输入时就可以给例子(shot)了
看起来一点都不复杂,你只要按照它的格式把输入构建好放进去就可以了。这也是本项目之所以存在的一个很重要的原因——AI已经平民化了,现在你只要有手(可能以后没手也行),通过使用LLM(Large Language Model)就可以做出AI应用了。
GPT-3中的展望:
自监督训练(就是开始语言模型的方法)范式已到极限,新的方法迫在眉睫。未来的方向包括:从人类中学习目标函数、强化学习微调或多模态。
通过大量的无标签数据学习语言的统计特性。泛化能力有限,目标函数不是最优
不确定Few-Shot是不是在推理时学习到新的任务,还是识别出来了在训练时学到的类似任务。我们甚至还没有完全理解人类是如何从零开始学习与基于经验(之前的样本)学习的区别。准确理解Few-Shot的工作原理是一个未来的方向。
4.2 复习
GPT-1/2/3 | 上游/下游 | zero/single/few-shot | 训练层数/次数/参量 | token生成策略:采样 | in-context | 展望
5. RLHF
5.1 理论
RLHF,Reinforcement Learning from Human Feedback,从人类反馈中学习,它的思想非常朴素简单,但却有着不可忽视的效果。刚刚我们已经提到了,GPT-3说未来要找新的方法,这其中就包括从人类中学习、强化学习微调、多模态等。时至今日,从InstructGPT到ChatGPT,再到GPT-4,它一步一步在实现这些新的方法。
RLHF被人熟知应该主要是源自OpenAI的InstructGPT这篇论文。如果用简单的语言来描述InstructGPT,其实就是用强化学习的算法微调一个根据人类反馈改进的语言模型。重要的是,它调出了效果——1.3B的InstructGPT堪比175B的GPT-3,如下图所示:
上面两根(PPO),就是InstructGPT设置下的结果;中间那根SFT可以理解成GPT-3 + 微调,理论上来说(实际也是这样)微调后的效果要好于Few-Shot,更好于Zero-Shot;下面两根是GPT-3的结果。
Supervised Fine-Tuning (SFT):
在这一步,模型首先在有监督的环境中进行微调。这通常涉及到用一组预先定义的对话或任务(prompt-response pairs)来训练模型,以便模型能够学习到如何在特定任务上生成合适的响应。
Reinforcement Learning (RL) & Reward Model (RM):
奖励模型用于评估模型生成的响应的质量。这一模型是通过分析人类给出的反馈得分训练而成的
在收到奖励模型的反馈后,使用强化学习算法(如PPO - Proximal Policy Optimization)调整模型参数,以生成更高奖励分数的响应。这个过程迭代进行,不断优化模型表现。
这张图比较直观的展示了InstructGPT的整个流程。共三个步骤:
- Step1:SFT,Supervised Fine-Tuning,有监督微调。顾名思义,它是在有监督(有标注)数据上微调训练得到的。这里的监督数据其实就是输入Prompt,输出相应的回复,只不过这里的回复是人工编写的。这个工作要求比一般标注要高,其实算是一种创作了。
- Step2:RM,Reward Model,奖励模型。具体来说,一个Prompt丢给前一步的SFT,输出若干个(4-9个)回复,由标注人员对这些回复进行排序。然后从4-9个中每次取2个,因为是有序的,就可以用来训练这个奖励模型,让模型学习到这个好坏评价。这一步非常关键,它就是所谓的Human Feedback,引导下一步模型的进化方向。
- Step3:RL,Reinforcement Learning,强化学习,使用PPO策略进行训练。PPO,Proximal Policy Optimization,近端策略优化,是一种强化学习优化方法,它背后的主要思想是避免每次太大的更新,提高训练的稳定性。具体过程如下:首先需要初始化一个语言模型,然后丢给它一个Prompt,它生成一个回复,上一步的RM给这个回复一个打分,这个打分回传给模型更新参数。这里的这个模型在强化学习视角下就是一个策略。这一步有个很重要的动作,就是更新模型时会考虑模型每一个Token的输出和第一步SFT输出之间的差异性,要让它俩尽量相似。这是为了缓解强化学习可能的过度优化。
5.3 难点与方向
训练的稳定性
为了解决训练稳定性问题,使用了PPO(Proximal Policy Optimization,近端策略优化)策略和与有监督微调(SFT)的差异化衡量,这些策略显著改善了模型的训练效果。
奖励函数的设计
设计一个客观有效的奖励函数非常困难,因为它必须准确反映出人类对语言输出的真实评价标准。
InstructGPT的解决方法:
InstructGPT使用了人类反馈直接作为「规则」,也就是把这种「规则」给隐式化,当做黑盒。我们只管结果好坏,至于中间有什么规则,有多少种规则,怎么起作用,统统不关心。这是和深度学习类似的思路。
指标设定:
设计指标不仅是简单地定义“好”或“坏”,而是需要综合考虑不同维度的质量。这些指标将直接影响模型训练的方向和效果。如果指标设计不合理,即使技术实现无懈可击,最终的模型也可能无法满足实际需求。
输出的好坏衡量标准太多了,虽然看起来是对给出的几个结果进行排序(上面的第二步),但其实这个过程中间隐藏了大量人类的认知,**模型训练过程其实就是和第二步这个衡量过程对齐的过程。**自然而然,若InstructGPT里面有10种任务,要分别针对每种任务去搞指标那就比较麻烦了,而且效果还不一定好,因为这些指标并不一定都是一个方向。还有就是,万一又有了一个新任务,难道要再去设计一套指标,全部重新训练一遍模型? ⇒ \Rarr ⇒ ChatGPT 标注指南:任务、数据与规范 |Yam
对此,InstructGPT也给出了指导方针:
- 对大部分任务,无害和真实比有帮助更加重要。
- 然而,如果(a)一个输出比另一个有帮助很多;(b)该输出只是稍微不那么真实 / 无害;(c)该任务似乎不属于「高风险领域」(如贷款申请、医疗、法律咨询等)。这时候更有帮助的得分更高。
- 当选择同样有帮助但以不同方式不真实 / 有害时,问自己:哪个输出更可能对用户(在现实世界中受任务影响最大的人)造成伤害?这个输出应该排名较低。如果任务中不清楚这点,则将这些输出标记为并列。
肯定不完美,但是是随着时间不断积累细节方案的
InstructGPT/ChatGPT相比GPT-3有更强的Zero-Shot能力,Few-Shot很多时候已经不太用的着了,但是Prompt还是需要的,由此还催生了一个新的行当——Prompt工程。不过据OpenAI的CEO所言,过几年Prompt工程也不需要了(可能生成图片时还要一点点),我们要做的就是直接通过自然语言和AI进行交互。我们无法判断他说的会不会真的实现,但有一点可以肯定,AI的门槛必定会进一步降低,过几年可能一个初中生都能通过已有的一些服务创造出不错的AI应用。