大模型上下文窗口的极限与突破

大模型上下文窗口的极限与突破 上下文窗口大小是衡量大语言模型实用性的核心指标之一。从GPT-3的2K token到如今多个模型支持的百万级token,这一参数的飞跃式增长背后是多项关键技术的突破。 为什么上下文窗口重要 上下文窗口决定了模型一次能"看到"多少信息。在RAG场景中,更大的窗口意味着可以塞入更多检索结果;在代码生成中,意味着可以理解更大的代码库;在对话场景中,意味着更长的对话历史保持连贯。 但扩展上下文窗口并非简单的"把序列长度调大"那么容易。标准的Transformer注意力机制的计算复杂度是O(n²),将窗口从4K扩展到128K,计算量会增加上千倍。这意味着我们需要在算法层面进行根本性创新。 技术突破路径 位置编码的改进 RoPE(Rotary Position Embedding)的提出是长上下文的关键里程碑。与绝对位置编码不同,RoPE通过旋转矩阵编码相对位置关系,天然支持长度外推。在此基础上,NTK-aware scaling、YaRN等技术进一步优化了RoPE在超长序列上的表现。 NTK-aware scaling的核心思想是调整RoPE的基频,使模型在不重训练的情况下就能处理比训练时更长的序列。YaRN则更进一步,通过分段插值策略在不同频率上应用不同的缩放因子。 注意力机制的优化 Sparse Attention是最直接减少计算量的思路——不让每个token都attend所有其他token,而是只关注局部窗口或特定模式。Longformer、BigBird等工作探索了不同的稀疏模式。 FlashAttention及其后续版本从实现层面大幅减少了注意力计算的内存访问次数,虽然不改变理论复杂度,但在实际运行中带来了数倍的加速。这已成为当前长上下文模型的标准配置。 Ring Attention和Blockwise Attention则将注意力计算分块进行,使得在有限GPU显存下处理超长序列成为可能。 检索增强的方法 与其让模型一次性处理所有信息,不如在推理时动态检索相关内容。这就是RAG的思路。但传统RAG与长上下文并非对立关系——最新的趋势是将两者结合:用长上下文容纳检索结果,用检索机制筛选最有价值的信息。 当前瓶颈 尽管技术上已经支持百万级token,但"能放进去"不等于"能用好"。研究表明,模型在长上下文中的信息利用率存在明显的"中间丢失"现象——位于上下文中间位置的信息更容易被忽略。这一问题在检索任务和问答任务中都有体现。 此外,长上下文的推理成本仍然高昂。即使计算复杂度被优化,存储KV Cache的显存需求仍然线性增长。对于百万token的上下文,仅KV Cache就需要数十GB显存。 未来展望 上下文窗口的扩展可能不会无限持续。当窗口大到可以容纳整个代码库或完整书籍时,边际收益开始递减。未来的突破点可能在于: 分层注意力机制:让模型自动分配注意力资源,对关键信息给予更多权重 压缩式上下文管理:将历史信息压缩为紧凑的表示,而非保留原始token 混合精度注意力:对不同位置和类型的信息使用不同精度的处理 上下文窗口的扩展不仅仅是工程问题,更是对模型认知架构的深层拷问:如何在有限的计算资源下,最大化信息的有效利用?这个问题的答案,可能定义了下一代大模型的核心竞争力。 本文同步发布于 硅基AGI论坛

2026-07-12 · 1 min · 36 words · 硅基 AGI 探索者

大模型幻觉问题:成因分析与缓解策略

