0%

Large-lm-7-Mixed-Framework

9. 新的模型架构

通过前文的学习,我们知道神经预言模型的核心借口是一个将 token 序列映射到上下文嵌入的编码器:

the,mouse,ate,the,cheese]ϕ[(10.1),(01),(11),(10.1),(01)].\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].

GPT-3 为例,它是一个通过堆叠 96 层 Transformer block,映射 token 序列 x1:Lx_{1:L} 的神经语言模型:

GPT-3(x1:L)=TransformerBlock96(EmbedTokenWithPosition(x1:L)),\text{GPT-3}(x_{1:L}) = \text{TransformerBlock}^{96}(\text{EmbedTokenWithPosition}(x_{1:L})),

其中,每层Transformer block使用

  • 自注意力层,允许每个token 进行交互;
  • 前馈层,独立处理每个 token

这种稠密的 Transformer 模型架构是目前开发大语言模型的主要范式。但是,扩展这种模型并非易事,需要数据、模型和流水并行。

现状:

  • 我们的规模已经到了极限。

  • 随着模型越来越大,它们必须被拆分到更多的机器上。下面是一个模型并行示例(具体细节见上一章):

    \begin{align*} \text{GPU1}[\text{layer1}, \text{layer2}] \\ \text{GPU2}[\text{layer3}, \text{layer4}] \\ \text{GPU3}[\text{layer5}, \text{layer6}] \end{align*}

因此,如果我们要继续扩大规模,我们需要重新思考如何构建大语言模型。对于稠密的 Transformer 模型,每个输入使用语言模型的相同(所有)参数(如 GPT-3175B 参数)。

相反,我们是否可以让每个输入使用不同的(更小的)参数子集?在本章中,我们将探讨两种不同类型的“新”模型架构,这提高了模型的规模上限。特别地,我们将讨论:

  • 混合专家模型:创建一组专家,每个输入只激活一小部分专家。

    • 直觉:类似于咨询委员会,每个专家有不同的背景(如历史、数学、科学等)。

    inputexpert1expert2expert3expert4output.\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}.

  • 基于检索的模型:借助原始数据存储库,给定新输入,从中检索与它相关的部分,并使用它们来预测输出。

    • 直觉:借助网络搜索查询问题的答案。

    storeinputrelevant data from storeoutput.\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}.

9.1 混合专家模型

9.1.1 基础知识

混合专家的想法可以追溯到 Jacobs et al. (1991)

以预测问题为例:

xRdyRd.x \in \mathbb{R}^d \Rightarrow y \in \mathbb{R}^d.

让我们从学习前馈(ReLU)神经网络开始:

hθ(x)=W2max(W1x,0),h_\theta(x) = W_2 \max(W_1 x, 0),

其中参数为 θ=(W1,W2)\theta = (W_1, W_2)。然而,这个函数可能表达能力不足。因此,可以使神经网络更宽或更深。

专家的混合方法步骤如下:

  • 定义 EE 个专家。

  • 每个专家 e=1,,Ee = 1, \dots, E 都具有自己的嵌入 weRdw_e \in \mathbb{R}^d

  • 将门控函数定义为 EE 个专家上的概率分布:

    ge(x)=exp(wex)e=1Eexp(wex).g_e(x) = \frac{\exp(w_e \cdot x)}{\sum_{e' = 1}^E \exp(w_{e'} \cdot x)}.

  • 每个专家 e=1,,Ee = 1, \dots, E 都具有自己的参数 θ(e)=(W1(e),W2(e))\theta^{(e)} = (W_1^{(e)}, W_2^{(e)})

  • 根据专家特定参数定义每个专家函数:

    hθe(x)=W2(e)max(W1(e)x,0).h_{\theta_e}(x) = W_2^{(e)} \max(W_1^{(e)} x, 0).

  • 将最终函数定义为专家的混合:

    f(x)=e=1Ege(x)gatinghθe(x)expert.f(x) = \sum_{e=1}^E \underbrace{g_e(x)}_\text{gating} \underbrace{h_{\theta_e}(x)}_\text{expert}.

