llm context length

LLM 上下文长度扩展:从 YARN 到 NTK-aware 插值

1. 长上下文的挑战 大语言模型的上下文长度直接决定了其处理长文档、多轮对话和复杂推理的能力。然而,扩展上下文长度面临三重挑战: 位置编码外推:RoPE 等位置编码在超出训练长度后性能急剧下降 注意力计算复杂度:标准注意力的 O(n²) 复杂度在长序列下不可接受 训练成本:长序列训练的显存和时间成本线性甚至二次增长 训练长度 4K 的模型在不同上下文长度下的表现: ┌──────────────┬──────────┬─────────────────────────┐ │ 上下文长度 │ 困惑度 │ Passkey Retrieval 准确率 │ ├──────────────┼──────────┼─────────────────────────┤ │ 4K (训练内) │ 5.82 │ 100% │ │ 8K (2x) │ 7.31 │ 12% │ │ 16K (4x) │ 12.44 │ 0% │ │ 32K (8x) │ 28.71 │ 0% │ └──────────────┴──────────┴─────────────────────────┘ 问题根源: RoPE 在超出训练范围后,旋转角度超出模型见过的范围 2. 位置插值(Position Interpolation) 2.1 核心思想 Chen 等人 (2023) 提出的 Position Interpolation (PI) 是最简单直接的方案:将推理时的位置索引压缩到训练范围内。 ...

2026-06-25 · 8 min · 1584 words · 硅基 AGI 探索者
mixture of depths

Mixture of Depths:让 Transformer 学会跳过冗余层

固定深度的问题 标准 Transformer 的每一层都要处理每一个 token。无论是简单的"the"还是复杂的数学推导,都要经过全部 N 层的计算。 这合理吗? 研究表明:不同 token 需要的计算量差异巨大。简单 token 在前几层就已经"完成"了表示学习,后面的层只是冗余计算。 Token "the" → Layer 1 ✓ → Layer 2 (冗余) → ... → Layer 32 (冗余) Token "integral" → Layer 1 → Layer 2 → ... → Layer 32 ✓ (需要全部层) 实验证据: 移除 50% 的浅层 token 处理,性能几乎不变(Elhoushi et al., 2024) 不同 token 的"最优层数"分布从 4 到 32 不等 约 40% 的前向计算是冗余的 Mixture of Depths 原理 核心思想 MoD(Raposo et al., 2024)借鉴了 Mixture of Experts(MoE)的思路,但不是在"专家"间路由,而是在层间路由: ...

2026-06-25 · 6 min · 1175 words · 硅基 AGI 探索者
moe architecture deep

MoE 混合专家架构深度解析:从稀疏激活到专家路由

1. MoE 的核心思想 Mixture of Experts(MoE)的核心思想极其简洁:不是每个 token 都需要激活整个模型的所有参数。传统稠密模型中,每个输入 token 都会与全部参数交互,而 MoE 引入了"专家"的概念,让每个 token 只激活一部分参数子集。 这种稀疏激活带来的直接好处是:可以用更少的计算量驱动更大的参数量。一个拥有 8×7B 参数的 MoE 模型,每次推理只激活约 7B 参数,却拥有 47B 的知识容量。 # 稠密模型 vs MoE 模型的计算对比 Dense Model: 参数量 = 计算量 = 7B → 每个token激活全部7B参数 MoE Model (8 experts, top-2): 参数量 = 8 × 7B = 56B (含共享层) 每token计算量 ≈ 2 × 7B = 14B (仅激活2个专家) 知识容量 ≈ 接近56B 2. MoE 的数学形式化 2.1 基本定义 给定输入 $x \in \mathbb{R}^d$,MoE 层的输出为: ...

2026-06-25 · 5 min · 1056 words · 硅基 AGI 探索者
ring attention long context

Ring Attention:突破百万 Token 上下文的分布式注意力

长上下文的显存困境 大模型上下文窗口从 4K 扩展到 1M,最大的障碍不是计算量,而是 KV Cache 的显存。 以 Llama-3-70B 为例,fp16 精度下: 上下文长度 KV Cache (单序列) 单卡 80GB 够吗? 8K ~1.5 GB 是 32K ~6 GB 是 128K ~24 GB 勉强 1M ~192 GB 需要多卡 如果 batch_size > 1,显存需求成倍增长。单卡无法装下百万 token 的 KV Cache,必须将注意力计算分布到多张卡上。 分布式注意力的三种方案 1. Megatron 张量并行 将 Q、K、V 矩阵按头切分到不同 GPU: GPU 0: 计算 Head 0-19 的注意力 GPU 1: 计算 Head 20-39 的注意力 优点:通信量小(只需 AllReduce 输出) 缺点:KV Cache 仍按头切分,单序列长度受限于 单卡显存 × 总头数 ...

2026-06-25 · 6 min · 1112 words · 硅基 AGI 探索者
rlhf dpo grpo

RLHF vs DPO vs GRPO:三种对齐算法深度对比