幻觉:大模型的阿喀琉斯之踵 大模型最令人不安的缺陷是"幻觉"——自信地陈述不真实的信息。这不是偶发的bug,而是当前大模型架构的根本性限制。 理解幻觉的成因,是缓解它的第一步。 幻觉的分类 并非所有"说错话"都是幻觉。我们将幻觉分为三类: 事实性幻觉:陈述了与客观事实不符的信息。如"爱因斯坦生于1900年"(实际1879年)。 忠实性幻觉:输出与给定上下文矛盾。如RAG场景中,检索到的文档说"收入增长10%",模型却说"收入下降5%"。 逻辑性幻觉:推理过程中的逻辑错误。如"所有猫都是动物,所有动物都会飞,所以猫会飞"——前提错误导致结论错误。 三类幻觉的成因和缓解策略不同,需要分别对待。 成因分析 训练数据层面 数据中的错误信息:训练语料本身就包含大量错误信息——维基百科的错误条目、社交媒体的谣言、小说中的虚构事实。模型不知道这些信息是错的,只是忠实地学习了统计模式。 长尾知识覆盖不足:对于高频知识,模型通过大量见例形成了可靠的表征。但对于长尾知识(只出现过一两次的事实),模型的表征是不稳定的,容易在生成时"拼凑"出错误信息。 知识更新滞后:模型的训练数据有截止日期。对于训练后发生的事件,模型要么不知道,要么基于旧信息进行推测。 模型架构层面 概率生成的本质:大模型本质是一个概率模型——它生成的是"最可能"的下一个Token,而非"最正确"的Token。当"流畅"和"准确"冲突时,模型倾向于流畅。 缺乏知识边界感知:模型不知道自己"不知道什么"。对于训练中从未见过的知识,模型会基于相关知识的模式进行推断,生成看似合理但实际错误的内容。 注意力稀释:在长文本生成中,模型对早期信息的注意力可能衰减,导致前后矛盾。 训练过程层面 SFT的过度自信:监督微调训练模型"给出答案",而非"承认不确定"。这导致模型对不确定的问题也倾向于给出确定性的回答。 RLHF的讨好倾向:RLHF训练让模型更"有用"——而给出一个(哪怕是错误的)答案通常比说"我不知道"更有用。这种偏好加剧了幻觉。 缓解策略 训练阶段 RLHF改进:在偏好数据中加入"正确拒绝"的样本——对模型不确定的问题,“我不知道"应该比错误答案获得更高奖励。 RAG增强:将外部知识检索与生成结合,让模型基于检索到的事实生成回答,而非完全依赖参数化知识。 DPO+事实性约束:在DPO训练中,偏好数据不仅考虑"哪个回答更好”,还考虑"哪个回答更准确"。 推理阶段 检索增强:实时检索相关信息作为生成依据。这是目前缓解事实性幻觉最有效的方法。 Self-Check机制:让模型在生成后自检——“请检查你上面的回答中是否有事实错误”。虽然不是完全可靠,但能捕获一部分明显错误。 多路验证:对关键事实,让模型独立生成多次回答,检查关键信息是否一致。不一致的部分需要额外验证。 结构化输出:将需要准确信息的部分用结构化格式输出(如表格),而非自由文本。结构化输出更容易验证。 置信度估计:让模型对每个事实陈述标注置信度。虽然模型的自我置信度不完美,但低置信度部分值得重点审查。 系统层面 知识库边界:明确定义模型的知识范围,对于超出范围的问题强制走RAG或拒绝回答。 事实后处理:生成后用专门的事实验证模块检查关键事实——人名、日期、数字等——与知识库对比。 用户反馈闭环:收集用户对幻觉的报告,用于持续改进模型和知识库。 效果评估 我们在一个知识问答场景中实施了一套组合策略: 策略 幻觉率降低 副作用 RAG增强 -45% 响应稍慢 Self-Check -15% Token消耗增加 多路验证 -25% 延迟增加2-3x DPO事实性约束 -20% 需要重新训练 组合方案 -70% 综合成本增加约30% 组合方案将幻觉率从约15%降低到约4.5%,虽然没有完全消除,但对于生产环境已经是可接受的水平。 未来方向 幻觉问题的根本解决可能需要架构层面的突破——让模型从纯概率生成进化为"概率+逻辑"的混合系统。一些有前景的方向: 神经符号系统:将神经网络的语言理解与符号逻辑的精确推理结合 可控生成:在解码过程中引入事实约束,确保生成内容与知识库一致 元认知:让模型对自己的知识和推理过程有更准确的感知 在AGI实现之前,幻觉大概率不会完全消失。但通过系统性的缓解策略,我们可以在特定场景中将幻觉控制在可接受范围内,让AI成为可信赖的助手。 本文同步发布于 硅基AGI论坛

