大模型能给定一个prompt生成符合需求的结果
prompt⇝completion
两个概念:
- 分词:即如何将一个字符串拆分成多个标记。
- 模型架构:我们将主要讨论Transformer架构,这是真正实现大型语言模型的建模创新。
分词
分词器将任意字符串转换为标记序列:the mouse ate the cheese ⇒[the,mouse,ate,the,cheese]
- 基于空格的分词
标记不应该过多或过少
- Byte pair encoding
找到字符集合V中共同出现次数最多的元素对 x,x'
- BPE算法减少数据的稀疏性
- Unigram model (SentencePiece) 通过统计每个词汇在训练数据中的出现次数来估计其概率
模型架构
在实践中,对于专门的任务来说,避免生成整个序列的生成模型可能更高效。标记的上下文向量表征取决于其上下文(周围的单词)。例如,考虑mouse的向量表示需要关注到周围某个窗口大小的其他单词。
- 我们将 ϕ:VL→Rd×L 定义为嵌入函数
- 标记序列 x1:L=[x1,…,xL],ϕ 生成上下文向量表征 ϕ(x1:L)
[the,mouse,ate,the,cheese]⇒ϕ[(10.1),(01),(11),(1−0.1),(0−1)].
语言模型分类
编码端(Encoder-Only)架构
BERT、RoBERTa
这些语言模型生成上下文向量表征,但不能直接用于生成文本。可以表示为, x1:L⇒ϕ(x1:L) 通常用于分类任务
双向地依赖
解码器(Decoder-Only)架构
GPT系列
上下文向量表征只能单向地依赖于左侧上下文 (x1:i−1) 。
编码-解码端(Encoder-Decoder)架构
Transformer BART T5
使用双向上下文向量表征来处理输入 x1:L,并且可以生成输出 y1:L。需要更多的特定训练目标
语言模型理论
TransformerBlock(x1:L)
基础架构
EmbedToken 函数通过在嵌入矩阵 E∈R∣v∣×d 中查找每个标记所对应的向量,该向量的具体值这是从数据中学习的参数:
def EmbedToken(x1:L:VL)→Rd×L :
- 将序列 x1:L 中的每个标记 xi 转换为向量。
- 返回[Ex1,…,ExL]。
以上的词嵌入是传统的词嵌入,向量内容与上下文无关。这里我们定义一个抽象的 SequenceModel 函数,它接受这些上下文无关的嵌入,并将它们映射为上下文相关的嵌入。
defSequenceModel(x1:L:Rd×L)→Rd×L :
- 针对序列 x1:L 中的每个元素xi进行处理,考虑其他元素。
- [抽象实现(例如, FeedForwardSequenceModel , SequenceRNN , TransformerBlock )]
最简单类型的序列模型基于前馈网络(Bengio等人,2003),应用于固定长度的上下文,就像n-gram模型一样,函数的实现如下:
def FeedForwardSequenceModel(x1:L:Rd×L)→Rd×L :
- 通过查看最后 n 个元素处理序列 x1:L 中的每个元素 xi 。
- 对于每个 i=1,…,L :
- 计算 hi=FeedForward(xi−n+1,…,xi) 。
- 返回[ h1,…,hL ]。
递归神经网络
RNN、LSTM和GRU
def SequenceRNN(x:Rd×L)→Rd×L :
- 从左到右处理序列 x1,…,xL ,并递归计算向量 h1,…,hL 。
- 对于 i=1,…,L :
- 计算 hi=RNN(hi−1,xi) 。
- 返回 [h1,…,hL] 。
Transformer
def Attention(x1:L:Rd×L,y:Rd)→Rd :
- 通过将其与每个xi进行比较来处理y。
- 返回 Wvaluex1:Lsoftmax(x1:L⊤Wkey⊤Wqueryy/d)