LLaMA简介
LLaMA(Large Language Model Meta AI)是由Meta开发的一种大规模语言模型,旨在提高自然语言处理任务的性能。LLaMA基于Transformer机构,并经过大规模数据训练,以便在多种语言任务中表现出色。
LLaMA所采用的Transformer结构和细节,与标准的Transformer结构不同的地方是包括了采用前置层归一化(Pre-normalization)并使用RMSNorm归一化函数(Normalizing Function)、激活函数更换为了SwiGLU,并使用了旋转位置嵌入(RoPE),整体Transformer架构与GPT-2类似。
RMSNorm归一化函数
为了使得模型训练的过程更加稳定,GPT-2相较于GPT就引入了前置层归一化方法,将第一个归一化移动到了多头注意力层之前,第二个归一化也移动到了全连接层之前,同时残差链接的位置也调整到了多头注意力层与全连接层之后。归一化中也采用了RMSNorm归一化函数。针对输入向量RNSNorm函数的计算公式如下:
代码实现如下:
class LLaMARMSNorm(nn.Module):
def __init__(self,hidden_size,eps=1e-6):
super().__init__()
self.weight=nn.Parameter(torch.ones(hidden_size))
self.variance_epsilon=eps
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)
return (self.weight*hidden_states).to(input_dtype)
SwiGLU激活函数
SwiGLU激活函数是相较于ReLU函数在大部分测评中都有不少的提升。在LLaMA中全连接层使用带有SwiGLU激活函数的FFN(Position-wise Feef-Forward Network)计算公式如下:
其中Swish函数是Sigmoid函数。当取不同的β时,激活函数的图像如下图所示。当β趋近于0时,Swish函数趋近于线性函数y=x;当β趋近于无穷大时,Swish函数趋近于ReLU函数。
LLaMA中直接将FFN中的ReLU替换为SwiGLU,并将维度放缩为(2/3)*4d