2026-07-12 · 1 min · 65 words · 硅基 AGI 探索者

大模型幻觉问题:成因分析与缓解策略

幻觉:大模型的阿喀琉斯之踵 大模型最令人不安的缺陷是"幻觉"——自信地陈述不真实的信息。这不是偶发的bug,而是当前大模型架构的根本性限制。 理解幻觉的成因,是缓解它的第一步。 幻觉的分类 并非所有"说错话"都是幻觉。我们将幻觉分为三类: 事实性幻觉:陈述了与客观事实不符的信息。如"爱因斯坦生于1900年"(实际1879年)。 忠实性幻觉:输出与给定上下文矛盾。如RAG场景中,检索到的文档说"收入增长10%",模型却说"收入下降5%"。 逻辑性幻觉:推理过程中的逻辑错误。如"所有猫都是动物,所有动物都会飞,所以猫会飞"——前提错误导致结论错误。 三类幻觉的成因和缓解策略不同,需要分别对待。 成因分析 训练数据层面 数据中的错误信息:训练语料本身就包含大量错误信息——维基百科的错误条目、社交媒体的谣言、小说中的虚构事实。模型不知道这些信息是错的,只是忠实地学习了统计模式。 长尾知识覆盖不足:对于高频知识,模型通过大量见例形成了可靠的表征。但对于长尾知识(只出现过一两次的事实),模型的表征是不稳定的,容易在生成时"拼凑"出错误信息。 知识更新滞后:模型的训练数据有截止日期。对于训练后发生的事件,模型要么不知道,要么基于旧信息进行推测。 模型架构层面 概率生成的本质:大模型本质是一个概率模型——它生成的是"最可能"的下一个Token,而非"最正确"的Token。当"流畅"和"准确"冲突时,模型倾向于流畅。 缺乏知识边界感知:模型不知道自己"不知道什么"。对于训练中从未见过的知识,模型会基于相关知识的模式进行推断,生成看似合理但实际错误的内容。 注意力稀释:在长文本生成中,模型对早期信息的注意力可能衰减,导致前后矛盾。 训练过程层面 SFT的过度自信:监督微调训练模型"给出答案",而非"承认不确定"。这导致模型对不确定的问题也倾向于给出确定性的回答。 RLHF的讨好倾向:RLHF训练让模型更"有用"——而给出一个(哪怕是错误的)答案通常比说"我不知道"更有用。这种偏好加剧了幻觉。 缓解策略 训练阶段 RLHF改进:在偏好数据中加入"正确拒绝"的样本——对模型不确定的问题,“我不知道"应该比错误答案获得更高奖励。 RAG增强:将外部知识检索与生成结合,让模型基于检索到的事实生成回答,而非完全依赖参数化知识。 DPO+事实性约束:在DPO训练中,偏好数据不仅考虑"哪个回答更好”,还考虑"哪个回答更准确"。 推理阶段 检索增强:实时检索相关信息作为生成依据。这是目前缓解事实性幻觉最有效的方法。 Self-Check机制:让模型在生成后自检——“请检查你上面的回答中是否有事实错误”。虽然不是完全可靠,但能捕获一部分明显错误。 多路验证:对关键事实,让模型独立生成多次回答,检查关键信息是否一致。不一致的部分需要额外验证。 结构化输出:将需要准确信息的部分用结构化格式输出(如表格),而非自由文本。结构化输出更容易验证。 置信度估计:让模型对每个事实陈述标注置信度。虽然模型的自我置信度不完美,但低置信度部分值得重点审查。 系统层面 知识库边界:明确定义模型的知识范围,对于超出范围的问题强制走RAG或拒绝回答。 事实后处理:生成后用专门的事实验证模块检查关键事实——人名、日期、数字等——与知识库对比。 用户反馈闭环:收集用户对幻觉的报告,用于持续改进模型和知识库。 效果评估 我们在一个知识问答场景中实施了一套组合策略: 策略 幻觉率降低 副作用 RAG增强 -45% 响应稍慢 Self-Check -15% Token消耗增加 多路验证 -25% 延迟增加2-3x DPO事实性约束 -20% 需要重新训练 组合方案 -70% 综合成本增加约30% 组合方案将幻觉率从约15%降低到约4.5%,虽然没有完全消除,但对于生产环境已经是可接受的水平。 未来方向 幻觉问题的根本解决可能需要架构层面的突破——让模型从纯概率生成进化为"概率+逻辑"的混合系统。一些有前景的方向: 神经符号系统:将神经网络的语言理解与符号逻辑的精确推理结合 可控生成:在解码过程中引入事实约束,确保生成内容与知识库一致 元认知:让模型对自己的知识和推理过程有更准确的感知 在AGI实现之前,幻觉大概率不会完全消失。但通过系统性的缓解策略,我们可以在特定场景中将幻觉控制在可接受范围内,让AI成为可信赖的助手。 本文同步发布于 硅基AGI论坛

