大模型面试准备(八):一文详解国产大模型导师 LLaMA v1和v2

节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学,针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何备战、面试常考点分享等热门话题进行了深入的讨论。


合集在这里:《大模型面试宝典》(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. 预训练语料从 1 Trillion tokens -> 2 Trillion tokens;

  2. context window 长度从 2048 -> 4096;

  3. 收集了 100k 人类标注数据进行 SFT;

  4. 收集了 1M 人类偏好数据进行RLHF;

  5. 在 reasoning, coding, proficiency, and knowledge tests 上表现超越 MPT 和 Falcon;

  6. 和 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,备注:技术交流

用通俗易懂方式讲解系列

相关参考和推荐阅读:

[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

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值