- encoder中的self-attention和decoder中的self-attention有什么区别
Transformer 编码器(Encoder)的**多头自注意力(Multi-Head Self-Attention)**与解码器(Decoder)的**掩码多头自注意力(Masked Multi-Head Self-Attention)**,核心差异源于两者的任务目标不同:**Encoder 负责"理解输入序列的全局语义",需双向关注所有 token;Decoder 负责"生成连贯的输出序列",需单向关注已生成的 token,防止泄露未来信息**。
两者的本质区别集中在**注意力掩码机制**,并由此衍生出注意力范围、输入特性、作用目标等一系列差异。
一、核心定义回顾
先明确 Transformer 中两类自注意力的定位:
-
**Encoder 自注意力**:是 Encoder 块的第一个子层,输入为 **Encoder 自身的词嵌入+位置编码**,作用是捕捉输入序列的全局依赖关系。
-
**Decoder 自注意力**:是 Decoder 块的第一个子层,输入为 **Decoder 自身的词嵌入+位置编码**,作用是捕捉已生成输出序列的上下文依赖关系;Decoder 块还有第二个注意力层(Encoder-Decoder Attention),这是跨注意力而非自注意力,需注意区分。
二、关键区别对比
| 对比维度 | **Encoder 多头自注意力** | **Decoder 掩码多头自注意力** |
|----------|--------------------------|-------------------------------|
| **注意力范围** | **双向(Bidirectional)**:任意 token 可以关注序列中**所有位置**的 token | **单向(Unidirectional/Causal)**:第 t 个 token 只能关注**第 1~t 个** token,无法关注 t+1 及以后的 token |
| **掩码类型** | 无掩码(或仅 padding mask):仅屏蔽 padding 填充的无效 token | **因果掩码(Causal Mask)+ padding mask**:<br>1. 因果掩码:强制 token 只能看前文,防止"未来信息泄露"<br>2. padding mask:屏蔽输出序列的 padding token |
| **输入特性** | 输入序列是**固定长度的完整序列**,训练和推理时均为并行输入 | 训练时输入是完整的目标序列(并行计算),推理时是**逐token增量生成**(从 bos 到 eos) |
| **核心作用** | 建模输入序列的**全局语义关联**,例如在翻译任务中,理解"我爱中国"中"我""爱""中国"的依存关系 | 建模输出序列的**上下文连贯性**,例如在翻译任务中,生成" I love China"时,生成"love"需依赖前文的"I",生成"China"需依赖"I love" |
| **适用任务** | 自然语言理解(NLU):如文本分类、命名实体识别、语义理解 | 自然语言生成(NLG):如机器翻译、文本摘要、对话生成 |
| **注意力分数计算** | Attention(Q,K,V) = \\text{softmax}\\left(\\frac{QK\^T}{\\sqrt{d_k}} + M_{\\text{pad}}\\right)V<br>M_{\\text{pad}} 仅屏蔽 padding 位置 | Attention(Q,K,V) = \\text{softmax}\\left(\\frac{QK\^T}{\\sqrt{d_k}} + M_{\\text{causal}} + M_{\\text{pad}}\\right)V<br>M_{\\text{causal}} 是下三角掩码,上三角元素设为 -\\infty |
三、核心差异的根源:因果掩码机制
两类自注意力的本质区别是**是否引入因果掩码**,我们通过具体原理和实现来理解:
3.1 因果掩码的作用原理
在 Decoder 中,生成任务要求"**根据前文生成下一个 token**",如果允许 token 关注未来的 token,模型就会"作弊"(比如生成第 3 个 token 时已经看到了第 5 个 token),导致推理时无法正常生成序列。
因果掩码是一个 **下三角矩阵**(对角线及下方为 0,上方为 -\\infty),假设序列长度为 4,掩码矩阵 M_{\\text{causal}} 如下:
M_{\\text{causal}} = \\begin{bmatrix} 0 \& -\\infty \& -\\infty \& -\\infty \\\\ 0 \& 0 \& -\\infty \& -\\infty \\\\ 0 \& 0 \& 0 \& -\\infty \\\\ 0 \& 0 \& 0 \& 0 \\end{bmatrix}
将该掩码加到注意力分数矩阵 QK\^T/\\sqrt{d_k} 上后,上三角区域的分数会变成 -\\infty,经过 `softmax` 后权重为 **0**,从而强制 token 只能关注前文。
3.2 实现层面的差异(PyTorch 示例)
我们通过代码片段直观展示两者的掩码差异:
```python
import torch
import torch.nn.functional as F
模拟 Q, K, V:batch_size, n_heads, seq_len, d_k
batch_size, n_heads, seq_len, d_k = 2, 8, 4, 64
q = k = v = torch.randn(batch_size, n_heads, seq_len, d_k)
-------------------------- Encoder 自注意力:仅 padding mask --------------------------
假设 padding_mask:batch_size, 1, 1, seq_len,1 表示有效 token,0 表示 padding
padding_mask = torch.tensor(\[\[\[1,1,0,0]], \[\[1,1,1,0]]]) # batch 1 的 seq 3-4 是 padding,batch 2 的 seq4 是 padding
padding_mask = (1 - padding_mask) * -10000.0 # padding 位置设为 -1e4
计算注意力分数:无因果掩码
attn_scores_encoder = torch.matmul(q, k.transpose(-2, -1)) / torch.sqrt(torch.tensor(d_k, dtype=torch.float32))
attn_scores_encoder += padding_mask # 仅加 padding mask
attn_weights_encoder = F.softmax(attn_scores_encoder, dim=-1)
-------------------------- Decoder 自注意力:因果掩码 + padding mask --------------------------
1. 生成因果掩码:1, 1, seq_len, seq_len
causal_mask = torch.tril(torch.ones(1, 1, seq_len, seq_len))
causal_mask = (1 - causal_mask) * -10000.0 # 上三角设为 -1e4
2. 叠加因果掩码和 padding mask
attn_scores_decoder = torch.matmul(q, k.transpose(-2, -1)) / torch.sqrt(torch.tensor(d_k, dtype=torch.float32))
attn_scores_decoder += causal_mask + padding_mask # 加两种掩码
attn_weights_decoder = F.softmax(attn_scores_decoder, dim=-1)
print("Encoder 注意力权重形状:", attn_weights_encoder.shape) # 2,8,4,4
print("Decoder 注意力权重上三角是否为 0:", (attn_weights_decoder0,0,:,:.triu(diagonal=1) == 0).all()) # True
```
四、补充:Decoder 的 Encoder-Decoder Attention
需要特别注意:Decoder 块包含**两个注意力层**,容易混淆:
-
**掩码自注意力**:输入是 Decoder 自身的序列(目标序列),作用是建模目标序列的内部依赖。
-
**Encoder-Decoder Attention**:输入的 Q 来自 Decoder 掩码自注意力的输出,K, V 来自 Encoder 的输出,作用是**关联源序列和目标序列**(比如翻译任务中,让目标词对齐源词)。
**Encoder-Decoder Attention 不是自注意力**(因为 Q 和 K,V 来自不同的序列),而我们讨论的核心是两类**自注意力**的区别。
五、总结
Encoder 自注意力和 Decoder 自注意力的核心区别,是**是否引入因果掩码**导致的**注意力范围差异**:
-
Encoder 自注意力是**双向的**,为了"理解全局",适配自然语言理解任务;
-
Decoder 自注意力是**单向的**,为了"生成连贯序列",适配自然语言生成任务。
这种设计完全服务于 Transformer 的"编码-解码"架构目标:Encoder 将输入序列编码为语义向量,Decoder 基于该向量和已生成序列,逐token生成目标序列。
- DeepSeek R1有看过吗? 介绍一下 最新64页补丁
DeepSeek R1:推理大模型的革命性突破与技术解析
DeepSeek R1 是幻方量化旗下深度求索(DeepSeek)于 **2025年1月20日** 发布的**专注推理能力**的大型语言模型,性能对标 OpenAI o1 系列,在数学、代码、自然语言推理等任务上表现突出。其核心创新在于**纯强化学习训练路径**与**MoE架构优化**,并以 MIT 协议完全开源,成为开源社区中推理能力最强的模型之一。
一、核心定位与发布背景
DeepSeek R1 诞生于大模型"推理能力竞赛"的关键时期,目标是解决传统大模型在**复杂逻辑推理、数学证明、代码生成**等任务上的短板。其发布具有三个里程碑意义:
-
首次验证**纯强化学习(无监督微调SFT)** 可训练出顶级推理能力模型
-
以 MoE 架构实现**671B总参数、37B活跃参数**的高效推理,平衡性能与算力成本
-
采用**MIT开源协议**,提供从1.5B到70B的全系列蒸馏模型,降低推理门槛
二、核心技术架构与创新
2.1 模型架构:MoE+MLA的高效组合
DeepSeek R1 基于 DeepSeek-V3 基座,采用创新混合架构:
| 架构参数 | 核心细节 |
|----------|----------|
| **总参数** | 671B(MoE架构),活跃参数37B/Token |
| **层数** | 61层Transformer,前3层为**Multi-Head Latent Attention (MLA)** 层,其余为标准注意力层 |
| **专家数量** | 128个专家,每Token激活2个专家,激活率约1.56% |
| **上下文窗口** | 128K tokens,支持超长文本推理与分析 |
| **归一化** | 采用 RMSNorm 替代 LayerNorm,提升训练效率与稳定性 |
**MLA层创新**:前3层引入潜在注意力机制,将输入映射到低维潜在空间进行注意力计算,大幅降低计算复杂度,同时保留全局语义信息。
2.2 训练范式:纯强化学习的推理锻造
DeepSeek R1 采用**四阶段训练流程**,核心是**无SFT的强化学习路径**:
-
**冷启动(Cold Start)**:用少量高质量CoT(思维链)数据预训练,使模型学会标准答案格式,解决R1-Zero的可读性问题
-
**RL锻造(GRPO算法)**:使用**GRPO(Generalized Relative Policy Optimization)** 替代PPO,在多种推理路径中自主选择最优策略,强化反思与验证能力
-
**数据反哺**:模型自生成高质量推理数据,减少对人工标注的依赖,形成"推理-数据-推理"的闭环
-
**人机融合**:引入人类偏好奖励模型,优化输出的自然性与可读性,解决R1-Zero的重复、语言混合问题
**关键突破**:R1-Zero(无冷启动)验证了纯RL可实现强大推理能力,在AIME 2024竞赛中pass1指标从15.6%提升至71.0%。
2.3 推理机制:反思+验证的深度思考模式
DeepSeek R1 的核心优势是**模拟人类推理过程**,而非直接输出答案:
-
**多路径探索**:对同一问题生成多种推理路径,通过价值函数选择最优解
-
**自我验证**:对推理结果进行交叉检查,发现矛盾时回溯修正
-
**超长思维链**:支持数万字的思维链长度,在数学证明、复杂代码生成中展现严谨逻辑
-
**幻觉抑制**:通过强化学习减少无根据断言,改写、摘要等场景幻觉率降低45%-50%
三、两大核心模型版本对比
DeepSeek R1 系列包含两个核心版本,定位与特性差异显著:
| 版本 | 训练特点 | 优势 | 不足 | 适用场景 |
|------|----------|------|------|----------|
| **R1-Zero** | 纯RL训练,无SFT,无冷启动 | 推理能力强,反思验证突出 | 重复输出、可读性差、语言混合 | 研究场景,探索纯RL极限 |
| **R1** | 冷启动+RL训练 | 平衡推理能力与可读性,幻觉率低 | 训练成本略高 | 生产环境,实际应用部署 |
四、性能表现:对标OpenAI o1的推理能力
DeepSeek R1 在多类推理任务中表现优异,部分指标超越GPT-4o、Claude 3.5:
4.1 数学推理能力
-
在AIME(美国数学邀请赛)中,pass1指标达71.0%,接近人类金牌水平
-
MATH数据集上得分89.2%,GSM8K得分98.7%,远超传统大模型
-
复杂数学证明中,思维链长度可达23K tokens,逻辑严谨性显著提升
4.2 代码生成能力
-
HumanEval测试集得分92.3%,MBPP得分94.1%,支持多语言代码生成与复杂项目开发
-
可自主发现代码错误并修复,实现"编写-测试-调试"的全流程自动化
4.3 自然语言推理
-
在BBH、MMLU等推理基准上表现优异,特别是在需要多步骤推理的任务中
-
幻觉率在改写、摘要等场景减少45%-50%,输出可靠性大幅提升
五、开源生态与应用场景
5.1 开源资源与部署选项
DeepSeek R1 提供完整的开源生态,降低使用门槛:
-
**开源模型**:R1-Zero、R1及6个蒸馏版本(1.5B、2B、7B、8B、14B、70B),均采用MIT协议
-
**推理工具**:支持Ollama、Hugging Face等主流框架,可快速部署本地推理
-
**API服务**:提供低成本API,输入4元/百万tokens,输出16元/百万tokens,缓存命中低至1元/百万tokens
5.2 典型应用场景
-
**数学科研**:自动定理证明、复杂公式推导、数学竞赛辅助
-
**软件工程**:代码生成、自动调试、架构设计、技术文档撰写
-
**金融分析**:量化策略开发、风险评估、财务报表深度解读
-
**法律领域**:合同审查、法律条文分析、判例推理
-
**教育领域**:智能辅导、个性化习题生成、解题思路分析
六、总结
DeepSeek R1 的核心价值在于:
-
**推理范式革新**:证明纯强化学习可训练出顶级推理能力,为大模型训练开辟新路径
-
**性能与效率平衡**:MoE架构使671B模型以37B活跃参数实现高效推理,大幅降低算力成本
-
**开源普惠**:MIT协议+全系列蒸馏模型,推动推理大模型在全球开发者社区的普及