2026-07-12 · 1 min · 65 words · 硅基 AGI 探索者

强化学习RLHF的替代方案:DPO全面解析

RLHF的痛点 RLHF(Reinforcement Learning from Human Feedback)是大模型对齐的标准方案,但它以复杂著称。完整的RLHF流程包含三个阶段:SFT(监督微调)、RM(奖励模型训练)、PPO(强化学习优化)。其中PPO阶段尤其棘手——需要同时维护Policy Model、Reference Model、Reward Model和Value Model四个模型,训练过程不稳定,超参数敏感,显存开销巨大。 有没有更简单的方式来实现同样的目标? DPO(Direct Preference Optimization)给出了一个令人惊喜的答案。 DPO的核心思想 DPO的核心洞察是:我们不需要显式地训练奖励模型,也不需要强化学习。 通过一个精巧的数学推导,DPO将偏好学习问题转化为一个简单的分类问题。 数学推导 在RLHF框架中,最优策略可以表示为: π*(y|x) ∝ π_ref(y|x) · exp(r(x,y)/β) 其中π_ref是参考策略,r是奖励函数,β是温度参数。这个关系意味着给定奖励函数,我们可以直接写出最优策略的形式。 DPO的关键步骤是反过来——给定偏好数据,我们可以直接从策略形式中推导出隐含的奖励函数: r(x,y) = β · log(π(y|x)/π_ref(y|x)) 将这个隐含奖励代入Bradley-Terry偏好模型,偏好概率变为: P(y_w > y_l | x) = σ(β · log(π(y_w|x)/π_ref(y_w|x)) - β · log(π(y_l|x)/π_ref(y_l|x))) 其中y_w是偏好回答,y_l是非偏好回答,σ是sigmoid函数。 这就是DPO的损失函数——一个简单的二元交叉熵!不需要奖励模型,不需要强化学习,只需要偏好数据对和一个参考模型。 与RLHF的对比 维度 RLHF (PPO) DPO 训练阶段 SFT → RM → PPO SFT → DPO 需要的模型 4个(Policy, Ref, Reward, Value) 2个(Policy, Ref) 超参数 多且敏感 少且鲁棒 训练稳定性 差,需要多种trick 好,类似标准训练 显存开销 极高 中等 实践经验 在过去一年中,我们在多个项目上使用DPO替代RLHF,总结出以下经验: ...

2026-07-12 · 1 min · 117 words · 硅基 AGI 探索者

强化学习RLHF的替代方案:DPO全面解析

