节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学,针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何备战、面试常考点分享等热门话题进行了深入的讨论。
合集在这里:《大模型面试宝典》(2024版) 正式发布!
ChatGPT (GPT-3.5/GPT-4)固然惊艳,但叫开源人工智能的 OpenAI 并没有将其开源,国内外正干着急之际,关键时刻还得看开源界一哥 Meta。
Meta 半开源的 LLaMA 系列模型,一经推出便冠以“开源版 ChatGPT”之称,一时间推动了LLM的大爆发,特别是国内也陆续推出了数百个“国产自研”大模型,其地位堪称国内大模型的导师,甚至就直接套壳。
所谓半开源即只有 inference 过程没有 train 过程。
LLaMA 除了作为开源届最有影响力的大语言模型外,在其影响下LLM 各种配套库也都是依据其建立,极大的推动了 LLM 的发展和 LLaMA 生态的繁荣,可以说现在所有 LLM 应该都能看到 LLaMA 生态里的代码的身影。
LLaMA 作为相关从业者必学必会的模型,但是原始论文中仅仅介绍了其和标准 Transformer 的差别,并没有一个全局的模型介绍。
因此这篇文章争取让读者不参考任何其他资料把 LLaMA 的模型搞懂。喜欢本文记得收藏、点赞、关注,更多技术和面试要点,文末加入我们讨论群。
LLaMA模型结构
LLaMA V1 和 V2 模型结构基本相同,主要由 Attention 和 MLP 堆叠而成
如下图所示:
LLaMA V1主要特点
-
前置的 RMSNorm;
-
在Q、K上使用旋转式位置编码 RoPE;
-
使用 Causal Mask 保证每个位置只能看到前面的 Tokens;
-
可以将更早的 K、V 拼接到当前 K、V 前面,可以用 Q 查找更早的信息(为了清晰没在图中画出来);
-
MLP表达式:,其中 down、up、gate 都是线性层 Linear。
LLaMA 各个不同大小的结构设置如下表所示。其中最大的 65B 的 LLaMA 用了 2048 张 80GB 的 A100,batch size 为 4百万,训练一次需要 21 天。
RMSNorm
BERT、GPT 等模型中广泛使用的是 LayerNorm:
RMSNorm(Root Mean Square Layer Normalization)发现 LayerNorm 的中心偏移没什么用(减去均值等操作)。将其去掉之后,效果几乎不变,但是速度提升了40%。RMSNorm 最终公式变为:
注意除了没有减均值、加偏置以外,分母上求的 RMS 而不是方差。
LLaMA 在 Attention Layer 和 MLP 的输入上使用了 RMSNorm,相比在输出上使用,训练会更加稳定。
SwiGLU
LLaMA 没有使用 ReLU,而是使用了 SwiGLU,有时也被称为 SiLU。公式为:
SwiGLU 的效果类似平滑版的 ReLU,如下图所示:
RoPE
LLaMA 使用的位置编码是 RoPE(Rotary Position Embedding)。对于 Q 的第 m 个位置向量 q,通过以下方法注入位置编码:
其中 是值介于 [1,0) 之间的固定向量。
通过以下代码得到了上式中的第二项 和第四项 :
class LlamaRotaryEmbedding(torch.nn.Module):
def __init__(self, dim, max_position_embeddings=2048, base=10000):
super().__init__()
theta = 1.0 / (base ** (torch.arange(0, dim, 2) / dim))
t = torch.arange(max_position_mbeddings)
freqs = torch.einsum("i,j->ij", t, theta)
emb = torch.cat((freqs, freqs), dim=-1)
self.register_buffer("cos_cached", emb.cos())
self.register_buffer("sin_cached", emb.sin())
def forward(self, seq_len=None):
return self.cos_cached[:, :, :seq_len, ...], self.sin_cached[:, :, :seq_len, ...]
# 在LlamaAttention通过以下命令调用:
cos, sin = self.rotary_emb(seq_len=kv_seq_len)
再通过以下代码将 q 沿着最后一个维度劈成两半,将后一半乘 -1,然后连接在第一半之前,就得到了上式第三项:
# 在接下来的apply_rotary_pos_emb函数里调用
def rotate_half(x):
x1 = x[..., : x.shape[-1] // 2]
x2 = x[..., x.shape[-1] // 2 :]
return torch.cat((-x2, x1), dim=-1)
最后通过以下代码得到结合了位置编码的 Q,K (K和Q使用同样的方式进行位置编码):
def apply_rotary_pos_emb(q, k, cos, sin, position_ids):
q_embed = (q * cos[position_ids]) + (rotate_half(q) * sin[position_ids])
k_embed = (k * cos[position_ids]) + (rotate_half(k) * sin[position_ids])
return q_embed, k_embed
# 在LlamaAttention中通过以下命令调用:
query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids)
使用了这么复杂的位置编码,有什么好处呢?
从上面的公式可以看出,RoPE 形式上是绝对位置编码,即依赖其绝对位置m;但当我们计算 Attention 时,RoPE 却可以变成相对位置编码。
绝对位置编码的优点是计算速度快等,缺点是拓展长度比较麻烦,且绝对位置并没有什么实际意义。
而相对位置编码对学习 token 之间的关系很有意义,比如距离的很远的两个 token 之间的关联大概率很小,使用相对位置编码往往能够获得更好的效果。
此外相对位置编码拓展长度也更容易,因为不论 context size 多长,只需关注最长距离以内的输入即可。
相对位置编码的缺点是没有绝对位置编码计算速度快。
那绝对位置编码的 RoPR 在计算 Attention 时是怎么变成相对位置编码的呢?
从上面这个公式可以看出,q 和 k 的 attention 依赖相对距离 m-n。因此 RoPE 为 q、k 注入的绝对位置编码,计算得到的 attention,却变成了相对位置编码。妙的很!
更多关于RoPR的解读可以看我之前的文章
LLaMA V2 相对 V1 的更新
-
预训练语料从 1 Trillion tokens -> 2 Trillion tokens;
-
context window 长度从 2048 -> 4096;
-
收集了 100k 人类标注数据进行 SFT;
-
收集了 1M 人类偏好数据进行RLHF;
-
在 reasoning, coding, proficiency, and knowledge tests 上表现超越 MPT 和 Falcon;
-
和 Falcon 模型一样,使用了 Group Query Attention,节省 cache。
Group Query Attention
GQA 出自 Google 的论文 Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints。
当前有如下 3 种主流的 Attention 计算方式:
自回归模型生成回答时,需要前面生成的 KV 缓存起来,来加速计算。
Multi-Head Attention(MHA)就是多个头各自拥有自己的 Q,K,V 来算各自的 Self-Attention,需要的缓存量很大。
Multi-Query Attention (MQA)指出多个头之间可以共享 KV 对,即 Q 依然保持多头,但是 KV 只有一个。
Group Query Attention (GQA)没有像 MQA 一样极端,将 Query 分组,组内共享 KV,效果接近 MHA,速度上与 MQA 可比较。
GQA 技术在 Falcon 已经用上了,当时 Falcon 说自己用的是 Multi Query Attention,因为当 group=1 时,GQA和MQA是等价的。Falcon 支持设置不同的 G。
技术交流群
前沿技术资讯、算法交流、求职内推、算法竞赛、面试交流(校招、社招、实习)等、与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度等名校名企开发者互动交流~
我们建了算法岗技术与面试交流群, 想要进交流群、需要源码&资料、提升技术的同学,可以直接加微信号:mlc2040。加的时候备注一下:研究方向 +学校/公司+CSDN,即可。然后就可以拉你进群了。
方式①、微信搜索公众号:机器学习社区,后台回复:加群
方式②、添加微信号:mlc2040,备注:技术交流
用通俗易懂方式讲解系列
- 《大模型面试宝典》(2024版) 正式发布!
- 《大模型实战宝典》(2024版)正式发布!
- 大模型面试准备(一):LLM主流结构和训练目标、构建流程
- 大模型面试准备(二):LLM容易被忽略的Tokenizer与Embedding
- 大模型面试准备(三):聊一聊大模型的幻觉问题
- 大模型面试准备(四):大模型面试必会的位置编码
- 大模型面试准备(五):图解 Transformer 最关键模块 MHA
- 大模型面试准备(六):一文讲透生成式预训练模型 GPT、GPT2、GPT3
- 大模型面试准备(七):ChatGPT 的内核 InstructGPT 详细解读
相关参考和推荐阅读:
[1] LLaMA: Open and Efficient Foundation Language Models
[2] Llama 2: Open Foundation and Fine-Tuned Chat Models
[3] https://zhuanlan.zhihu.com/p/636784644
[4] https://zhuanlan.zhihu.com/p/649756898
[5] https://zhuanlan.zhihu.com/p/634063775
[6] https://zhuanlan.zhihu.com/p/643894722