【大模型理论基础(So-Large-LLM)Task03 模型架构】

本文详细探讨了大型语言模型So-Large-LLM的架构,包括分词方法(基于空格、BPE和Unigrammodel)以及模型结构(如RRN和Transformer),介绍了编码端、解码端和编码-解码端的不同模型类型及其特点。
摘要由CSDN通过智能技术生成

大模型理论基础(So-Large-LLM)Task03 模型架构

为了更好的了解整体的功能结构(而不从一开始就陷入局部的结构细节),我们一开始先将语言模型(model)的看作一个黑箱(black box)(在后续的内容中再逐步的拆解),从形象化的概念理解上来说当前大语言模型(大:体现中模型的规模上)的能力,其可以根据输入需求的语言描述(prompt)生成符合需求的结果(completion)。

讨论大型语言模型是如何构建的,其章节将着重讨论两个主题,分别是分词和模型架构:

  • 分词(Tokenization):即如何将一个字符串拆分成多个词元。
  • 模型架构(Model architecture):我们将主要讨论RRN(递归神经网络)以及Transformer架构,这是真正实现大型语言模型的建模创新。

1. 分词

由于语言模型 p 是建立在词元(token)序列的上的一个概率分布输出,其中每个词元来自某个词汇表V。然而,自然语言并不是以词元序列的形式出现,而是以字符串的形式存在(具体来说,是Unicode字符的序列),也可以将这个方式理解为自然语言和机器语言的一种隐式的对齐。因此如何将一个字符串文本变成机器能计算的数值就显得尤为重要。本次学习主要介绍三种分词方式:基于空格的分词方法、Byte pair encoding(BPE)、Unigram model(SentencePiece)。

对于分词的标准,目前从直觉和工程实践的角度来说:

  • 首先我们不希望有太多的词元(极端情况:字符或字节),否则序列会变得难以建模。
  • 其次我们也不希望词元过少,否则单词之间就无法共享参数(例如,mother-in-law和father-in-law应该完全不同吗?),这对于形态丰富的语言尤其是个问题(例如,阿拉伯语、土耳其语等)。
  • 每个词元应该是一个在语言或统计上有意义的单位。

1.1 基于空格的分词

分词,其实从字面很好理解,就是把词分开,从而方便对于词进行单独的编码,对于英文字母来说,由于其天然的主要由单词+空格+标点符号组成,最简单的解决方案是使用text.split(' ')方式进行分词,这种分词方式对于英文这种按照空格,且每个分词后的单词有语义关系的文本是简单而直接的分词方式。然而,对于一些语言,如中文,句子中的单词之间没有空格还有一些语言。再比如德语,存在着长的复合词。即使在英语中也有连字符词(例如father-in-law)和缩略词(例如don’t),它们需要被正确拆分。

1.2 Byte pair encoding

将字节对编码(BPE)算法应用于数据压缩领域,用于生成其中一个最常用的分词器。BPE分词器需要通过模型训练数据进行学习,获得需要分词文本的一些频率特征。

学习分词器的过程,直觉上,我们先将每个字符作为自己的词元,并组合那些经常共同出现的词元。整个过程可以表示为:

  • Input(输入):训练语料库(字符序列)。 算法步骤

  • Step1. 初始化词汇表 V 为字符的集合。

    while(当我们仍然希望V继续增长时):

  • Step2. 找到VV中共同出现次数最多的元素对x,x′ 。

  • Step3. 用一个新的符号xx′ 替换所有x,x′ 的出现。

  • Step4. 将xx′ 添加到V中。

1.3 Unigram model(SentencePiece)

与仅仅根据频率进行拆分不同,一个更“有原则”的方法是定义一个目标函数来捕捉一个好的分词的特征,这种基于目标函数的分词模型可以适应更好分词场景,Unigram model就是基于这种动机提出的。我们现在描述一下unigram模型(Kudo,2018年)。

这是SentencePiece工具(Kudo&Richardson,2018年)所支持的一种分词方法,与BPE一起使用。 它被用来训练T5和Gopher模型。给定一个序列 $x_{1:L} ,一个分词器 ∗ T ∗ 是 ,一个分词器 *T* 是 ,一个分词器T$ p\left(x_{1: L}\right)=\prod_{(i, j) \in T} p\left(x_{i: j}\right)$$​的一个集合。这边给出一个实例:

  • 训练数据(字符串):ababc
  • 分词结果 T=(1,2),(3,4),(5,5) (其中 V={ab,c} )
  • 似然值:p( x 1 : L x_{1:L} x1:L)=2/3⋅2/3⋅1/3=4/27

