第二章 大模型的能力
关于GPT-3论文
论文的核心概念是Few-Shot Learning,即用极少量的示例(通常是一个或几个示例)来学习执行特定任务,证明了大规模语言模型使用元学习策略的可能和fine-tune策略的非必要性。
训练了包含175billion参数(以往非稀疏语言模型的10倍大小)的GPT3自回归语言模型,并在多个数据集上测试没有fine-tune过程的性能表现。
虽然GPT3在翻译、问答、填空、新词使用和算数等任务表现不错,但在阅读理解和推理任务数据集上的表现仍有待提高。
GPT3能够编写出人类难以区分的新闻文章。
1 语言模型的适应性:从语言模型到任务模型的转化
语言模型
p
p
p 是一种对token序列
x
1
:
L
x_{1:L}
x1:L 的分布,因此可以用来评估序列:
p
(
the, mouse, ate, the, cheese
)
p(\text{the, mouse, ate, the, cheese})
p(the, mouse, ate, the, cheese)
它还能用于在给定提示的条件下生成完成的序列:
the mouse ate
⇝
the cheese
\text{the mouse ate}⇝\text{the cheese}
the mouse ate⇝the cheese
在这里,任务被定义为从输入映射到输出。
我们使用“适应(Adaptation)”一词来指代将语言模型转化为任务模型的过程。这个过程需要以下两个输入:
- 任务的自然语言描述
- 一组训练实例(输入-输出对)
我们主要有两种方式来进行这种适应:
-
Training(标准的有监督学习):训练一个新模型,使其能将输入映射到输出。
-
这可以通过创建一个新模型并利用语言模型作为特征(探针法),
创建一个新模型并利用语言模型作为特征,通常是指使用一个已经训练好的大型语言模型(如GPT-3、BERT等)来提取文本数据的特征,并将这些特征用于训练一个新的机器学习模型或深度学习模型,以解决特定的自然语言处理任务。这个方法通常被称为探针法或迁移学习。
探针法的一般步骤:选择预训练语言模型、特征提取、数据预处理、训练新模型、微调和评估
-
或者从现有的语言模型出发,根据训练实例进行更新(微调),
这是一种迁移学习的技术,允许采用一个已经预训练好的语言模型,然后通过在特定任务的训练数据上进一步训练它,使其适应该任务。
-
或者在这两者之间找到平衡(轻量级的微调)。
传统的微调方法通常会对整个预训练模型(所有的参数和层级)进行调整。轻量级微调只微调模型的一小部分参数(通常是最后几层或某些任务相关的层)来进行优化,使得模型可以在特定任务上进行局部优化,同时保留预训练模型在其他语言理解任务上学到的一般性知识和能力
-
-
Prompting(上下文学习):根据对任务的描述建一个或一组提示/上下文信息,将其输入到语言模型中以获取基于该任务的生成结果。根据提示/上下文信息的数量,我们还可以进一步细分:
上下文是指文本或数据中的相关信息,可以帮助解释、理解或补充当前信息的环境。
上下文学习的一个主要目标是建模上下文,以便在分析和处理数据时使用。
- 零样本学习(Zero-shot):提示/上下文信息的数量为0,模型直接基于对任务的理解输出结果。
- 单样本学习(One-shot):提示/上下文信息的数量为1,一般来说模型基于1个例子可以更好的理解任务从而较好的生成结果。
- 少样本学习(Few-shot):提示/上下文信息的数量大于1,大模型可以看到更丰富的例子,一般来说获得比单样本学习更好的效果。
在这个选择过程中,
- 训练可能会因为过拟合而变得具有挑战性(例如,想象一下根据5个例子微调一个有1750亿参数的模型)。如何有效进行训练将会在这门课程之后中进行讨论。
- 现在,我们将先满足于使用提示进行GPT-3的适应。但是值得注意的是,提示的局限性在于我们只能利用少量的训练实例(一般情况只能塞进一个提示的数量)。这种输入的局限性由于Transformer自身的局限性导致的,模型可输入的长度具有约束(一般来讲是2048个tokens)。
模型的大小和训练样本的数量都很重要。在下面的多个任务中,对于GPT-3的默认实验设置为:
- 完整的GPT-3模型,其拥有1750亿参数。
- 使用尽可能多的使用训练数据的实例进行上下文学习。
2.1 Language Modeling
我们知道,可以将联合概率分解为每个令牌的条件概率的乘积,这是通过链式规则完成的:
p ( x 1 : L ) = ∏ i = 1 L p ( x i ∣ x 1 : i − 1 ) . p(x_{1:L}) = \prod_{i=1}^L p(x_i \mid x_{1:i-1}). p(x1:L)=i=1∏Lp(xi∣x1:i−1).
困惑度(Perplexity)是一个重要的指标,是自然语言处理和语言模型中的一个重要概念,用于衡量语言模型的性能。它可以解释为模型在预测下一个词时的平均不确定性。简单来说,如果一个模型的困惑度较低,那么它在预测下一个词的时候就会更加准确。对于给定的语言模型和一个测试数据集,困惑度被定义为:
P
(
X
)
=
P
(
x
1
,
x
2
,
.
.
.
,
x
N
)
(
−
1
/
N
)
P(X) = P(x_1,x_2,...,x_N)^{(-1/N)}
P(X)=P(x1,x2,...,xN)(−1/N)
其中, X = x 1 , x 2 , . . . , x N X=x_{1},x_{2},...,x_{N} X=x1,x2,...,xN 是测试集中的词序列, N N N 是测试集中的总词数。
一个序列的联合概率取决于其长度,并且随着长度的增长,其值趋近于零,这使得困惑度变得难以追踪。
直观上,我们希望对每个词标记(token)的概率 p ( x i ∣ x 1 : i − 1 ) p(x_{i}∣x_{1:i−1}) p(xi∣x1:i−1) 进行平均。这里的 p ( x i ∣ x 1 : i − 1 ) p(x_{i}∣x_{1:i−1}) p(xi∣x1:i−1) 表示给定之前的词序列 x 1 : i − 1 x_{1:i−1} x1:i−1 后,下一个词 x i x_{i} xi 出现的概率。这样做的目的是评估模型在处理各种词标记时的平均性能。
事实上不希望采取算术平均,因为如果给一个词标记分配了0的概率(即我们的模型认为这个词在特定的上下文中绝对不可能出现),那么在算术平均中这会造成极大的问题。因为算术平均并不会为此惩罚你,它只是简单地将所有词标记的概率加在一起,然后除以总数,因此一个非常低的概率(如0)可能会被其他较高的概率抵消。
相反,我们希望采用几何平均,这就是困惑度(perplexity)所做的。在几何平均中,每个词标记的概率都被同等看待,并且一个极低的概率(如0)将会导致整个几何平均大幅度下降。因此,通过计算几何平均,我们可以更好地衡量模型在处理所有可能的词标记时的性能,特别是在处理那些模型可能会出错的情况。
perplexity
p
(
x
1
:
L
)
=
exp
(
1
L
∑
i
=
1
L
log
1
p
(
x
i
∣
x
1
:
i
−
1
)
)
.
\text{perplexity}_p\left(x_{1: L}\right)=\exp \left(\frac{1}{L} \sum_{i=1}^L \log \frac{1}{p\left(x_i \mid x_{1: i-1}\right)}\right) \text {. }
perplexityp(x1:L)=exp(L1i=1∑Llogp(xi∣x1:i−1)1).
- x 1 : L x_{1:L} x1:L 表示一个文本序列,其中 x i x_i xi 表示序列中的第 i i i 个词或字符, L L L 表示序列的长度。
- p ( x i ∣ x 1 : i − 1 ) p(x_i | x_{1:i-1}) p(xi∣x1:i−1) 表示语言模型对给定历史上下文 x 1 : i − 1 x_{1:i-1} x1:i−1 条件下,预测下一个词 x i x_i xi 的概率。这个概率值表示了模型认为 x i x_i xi 是在给定上下文后的最可能的词。
- log ( 1 p ( x i ∣ x 1 : i − 1 ) ) \log\left(\frac{1}{p(x_i | x_{1:i-1})}\right) log(p(xi∣x1:i−1)1) 计算了每个词的负对数似然,它衡量了模型的预测与实际观察到的词之间的差异。对数的使用是因为在信息论中,通常使用对数尺度来衡量不确定性和信息量。
- 1 L ∑ i = 1 L log ( 1 p ( x i ∣ x 1 : i − 1 ) ) \frac{1}{L} \sum_{i=1}^L \log\left(\frac{1}{p(x_i | x_{1:i-1})}\right) L1∑i=1Llog(p(xi∣x1:i−1)1) 对总的负对数似然进行标准化,将其除以序列的长度 L L L,以便得到每个词的平均负对数似然。
- exp ( 1 L ∑ i = 1 L log ( 1 p ( x i ∣ x 1 : i − 1 ) ) ) \exp\left(\frac{1}{L} \sum_{i=1}^L \log\left(\frac{1}{p(x_i | x_{1:i-1})}\right)\right) exp(L1∑i=1Llog(p(xi∣x1:i−1)1)) 最后,将平均负对数似然取指数,得到了困惑度。困惑度是一个正数,它衡量了语言模型对文本数据的平均预测不确定性。较低的困惑度表示模型更接近实际数据,而较高的困惑度表示模型的预测更不确定或不准确。
困惑度可以被理解为每个标记(token)的平均"分支因子(branching factor)"。这里的“分支因子”可以理解为在每个位置,模型认为有多少种可能的词会出现。例如,若困惑度为10,那意味着每次模型在预测下一个词时,平均上会考虑10个词作为可能的选择。
这个理解与公式中的 log 1 p ( x i ∣ x 1 : i − 1 ) \log \frac{1}{p\left(x_i \mid x_{1: i-1}\right)} logp(xi∣x1:i−1)1 密切相关,这个表达式代表了编码长度。我们在计算的是平均编码长度,这个长度反映了给定当前词或标记后,下一个词或标记可能的选择数量。因此,通过对平均编码长度取指数,我们可以得到可能的选择数量,这也就是"分支因子"。
为了更好地理解,我们可以考虑一个均匀分布的例子:一个长度为3的二进制字符串可以编码 2 3 = 8 2^3=8 23=8个可能的字符串。同样,困惑度反映了模型预测下一个词时,考虑的平均可能性数。如果困惑度为8,那么对于序列中的每个词,模型会考虑8个可能的词。这个例子类似于我们的语言模型:在给定特定词或标记后,模型需要从多个可能的选项中预测下一个词或标记。如果选择的可能性多,模型的预测任务就更为复杂,相应的困惑度就会更高。
两类错误:语言模型可能会犯两种类型的错误,而困惑度对这两种错误的处理方式并不对称:
- 召回错误:语言模型未能正确地为某个词符分配概率值。这种情况下,困惑度是毫不留情的。例如,如果模型为词组 ‘𝖺𝗍𝖾’ 在 ‘𝗍𝗁𝖾,𝗆𝗈𝗎𝗌𝖾’ 后出现的概率预测为接近0,那么对应的困惑度值将趋近于无穷大。
p ( a t e ∣ t h e , m o u s e ) → 0 ⇒ perplexity p ( t h e , m o u s e , a t e , t h e , c h e e s e ) → ∞ . p({ate} \mid {the}, {mouse}) \to 0 \quad\Rightarrow\quad \text{perplexity}_p({the}, {mouse}, {ate}, {the}, {cheese}) \to \infty. p(ate∣the,mouse)→0⇒perplexityp(the,mouse,ate,the,cheese)→∞.
- 精确度错误:语言模型为某些错误的词序列过度分配了概率值。在这种情况下,困惑度会进行适度的惩罚。给定一个语言模型 p,假设我们将一些垃圾分布 r r r 按照概率 ϵ ϵ ϵ 混入:
q ( x i ∣ x 1 : i − 1 ) = ( 1 − ϵ ) p ( x i ∣ x 1 : i − 1 ) + ϵ r ( x i ∣ x 1 : i − 1 ) . q(x_i \mid x_{1:i-1}) = (1-\epsilon) p(x_i \mid x_{1:i-1}) + \epsilon r(x_i \mid x_{1:i-1}). q(xi∣x1:i−1)=(1−ϵ)p(xi∣x1:i−1)+ϵr(xi∣x1:i−1).
那么,我们可以计算在 q q q 下的 x 1 : L x_{1:L} x1:L 的困惑度:
perplexity
q
(
x
1
:
L
)
≤
1
1
−
ϵ
perplexity
p
(
x
1
:
L
)
≊
(
1
+
ϵ
)
perplexity
p
(
x
1
:
L
)
,
\text{perplexity}_q(x_{1:L}) \le \frac{1}{1 - \epsilon} \text{perplexity}_p(x_{1:L}) \approxeq (1 + \epsilon) \text{perplexity}_p(x_{1:L}),
perplexityq(x1:L)≤1−ϵ1perplexityp(x1:L)≊(1+ϵ)perplexityp(x1:L),
其中,最后一个近似等式在
ϵ
ϵ
ϵ 的值较小时成立。如果我们混入5%的垃圾信息,那么困惑度只增加 5%。需要注意的是,这样生成的语言结果会非常糟糕,因为平均每 20 个词符就会生成一个无意义的词符。
现在,我们继续评估实际数据集上的困惑度。
不同数据集的结果
- Peen Tree Bank:GPT-3大幅度的超过了目前的最好结果
- LAMBADA:GPT-3超过了之前的最好结果(GPT-2)
- HellaSwag:GPT-3接近但没有超过最先进的水平,最先进的SOTA结果是在该数据集的训练集中微调得到的结果,而GPT-3未在此数据集训练,因此该结果也令人惊喜
2.2 Question answering
语言模型必须以某种方式“知道”答案,而无需在数据库或一组文档中查找信息。
不同数据集的结果:
- TriviaQA:根据训练实例和问题定义提示,准确率约60-70%增加模型大小和增加in-context training实例都有助于提高性能。
- WebQuestions:问答任务,数据集从谷歌搜索查询中收集,准确率偏低。
- NaturalQuestions:回答问题,从谷歌搜索中收集数据集(区别在于答案长度较长),准确率低于以上数据集。
2.3 Translation
翻译任务是将源语言(例如,德语)中的句子翻译成目标语言(例如,英语)中的句子对于Few-shot的情况,
- 即使没有监督训练数据,GPT-3也能达到全监督系统的最新技术水平!
- 这为机器翻译的性能设定了一个下限;因为肯定会想利用大量的平行语料库(对齐的输入-输出对)。
- 法语和罗马尼亚语的结果类似。
- 从英语到外语的结果要差得多,这是可以预料的,因为GPT-3主要是一个英语模型。
2.4 Arithmetic
这里的Arithmetic任务是做算术题(2-5位数的加法,减法,乘法)。
从实验结果看起来,虽说不能认为GPT-3获得很好的结果,但是还是让我们惊艳,并对未来充满想象。
2.5 News article generation
任务:给定标题和副标题,生成新闻文章。
我们设立了一个评估标准,人类根据文章可能由机器编写的可能性对文章进行评分。我们在上下文学习中给模型提供提示样本:
**结果:**人类几乎只是随机机会正确区分人和机器。
2.6 Novel tasks
主要包括使用新词和纠正英语语法
2.7 Other tasks
词汇替换、Massive Multitask Language Understanding、人类由于误解而错误回答的问答数据集等
2.8 总结
- GPT-3在广泛的标准NLP基准测试和一次性任务上进行了评估。
- GPT-3可以表现得极好或者非常普通。
- 增加模型的大小和示例的数量都有助于提高性能。
- 有一些启发式的方法可以将语言模型适应到感兴趣的任务。
- 但是为什么会有这样表现,没有人知道。