为什么需要对齐? 预训练后的 LLM 只是"下一个 token 预测器",它学会了互联网上的所有文本模式——包括有害内容、错误信息和不符合人类价值观的回答。 对齐(Alignment) 的目标是:让模型的行为符合人类期望。 三个阶段: SFT(监督微调):用人类标注的问答对训练 偏好学习:让模型学会区分"好回答"和"差回答" 安全对齐:拒绝有害请求 本文聚焦于第 2 阶段的三种主流方法。 RLHF:经典三阶段方法 总体架构 SFT Model | v [奖励模型训练] ← 人类偏好数据 (chosen, rejected) | v 奖励模型 (Reward Model) | v [PPO 强化学习] ← 奖励模型打分 + SFT 模型作为参考 | v 对齐后的模型 (Aligned Policy) 阶段一:训练奖励模型 人类标注员对模型的多个回答进行排序(A > B > C),然后训练一个奖励模型 RM 来预测偏好分数: import torch import torch.nn as nn class RewardModel(nn.Module): """ 奖励模型:基于 SFT 模型,将最后一个 token 的隐藏状态 投影到标量奖励值 """ def __init__(self, base_model): super().__init__() self.base_model = base_model # 通常是 SFT 模型 self.value_head = nn.Linear( base_model.config.hidden_size, 1 ) def forward(self, input_ids, attention_mask): # 获取最后一个 token 的隐藏状态 outputs = self.base_model( input_ids, attention_mask=attention_mask, output_hidden_states=True ) hidden = outputs.hidden_states[-1] # (B, L, D) # 取最后一个非 padding token seq_lens = attention_mask.sum(dim=1) - 1 # (B,) last_hidden = hidden[torch.arange(hidden.size(0)), seq_lens] # 投影到标量 reward = self.value_head(last_hidden) # (B, 1) return reward.squeeze(-1) def reward_model_loss(rm, chosen_ids, chosen_mask, rejected_ids, rejected_mask): """ Bradley-Terry 模型:chosen 的奖励应高于 rejected Loss = -log(sigmoid(r_chosen - r_rejected)) """ r_chosen = rm(chosen_ids, chosen_mask) r_rejected = rm(rejected_ids, rejected_mask) # Bradley-Terry loss loss = -torch.nn.functional.logsigmoid(r_chosen - r_rejected).mean() # 准确率 acc = (r_chosen > r_rejected).float().mean() return loss, acc 阶段二:PPO 强化学习 用奖励模型作为奖励函数,通过 PPO 算法优化策略模型: ...

2026-06-25 · 7 min · 1368 words · 硅基 AGI 探索者
tokenizer comparison

Tokenizer 全面对比:BPE vs WordPiece vs Unigram vs SentencePiece

1. 为什么 Tokenizer 如此重要 Tokenizer 是大语言模型与文本世界的接口。它决定了: 模型如何"看到"文本(粒度) 词表大小与序列长度的权衡 多语言、代码、特殊字符的覆盖能力 模型的最大知识单元(token = 模型的"字母") 一个不好的 tokenizer 会导致: 序列过长 → 计算浪费 未登录词过多 → 语义丢失 跨语言不均衡 → 多语言能力差 英文 "Hello World" 的不同分词: 字符级: H e l l o W o r l d → 11 tokens 词级: Hello World → 2 tokens (但词表爆炸) BPE: Hello World → 2 tokens (高频词保留) 字节级: Hello World → 2 tokens (256基础, 递归合并) 中文 "你好世界" 的不同分词: 字符级: 你 好 世 界 → 4 tokens BPE: 你 好 世 界 → 4 tokens (中文常见) 词级: 你好世界 → 1 token (理想但不可达) 2. BPE (Byte Pair Encoding) 2.1 算法原理 BPE 最初是一种数据压缩算法,被 Sennrich 等人 (2016) 引入 NLP。核心思想:从字符级开始,迭代合并最高频的相邻 token 对。 ...

2026-06-25 · 8 min · 1626 words · 硅基 AGI 探索者
transformer alternatives 2026

超越 Transformer:Mamba/SSM/RWKV 架构深度对比

为什么我们需要超越 Transformer? 自 2017 年 Transformer 问世以来,它几乎统治了所有序列建模任务。但 Transformer 有一个根本性缺陷:注意力机制的复杂度是 O(N²),其中 N 是序列长度。当上下文窗口从 2K 扩展到 1M 时,计算和内存开销呈平方级增长。 序列长度 注意力矩阵大小 显存占用(近似) 2,048 4M ~16 MB 32,768 1B ~4 GB 131,072 17B ~68 GB 1,048,576 1T ~4 TB 这意味着:百万级 token 的上下文窗口在标准 Transformer 中几乎不可行,除非借助分布式注意力(如 Ring Attention)或近似方法。 研究者们提出了三类替代方案: 状态空间模型(SSM):S4、S5、S6/Mamba 线性注意力/RNN 混合:RWKV、RetNet、Linear Attention 混合架构:Jamba(Mamba+Transformer)、Zamba 状态空间模型(SSM):从 S4 到 Mamba SSM 的数学基础 状态空间模型源自控制理论,用一组隐状态 h(t) 来压缩历史信息: h'(t) = A·h(t) + B·x(t) # 状态方程 y(t) = C·h(t) + D·x(t) # 输出方程 离散化后变为递推形式: ...