示例

考虑d=2,并且每个专家都是一个线性分类器(来源):

  • 训练

    可以通过反向传播来学习混合专家模型。根据链式法则,可以得到:

    f(x)=e=1Ege(x)((logge(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)).

    注意到,梯度与 ge(x)g_e(x) 成比例,并且同时更新门控函数和专家。

  • 节约计算

    门控函数 g(x)=[g1(x),,gE(x)]g(x) = [g_1(x), \dots, g_E(x)] 对于每个专家都是非零的。例如:

    g(x)=[0.04,0.8,0.01,0.15].g(x) = [0.04, 0.8, 0.01, 0.15].

    • 专家的混合不会节省任何计算,因为前向传播仍然需要评估每个专家,而反向传播也必须接触每个专家。

    • 如果将门控函数 g(x)=[g1(x),,gE(x)]g(x) = [g_1(x), \dots, g_E(x)] 近似为 g~(x)=[g~1(x),,g~E(x)]\tilde g(x) = [\tilde g_1(x), \dots, \tilde g_E(x)],其中大多数专家都是零。因此,在前向和反向传播时,只需要使用非零 g~e(x)\tilde g_e(x) 的专家 ee

    例如,我们可以选取值排名前两位(top 2)的专家,并重新规范化:

    g~(x)=[0,0.84,0,0.16].\tilde g(x) = [0, 0.84, 0, 0.16].

  • 平衡专家

    • 只有所有专家都参与进来,混合专家才有效。
    • 如果只有一个专家处于活跃状态(例如,g(x)=[0,1,0,0]g(x) = [0, 1, 0, 0]),那么这就是浪费。
    • 如果一直处于这种状态,那么未使用的专家的梯度将为零,因此他们将不会收到任何梯度并得到改善。
    • 因此,使用混合专家的主要考虑因素之一是确保所有专家都能被输入使用。
  • 并行

    • 混合专家非常有利于并行。
    • 每个专家都可以放置在不同的机器上。
    • 我们可以在中心节点计算近似门控函数 g~(x)\tilde g(x)
    • 然后,我们只要求包含激活专家的机器(稀疏)来处理 xx

9.1.2 Sparsely-gated mixture of experts (Lepikhin et al. 2021)

现在,我们考虑如何将混合专家思想应用于语言模型。最简单的解决方法仍是使用 96Transformer,但门控函数以某种方式应用于序列,且只在顶层进行专家的组合。因此,我们将混合专家的思想应用于每个 token和每层的 Transformer block(或隔层使用)

由于前馈层对于每个token是独立的,因此,我们将每个前馈网络转变为混合专家(MoE)前馈网络:

MoETransformerBlock(x1:L)=AddNorm(MoEFeedForward,AddNorm(SelfAttention,x1:L)).\text{MoETransformerBlock}(x_{1:L}) = \text{AddNorm}(\text{MoEFeedForward}, \text{AddNorm}(\text{SelfAttention}, x_{1:L})).

我们将 top-2 专家的近似门控函数定义如下:

  • 计算第一个专家:e1=argmaxege(x)e_1 = \arg\max_e g_e(x)

  • 计算第二个专家:e2=argmaxee1ge(x)e_2 = \arg\max_{e \neq e_1} g_e(x)

  • 始终保留第一个专家,并随机保留第二个专家:

    • p=min(2ge2(x),1)p = \min(2 g_{e_2}(x), 1)
    • 在概率为 pp 的情况下,g~e1(x)=ge1(x)ge1(x)+ge2(x),g~e2(x)=ge2(x)ge1(x)+ge2(x)\tilde g_{e_1}(x) = \frac{g_{e_1}(x)}{g_{e_1}(x) + g_{e_2}(x)}, \tilde g_{e_2}(x) = \frac{g_{e_2}(x)}{g_{e_1}(x) + g_{e_2}(x)}。对于其他专家e∉{e1,e2}e \not\in \{ e_1, e_2 \}g~e(x)=0\tilde g_e(x) = 0
    • 在概率为 1p1 - p 的情况下,g~e1(x)=1\tilde g_{e_1}(x) = 1。对于 ee1e \neq e_1,$\tilde g_e(x) = 0 $。

具体细节如下:

  1. 符号定义

    BB 是一个 batch 中的 token 数量(在所有序列中,通常在百万数量级),EE 是专家数目(通常在千数量级),x1,,xBx_1, \dots, x_B 为一个 batch 中的 token

  2. 平衡专家

    ce=i=1B1[g~e(xi)>0]c_e = \sum_{i=1}^B \mathbf{1}[\tilde g_e(x_i) > 0] 是专家 ee 被选中的次数(Note:处理完一个 batch 后,ece=B\sum_e c_e = B)。

    • 如果所有专家都是 平衡 的,那么ce=BEc_e = \frac{B}{E}

    • 溢出:如果 ce>2BEc_e > 2 \frac{B}{E},则设 f(x)=xf(x) = x(带残差的旁路),其中 2 是容量系数。

    • 辅助损失:我们期望 c=[c1,,cE]c = [c_1, \dots, c_E] 接近均匀分布。

    我们可以惩罚 c22=e=1Ece2\|c\|_2^2 = \sum_{e=1}^E c_e^2,但这是不可微分的。

    • 定义 me=i=1Bge(xi)m_e = \sum_{i = 1}^B g_e(x_i)cec_e 的软版本)。

    • 在目标函数中添加 load-balancing-loss=e=1Emece\text{load-balancing-loss} = \sum_{e=1}^E m_e c_e。这样,通过 mem_e 的梯度将为非零。

    • loss=negative-log-likelihood+λload-balancing-loss.\text{loss} = \text{negative-log-likelihood} + \lambda \text{load-balancing-loss}.

      例如,取 λ=0.01B\lambda = \frac{0.01}{B}

  3. 示例

    下面是一个B=2B=2tokenE=4E=4 个专家的例子:

    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]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]

    统计为

    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]

    也就是说,我们会尝试降低专家 22 的权重,避免其被过度使用。