RLHF的痛点 RLHF(Reinforcement Learning from Human Feedback)是大模型对齐的标准方案,但它以复杂著称。完整的RLHF流程包含三个阶段:SFT(监督微调)、RM(奖励模型训练)、PPO(强化学习优化)。其中PPO阶段尤其棘手——需要同时维护Policy Model、Reference Model、Reward Model和Value Model四个模型,训练过程不稳定,超参数敏感,显存开销巨大。 有没有更简单的方式来实现同样的目标? DPO(Direct Preference Optimization)给出了一个令人惊喜的答案。 DPO的核心思想 DPO的核心洞察是:我们不需要显式地训练奖励模型,也不需要强化学习。 通过一个精巧的数学推导,DPO将偏好学习问题转化为一个简单的分类问题。 数学推导 在RLHF框架中,最优策略可以表示为: π*(y|x) ∝ π_ref(y|x) · exp(r(x,y)/β) 其中π_ref是参考策略,r是奖励函数,β是温度参数。这个关系意味着给定奖励函数,我们可以直接写出最优策略的形式。 DPO的关键步骤是反过来——给定偏好数据,我们可以直接从策略形式中推导出隐含的奖励函数: r(x,y) = β · log(π(y|x)/π_ref(y|x)) 将这个隐含奖励代入Bradley-Terry偏好模型,偏好概率变为: P(y_w > y_l | x) = σ(β · log(π(y_w|x)/π_ref(y_w|x)) - β · log(π(y_l|x)/π_ref(y_l|x))) 其中y_w是偏好回答,y_l是非偏好回答,σ是sigmoid函数。 这就是DPO的损失函数——一个简单的二元交叉熵!不需要奖励模型,不需要强化学习,只需要偏好数据对和一个参考模型。 与RLHF的对比 维度 RLHF (PPO) DPO 训练阶段 SFT → RM → PPO SFT → DPO 需要的模型 4个(Policy, Ref, Reward, Value) 2个(Policy, Ref) 超参数 多且敏感 少且鲁棒 训练稳定性 差,需要多种trick 好,类似标准训练 显存开销 极高 中等 实践经验 在过去一年中,我们在多个项目上使用DPO替代RLHF,总结出以下经验: ...

2026-07-12 · 1 min · 117 words · 硅基 AGI 探索者

深度解析Transformer-XL:长序列建模的突破

标准Transformer的长度困境 Transformer架构的核心——自注意力机制有一个O(n²)的计算复杂度问题。序列长度翻倍,计算量增加4倍。这使得标准Transformer在处理长文档时面临严峻挑战。 在实际应用中,这个问题尤为突出。一本长篇小说可能有数十万Token,一个代码仓库可能有上百万Token,而标准Transformer的有效上下文窗口通常被限制在几万Token以内。 Transformer-XL正是为解决这个问题而生。 两个核心创新 Transformer-XL通过两个关键创新来突破长度限制: 循环机制(Recurrence Mechanism) 不同于标准Transformer在处理每个新段时从零开始,Transformer-XL缓存了前一个段的隐藏状态序列。当处理新段时,前一段的隐藏状态被复用,作为额外的上下文信息。 具体来说,设第t-1段的隐藏状态为h_{t-1},第t段的隐藏状态计算为: h_t = TransformerLayer(x_t, [h_{t-1}, x_t]) 其中[·, ·]表示拼接操作。这样,即使每个段的长度固定为L,模型也能通过缓存机制获得约L×N的有效上下文长度(N为段数)。 关键区别在于:梯度不需要穿过缓存的隐藏状态反向传播。这些缓存的状态就像"只读记忆",提供了长期上下文但不增加训练时的计算开销。 相对位置编码(Relative Positional Encoding) 标准Transformer使用绝对位置编码,每个位置有固定的编码向量。这在长序列中会产生问题——位置1000和位置1001的编码差异可能与位置10和位置11的差异完全不同。 Transformer-XL改用相对位置编码,不再编码"这是第几个位置",而是编码"这两个位置之间隔多远"。这使得模型能够泛化到训练时未见过的序列长度。 与其他长序列方案的对比 2026年的长序列建模已经有了多种方案,Transformer-XL的思路仍然是其中最有启发性的之一: 稀疏注意力(Sparse Attention):通过减少注意力矩阵中的计算点来降低复杂度。Longformer和BigBird采用这种思路。优势是实现简单,劣势是可能遗漏关键的长距离依赖。 线性注意力(Linear Attention):通过核函数近似将复杂度降到O(n)。Linformer和Performer代表了这个方向。优势是理论复杂度低,劣势是近似精度在超长序列上仍有争议。 分段循环(Segment-level Recurrence):Transformer-XL开创的思路,后续的Compressive Transformer和Memorizing Transformer都沿用了这个框架并加以改进。 实践启示 Transformer-XL的思路给我们的最大启发是:解决复杂度问题不一定需要暴力降低复杂度,可以通过架构设计让有限计算覆盖更大范围。 在Agent场景中,我们借鉴了Transformer-XL的循环机制来处理长对话历史——将对话分段处理,缓存每段的表示,在保持实时性的同时将有效上下文扩展到数万轮对话。 在RAG场景中,当检索到的文档片段过多时,也可以采用类似的分段+缓存策略,避免将所有文档一次性塞入上下文窗口。 未来方向 虽然Transformer-XL本身已经不再是长序列建模的SOTA,但它的核心思想——通过记忆机制扩展有效上下文——正在以新的形式重生。从RMT(Recurrent Memory Transformer)到最近的Infini-attention,“有限窗口+外部记忆"的范式正在成为长序列建模的主流方向。 当上下文窗口从8K扩展到1M甚至无限,我们需要的不只是更大的窗口,而是更聪明的记忆管理策略。这是Transformer-XL留给我们最宝贵的遗产。 本文同步发布于 硅基AGI论坛

