1 大模型种类
prefix Decoder 和 causal Decoder 和 Encoder-Decoder 区别是 attention mask 不同;• Encoder-Decoder :
- 在输入上采用双向注意力,对问题的编码理解更充分
- 适用任务:在偏理解的 NLP 任务上效果好
- 缺点:在长文本生成任务上效果差,训练效率低;
• causal Decoder :
- 自回归语言模型,预训练和下游应用是完全一致的,严格遵守只有后面的token才能看到前面的 token的规则;
- 适用任务:文本生成任务效果好;
- 优点:训练效率高,zero-shot 能力更强,具有涌现能力;
prefix Decoder:
- 特点:prefix部分的token互相能看到,causal Decoder 和 Encoder-Decoder 折中;
- 缺点:训练效率低
- Prefix Decoder 系:主要用于需要额外上下文信息引导生成内容的场景,如对话系统。
- Causal Decoder 系:主要用于生成连续的文本序列,每个生成的词依赖于前面的词。
- Encoder-Decoder 系:主要用于需要双向上下文信息的任务,如机器翻译、文本摘要等。
可入手下面的模型进行微调:
目前,主流的开源大语言模型主要有三个:LLaMA、ChatGLM 和 BLOOM。基于这三个开源模型,业界进行了指令微调或强化学习,衍生出了许多不同的大模型。下面从训练数据、tokenizer 和模型结构上对这三个大语言模型进行比较。
1.1 ChatGLM
ChatGLM借助编码器-解码器架构思想,前半部分采用类似于Bert的双向注意力,后半部分采用类似于GPT的自回归架构进行预测;ChatGPT采用的是仅解码器架构。
ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。ChatGLM-6B 使用了和 ChatGPT 相似的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答。
在 ChatGLM 的预训练过程中,使用掩码片段(masked spans)作为预训练任务的一部分,可以帮助模型学习更长距离的上下文依赖关系。具体来说,可以将输入文本分割成多个片段,并从中随机选取若干片段进行掩码,然后将这些掩码片段的位置打乱,形成 Part A 和 Part B 的输入。
ChatGLM的输入:
1 随机采样2个片段,将其mask,作为part A。
2、被mask的2个片段(各自开头加上起始符)的位置随机打散,作为part B。【为何要随机打散呢?我的理解是:因为被mask的片段间实际上attention是单向的,打散可以完整的捕捉到不同片段之间的依赖关系】
3、part A和part B拼接作为输入序列。
4、为了区分part A和part B的token的位置信息,GLM采用了二维位置编码,也就是每个token用两个位置id来表示,这样一来就可以将token embedding和其对应的两个position embedding相加了。那么,为兼具encoder和decoder的优势,GLM对attention mask做了如下改进:
1、A 部分的字符可以注意到A 部分的所有字符(双向),但是不能注意到 B部分的任何字符。
2、B 部分只能注意到B自身之前的字符(单向);但可以注意到A 部分的所有字符。
3、其他部分就是mask了。
为兼顾下游自然语言理解和自然语言生成任务的性能,GLM设计了三种不同的基于自回归填空的预训练目标。
针对自然语言理解任务:
- 从一个均值为3的泊松分布中采样片段的长度0直到原始文本中 15%的字符被掩盖,然后在文本中随机排布填空片段的位置这个目标我们称为 token-level objective。(实际中,GLM发现15%的填空比例对于下游自然语言理解任务的良好表现非常重要)
针对文本生成任务设计了另外两种预训练目标:
- document-level obiective: 我们采样了一个长度从原始文本长度的 50% 到100%的均匀分布中采样的片段。这个预训练目标针对的是无条件的长文本生成任务。
- sentence-level objective: 我们限制了每个被掩盖的片段必须是完整的句子,采样多个句子直到覆盖了原始文本中15%的字符。这个预训练目标针对的是输出目标常常是句子或者段落的有条件文本生成任务。
1.2 Bloom
bloom是一种基于变换器网络(Transformer)架构的自回归语言模型。该模型除了176B 之外,还提供了几个较小的模型,其模型参数规模为:560M,1.1B,1.7B,3B 和7.1B。46 种口语和 13 种编程语言,其中包括中文。
1.3 Llama
1.3.0 分词技术
BPE 算法原理
BPE 的基本思想是通过迭代地合并最常见的字符对来构建词汇表。这使得模型能够处理任意长度的词汇单元,并且能够适应新出现的词汇。算法步骤
1 初始化词汇表:从所有字符的集合开始,每个字符都是词汇表中的一个独立条目。
2 统计字符对频率:遍历训练文本,统计每个字符对出现的次数。
3 合并最常见字符对:找到出现次数最多的字符对,并将其作为一个新的词汇单元添加到词汇表中。
4 更新文本表示:用新合并的词汇单元替换原文本中的相应字符对。
5 重复步骤 2 至 4:不断迭代,直到达到预定的词汇表大小或满足其他停止条件
Llama 模型是由 Facebook AI(现 Meta AI)研发的一种大规模语言模型,它基于 Transformer 架构,并且是为了处理各种自然语言处理(NLP)任务而设计的。Llama 模型的主要特点是其大规模的参数量和强大的生成能力,使其能够在多种任务上表现出色,包括但不限于文本生成、对话系统、问答系统等。
Llama 2 采用了 Llama 1 的大部分预训练设置和模型架构。他们使用标准的Transformer架构,应用RMSNorm进行预归一化,使用SwiGLU激活函数和旋转位置编码。与 Llama 1 相比,主要的架构差异包括增加的上下文长度和分组查询注意力(GQA)。
1.3.1 RMSNorm: 根均方归一化
归一化前置:为了使得模型训练过程更加稳定,GPT-2相较于GPT就引入了前置层归一化方法(归一化操作放在残差操作前面)
层归一化中也采用了RMSNorm归一化函数。针对输入向量a,RMSNorm 函数计算公式如下:
1.3.2 SwiGLU激活函数
GLU(Gated Linear Units)其实不算是一种激活函数,而是一种神经网络层。它是一个线性变换后面接门控机制的结构。SwiGLU 的核心思想是使用 Swish 函数作为激活函数,并将其与 GLU 结构结合起来。具体来说,SwiGLU 的输入通常被分为两半,一半用于生成门控信号,另一半则通过 Swish 激活函数,最终这两部分相乘得到输出。GLU可以有效地捕获序列中的远程依赖关系,同时避免与lstm和gru等其他门控机制相关的一些梯度消失问题。
在 Llama 模型中,SwiGLU 通常用于 Transformer 编码器或解码器的 FFN 层中。具体来说,每个 FFN 层包含两个线性层,其中第一个线性层的输出被分成两半,一半作为激活信号,另一半作为门控信号。这两个部分通过 SwiGLU 激活函数组合在一起。
选择 SwiGLU 作为大语言模型的激活函数,主要是因为它综合了非线性能力、门控特性、梯度稳定性和可学习参数等方面的优势。在处理语言模型中复杂的语义关系、长依赖问题、以及保持训练稳定性和计算效率方面,SwiGLU 表现出色,因此被广泛采用。
其中 σ 为sigmoid函数,⊗ 为逐元素乘。通过使用其他的激活函数我们就能够得到GLU的各种变体了。
Swish是一个非线性激活函数,定义如下:
Swish(x) = x*sigmoid(ßx): 其中,ß 为可学习参数。Swish可以比ReLU激活函数更好,因为它在0附近提供了更平滑的转换,这可以带来更好的优化。
上面我们已经说到SwiGLU是两者的结合。它是一个GLU,但不是将sigmoid作为激活函数,而是使用ß=1的swish,因此我们最终得到以下公式:
SwiGLU(x) = Swish(W1x+b)⊗(Vx+c)
1.3.3 旋转位置编码
https://zhuanlan.zhihu.com/p/632102048
在位置编码上,使用旋转位置嵌入(Rotary Positional Embeddings,RoPE)代替原有的绝对位置编码。RoPE借助了复数的思想,出发点是通过绝对位置编码的方式实现相对位置编码。没怎么看懂。
1.3.4 Group Query Attention
与Multi-head Attention相比,Query还是多个头,KV组内共享,节省了很多计算量。模型的精度会稍微降低一点,但是推理速度会快很多。
Grouped-query Attention是multi-head和multi-query方案的折中。模型精度高于multi-query,速度优于multi-head。LLaMA2在34B和70B的模型上使用了Grouped-Query Attention。
在传统的 MHSA 中,每个头部都有独立的查询、键(Key)和值(Value)向量,这些向量通过点积运算计算注意力分数,然后加权聚合值向量来产生输出。然而,随着序列长度的增长,这种方法的计算复杂度和内存需求也随之增加,因为需要计算所有查询向量与所有键向量之间的点积。
GQA(Group Query Attention) 的核心在于将查询向量分组,并且每个组只与键向量进行一次点积运算,而不是每个查询向量都与所有的键向量计算点积。这样可以显著减少计算量,同时保持足够的表达能力。每个组共享一个Key 和 Value 矩阵。当组数与头数相同就进化到多头注意力机制了!
https://zhuanlan.zhihu.com/p/632102048
ref:https://zhuanlan.zhihu.com/p/630134021