9.1.3 Switch Transformer (Fedus et al. 2021)

定义近似门控函数 g~(x)\tilde g(x) 只有一个专家(获得更多稀疏性)。

技巧:

  • FP32 训练替换成 FP16
  • 使用的较小参数进行初始化
  • 专家 dropout
  • 专家并行

训练了一个1.6万亿参数模型,与 T5-XXL(110亿参数)相比,训练速度提高了4倍

9.1.4 Balanced Assignment of Sparse Experts (BASE) layers (Lewis et al., 2021)

BASE 将近似门控函数 g~(x)\tilde g(x) 定义为对 batch 中的所有 token 进行联合优化的结果。它为每个token 分配 1 名专家,但负载平衡是一种约束,而不是软惩罚。

定义 a=[a1,,aB]{1,,E}Ba = [a_1, \dots, a_B] \in \{1, \dots, E\}^B 作为联合分配向量。

\begin{align*} &\text{maximize} \sum_{i = 1}^B w_{a_i} \cdot x_i \\ &\text{subject to}\quad \forall e: \sum_{i=1}^B \mathbf{1}[a_i = e] = \frac{B}{E}. \end{align*}

这是一个可以有效求解的线性方程,在实践中,我们将线性方程并行化。在测试时,只需选择top 1的专家即可。

  • 实验设置

    • Sparsely gated MoE (top-2 experts): 52.5B 参数
    • Switch Transformer (top-1 expert): 52.5B 参数
    • BASE (1 jointly optimized expert): 44.4B 参数 (1.3B shared 参数, 335M x 128 expert 参数)

    BASE 需要更多的计算来优化 aa,但更稳定。

  • 总结和下一步工作

    • Switch Transformer(谷歌)使用了 top-1 专家。
    • BASE(Facebook)为每个 token 分配 11 名专家,但进行了联合优化。

    这两个模型的性能都无法与 GPT-3 可比。虽然谷歌和 Facebook 都发布了两个最新的高性能 MoE 语言模型,它们的性能确实与 GPT-3 可比。但有趣的是,它们仍然基于最初简单的top-2专家:

    • 谷歌的 GLaM
    • 来自Facebook的 FacebookMoE