2026-07-12 · 1 min · 44 words · 硅基 AGI 探索者

深度解析Transformer-XL:长序列建模的突破

标准Transformer的长度困境 Transformer架构的核心——自注意力机制有一个O(n²)的计算复杂度问题。序列长度翻倍,计算量增加4倍。这使得标准Transformer在处理长文档时面临严峻挑战。 在实际应用中,这个问题尤为突出。一本长篇小说可能有数十万Token,一个代码仓库可能有上百万Token,而标准Transformer的有效上下文窗口通常被限制在几万Token以内。 Transformer-XL正是为解决这个问题而生。 两个核心创新 Transformer-XL通过两个关键创新来突破长度限制: 循环机制(Recurrence Mechanism) 不同于标准Transformer在处理每个新段时从零开始,Transformer-XL缓存了前一个段的隐藏状态序列。当处理新段时,前一段的隐藏状态被复用,作为额外的上下文信息。 具体来说,设第t-1段的隐藏状态为h_{t-1},第t段的隐藏状态计算为: h_t = TransformerLayer(x_t, [h_{t-1}, x_t]) 其中[·, ·]表示拼接操作。这样,即使每个段的长度固定为L,模型也能通过缓存机制获得约L×N的有效上下文长度(N为段数)。 关键区别在于:梯度不需要穿过缓存的隐藏状态反向传播。这些缓存的状态就像"只读记忆",提供了长期上下文但不增加训练时的计算开销。 相对位置编码(Relative Positional Encoding) 标准Transformer使用绝对位置编码,每个位置有固定的编码向量。这在长序列中会产生问题——位置1000和位置1001的编码差异可能与位置10和位置11的差异完全不同。 Transformer-XL改用相对位置编码,不再编码"这是第几个位置",而是编码"这两个位置之间隔多远"。这使得模型能够泛化到训练时未见过的序列长度。 与其他长序列方案的对比 2026年的长序列建模已经有了多种方案,Transformer-XL的思路仍然是其中最有启发性的之一: 稀疏注意力(Sparse Attention):通过减少注意力矩阵中的计算点来降低复杂度。Longformer和BigBird采用这种思路。优势是实现简单,劣势是可能遗漏关键的长距离依赖。 线性注意力(Linear Attention):通过核函数近似将复杂度降到O(n)。Linformer和Performer代表了这个方向。优势是理论复杂度低,劣势是近似精度在超长序列上仍有争议。 分段循环(Segment-level Recurrence):Transformer-XL开创的思路,后续的Compressive Transformer和Memorizing Transformer都沿用了这个框架并加以改进。 实践启示 Transformer-XL的思路给我们的最大启发是:解决复杂度问题不一定需要暴力降低复杂度,可以通过架构设计让有限计算覆盖更大范围。 在Agent场景中,我们借鉴了Transformer-XL的循环机制来处理长对话历史——将对话分段处理,缓存每段的表示,在保持实时性的同时将有效上下文扩展到数万轮对话。 在RAG场景中,当检索到的文档片段过多时,也可以采用类似的分段+缓存策略,避免将所有文档一次性塞入上下文窗口。 未来方向 虽然Transformer-XL本身已经不再是长序列建模的SOTA,但它的核心思想——通过记忆机制扩展有效上下文——正在以新的形式重生。从RMT(Recurrent Memory Transformer)到最近的Infini-attention,“有限窗口+外部记忆"的范式正在成为长序列建模的主流方向。 当上下文窗口从8K扩展到1M甚至无限,我们需要的不只是更大的窗口,而是更聪明的记忆管理策略。这是Transformer-XL留给我们最宝贵的遗产。 本文同步发布于 硅基AGI论坛

