赞
踩
主流的大语言模型都采用了Transformer架构,它是一个基于多层Self-attention的神经网络模型。
原始的Transformer由编码器(Encoder)和解码器(Decoder)两个部分构成,同时,这两个部分也可以独立使用。
Llama模型与GPT-2类似,也是采用了基于Decoder-Only的架构。在原始Vanilla Transformer Decoder的基础上,Llama进行了如下改动:
接下来,我们将展开看下每个版本的不同变体:
LLaMa-1:Meta开源的Pre-trained Model,模型参数从 7B、13B、32B、65B 不等
,LLaMa-7B在大多数基准测试上超过了Text-davinci-003(即GPT3-173B),相比于ChatGPT或者GPT4来说,LLaMa可能效果上还有差距,目前hugging face已集成了LLaMa的代码实现和开源模型。学术界和工业界都可以在此基础上进行学习和研究。
Alpaca:斯坦福在LLaMa-7B的基础上监督微调出来的模型
,斯坦福是用OpenAI的Text-davinci-003(即GPT3-173B)的API
配合self-instruct技术
,使用175个提示语种子自动生成了52K条提示-回复的指示数据集,在LLaMa-7B上微调得到的模型,在8张80G的A100上训练了3小时。
Vicuna:在LLaMa-13B的基础上使用监督微调得到的模型
,数据集来自于ShareGPT 产生的用户对话数据
,共70K条。使用Pytorch FSDP在8张A100上训练了一天。相较于Alpaca,Vicuna在训练中将序列长度由512扩展到了2048
,并且通过梯度检测和flash attention来解决内存问题;调整训练损失考虑多轮对话,并仅根据模型的输出进行微调。通过GPT4来打分评测,Vicuna可以达到ChatGPT 90%的效果。
7B、13B、34B、70B
四个参数量版本。LLaMa2和LLaMa1的最大差别是:Llama-2将预训练的语料扩充到了 2T token语料
,同时将模型的上下文长度从2,048翻倍到了4,096
,并在训练34B、70B
的模型中引入了分组查询注意力机制(grouped-query attention, GQA)
。LLaMa-2 Chat:有了更强大的基座模型Llama-2,Meta通过进一步的有监督微调(Supervised Fine-Tuning, SFT)
、基于人类反馈的强化学习(Reinforcement Learning with Human Feedback, RLHF)
等技术对模型进行迭代优化(Pertrain -> SFT -> RLHF)
,并发布了面向对话应用的微调系列模型 Llama-2 Chat。
Code-LLaMa:得益于Llama-2的优异性能,Meta在2023年8月发布了专注于代码生成的Code-Llama,共有7B、13B、34B和70B四个参数量版本。
8B和70B
两个参数量版本。除此之外,Meta还透露,400B的Llama-3还在训练中。相比Llama-2,Llama-3支持8K长文本
,并采用了一个编码效率更高的tokenizer,词表大小为128K
。在预训练数据方面,Llama-3使用了超过15T token的语料
,这比Llama 2的7倍还多。Embedding的过程:word -> token_id -> embedding_vector
其中第一步转化使用tokenizer的词表进行,第二步转化使用 learnable 的 Embedding layer。
为什么使用RMS Norm?
(1)RMS Norm计算量更小
(2)RMS的效果和Layer Norm一样好。
针对输入向量 a 的RMS Norm 函数计算公式如下:
此外,RMSNorm 还可以引入可学习的缩放因子gi 和偏移参数bi,从而得到:
RMSNorm 在HuggingFace Transformer 库中代码实现如下所示:
class LlamaRMSNorm(nn.Module):
def __init__(self, hidden_size, eps=1e-6):
"""
LlamaRMSNorm is equivalent to T5LayerNorm
"""
super().__init__()
self.weight = nn.Parameter(torch.ones(hidden_size))
self.variance_epsilon = eps # eps 防止取倒数之后分母为0
def forward(self, hidden_states):
input_dtype = hidden_states.dtype
variance = hidden_states.to(torch.float32).pow(2).mean(-1, keepdim=True)
hidden_states = hidden_states * torch.rsqrt(variance + self.variance_epsilon)
# weight 是末尾乘的可训练参数, 即g_i
return (self.weight * hidden_states).to(input_dtype)
为了使得模型训练过程更加稳定,GPT-2 相较于GPT 就提出了将Layer Norm前置
,将第一个层归一化移动到多头自注意力层之前,第二个层归一化也移动到了全连接层之前,同时残差连接的位置也调整到了多头自注意力层与全连接层之后。层归一化中也采用了RMSNorm 归一化函数。
绝对Positional Encodding的使用过程:word -> token_id -> embedding_vector + position_encodding -> Encoder_Input
其中第一步转化使用tokenizer的词表进行,第二步转化使用 learnable 的 Embedding layer。将得到的embedding_vector 和 position_encodding 进行element-wise的相加,然后才做为input送入LLM的encoder。
对比Absolute PE 和 Relative PE:
Absolute PE 绝对位置编码:每次单独1个token的PE,每个token的PE之间没有关系,是一组固定的vector,反映每个token在sequence中的绝对位置。计算 query, key 和 value 向量之前加在输入序列X上, Q / K / V = W q / k / v ( X + P ) Q/K/V=W_{q/k/v}(X+P) Q/K/V=Wq/k/v(X+P),经典的位置编码向量 P 的计算方式是使用 Sinusoidal 函数。
Relative PE 相对位置编码:每次处理2个token的PE,只在计算attention时使用(在query@key时加在key上),反映2个token的相关度。
和相对位置编码(Relative PE)相比,旋转位置编码(RoPE) 具有更好的外推性,目前是大模型相对位置编码中应用最广的方式之一。
备注:什么是大模型外推性?(Length Extrapolation)
外推性是指大模型在训练时和预测时的输入长度不一致,导致模型的泛化能力下降的问题。
例如,如果一个模型在训练时只使用了512个token 的文本,那么在预测时如果输入超过512个
token,模型可能无法正确处理。这就限制了大模型在处理长文本或多轮对话等任务时的效果。
旋转位置编码(RoPE):RoPE 借助了复数的思想,出发点是通过绝对位置编码的方式,实现token间的相对位置编码。其目标是通过下述 f 运算,计算self-attention前,来给q,k 添加,其在sequence中的绝对位置信息m和n,得到qm 和kn,然后进行qm@kn:
SwiGLU 激活函数是Shazeer 在文献中提出,并在PaLM等模中进行了广泛应用,并且取得了不错的效果,相较于ReLU 函数在大部分评测中都有不少提升。在LLaMA 中全连接层使用带有SwiGLU 激活函数的FFN(Position-wise Feed-Forward Network)的计算公式如下:
其中,σ(x) 是Sigmoid 函数。下图给出了Swish 激活函数在参数β 不同取值下的形状。可以看到当β 趋近于0 时,Swish 函数趋近于线性函数y = x,当β 趋近于无穷大时,Swish 函数趋近于ReLU 函数,β 取值为1 时,Swish 函数是光滑且非单调。
HuggingFace 的Transformer 库中
S
w
i
s
h
β
=
1
Swish_{\beta=1}
Swishβ=1 函数使用 SILU 函数 代替。
[待补充]
[待补充]
[待补充]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。