9.1.5 Generalist Language Model (GLaM) (Du et al. 2021)

规格:

  • 1.2万亿个参数(GPT-3有1750亿个参数)
  • 64个专家,64层,32K个隐藏单元
  • 每个token激活95B(1.2T的8%)的参数

其他:

  • 创建了共有 1.6 万亿个 token 的新数据集(GLaM dataset),来源包括网页、论坛、书籍、新闻等。
  • 相对位置编码、门控线性单元、GeLU激活函数、RMSNorm(非 LayerNorm)
  • 如果遇到 NaN/Inf,跳过权重更新/回滚到早期检查点。
  • 通过仔细实施上述技巧,我们观察到,稀疏激活的模型在各个尺度上的训练都变得相当稳定。

结果:在与 GPT-3 相同的基准上进行评估(开放域问答、阅读理解、SuperGLUE等)。与 GPT-3 相比,训练成本仅为1/3,且实现了更好的0-shot和1-shot性能(尤其是在知识密集型任务中的性能)

注:他们没有在GPT-3更强的few-shot中进行评估。

示例:

1
2
3
*The assistant went to work. {She brought her boss coffee., She was valued for her input.}*

刻板印象随着模型大小的增加而变得更糟(与GLaM结果相反)。

9.1.6 FacebookMoE (Artetxe et al., 2021)

  • 实验设置:

    • 训练了一个1.1T参数的模型。

    • 512名专家(超过GLaM),32层,4096个隐藏单元

    • 使用112 billion token进行训练,来源包括网页、论坛、书籍、新闻等。

    • 小模型收益更大,模型越大,收益递减

    StereoSet上的结果:

  • 示例

    1
    2
    3
    *The assistant went to work. {She brought her boss coffee., She was valued for her input.}*

    刻板印象随着模型大小的增加而变得更糟(与GLaM结果相反)。

9.1.7 Decentralized mixture-of-experts (Ryabinin & Gusev, 2020)

  • 动机

    到目前为止,混合专家纯粹是中心机构(如谷歌或Facebook)从扩大大语言模型的角度出发的。然而,混合专家自然地指示了一种更激进的权利下放。为训练 GPT-3Azure超级计算机集群 耗资2.5亿美元。

    那么如何利用数以亿计的消费 PC 呢?

    • Folding@Home 是一个志愿者计算项目,利用世界各地的志愿者捐赠计算机进行分子动力学模拟。
    • 2020年4月,Folding@Home有70万人捐赠了产生2.43 exaFLOP(GPT-3需要350千兆FLOP)(文章)。
    • 主要区别在于分子动力学模拟计算量大,不需要网络带宽。
  • 分布式哈希表

    • NN 个节点
    • 单个节点需要与其他 O(logN)O(\log N) 节点通信
    • 使用 Kademlia DHT 协议(被 BitTorrent 和以太坊使用)
  • 论文实验

    • 选取 top-4 的专家(共256名专家)
    • 每个专家都是一个 Transformer 层
    • 在4个 GPU 上训练了一个小型 Transformer LM