在这个例子中,训练数据是字符串" ababc "。分词结果 T=(1,2),(3,4),(5,5) 表示将字符串拆分成三个子序列: (𝖺,𝖻),(𝖺,𝖻),(𝖼)。词汇表 V={𝖺𝖻,𝖼}V={ab,c} 表示了训练数据中出现的所有词汇。

似然值 p ( x 1 : L ) p(x_{1:L}) p(x1:L)是根据 unigram 模型计算得出的概率,表示训练数据的似然度。在这个例子中,概率的计算为 2/3⋅2/3⋅1/3=4/27 。这个值代表了根据 unigram 模型,将训练数据分词为所给的分词结果 T 的概率。

unigram 模型通过统计每个词汇在训练数据中的出现次数来估计其概率。在这个例子中,ab 在训练数据中出现了两次, c 出现了一次。因此,根据unigram模型的估计, p(ab)=2/3 , p©=1/3 。通过将各个词汇的概率相乘,我们可以得到整个训练数据的似然值为 4/27 。

似然值的计算是 unigram 模型中重要的一部分,它用于评估分词结果的质量。较高的似然值表示训练数据与分词结果之间的匹配程度较高,这意味着该分词结果较为准确或合理。

算法流程

  • 从一个“相当大”的种子词汇表 V 开始。
  • 重复以下步骤:
    • 给定 V ,使用EM算法优化p(x) 和 T
    • 计算每个词汇 xV 的 loss(x) ,衡量如果将 xV 中移除,似然值会减少多少。
    • 按照 loss进行排序,并保留 V 中排名靠前的80%的词汇。

这个过程旨在优化词汇表,剔除对似然值贡献较小的词汇,以减少数据的稀疏性,并提高模型的效果。通过迭代优化和剪枝,词汇表会逐渐演化,保留那些对于似然值有较大贡献的词汇,提升模型的性能。

1.4 补充内容

1.4.1 Unicode的问题

Unicode(统一码)是当前主流的一种编码方式。其中这种编码方式对BPE分词产生了一个问题(尤其是在多语言环境中),Unicode字符非常多(共144,697个字符)。在训练数据中我们不可能见到所有的字符。 为了进一步减少数据的稀疏性,我们可以对字节而不是Unicode字符运行BPE算法(Wang等人,2019年)。以中文为例: 今天 ⇒ [ x 62 , x 11 , 4 e , c a ] 今天⇒[x62, x11, 4e, ca] 今天[x62,x11,4e,ca]

BPE算法在这里的作用是为了进一步减少数据的稀疏性。通过对字节级别进行分词,可以在多语言环境中更好地处理Unicode字符的多样性,并减少数据中出现的低频词汇,提高模型的泛化能力。通过使用字节编码,可以将不同语言中的词汇统一表示为字节序列,从而更好地处理多语言数据。

2. 模型结构:研究和实现RNN, Transformer等网络结构

到目前为止,我们已经将语言模型定义为对词元序列的概率分布 p ( x 1 , … , x L ) p(x_{1},…,x_{L}) p(x1,,xL),我们已经看到这种定义非常优雅且强大(通过提示,语言模型原则上可以完成任何任务,正如GPT-3所示)。然而,在实践中,对于专门的任务来说,避免生成整个序列的生成模型可能更高效。

2.1 语言模型分类

将语言模型分为三个类型:编码端(Encoder-Only),解码端(Decoder-Only)和编码-解码端(Encoder-Decoder)。

2.1.1 编码端(Encoder-Only)