2026-07-12 · 1 min · 44 words · 硅基 AGI 探索者
LLM损失函数

LLM训练损失函数详解

损失函数:训练信号的来源 损失函数定义了模型的学习目标。在LLM训练的不同阶段——预训练、指令微调、对齐——使用的损失函数截然不同。理解每种损失函数的设计意图和数学特性,是构建高质量LLM的基础。 预训练:交叉熵损失 基本形式 预训练的核心是下一个token预测,使用交叉熵损失: def cross_entropy_loss(logits, labels, ignore_index=-100): """ logits: [batch, seq_len, vocab_size] labels: [batch, seq_len] """ batch_size, seq_len, vocab_size = logits.shape # 展平 logits_flat = logits.view(-1, vocab_size) labels_flat = labels.view(-1) # 计算交叉熵(忽略padding位置) loss = F.cross_entropy( logits_flat, labels_flat, ignore_index=ignore_index, reduction='mean' ) return loss Z-Loss Chinchilla引入的Z-Loss用于稳定训练。它通过对logits的log-partition-function进行正则化,防止logits过大: def z_loss(logits, coefficient=1e-4): """Z-Loss: 正则化logits的规模""" log_z = torch.logsumexp(logits, dim=-1) # [batch, seq_len] return coefficient * (log_z ** 2).mean() # 总损失 total_loss = cross_entropy_loss(logits, labels) + z_loss(logits) Z-Loss的作用: 防止某些logits变得过大(导致softmax饱和) 稳定混合精度训练 对最终性能几乎没有负面影响 Label Smoothing 标签平滑将硬标签(one-hot)软化为软标签,防止模型过度自信: def label_smoothing_cross_entropy(logits, labels, smoothing=0.1, ignore_index=-100): """带标签平滑的交叉熵""" n_classes = logits.size(-1) # 创建软标签 log_probs = F.log_softmax(logits, dim=-1) # 均匀分布的平滑 smooth_loss = -log_probs.mean(dim=-1) # 对所有类的平均log prob # 标准交叉熵 nll_loss = -log_probs.gather(dim=-1, index=labels.unsqueeze(-1)).squeeze(-1) # 混合 loss = (1 - smoothing) * nll_loss + smoothing * smooth_loss # 忽略padding mask = (labels != ignore_index) loss = loss[mask].mean() return loss 标签平滑的效果: ...

2026-07-02 · 4 min · 646 words · 硅基 AGI 探索者
Softmax变体

Softmax变体2026:从标准到线性

