回想一下第6章 模型架构,神经语言模型的核心接口是一个将token序列映射到上下文嵌入的编码器:
[ the , mouse , ate , the , cheese ] ⇒ ϕ [ ( 1 0.1 ) , ( 0 1 ) , ( 1 1 ) , ( 1 − 0.1 ) , ( 0 − 1 ) ] . [\text{the}, \text{mouse}, \text{ate}, \text{the}, \text{cheese}] \stackrel{\phi}{\Rightarrow} \left[\binom{1}{0.1}, \binom{0}{1}, \binom{1}{1}, \binom{1}{-0.1}, \binom{0}{-1} \right].\ [the,mouse,ate,the,cheese]⇒ϕ[(0.11),(10),(11),(−0.11),(−10)].
以GPT-3为例,它是一个通过堆叠96层Transformer block,映射token序列 x 1 : L x_{1:L} x1:L的神经语言模型:
GPT-3 ( x 1 : L ) = TransformerBlock 96 ( EmbedTokenWithPosition ( x 1 : L ) ) , \text{GPT-3}(x_{1:L}) = \text{TransformerBlock}^{96}(\text{EmbedTokenWithPosition}(x_{1:L})), GPT-3(x1:L)=TransformerBlock96(EmbedTokenWithPosition(x1:L)),
其中,每层Transformer block使用
TransformerBlock ( x 1 : L ) = AddNorm ( FeedForward , AddNorm ( SelfAttention , x 1 : L ) ) . \text{TransformerBlock}(x_{1:L}) = \text{AddNorm}(\text{FeedForward}, \text{AddNorm}(\text{SelfAttention}, x_{1:L})). TransformerBlock(x1:L)=AddNorm(FeedForward,AddNorm(SelfAttention,x1:L)).
先验知识:
现状:
GPU1 [ layer1 , layer2 ] GPU2 [ layer3 , layer4 ] GPU3 [ layer5 , layer6 ] . \text{GPU1}[\text{layer1}, \text{layer2}] \quad\quad\quad \text{GPU2}[\text{layer3}, \text{layer4}] \quad\quad\quad \text{GPU3}[\text{layer5}, \text{layer6}]. GPU1[layer1,layer2]GPU2[layer3,layer4]GPU3[layer5,layer6].
在本章中,我们将探讨两种不同类型的“新”模型架构,这提高了模型的规模上限。特别地,我们将讨论:
input ⇒ expert 1 expert 2 expert 3 expert 4 ⇒ output . \text{input} \quad\quad\Rightarrow\quad\quad \text{expert}_1 \quad \text{expert}_2 \quad \text{expert}_3 \quad \text{expert}_4 \quad\quad\Rightarrow\quad\quad \text{output}. input⇒expert1expert2expert3expert4⇒output.
store ∣ input ⇒ relevant data from store ⇒ output . \text{store} \quad\quad|\quad\quad \text{input} \quad\quad\Rightarrow\quad\quad \text{relevant data from store} \quad \quad\quad\Rightarrow\quad\quad \text{output}. store∣input⇒relevant data from store⇒output.
混合专家的想法可以追溯到Jacobs et al. (1991)。
为了介绍基本思想,假设我们正在解决一个预测问题:
x ∈ R d ⇒ y ∈ R d . x \in \mathbb{R}^d \Rightarrow y \in \mathbb{R}^d. x∈Rd⇒y∈Rd.
让我们从学习前馈(ReLU)神经网络开始:
h θ ( x ) = W 2 max ( W 1 x , 0 ) , h_\theta(x) = W_2 \max(W_1 x, 0), hθ(x)=W2max(W1x,0),
其中参数为 θ = ( W 1 , W 2 ) \theta = (W_1, W_2) θ=(W1,W2)。
但专家的混合方法是:
定义 E E E个专家。
每个专家 e = 1 , … , E e = 1, \dots, E e=1,…,E都具有自己的嵌入 w e ∈ R d w_e \in \mathbb{R}^d we∈Rd。
将门控函数定义为 E E E个专家上的概率分布:
g e ( x ) = exp ( w e ⋅ x ) ∑ e ′ = 1 E exp ( w e ′ ⋅ x ) . g_e(x) = \frac{\exp(w_e \cdot x)}{\sum_{e' = 1}^E \exp(w_{e'} \cdot x)}. ge(x)=∑e′=1Eexp(we′⋅x)exp(we⋅x).
每个专家 e = 1 , … , E e = 1, \dots, E e=1,…,E都具有自己的参数 θ ( e ) = ( W 1 ( e ) , W 2 ( e ) ) \theta^{(e)} = (W_1^{(e)}, W_2^{(e)}) θ(e)=(W1(e),W2(e))。
根据专家特定参数定义每个专家函数:
h θ e ( x ) = W 2 ( e ) max ( W 1 ( e ) x , 0 ) . h_{\theta_e}(x) = W_2^{(e)} \max(W_1^{(e)} x, 0). hθe(x)=W2(e)max(W1(e)x,0).
f ( x ) = ∑ e = 1 E g e ( x ) ⏟ gating h θ e ( x ) ⏟ expert . f(x) = \sum_{e=1}^E \underbrace{g_e(x)}_\text{gating} \underbrace{h_{\theta_e}(x)}_\text{expert}. f(x)=e=1∑Egating ge(x)expert hθe(x).
考虑d=2,并且每个专家都是一个线性分类器(来源):
我们可以通过反向传播来学习混合专家模型。根据链式法则,可以得到:
∇ f ( x ) = ∑ e = 1 E g e ( x ) ( ∇ ( log g e ( x ) ) h θ e ( x ) + ∇ h θ e ( x ) ) . \nabla f(x) = \sum_{e=1}^E g_e(x) (\nabla (\log g_e(x)) h_{\theta_e}(x) + \nabla h_{\theta_e}(x)). ∇f(x)=e=1∑Ege(x)(∇(logge(x))hθe(x)+∇hθe(x)).
注意到,梯度与 g e ( x ) g_e(x) ge(x)成比例,并且同时更新门控函数和专家。
g ( x ) = [ 0.04 , 0.8 , 0.01 , 0.15 ] . g(x) = [0.04, 0.8, 0.01, 0.15]. g(x)=[0.04,0.8,0.01,0.15].
正如公式所言,专家的混合不会节省任何计算,因为前向传播仍然需要评估每个专家,而反向传播也必须接触每个专家。
然而,如果我们将门控函数 g ( x ) = [ g 1 ( x ) , … , g E ( x ) ] g(x) = [g_1(x), \dots, g_E(x)] g(x)=[g1(x),…,gE(x)]近似为 g ~ ( x ) = [ g ~ 1 ( x ) , … , g ~ E ( x ) ] \tilde g(x) = [\tilde g_1(x), \dots, \tilde g_E(x)] g~(x)=[g~1(x),…,g~E(x)],其中大多数专家都是零。因此,在前向和反向传播时,我们只需要使用非零 g ~ e ( x ) \tilde g_e(x) g~e(x)的专家 e e e。
例如,我们可以选取值排名前两位(top 2)的专家,并重新规范化:
g ~ ( x ) = [ 0 , 0.84 , 0 , 0.16 ] . \tilde g(x) = [0, 0.84, 0, 0.16]. g~(x)=[0,0.84,0,0.16].
MoETransformerBlock ( x 1 : L ) = AddNorm ( MoEFeedForward , AddNorm ( SelfAttention , x 1 : L ) ) . \text{MoETransformerBlock}(x_{1:L}) = \text{AddNorm}(\text{MoEFeedForward}, \text{AddNorm}(\text{SelfAttention}, x_{1:L})). MoETransformerBlock(x1:L)=AddNorm(MoEFeedForward,AddNorm(SelfAttention,x1:L)).
我们将top-2专家的近似门控函数定义如下:
计算第一个专家: e 1 = arg max e g e ( x ) e_1 = \arg\max_e g_e(x) e1=argmaxege(x)。
计算第二个专家: e 2 = arg max e ≠ e 1 g e ( x ) e_2 = \arg\max_{e \neq e_1} g_e(x) e2=argmaxe=e1ge(x)。
始终保留第一个专家,并随机保留第二个专家:
loss = negative-log-likelihood + λ load-balancing-loss . \text{loss} = \text{negative-log-likelihood} + \lambda \text{load-balancing-loss}. loss=negative-log-likelihood+λload-balancing-loss.
例如,我们可以取 λ = 0.01 B \lambda = \frac{0.01}{B} λ=B0.01。
下面是一个
B
=
2
B=2
B=2个token,
E
=
4
E=4
E=4个专家的例子:
g
(
x
1
)
=
[
0.2
,
0.6
,
0.1
,
0.1
]
⇒
g
~
(
x
1
)
=
[
0.25
,
0.75
,
0
,
0
]
g
(
x
2
)
=
[
0.1
,
0.6
,
0.2
,
0.1
]
⇒
g
~
(
x
2
)
=
[
0
,
0.75
,
0.25
,
0
]
g(x_1) = [0.2, 0.6, 0.1, 0.1] \Rightarrow \tilde g(x_1) = [0.25, 0.75, 0, 0] \\ g(x_2) = [0.1, 0.6, 0.2, 0.1] \Rightarrow \tilde g(x_2) = [0, 0.75, 0.25, 0]
g(x1)=[0.2,0.6,0.1,0.1]⇒g~(x1)=[0.25,0.75,0,0]g(x2)=[0.1,0.6,0.2,0.1]⇒g~(x2)=[0,0.75,0.25,0]
统计为
c
=
[
1
,
2
,
1
,
0
]
m
=
[
0.3
,
1.2
,
0.3
,
0.2
]
c = [1, 2, 1, 0] \quad\quad\quad\quad m = [0.3, 1.2, 0.3, 0.2]
c=[1,2,1,0]m=[0.3,1.2,0.3,0.2]
也就是说,我们会尝试降低专家2的权重,避免其被过度使用。
BASE需要更多的计算来优化 a a a,但更稳定。
示例:The nurse notified the patient that {her/his,their} shift would be ending in an hour.
GLaM的性别偏见少于GPT-3。
StereoSet上的结果:
The assistant went to work. {She brought her boss coffee., She was valued for her input.}
刻板印象随着模型大小的增加而变得更糟(与GLaM结果相反)。
现在,我们转向另一类语言模型,基于检索的(或检索增强的、记忆增强的模型),它可以帮助我们突破稠密Transformer的缩放上限。
让我们首先关注使用编码器-解码器框架的序列到序列任务:
input
x
⇒
output
y
\text{input } x \quad\Rightarrow\quad \text{output } y
input x⇒output y
示例(开放问答):
回想一下,BART和T5是编码器-解码器模型的代表:
p
(
y
∣
x
)
p(y \mid x)
p(y∣x)
其使用去噪目标函数进行训练。
例如:
输入
x
x
x:Thank you
<
X
>
输出
y
y
y:
<
X
>
假设我们有一个存储库
S
S
S,它是一组序列(通常是文档或段落)的集合。
S
=
{
Why is the...
,
Thanks for
,
.
.
.
,
The quick...
,
Stanford...
}
.
S = \{ \text{Why is the...}, \text{Thanks for}, ..., \text{The quick...}, \text{Stanford...} \}.
S={Why is the...,Thanks for,...,The quick...,Stanford...}.
基于检索的模型直观的生成过程:
示例(开放问答):
最近邻是最常用的一种检索方法:
形式上,RAG模型定义如下:
(
y
∣
x
)
=
∑
z
∈
S
p
(
z
∣
x
)
⏟
retriever
p
(
y
∣
z
,
x
)
⏟
generator
.
(y \mid x) = \sum_{z \in S} \underbrace{p(z \mid x)}_\text{retriever} \underbrace{p(y \mid z, x)}_\text{generator}.
(y∣x)=z∈S∑retriever
p(z∣x)generator
p(y∣z,x).
在实践中,
∑
z
∈
S
\sum_{z \in S}
∑z∈S由前k个代替(类似于为混合专家选择前1个或2个专家)。
Dense Passage Retrieval (DPR)** (Karpukhin et al., 2020)
p ( z ∣ x ) = exp ( BERT d ( z ) ⋅ BERT q ( x ) ) ∑ z ′ ∈ S exp ( BERT d ( z ′ ) ⋅ BERT q ( x ) ) . p(z \mid x) = \frac{\exp(\text{BERT}_\text{d}(z) \cdot \text{BERT}_\text{q}(x))}{\sum_{z' \in S} \exp(\text{BERT}_\text{d}(z') \cdot \text{BERT}_\text{q}(x))}. p(z∣x)=∑z′∈Sexp(BERTd(z′)⋅BERTq(x))exp(BERTd(z)⋅BERTq(x)).
p ( y ∣ z , x ) = p ( y ∣ concat ( z , x ) ) . p(y \mid z, x) = p(y \mid \text{concat}(z, x)). p(y∣z,x)=p(y∣concat(z,x)).
这里引用GPT-3 few-shot的结果进行比较:NaturalQuestions (29.9%), WebQuestions (41.5%), TriviaQA (71.2%)