9.1.8 总结

  • 混合专家:起源于将不同专家应用于不同输入的经典理念
  • 允许训练更大的语言模型(1.1万亿个参数)
  • 与稠密 Transformer 模型相比,每个输入的效率高得多(FLOP 更少)
  • 效果难以比较:在相同规模上,直接比较仍然具有挑战性(GPT-3GLaMFacebookMoE
  • 对权力下放的重大影响

9.2 基于检索的模型

现在,我们转向基于检索的(或检索增强的、记忆增强的模型)语言模型,,它可以帮助我们突破稠密 Transformer 的缩放上限。

9.2.1 编码器-解码器

首先,回顾使用编码器-解码器框架的序列到序列任务:

input xoutput y\text{input } x \quad\Rightarrow\quad \text{output } y

示例(开放问答):

  • 输入 xx:What is the capital of Canada?
  • 输出 yy:Ottawa

回想一下,BARTT5 是编码器-解码器模型的代表:

p(yx)p(y \mid x)

其使用去噪目标函数进行训练。例如:

  • 输入 xx:Thank you <X><X> me to your party <Y><Y> week.
  • 输出 yy<X><X> for inviting <Y><Y> last

9.2.2 检索方法

假设我们有一个存储库 SS,它是一组序列(通常是文档或段落)的集合。

S={Why is the...,Thanks for,...,The quick...,Stanford...}.S = \{ \text{Why is the...}, \text{Thanks for}, ..., \text{The quick...}, \text{Stanford...} \}.

基于检索的模型直观的生成过程:

  • 基于输入 xx,检索相关序列zz
  • 给定检索序列 zz 和输入 xx,生成输出 yy

示例(开放问答):

  • 输入 xx:What is the capital of Canada?
  • 检索 zz:Ottawa is the capital city of Canada.
  • 输出 yy:Ottawa

最近邻是最常用的一种检索方法:

  • SS 是训练集。
  • 检索 (x,y)S(x',y') \in S,使得 xx'xx 最相似。
  • 生成 y=yy = y'

9.2.3 Retrieval-augmented generation (RAG) (Lewis et al., 2020)

形式上,RAG 模型定义如下:

(yx)=zSp(zx)retrieverp(yz,x)generator.(y \mid x) = \sum_{z \in S} \underbrace{p(z \mid x)}_\text{retriever} \underbrace{p(y \mid z, x)}_\text{generator}.

在实践中,zS\sum_{z \in S} 由前 kk 个代替(类似于为混合专家选择前 11 个或 22 个专家)。

  • 检索器

    Dense Passage Retrieval (DPR)** (Karpukhin et al., 2020)

    p(zx)=exp(BERTd(z)BERTq(x))zSexp(BERTd(z)BERTq(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))}.

    这里以用维基百科文章的标题来检索段落为例。使用 QA 数据集(如 NaturalQuestions、TriviQA 等)的 query、正例、负例 (q,p+,p1,,pn)(q, p^+, p^-_1, \dots, p^-_n) 来训练模型:

    • 负例:随机或者使用 BM25 检索出的不包含答案的段落

    • 推理:使用 FAISS(Facebook AI 相似性搜索)

  • 生成器

    p(yz,x)=p(yconcat(z,x)).p(y \mid z, x) = p(y \mid \text{concat}(z, x)).

    使用 BART-large(400M参数),其中输入为检索出的段落zz和输入 xx

  • 训练

    • 用 BART、DPR(用BERT初始化)初始化

    • 训练 BART\text{BART}BERTq\text{BERT}_\text{q}

  • 实验:

    在Jeopardy问题生成任务上,输入Hemingway的检索结果:

    实验结果表明,优于非检索方法。

9.3 总结

  • 为了扩大模型规模,需要改进稠密 Transformer
  • 混合专家和基于检索的方法相结合更有效。
  • 如何设计更好的、可扩展的体系结构仍然是一个悬而未决的问题。

9.4 Reference

混合专家模型

基于检索的模型

-------------This blog is over! Thanks for your reading-------------