一文搞懂DeepSeek - 多头注意力(MHA)和多头潜在注意力(MLA)

最近秋招发放Offer已高一段落。

不同以往的是,当前职场环境已不再是那个双向奔赴时代了。求职者在变多,HC 在变少,岗位要求还更高了。

最近,我们又陆续整理了很多大厂的面试题,帮助一些球友解惑答疑,分享技术面试中的那些弯弯绕绕。

喜欢本文记得收藏、关注、点赞。更多实战和面试交流,文末加入我们

技术交流

在这里插入图片描述

DeepSeek-V3的基本架构仍然基于Transformer框架,为了实现高效推理和经济高效的训练,DeepSeek-V3还采用了MLA(多头潜在注意力)。

MHA(多头注意力)通过多个注意力头并行工作捕捉序列特征,但面临高计算成本和显存占用;MLA(多头潜在注意力)则通过低秩压缩优化键值矩阵,降低显存占用并提高推理效率。

图片

一、多头注意力(MHA)

多头注意力(Multi-Head Attention,MHA)是什么?多头注意力(MHA)是Transformer模型架构中的一个核心组件,它允许模型在处理输入序列时能够同时关注来自不同位置的不同表示子空间的信息。

MHA通过将输入向量分割成多个并行的注意力“头”,每个头独立地计算注意力权重并产生输出,然后将这些输出通过拼接和线性变换进行合并以生成最终的注意力表示。

图片

多头注意力(MHA)如何进行Q、K、V计算?多头注意力(MHA)通过线性变换将输入张量分别转换为查询(Q)、键(K)和值(V)矩阵,每个矩阵再被分割成多个头进行并行处理。

  1. 输入变换:输入序列首先通过三个不同的线性变换层,分别得到查询(Query)、键(Key)和值(Value)矩阵。这些变换通常是通过全连接层实现的。

  2. 分头:将查询、键和值矩阵分成多个头(即多个子空间),每个头具有不同的线性变换参数。

  3. 注意力计算:对于每个头,都执行一次缩放点积注意力(Scaled Dot-Product Attention)运算。具体来说,计算查询和键的点积,经过缩放、加上偏置后,使用softmax函数得到注意力权重。这些权重用于加权值矩阵,生成加权和作为每个头的输出。

  4. 拼接与融合:将所有头的输出拼接在一起,形成一个长向量。然后,对拼接后的向量进行一个最终的线性变换,以整合来自不同头的信息,得到最终的多头注意力输出。

图片

二、多头潜在注意力(MLA)

多头潜在注意力(Multi-Head Latent Attention,MLA)是什么?多头潜在注意力(MLA)是一种改进的注意力机制,旨在提高Transformer模型在处理长序列时的效率和性能。

在传统的Transformer架构中,多头注意力(MHA)机制允许模型同时关注输入的不同部分,每个注意力头都独立地学习输入序列中的不同特征。然而,随着序列长度的增长,键值(Key-Value,KV)缓存的大小也会线性增加,这给模型带来了显著的内存负担。为解决MHA在高计算成本和KV缓存方面的局限性,DeepSeek引入了多头潜在注意力(MLA)。

图片

多头潜在注意力(MLA)技术创新是什么?多头潜在注意力(MLA)采用低秩联合压缩键值技术,优化了键值(KV)矩阵,显著减少了内存消耗并提高了推理效率。

  1. 低秩联合压缩键值:MLA通过低秩联合压缩键值(Key-Value),将它们压缩为一个潜在向量(latent vector),从而大幅减少所需的缓存容量。这种方法不仅减少了缓存的数据量,还降低了计算复杂度。

  2. 优化键值缓存:在推理阶段,MHA需要缓存独立的键(Key)和值(Value)矩阵,这会增加内存和计算开销。而MLA通过低秩矩阵分解技术,显著减小了存储的KV(Key-Value)的维度,从而降低了内存占用。

MLA通过“潜在向量”来表达信息,避免了传统注意力机制中的高维数据存储问题。利用低秩压缩技术,将多个查询向量对应到一组键值向量,实现KV缓存的有效压缩,使得DeepSeek的KV缓存减少了93.3%。

### 多头潜在注意力MLA)架构概述 多头潜在注意力建筑是一种高级神经网络组件,在深度学习领域被广泛应用于自然语言处理其他序列建模任务中。该结构通过引入多个并行的注意力机制来增强模型捕捉不同特征的能力[^1]。 #### 结构特点 - **多头设计**:每个头部专注于输入数据的不同部分,从而允许模型在同一时间关注到更多的信息维度。 - **潜变量表示**:利用隐含空间中的向量作为查询、键值来进行计算,这有助于提高表达能力灵活性。 - **自适应加权融合**:最终输出是由各个独立工作的“专家”即各单独的注意力头的结果组合而成,这种策略可以更好地综合来自不同视角的信息[^2]。 ```python import torch.nn as nn class MultiHeadLatentAttention(nn.Module): def __init__(self, d_model, num_heads): super(MultiHeadLatentAttention, self).__init__() assert d_model % num_heads == 0 self.d_k = d_model // num_heads self.num_heads = num_heads self.linears = clones(nn.Linear(d_model, d_model), 4) def forward(self, query, key, value, mask=None): batch_size = query.size(0) # Apply linear projection to each head's input. query, key, value = [ l(x).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2) for l, x in zip(self.linears, (query, key, value)) ] scores = ... p_attn = ... if mask is not None: mask = mask.unsqueeze(1) scores = scores.masked_fill(mask == 0, -1e9) attn_output_weights = ... context_layer = ... return context_layer, attn_output_weights ``` 此代码片段展示了如何实现一个多头潜在注意力层,其中包含了线性变换、分组操作以及掩码应用等功能模块。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值