模型架构

114 阅读1分钟

大模型能给定一个prompt生成符合需求的结果

promptcompletionprompt \leadsto completion

两个概念:

  • 分词:即如何将一个字符串拆分成多个标记。
  • 模型架构:我们将主要讨论Transformer架构,这是真正实现大型语言模型的建模创新。

分词

分词器将任意字符串转换为标记序列:the mouse ate the cheese [the,mouse,ate,the,cheese]\Rightarrow [the, mouse, ate, the, cheese]

  • 基于空格的分词 标记不应该过多或过少
  • Byte pair encoding 找到字符集合V中共同出现次数最多的元素对 x,x'
  • BPE算法减少数据的稀疏性
  • Unigram model (SentencePiece) 通过统计每个词汇在训练数据中的出现次数来估计其概率

模型架构

在实践中,对于专门的任务来说,避免生成整个序列的生成模型可能更高效。标记的上下文向量表征取决于其上下文(周围的单词)。例如,考虑mouse的向量表示需要关注到周围某个窗口大小的其他单词。

  • 我们将 ϕ:VLRd×Lϕ:V^{L}→ℝ^{d×L} 定义为嵌入函数
  • 标记序列 x1:L=[x1,,xL]x1:L=[x_{1},…,x_{L}]ϕϕ 生成上下文向量表征 ϕ(x1:L)ϕ(x_{1:L})
[the,mouse,ate,the,cheese]ϕ[(10.1),(01),(11),(10.1),(01)].[the, mouse, ate, the, cheese] \stackrel{\phi}{\Rightarrow}\left[\left(\begin{array}{c} 1 \\ 0.1 \end{array}\right),\left(\begin{array}{l} 0 \\ 1 \end{array}\right),\left(\begin{array}{l} 1 \\ 1 \end{array}\right),\left(\begin{array}{c} 1 \\ -0.1 \end{array}\right),\left(\begin{array}{c} 0 \\ -1 \end{array}\right)\right].

语言模型分类

编码端(Encoder-Only)架构

BERT、RoBERTa

这些语言模型生成上下文向量表征,但不能直接用于生成文本。可以表示为, x1:Lϕ(x1:L)x_{1:L}⇒ϕ(x_{1:L}) 通常用于分类任务

双向地依赖

解码器(Decoder-Only)架构

GPT系列

上下文向量表征只能单向地依赖于左侧上下文 (x1:i1)(x_{1:i−1})

编码-解码端(Encoder-Decoder)架构

Transformer BART T5

使用双向上下文向量表征来处理输入 x1:Lx_{1:L} ,并且可以生成输出 y1:Ly_{1:L}。需要更多的特定训练目标

语言模型理论

TransformerBlock(x1:L)TransformerBlock(x_{1:L})

基础架构

EmbedTokenEmbedToken 函数通过在嵌入矩阵 ERv×dE∈ℝ^{|v|×d} 中查找每个标记所对应的向量,该向量的具体值这是从数据中学习的参数:

def EmbedToken(x1:L:VL)Rd×LEmbedToken(x_{1:L}:V^{L})→ℝ^{d×L}

  • 将序列 x1:Lx_{1:L} 中的每个标记 xixi 转换为向量。
  • 返回[Ex1,…,ExL]。

以上的词嵌入是传统的词嵌入,向量内容与上下文无关。这里我们定义一个抽象的 SequenceModelSequenceModel 函数,它接受这些上下文无关的嵌入,并将它们映射为上下文相关的嵌入。

defSequenceModel(x1:L:Rd×L)Rd×Ldef SequenceModel(x_{1:L}:ℝ^{d×L})→ℝ^{d×L}

  • 针对序列 x1:Lx_{1:L} 中的每个元素xi进行处理,考虑其他元素。
  • [抽象实现(例如, FeedForwardSequenceModelFeedForwardSequenceModelSequenceRNNSequenceRNNTransformerBlockTransformerBlock )]

最简单类型的序列模型基于前馈网络(Bengio等人,2003),应用于固定长度的上下文,就像n-gram模型一样,函数的实现如下:

def FeedForwardSequenceModel(x1:L:Rd×L)Rd×LFeedForwardSequenceModel(x_{1:L}:ℝ^{d×L})→ℝ^{d×L}

  • 通过查看最后 nn 个元素处理序列 x1:Lx_{1:L} 中的每个元素 xixi
  • 对于每个 i=1,,Li=1,…,L
    • 计算 hih_{i}=FeedForward(xin+1,,xi)FeedForward(x_{i−n+1},…,x_{i})
  • 返回[ h1,,hLh_{1},…,h_{L} ]。

递归神经网络

RNN、LSTM和GRU

def SequenceRNN(x:Rd×L)Rd×LSequenceRNN(x:ℝ^{d×L})→ℝ^{d×L}

  • 从左到右处理序列 x1,,xLx_{1},…,x_{L} ,并递归计算向量 h1,,hLh_{1},…,h_{L}
  • 对于 i=1,,Li=1,…,L
    • 计算 hi=RNN(hi1,xi)h_{i}=RNN(h_{i−1},x_{i})
    • 返回 [h1,,hL][h_{1},…,h_{L}]

Transformer

def Attention(x1:L:Rd×L,y:Rd)RdAttention(x_{1:L}:ℝ^{d×L},y:ℝ^d)→ℝ^d

  • 通过将其与每个xix_{i}进行比较来处理yy
  • 返回 Wvaluex1:Lsoftmax(x1:LWkeyWqueryy/d)W_{value} x_{1: L} \operatorname{softmax}\left(x_{1: L}^{\top} W_{key}^{\top} W_{query} y / \sqrt{d}\right)