编码端架构的著名的模型如BERT、RoBERTa等。这些语言模型生成上下文向量表征,但不能直接用于生成文本。可以表示为, x 1 : L ⇒ ϕ ( x 1 : L ) x_{1:L}⇒ϕ(x_{1:L}) x1:Lϕ(x1:L) 。这些上下文向量表征通常用于分类任务(也被称为自然语言理解任务)。任务形式比较简单,下面以情感分类/自然语言推理任务举例:
情感分析输入与输出形式: [ [ C L S ] , 他们 , 移动 , 而 , 强大 ] ⇒ 正面情绪 自然语言处理输入与输出形式: [ [ C L S ] , 所有 , 动物 , 都 , 喜欢 , 吃 , 饼干 , 哦 ] ⇒ 蕴涵 情感分析输入与输出形式:[[CLS],他们,移动,而,强大]⇒正面情绪\\ 自然语言处理输入与输出形式:[[CLS],所有,动物,都,喜欢,吃,饼干,哦]⇒蕴涵 情感分析输入与输出形式:[[CLS],他们,移动,,强大]正面情绪自然语言处理输入与输出形式:[[CLS],所有,动物,,喜欢,,饼干,]蕴涵
该架构的优势是对于文本的上下文信息有更好的理解,因此该模型架构才会多用于理解任务。该架构的有点是对于每个 x i x_{i} xi ,上下文向量表征可以双向地依赖于左侧上下文 ( x 1 : i − 1 ) (x_{1:i−1}) (x1:i1)和右侧上下文$ (x_{i+1:L})$但是缺点在于不能自然地生成完成文本,且需要更多的特定训练目标(如掩码语言建模)。

2.1.2 解码端(Decoder-Only)

解码器架构的著名模型就是大名鼎鼎的GPT系列模型。这些是我们常见的自回归语言模型,给定一个提示 x 1 : i x_{1:i} x1:i ,它们可以生成上下文向量表征,并对下一个词元$ x_{i+1}$(以及递归地,整个完成 x i + 1 : L x_{i+1:L} xi+1:L生成一个概率分布)。 x 1 : i ⇒ ϕ ( x 1 : i ) , p ( x i + 1 ∣ x 1 : i ) x_{1:i}⇒ϕ(x_{1:i}),p(x_{i+1}∣x_{1:i}) x1:iϕ(x1:i),p(xi+1x1:i) 。我们以自动补全任务来说,输入与输出的形式为, [ [ C L S ] , 他们 , 移动 , 而 ] ⇒ 强大 [[CLS], 他们, 移动, 而]⇒强大 [[CLS],他们,移动,]强大 。与编码端架构比,其优点为能够自然地生成完成文本,有简单的训练目标(最大似然)。缺点也很明显,对于每个 x i x_i xi,上下文向量表征只能单向地依赖于左侧上下文 ( x 1 : i − 1 x_{1:i−1} x1:i1) 。

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

编码-解码端架构就是最初的Transformer模型,其他的还有如BART、T5等模型。这些模型在某种程度上结合了两者的优点:它们可以使用双向上下文向量表征来处理输入$ x_{1:L}$,并且可以生成输出 y 1 : L y_{1:L} y1:L 。可以公式化为:
x 1 : L ⇒ ϕ ( x 1 : L ) , p ( y 1 : L ∣ ϕ ( x 1 : L ) ) 。 x_{1:L}⇒ϕ(x_{1:L}),p(y_{1:L}∣ϕ(x_{1:L}))。 x1:Lϕ(x1:L),p(y1:Lϕ(x1:L))
以表格到文本生成任务为例,其输入和输出的可以表示为: [ 名称 : , 植物 , ∣ , 类型 : , 花卉 , 商店 ] ⇒ [ 花卉 , 是 , 一 , 个 , 商店 ] [名称:, 植物, |, 类型:, 花卉, 商店]⇒[花卉, 是, 一, 个, 商店] [名称:,植物,,类型:,花卉,商店][花卉,,,,商店]

该模型的具有编码端,解码端两个架构的共同的优点,对于每个 x i x_{i} xi,上下文向量表征可以双向地依赖于左侧上下文($ x_{1:i−1}$ ) 和右侧上下文 ( x i + 1 : L x_{i+1:L} xi+1:L ),可以自由的生成文本数据。缺点就说需要更多的特定训练目标。

2.4 补充内容

上下文向量表征 (Contextual Embedding): 作为先决条件,主要的关键发展是将词元序列与相应的上下文的向量表征:
KaTeX parse error: Undefined control sequence: \pmatrix at position 43: …\overset{ϕ}{⇒}[\̲p̲m̲a̲t̲r̲i̲x̲{1 \\0.1},\pmat…

  • 符号表示:我们将 ϕ:VL→R{d×L} 定义为嵌入函数(类似于序列的特征映射,映射为对应的向量表示)。
  • 对于词元序列 x_{1:L}=[x_{1},…,x_{L}],ϕ 生成上下文向量表征ϕ(x_{1:L})ϕ(x1:L)。

3. Transformer各层细节:从位置信息编码到注意力机制

参考资料

  1. so-large-llm 第三章:模型架构
  2. so-large-llm 第四章:新的模型的架构
  • 22
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aaxiaotao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值