注意力机制笔记
Transformer
结构篇:
encoder-decoder:6 block
相关问题
self-attention实现
$Softmax\frac{(Q*k)}{\sqrt{d_k}}V$,其中$d_k$是Q,K的列数,防止内积过大;可以使得输入的数据的分布变得更好,防止梯度消失,让模型能够更容易训练。
只要能够建模相关性,别的建模方式也能够代替当前的自注意力计算;同样的能够缓解梯度消失问题也不用除掉列数值。
对位置信息不敏感,需要增加pos-emb;embedding 的直接相加,类似于信号的叠加,只要保证频率不同叠加的信号就能够再后续发挥作用。
QKV的不同主要是为了增强容量和表达能力。多头也是为了增加参数量进而增强模型的表达能力,
整体的维度变化
input:(bs,max_len)
embedding:(bs,max_len,hidden_size)
MHA:(bs,max_len,hidden_size)Q(K,V): (bs,max_len,hidden_size) 多头机制: input:(bs*num_heads,max_len,hidden_size//num_heads) output:(bs*num_heads,max_len,hidden_size//num_heads) concat&Linear:(bs,max_len,hidden_size)
add&Post-Norm:(bs,max_len,hidden_size)
FF:(bs,max_len,hidden_size)先升维再降维 FF1:(bs,max_len,hidden_size*4) FF2:(bs,max_len,hidden_size)
计算复杂度对比
References
- 【关于Transformer】 那些的你不知道的事(上)
- 从Attention 到 MultiHeadAttention
- Transformer模型详解(图解最完整版)
- 说说transformer当中的维度变化
- 大模型面试八股
位置编码相关工作
总述
基于自注意力机制本身的计算原理,其对位置信息不敏感,具体从公式角度来看:
调换序列中两个元素的位置不会影响到当前的注意力得分计算。
绝对位置编码
- 训练式
直接将位置编码当作可训练参数。一般的认为,该方法的缺点在于没有外推性,超过预设窗口大小的内容就无法处理了。(当前有一些可以通过如层次分解的方法将位置编码外推足够长的范围)
- 三角式-transformer:
通过内积的方法将相对位置信息融入到特征中。但具体实现中,由于参数矩阵也需要参与计算$p^{T}{t}W^{T}{Q}W_{K}p_s \not ={p^{T}_{t}p_s}.$经相关研究,可知由于参数矩阵使得余弦波不再是理想情况,无法真正感知元素的相对未知信息。
- 递归式
本质思想是RNN这类递归模型,学习位置编码,再接入transformer。但最大的问题是牺牲了一定的并行性,会带来速度瓶颈。
相对位置编码
相对位置编码在计算自注意力矩阵时,根据矩阵元素的下标,直接考虑每个元素对应的两个token间的相对位置关系。此外,相比于绝对位置编码仅仅在输入层考虑顺序特征,相对位置编码则通过修改自注意力计算的过程,植入到Transformer架构的每一层。
不同模型的相对位置编码:
参考
RoPE
不同激活函数与优化器设计
优化器
AdamW
激活函数
SwiGLU
- siwish-线性函数与ReLU之间的平滑
$f(x)=x \times sigmoid(\beta x)$
- GELU-高斯误差线性单元,RELU的变种
$f(x)=x \times \phi(x),\phi(x)是正态分布的累积函数$,和Swish形式性质相似,表现相当
- GLU-门控
$\text{GLU}(a, b) = a \otimes \sigma(b)$
具体就是首先通过中间向量g(x)=xW进行门控操作,使用Sigmoid函数σ将其映射到0到1之间的范围,表示每个元素被保留的概率。然后,将输入向量x与门控后的向量进行逐元素相乘(即 ⊗ 操作),得到最终的输出向量。
- GEGL-GLU变体
就是将GLU中的sigmoid激活函数替换成GELU激活函数
5. SwiGLU
就是将GLU中的sigmoid激活函数替换成Swish激活函数
参考
模型结构微调
Norm
Pre-Norm
- LayerNorm会影响训练的稳定性
Megatron-LM 用实验证明layernorm后置效果要更加稳定
Post-LN(原始的BERT)
Pre-LN:On layer normalization in the transformer architecture
Sandwich-LN: Cogview: Mastering text-to-image generation via transformers
通常认为稳定性上: Sandwich-LN > Pre-LN > Post-LN
Norm类型
LayerNorm
传统transformer-Post-LN、随着层数加深梯度范数会增大导致训练不稳定。
Pre-LN:使用pre LN的深层transformer训练更稳定,可以缓解训练不稳定问题。但缺点是pre LN可能会轻微影响transformer模型的性能 大语言模型的一个挑战就是如何提升训练的稳定性。Norm中采用的性质:
- 平移不变性:均值
- 缩放不变性:方差
RMSNorm
只保留缩放,简化计算的同时,效果基本相当甚至还略有提升。DeepNorm
用以缓解爆炸式模型更新的问题,更可以再此基础上实现千层堆积。
$x = LayerNorm(x \times \alpha + f(x))$- DeepNorm在进行Layer Norm之前会以 α参数扩大残差连接
- 在Xavier参数初始化过程中以 β减小部分参数的初始化范围
参考
不同attention实现
Flash-Attention
PageAttention
Multi-Query Attention
Group-Query Attention
Bert与GPT的不同
自回归模型
AR,代表GPT,从左向右学习。
AR模型通常用于生成式任务,在长文本的生成能力很强,比如自然语言生成(NLG)领域的任务:摘要、翻译或抽象问答。
具体来说,就是利用上文词预测下一个词的发生概率。
优点:AR模型擅长生成式NLP任务。AR模型使用注意力机制,预测下一个token,因此自然适用于文本生成。此外,AR模型可以简单地将训练目标设置为预测语料库中的下一个token,因此生成数据相对容易。
缺点:AR模型只能用于前向或者后向建模,不能同时使用双向的上下文信息,不能完全捕捉token的内在联系。
GPT系列模型
GPT1
通过无监督预训练+有监督微调实现模型性能的提升。另外,将预训练目标作为辅助目标加入下游任务loss中,将会提高有监督模型的泛化性能,并加速收敛。GPT2-15B
“所有的有监督学习都是无监督语言模型的一个子集”
增大了模型大小与参数规模,提出了zero-shot,并且提出了以一个通用预训练模型为基础,使得下游任务无需手动生成或标记训练数据集,更不需要修改预训练模型的参数或结构。
GPT2通过实验验证了海量数据与大量参数训练得到的语言模型可以迁移到下游其他任务中,无需额外训练和微调。
GPT3-175B
引入了In-Context Learning的概念,GPT3参数量增大的同时,期望不通过微调直接能够通过上下文指示也能够有较好的性能。In-Context learning是元学习(Meta-learning)的一种,元学习的核心思想在于通过少量的数据寻找一个合适的初始化范围,使得模型能够在有限的数据集上快速拟合,并获得不错的效果。
InstructGPT
提出动机:让模型的输出达到3H(helpful,honest,harmless)
- RLHF
人类喜欢的内容大致符合以上的3H标准,并且也能够保证生成内容流畅性与语法正确性;
通过RL指导模型训练,以人类反馈作为奖励,实现将人类经验内容的注入。
- 实验步骤
有监督微调-基于人工标注的对比数据训练奖励模型-基于RM利用PPO微调SFT模型;
三部分数据集:
SFT数据:简单任务、few-shot任务、用户相关的任务;
RM数据:让模型先生成一批候选文本,然后针对这部分数据进行排序;
PPO数据:无标注数据,来自GPT3的API用户调用任务数据;训练设置:
SFT:与GPT3一致,适当过拟合有助于后续的训练;
RM:输入prompt和response,输出奖励值;训练过程中将同一个prompt的k个输出成对取出共有$C_{K}^{2}$个结果作为一个batch输入,loss就是最大化结果的差值;
PPO:KL惩罚确保两个策略的输出差距不会很大;为了防止模型在通用NLP任务上性能大幅度下降,优化目标中增加了通用语言模型的目标;- 优缺点
优点:结果更真实,无害性提高,coding能力提升;
缺点:会降低在通用NLP任务上的效果;依然会给出奇怪的输出;对指示十分敏感;对简单概念过分解读。GPT4-1.8T
- 模型架构
采用的是MoE的架构
- 数据组成
自编码模型
AE,代表BERT,主要是对掩码部分能够实现重建,常用于内容理解任务,比如自然语言理解(NLU)中的分类任务:情感分析、提取式问答。
优点:在上下文依赖中,BERT的表示可以涵盖前后向两边的上下文。BERT使用双向transformer,在语言理解相关的任务中表现很好。
缺点:
- 输入噪声:
BERT在预训练过程中使用【mask】符号对输入进行处理,这些符号在下游的finetune任务中永远不会出现,这会导致预训练-微调差异。而AR模型不会依赖于任何被mask的输入,因此不会遇到这类问题。 - BERT在对联合条件概率进行因式分解时,基于一个独立假设:在给定了unmasked tokens时,所有待预测(masked)的tokens是相互独立的。
Encoder-Decoder
同时包含编码器和解码器两部分,常用的有T5、BART等模型