2026-06-25 · 4 min · 778 words · 硅基 AGI 探索者
quantization techniques

大模型量化技术全景:从 INT8 到 GPTQ 与 AWQ

1. 量化的动机与基础 大模型的推理成本主要由显存和计算量决定。量化通过降低参数精度来同时减少这两者: 模型: Llama-3-70B ┌──────────────┬─────────┬───────────┬──────────────┐ │ 精度 │ 显存 │ 推理速度 │ 质量损失 │ ├──────────────┼─────────┼───────────┼──────────────┤ │ FP16 (基准) │ 140 GB │ 1.0x │ 0% │ │ INT8 │ 70 GB │ 1.8x │ <0.5% │ │ INT4 │ 35 GB │ 2.5x │ 1-2% │ │ INT2 │ 18 GB │ 3.0x │ 5-15% │ └──────────────┴─────────┴───────────┴──────────────┘ 1.1 量化的数学定义 量化是将浮点数映射到低精度整数的过程: $$x_q = \text{clamp}\left(\text{round}\left(\frac{x}{s}\right) + z\right), \quad x \in [x_{min}, x_{max}]$$ ...

2026-06-25 · 8 min · 1697 words · 硅基 AGI 探索者
training stability

大模型训练稳定性:梯度爆炸、Loss Spike 与恢复策略

1. 大模型训练稳定性的挑战 大语言模型的训练是大规模并行计算中的"走钢丝"——数千亿参数、万亿 token、数百 GPU 协同工作,任何微小的数值不稳定都可能在迭代中放大为灾难性的训练崩溃。 训练不稳定性事件案例: ┌──────────────────┬─────────────────────────────────────────┐ │ 模型 │ 不稳定事件 │ ├──────────────────┼─────────────────────────────────────────┤ │ GPT-3 175B │ 多次 Loss Spike, 部分无法恢复 │ │ OPT 175B │ 训练崩溃 10+ 次, 需要回退检查点 │ │ BLOOM 176B │ 梯度爆炸导致 NaN, 引入更多稳定化手段 │ │ LLaMA-2 70B │ 7次显著 Loss Spike, 4次需手动干预 │ │ GLM-130B │ Embedding 层梯度爆炸, 引入 DeepNorm │ └──────────────────┴─────────────────────────────────────────┘ 训练不稳定的主要表现形式: Loss Spike:损失突然飙升(10x-1000x),可能恢复也可能永久发散 梯度爆炸:梯度范数急剧增大,权重更新过大 梯度消失:梯度范数趋近于零,训练停滞 NaN/Inf:数值溢出,训练完全崩溃 2. 梯度爆炸与消失 2.1 根本原因 # 梯度爆炸/消失的理论分析 # 在深度网络中, 梯度通过链式法则传播: # ∂L/∂x_0 = ∂L/∂x_n · ∏(i=1 to n) ∂x_i/∂x_{i-1} # 如果每层的雅可比矩阵的谱半径 > 1: 梯度爆炸 # 如果每层的雅可比矩阵的谱半径 < 1: 梯度消失 def analyze_gradient_flow(model, input_data): """分析各层梯度流""" layer_grad_norms = {} for name, param in model.named_parameters(): if param.grad is not None: layer_grad_norms[name] = param.grad.norm().item() # 按层分组统计 return layer_grad_norms # 典型的梯度分布 (100层Transformer): # Layer 0 (输入): grad_norm = 0.001 ← 梯度消失 # Layer 50 (中间): grad_norm = 0.5 # Layer 99 (输出): grad_norm = 12.3 ← 梯度较大 2.2 残差连接的作用 残差连接是缓解梯度消失的最重要设计: ...

2026-06-25 · 9 min · 1879 words · 硅基 AGI 探索者
continuous batching

连续批处理:vLLM 高吞吐推理的核心技术

静态批处理的瓶颈 传统 LLM 推理服务采用静态批处理:每个批次固定大小,所有请求必须等最长的那个请求完成后才能返回。 静态批处理示例(batch=4): Request A: [tok][tok][tok][tok][EOS] # 生成 5 个 token Request B: [tok][tok][tok][tok][tok][tok][EOS] # 生成 7 个 token Request C: [tok][tok][tok][EOS] # 生成 4 个 token Request D: [tok][tok][tok][tok][tok][tok][tok][tok][EOS] # 生成 9 个 token 批处理完成时间:等待 D 完成(9 个 token) 实际计算:A 只需要 5 步,但等了 9 步 GPU 利用率:≈ 25/36 = 69%(因为要等待最慢的请求) 问题: 首 token 延迟:新请求必须等当前批次完成才能进入 GPU 闲置:短请求完成后,GPU 资源被浪费 吞吐低下:无法动态调度,无法"边生成边接收" 连续批处理原理 连续批处理(Continuous Batching, Orca, 2023)的核心思想是:动态管理批次,随时加入新请求,随时移除已完成的请求。 ...

2026-06-25 · 6 min · 1080 words · 硅基 AGI 探索者
鲁ICP备2026018361号