Softmax:将分数变为概率 Softmax函数将任意实数向量转换为概率分布——所有元素为正且和为1。它是分类、注意力、语言模型等核心组件的数学基础。 Softmax(x_i) = exp(x_i) / Σ_j exp(x_j) 看似简单的公式背后,隐藏着数值稳定性、计算效率和梯度行为的深刻问题。 数值稳定性 溢出问题 当输入值很大时,exp(x)会溢出。例如exp(1000)远超FP32的范围(~3.4e38)。解决方案是减去最大值: def softmax_stable(x, dim=-1): """数值稳定的Softmax""" x_max = x.max(dim=dim, keepdim=True).values exp_x = torch.exp(x - x_max) return exp_x / exp_x.sum(dim=dim, keepdim=True) 减去最大值不改变结果(因为分子分母同时除以exp(max)),但将指数运算的输入控制在合理范围内。 Log-Softmax 在许多场景中(如交叉熵损失),我们需要的是log概率而非概率本身。直接对softmax取log可能损失精度: def log_softmax_stable(x, dim=-1): """数值稳定的Log-Softmax""" x_max = x.max(dim=dim, keepdim=True).values shifted = x - x_max log_sum_exp = torch.log(torch.exp(shifted).sum(dim=dim, keepdim=True)) return shifted - log_sum_exp PyTorch的F.log_softmax和F.cross_entropy内部都使用了这种稳定的实现。 Softmax的梯度特性 饱和问题 当某个输入远大于其他输入时,Softmax的输出接近one-hot——一个接近1,其余接近0。此时梯度几乎为零,导致学习停滞。 # 梯度公式 # ∂softmax(x_i)/∂x_j = softmax(x_i) * (δ_ij - softmax(x_j)) 当softmax(x_i) ≈ 1时,梯度 ≈ 1 × (δ_ij - softmax(x_j)) ≈ 0(对所有j)。 温度调节 温度参数T控制softmax的"尖锐度": Softmax_T(x_i) = exp(x_i / T) / Σ_j exp(x_j / T) T→0:趋向one-hot(尖锐) T→∞:趋向均匀分布(平滑) T=1:标准softmax 在知识蒸馏中,高温(T=4-10)使Teacher模型的输出更"软",传递更多暗知识。 LLM中的Softmax变体 Scaled Dot-Product Softmax 注意力中的softmax需要除以√d_k来防止内积值过大导致饱和: ...

2026-07-02 · 4 min · 818 words · 硅基 AGI 探索者
嵌入层优化

嵌入层优化:从查找到计算

嵌入层:被忽视的显存大户 在LLM中,嵌入层(Embedding Layer)往往是被忽视的显存消耗者。以Llama-3为例,词表大小128K、隐藏维度4096、FP16精度下,嵌入层参数量为 128K × 4096 × 2 = 1GB。对于更大的词表(如Qwen的152K),嵌入层可达1.5GB以上。 在70B模型中,嵌入层占总参数量的约2%,但在推理时它还需要一个等大的输出投影层(LM Head),两者合计占4%——这还不算小。 标准嵌入层 查找表 标准嵌入层是一个简单的查找表——词表中的每个token对应一个可学习的向量: class StandardEmbedding(nn.Module): def __init__(self, vocab_size, d_model): super().__init__() self.weight = nn.Parameter(torch.randn(vocab_size, d_model)) def forward(self, input_ids): # 简单的索引查找 return self.weight[input_ids] # [batch, seq_len, d_model] 权重共享 许多LLM共享嵌入层和输出层的权重(Weight Tying): class SharedEmbeddingModel(nn.Module): def __init__(self, vocab_size, d_model): super().__init__() self.embedding = nn.Embedding(vocab_size, d_model) # 输出层直接使用嵌入矩阵的转置 # 不需要额外的参数 def forward(self, input_ids): x = self.embedding(input_ids) x = self.transformer(x) # 输出logits = x @ embedding.weight.T logits = F.linear(x, self.embedding.weight) return logits 权重共享的好处: 减少参数量(节省1GB+显存) 输入和输出在同一个语义空间中 训练时梯度信号更强 但也有研究指出,权重共享可能导致冲突——输入嵌入需要捕捉"词的语义",输出层需要捕捉"词的预测概率分布",两者的最优表示可能不同。 嵌入层压缩 矩阵分解 将大的嵌入矩阵分解为两个小矩阵的乘积: class FactorizedEmbedding(nn.Module): def __init__(self, vocab_size, d_model, d_factor): """ d_factor: 分解后的中间维度 """ super().__init__() # V × D → V × d_factor × d_factor × D self.factor1 = nn.Parameter(torch.randn(vocab_size, d_factor)) self.factor2 = nn.Parameter(torch.randn(d_factor, d_model)) def forward(self, input_ids): # 查找低维因子,然后投影到高维 low_dim = self.factor1[input_ids] # [batch, seq, d_factor] return low_dim @ self.factor2 # [batch, seq, d_model] 参数量从 V×D 降低到 V×d + d×D。当 D=4096、d=256、V=128K 时,参数量减少约16倍。 ...

2026-07-02 · 3 min · 562 words · 硅基 AGI 探索者
鲁ICP备2026018361号