LLM:vLLM,MoE,Qwen,DeepSeek
1,vLLM
1.1,痛点:显存 & 长度
【LLM Decoder推理】LLM decoder 推理是 memory bound 的,这意味着推理 throughput 很大程度取决于能喂进 HBM 显存多大的 batch size,而不是GPU算力越高,吞吐越大。HBM 的消耗随着 model size 和句子 seqlen 而变化。
- 假设:模型参数量:13B;推理使用 FP16 / BF16;每个参数 2 bytes;
- 模型权重显存占用为:13B × 2 bytes ≈ 26 GB
- 在 A100-40GB 上剩余:40GB − 26GB = 14GB
对 decoder-only Transformer,每一层、每个 token 都要缓存:
K: [num_heads, head_dim]
V: [num_heads, head_dim]
以典型 13B 模型(如 LLaMA-13B)为例:
- layers ≈ 40
- hidden_size ≈ 5120
- dtype = FP16(2 bytes)
每 token KV ≈ 2(K+V) × layers × hidden_size × 2 bytes
- ≈ 2 × 40 × 5120 × 2
- ≈ 819,200 bytes ≈ 0.8 MB
工程上通常 粗略估成 1MB / token,进而计算可以输出的 token 数 & batch size:
- 14GB / 1MB ≈ 14,000 tokens
- 设 bs × seqlen ≤ 14,000
- 如果 seqlen = 512 则 bs ≤ 14000 / 512 ≈ 27.3 → 28
- 如果 seqlen = 2048 则 bs ≤ 14000 / 2048 ≈ 6.8 → 7
这是一个上限数字,因为还没算中间 tensor 的 memory 占用;所以 【量化】,在LLM里面很有用,可以加大单卡上的 batchsize 和 seqlen,但是这要去修改模型的 weights,也有不用修改weights的,比如 flashattention,以及 continuous batching,它们都提升了 memory IO effeciency。
1.2,痛点:自回归 & KV Cache
LLM的生成过程:
- 输入(Prompt)处理:首先,模型一次性处理初始输入。
- 生成第一个 Token:基于输入,模型预测出第一个最可能的输出 token。
- 生成后续 Token:把第一个生成的 token "vLLM" 拼接到输入后面,形成新的序列,然后基于这个新序列预测第二个 token。
- 循环往复:把第二个token拼接上,预测第三个 token... 直到模型生成一个特殊的结束符(EOS token)或者达到最大长度限制。
这个“一个字一个字往外蹦”的模式,意味着每生成一个新 token,模型都需要进行一次完整的前向计算(Forward Pass)。虽然每次只生成一个 token,但计算量并不小,因为它需要“回顾”前面所有的内容。
【KV Cache】Transformer 模型(LLM 的基础架构)引入了一个重要的优化:【KV Cache】。对于已经计算过的 token,它们的 Key 和 Value 向量是不会变的。没必要在生成下一个 token 时重新计算它们。所以,把这些计算好的 K 和 V 向量缓存起来。当生成第
个 token 时:
- 模型只需要计算当前这个新 token 的
- 然后,用
和缓存中所有的
以及新的
进行注意力计算。
- 同样,加权求和时使用缓存中的
和新的
- 最后,把新计算出的
和
追加到 KV Cache 中,供下一次生成使用。
【模型部署显存需求】虽然 KV Cache 极大地减少了重复计算,是 LLM 推理能够实际运行的关键。但是非常非常吃显存。
- 模型有
层,每层注意力头数为
, 每个头的维度是
![]()
- 每个 token 在每一层需要存储的
和
向量大小是
- 序列长度为
,Batch Size 为
- 数据类型为半精度浮点数(FP16,每个数值占 2 字节)
通常等于模型的隐藏层维度
举个例子:对于 Qwen2 7B 模型,
,
。如果序列长度
,Batch Size
,用 FP16 存储,那么 KV Cache 大小约为:
- 如果 Batch Size 是 32 ,那就是 32 GB!
- 序列长度 S 是动态增长的!每生成一个 token,S 就加 1,KV Cache 就变大一点。如果最大长度支持到 4096 甚至更长呢?
- 模型本身(权重参数)也要占用 2倍显存。Qwen2 7B FP16 大概需要 14 GB。
KV Cache 是 LLM 推理的性能关键,但也是主要的内存消耗者。管理好 KV Cache 的内存,是优化的重中之重!
1.3,痛点:内存墙 & 内存之殇
现代 GPU 的计算能力(FLOPS)其实非常强悍。真正的瓶颈往往在于内存带宽(Memory Bandwidth)。在 Decoding 阶段,GPU 大部分时间可能都在等待数据从显存加载到计算单元。假如GPU是一个顶级“牛马”(GPU 计算单元),干活速度飞快,但大部分时间都在等小助手(内存总线)把任务(权重和 KV Cache)从遥远的地方(显存)搬过来。这个“搬砖”速度跟不上,“牛马”就只能闲着。
传统的 LLM 推理框架(比如 Transformers 中的默认实现)在管理 KV Cache 时通常采用比较简单粗暴的方式:
- 预先分配(Pre-allocation):为每个请求序列预先分配一块连续的内存空间,大小通常是按照该请求可能达到的最大序列长度来计算的。如果一个请求只需要生成很短的序列,那么大部分预分配的空间就被浪费了。
- 内存碎片化(Memory Fragmentation):由于每个序列都需要一块连续的内存,即使总的空闲显存还很多,但如果找不到一块足够大的 连续 空间来满足新请求的最大长度需求,新请求也无法开始。
- 内部碎片:预分配空间大于实际使用空间,造成的浪费。
- 外部碎片:总空闲空间够,但没有连续的大块空间,造成的浪费。
- 死板的批处理(Static Batching):为了提高 GPU 利用率,通常会将多个请求组成一个 Batch 一起处理。但在传统方法中,一个 Batch 里的所有序列必须步调一致。如果某个序列提前生成完了,它占用的资源(包括 KV Cache 内存)并不能立刻释放给新的请求,必须等待整个 Batch 中 最慢 的那个序列完成。seq1 生成了 2 个 token,3 生成了 1 个,4 生成了 2 个,然而 2 生成了 5 个,seq1、3、4 结束标记后的白色方块就是GPU在空闲,什么都没有做,此时GPU利用率非常低,传统的 static batching 不能把白色空闲时间利用起来。
这些问题叠加在一起,导致 GPU 显存利用率低下(大量浪费和碎片),并发处理能力差,吞吐量上不去。
1.4,解法:continuous batching
vLLM 是一个 LLM(Large Lanuage Model)推理和部署服务库,它结合 iterative-level schedule(常被称为 continuous batching)和 PagedAttention 注意力算法以提高服务的吞吐量。
- 前者(continuous batching)以单轮迭代的方式对用户的请求进行处理,即 LLM 生成一个 token 后会重新调度下一轮要处理的请求。
- 后者(PagedAttention)受操作系统虚拟内存和分页思想启发,将原本连续的 KV cache 存储在不连续的空间(操作系统虚拟内存),以避免 KV cache 带来的显存浪费。
简单来说【continuous batching】,一旦一个batch中的某个seq完成生成,发射了一个end-of-seq token,就可以在其位置插入新的seq继续生成token,从而达到比static batching更高的GPU利用率。
1.5,解法:PagedAttention
【PagedAttention 】是对 kv cache 所占空间的分页管理,是一个典型的以内存空间换计算开销的手段,vllm 和 tenorRT-llm 都应用了这个手段来节约 kv cache 占用的 memory,和现今大模型训练的 recompute 中间 activation 用于 bwd 的以计算开销换内存空间的手段恰好相反。
上图展示了一个 130 亿参数的 LLM 在一台 40GB RAM 的英伟达 A100 GPU 上的内存分布。其中,65% 的内存都分配给了模型权重,而模型权重在提供服务期间是不会变化的。
30% 的内存是用于存储请求的动态状态。对 Transformer 而言,这些状态由与注意力机制关联的键(key)和值(value)张量构成,通常被称为【KV Cache】,其表示用于生成序列中新输出 token 的之前 token 上下文。其余占比很小的内存则是用于其它数据,包括激活 —— 评估 LLM 时创建的临时张量。
【KV Cache 分页管理】LLM 服务系统都没有高效地管理 KV 缓存内存。主要原因是它们会将请求的 KV 缓存保存在邻接的内存空间中,因为大多数深度学习框架都需要将张量存储在相邻连续的内存中。但是,不同于传统深度学习工作负载中的张量,KV Cache 有其自己的独特性质:它会在模型生成新 token 的过程中随时间动态地增长和缩小,而且它的持续时间和长度是无法事先知晓的。
与传统的注意力算法不同,PagedAttention 允许在非连续的内存空间中存储连续的 key 和 value。
- 划分物理块(Physical Blocks):PagedAttention 将 GPU 显存划分为许多个固定大小的物理块(Physical Block)。每个块的大小可以配置,通常是几十 KB 或几百 KB。每个块包含固定数量 token 的 key 和 value。在执行注意力计算时,PagedAttention 的内核能够高效识别并获取这些块。
- 逻辑块(Logical Blocks):对于每个序列,它的 KV Cache 不再是连续存储的。而是被看作是由一系列逻辑块(Logical Block)组成的。可以将块(blocks)视为页面(pages),token 视为字节(bytes),序列视为进程(processes)。一个序列中逻辑上连续的块,会通过一个块表(block table)映射到物理上非连续的块。
- 块表(Block Table):为每个序列维护一个块表(Block Table)。这个表的作用,就像操作系统中的页表一样,负责将序列的逻辑块映射到 GPU 显存中的物理块。
工作流程:
- 当一个新请求(序列)到来时,vLLM 不需要立刻分配能容纳最大长度的内存。
- 在处理 Prompt (Prefill) 阶段,计算出初始的 KV Cache,vLLM 会按需分配若干个物理块来存储它们,并在该序列的块表中记录下逻辑块到物理块的映射关系。
- 在生成 Token (Decoding) 阶段,每当一个序列的 KV Cache 需要增长,超出了当前已分配物理块的容量时,vLLM 就从空闲物理块池中分配一个新的物理块,并更新该序列的块表,将新的逻辑块指向这个新的物理块。
关键优势:
- 消除内部碎片:内存是按需分配的,一个块用满了再分配下一个。不会因为预留过多而浪费。序列实际用了多少 Token,就消耗大致对应数量的块。在 PagedAttention 中,内存浪费仅发生在序列的最后一个块。在实际应用中,这种方式带来了近乎最优的内存利用率,内存浪费率低于 4%。它使系统能够同时处理更多序列(batching),提高 GPU 利用率,从而显著提升吞吐量。
- 极大缓解外部碎片:由于是以小的、固定大小的块为单位进行分配,即使显存中有很多“缝隙”,只要这些缝隙能容纳一个物理块,就可以被利用起来。找到一个小的空闲块,远比找到一个巨大的连续空闲空间容易得多。这使得显存利用率可以接近理论上限。
【内存共享】假设多个用户可能同时请求模型续写同一个故事开头,或者回答同一个热门问题。这意味着他们的输入 Prompt 是相同的,或者有很长一部分是相同的。在传统方法中,即使 Prompt 完全一样,每个请求也会在内存中复制一份独立的 KV Cache。这是巨大的浪费!
【问题】PagedAttention 如何实现共享?由于 KV Cache 被分块管理,并且通过块表进行映射,实现共享变得非常自然:
- Prefix Cache 识别共享前缀:用于缓存一段“固定前缀”的注意力中间结果(主要是 KV)。典型前缀包括 system prompt、长指令、RAG 检索结果等。多个请求共享同一前缀时,不需要重复计算这部分 KV,只在首轮构建一次,后续请求直接复用,从而显著降低首 token 延迟和算力开销。
- 共享物理块:PagedAttention 通过其 块表(block table),天然实现了内存共享的能力。指向相同前缀对应的逻辑块的部分,都映射到同一组物理块。类似于操作系统中多个进程共享物理页面的方式,PagedAttention 中的不同序列可以通过将各自的逻辑块映射到相同的物理块,实现共享。
- 写时复制(Copy-on-Write,类似概念):只有当某个序列开始生成与共享前缀不同的、自己独有的 Token 时,vLLM 才需要为这个序列分配新的物理块来存储它自己独特的 KV Cache。对于共享的部分,大家只读不写(或者说,只追加,不修改已有内容),所以可以安全共享。
共享带来的好处:
- 大幅节省显存:对于 Prompt 很长或者相似度很高的场景(例如 Beam Search、多轮对话、相似查询),共享可以节省大量的 KV Cache 显存。想象一下,如果 100 个用户都在问关于“vLLM 原理”的问题,他们的 Prompt KV Cache 可能只需要存储一份!
- 降低 Prefill 成本:对于共享的 Prompt 部分,其 KV Cache 只需要计算一次,后续共享该 Prompt 的请求可以直接复用,减少了计算量。
PagedAttention 的内存共享机制大幅减少了复杂采样算法的内存开销,如并行采样(parallel sampling)和束搜索(beam search),最多可降低显存使用达 55%。这能够带来 最高 2.2 倍的吞吐量提升,使这些原本内存消耗较大的采样方法在大语言模型(LLM)服务中变得切实可行。
2,MoE & Dense
混合专家(Mixture of Experts,MoE)就像是神经网络世界中的一种团队合作技术。把一项大任务分解成更小的部分,让不同的专家来处理每个部分。然后,有一个聪明的法官,他根据情况决定遵循哪位专家的建议,所有这些建议都融合在一起。
2.1,什么是 MoE?
模型规模是提升模型性能的关键因素之一,这也是为什么今天的大模型能取得成功。在有限的计算资源预算下,用更少的训练步数训练一个更大的模型,往往比用更多的步数训练一个较小的模型效果更佳。Dense 架构以计算换稳定性和工程简洁性,而 MoE 架构以系统复杂度为代价,实现模型容量与计算成本的解耦,是超大规模模型的重要路径。
【问题】MOE 架构和 Dense 架构,训练和推理方面的差异
- 架构:Dense 架构中,每个 token 都会经过完整模型参数,模型容量与计算量强绑定;而 MoE 通过路由机制为每个 token 选择少量专家,仅激活部分参数,从而在近似相同计算量下显著扩大模型容量。
- 训练:Dense 需要对全部参数进行前向和反向计算,训练过程稳定但扩展成本高。MoE 训练中单 token 只更新被选中的专家,FLOPs 接近中小规模 Dense,却可以支持数量级更大的参数规模,但需要额外的负载均衡损失与复杂的并行和通信机制,训练稳定性和工程复杂度更高。
- 推理:Dense 计算路径固定、延迟稳定,易于充分利用 GPU,适合在线低延迟场景。MoE 推理中单 token 计算量更低,但存在路由、token 重排和跨设备通信开销,延迟波动更大,对系统调度和负载均衡要求更高,更适合大 batch 或离线高吞吐场景。
【问题】专家数量对预训练的影响?增加更多专家可以提升处理样本的效率和加速模型的运算速度,但这些优势随着专家数量的增加而递减 (尤其是当专家数量达到 256 或 512 之后更为明显)。同时,这也意味着在推理过程中,需要更多的显存来加载整个模型。
【问题】MoE 为什么能够实现在低成本下训练更大的模型。因为稀疏路由的原因,每个 token 只会选择 top-k 个专家进行计算。同时可以使用模型并行、专家并行和数据并行,优化 MoE 的训练效率。而负载均衡损失可提升每个 device 的利用率。
【问题】MoE大模型的缺点:
- 训练稳定性:MoE 在训练过程中可能会遇到稳定性问题。
- 通信成本:在分布式训练环境中,MoE 的专家路由机制可能会增加通信成本,尤其是在模型规模较大时。
- 模型复杂性:MoE 的设计相对复杂,可能需要更多的工程努力来实现和优化。
- 下游任务性能:MoE 由于其稀疏性,使得在 Fine-tuning 过程中容易出现过拟合。
在混合专家模型 (MoE) 中,将传统 Transformer 模型中的每个前馈网络 (FFN) 层替换为 MoE 层,其中 MoE 层由两个核心部分组成:一个路由器(或者叫门控网络)和若干数量的专家。
【稀疏 MoE 层】这些层代替了传统 Transformer 模型中的前馈网络 (FFN) 层。MoE 层包含若干“专家”(例如 8 个),每个专家本身是一个独立的神经网络。在实际应用中,这些专家通常是前馈网络 (FFN),但它们也可以是更复杂的网络结构。
【可训练门控网络或路由】这个部分用于决定哪些 token 被发送到哪个专家。例如,“More”这个 token 可能被发送到第二个专家,而“Parameters”这个 token 被发送到第一个专家。有时,一个 token 甚至可以被发送到多个专家。token 的路由方式是 MoE 使用中的一个关键点,因为路由器由学习的参数组成,并且与网络的其他部分一同进行预训练。
2.2,Switch Transformers
尽管 MoE 显示出了很大的潜力,但是由于复杂性、通信成本以及训练和微调过程的不稳定性,模型广泛采用仍需要优化。Switch Transformers 简化了 MoE 路由算法,设计了直观的改进模型,降低了通信和计算成本。Switch Transformers 的训练方法减轻了不稳定性,并且首次展示了用较低精度(bfloat16)格式训练大型稀疏模型的可能性。
【主要优化】与最初使用至少两个专家的想法相反,Switch Transformer 采用了简化的单专家策略,每次只选择一个专家。这种方法的效果包括:
- 减少了路由计算,一个 token 每次只路由到一个专家
- 每个专家的 batch size(专家容量、Expert Capacity) 至少可以减半
- 简化路由的实现,降低了 MoE 中的通信成本
【专家容量】是指每个专家在模型中处理的 token 数。在编译时,所有 tensor 的形状都是静态确定的。这意味着在编译阶段,模型的架构和数据布局已经被定义,包括模型的层数、每层的输入和输出维度等。尽管 tensor 的形状是静态的,但在训练和推理过程中,模型的计算是动态的。这是因为模型中的路由器(门控网络)会根据输入数据动态地将 token 分配给不同的专家。这种动态性要求模型能够在运行时灵活地处理数据分布。而这个专家容量的作用就是将 batch 中的总 token 数平均分配给所有专家。然后,为了应对 token 分布不均的情况,会通过一个容量因子(capacity factor)来扩展每个专家的容量。
【容量因子】是一个大于 1.0 的数,它的作用是为每个专家提供额外的缓冲空间,以容纳可能超出平均分配的 token。这样,即使某些专家接收到的 token 数量超过了平均值,也能够处理这些额外的 token,而不会因为容量不足而导致计算跳过,直接将 token 的表示通过残差连接传递到下一层。 如果容量因子设置得过高,会导致计算资源和内存的浪费,因为模型会为可能永远不会用到的 token 分配额外的资源。
2.3,负载均衡
在实际训练过程中,由于数据分布的不均匀性,某些专家可能会处理更多的数据,而其他专家可能会处理较少的数据。这种不均衡可能导致训练效率低下,因为某些专家可能会过载,而其他专家则可能闲置。
【假设】给定
个专家,索引为
,以及一个包含
个 token 的
,辅助
计算为向量
和
的缩放点积。
是 batch 中分配给专家
的 token 占比,计算方式为 batch 中被路由到专家
的 token 数除以总 token 数(硬路由负载):
是所有输入 token 被路由到专家
的概率(软路由负载):
其中
是给定 token
被路由到专家
的概率。
MoE 有 3 个专家:E1, E2, E3(即 N=3),一个批次 B 有 4 个样本:x1, x2, x3, x4:
样本 p1(x) p2(x) p3(x) argmax x1 0.7 0.2 0.1 1 x2 0.4 0.5 0.1 2 x3 0.3 0.6 0.1 2 x4 0.2 0.3 0.5 3
由于希望 batch 中的所有 token 能够均匀地分配给
个专家。这意味着每个专家应该处理相同数量的 token,即每个专家处理的 token 比例应该是
。通过最小化公式的辅助 loss,可以鼓励这种均匀路由。当 token 均匀分布时,这个损失会被最小化。最终的 loss 被乘以专家数量
,这样即使专家数量变化,loss 也能保持恒定。这是因为在均匀路由情况下:
2.4,归一化
【用什么归一化】为什么 Transformer 采用 LayerNorm 而不是 BatchNorm?序列长度可变且 batch 可能很小,BN 依赖 batch 统计不稳定,而 LN 按特征归一化,对单样本稳定,且更适合残差结构和自注意力机制。
- BatchNorm:均值和方差是整个batch所有样本计算的,依赖batch size。
是 batch 内元素数量。
- LayerNorm:均值和方差是单个样本的特征维度计算的,不依赖batch。
是单个样本的特征维度长度
【问题】RMSNorm 相较于 LayerNorm 有什么优势?公式是什么?解决“怎么更省、更稳地做归一化”。不做归一化时,激活值会层层放大或缩小,导致梯度爆炸/消失。Norm 将每一层的输出限制在可控尺度内。
- LayerNorm 对特征做“去均值 + 归一化方差”;
- RMSNorm 只基于二阶矩(RMS)做缩放,没有
,不减均值。
- 计算高效:少一次均值计算与减法,算子更简单;在大模型与长序列下更省算力、显存与带宽。在 Transformer 中,线性层与残差连接可以学习到必要的平移;规范化的关键是控制尺度而非强制零均值。大量实证(GPT、LLaMA、Qwen 等)表明性能不劣。
- 数值稳定(适合 FP16/BF16):避免均值引入的数值抖动;在 Pre-Norm 结构中训练更稳定。
- 参数更少:无
,参数量与内存略降。
【归一化放在残差块的哪里】Pre-LayerNorm 相较于 Post-LayerNorm 有什么优势?公式是什么?解决“梯度怎么走得稳”
- Post-Norm:梯度必须穿过 Norm 再回到下层。层数一深,梯度被反复缩放,容易不稳定,深层训练困难。
- Pre-LayerNorm:残差分支是“直通”的,梯度可以绕过子层和 Norm,梯度路径更短、更稳定。可堆叠更深层数,收敛更快,对超参不那么敏感。
3,DeepSeek
3.1,DeepSeek R1
【问题】DeepSeek R1的训练流程和基本原理?
【阶段 0:基础模型预训练】以 V3 为起点,使用大规模无监督语料进行标准自回归预训练。学习语言建模能力与通用知识,不针对推理进行特殊优化,为后续强化学习提供稳定的初始策略。
【阶段 1:冷启动监督微调(SFT)】使用极少量高质量推理样本进行监督微调,覆盖数学、逻辑、代码等典型推理任务。目标不是显著提升能力,而是让模型理解“什么类型的任务需要推理、输出应具备何种结构”,起到任务形态对齐作用。
【阶段 2:纯强化学习(R1-Zero 核心阶段)】在不提供人工思维链标注的前提下,对同一问题采样多条推理路径,仅根据最终答案正确性、格式合规性和一致性等信号构建奖励函数,通过 PPO 等策略梯度方法更新模型参数。模型在这一阶段自发学会生成更长、更稳定的推理过程,推理能力出现跃迁。
【阶段 3:推理能力蒸馏与监督微调】利用 R1-Zero 生成的大量高质量推理样本,对模型进行蒸馏式 SFT。该阶段保留强化学习获得的推理能力,同时显著改善输出稳定性、可控性和通用可用性,形成正式的 DeepSeek R1。
【阶段 4:对齐与安全微调】在推理能力基本定型后,引入指令跟随、人类偏好与安全约束相关数据进行微调,使模型在实际使用中具备良好的交互体验和安全性。
【问题】DeepSeek R1的冷启动具体是什么?冷启动(cold start) 通常指的是在缺乏特定任务或领域的监督数据的情况下,对模型进行初始微调,以便为后续训练提供基础。冷启动的主要目的是为模型提供一个起点,使其更容易适应新的任务或提高特定能力。冷启动数据相当于给模型提供一个“热身”阶段,而不是直接从零开始探索,帮助它更高效地发展推理。
3.2,Qwen
【问题】Qwen 与传统的Transformer模型相比,有什么结构上的改进?
- 注意力机制:从标准 MHA 到 GQA / 优化实现
- 位置编码:从绝对位置到 RoPE 系改进 RoPE scaling(频率缩放)
- FFN结构:从 ReLU 到 SwiGLU
- 梯度求解方式:Transformer 使用 Post-Norm,深层模型训练不稳定。Qwen 使用 Pre-LayerNorm,梯度更稳定,支持更深网络。
- 归一化方式:使用 RMSNorm(替代 LayerNorm,去掉均值项,计算更高效)
【问题】RoPE scaling 是什么?通过拉伸位置角频率,减缓高频旋转在长序列下的相位崩溃,让 attention 在更长距离仍能对齐语义。
【问题】GPT 和 llama 在模型结构上的区别?
- 规范化与稳定性设计:LLaMA 统一采用 Pre-LN + RMSNorm;GPT 早期用 Post-LN,新版本已逐步对齐 Pre-LN,但细节未公开。
- 位置与注意力的现代化程度:LLaMA 从一开始就用 RoPE,并系统性引入 GQA,显著提升长上下文与推理效率;GPT 早期使用绝对位置编码,后续版本才演进到 RoPE / 类 RoPE 方案。
- FFN 表达效率:LLaMA 使用 SwiGLU(门控 FFN),同参数量下表达能力更强;GPT-3 主要是 GELU FFN,新版本可能已升级但未完全公开。
3.3,架构,复读机,多轮对话
【问题】为什么现在 Decoder - only 成为大模型的主流架构?
【答案】Encoder 在抽取序列中某一个词的特征时能够看到整个序列中所有的信息,即上文和下文同时看到;而 Decoder 中因为有 mask 机制的存在,使得它在编码某一个词的特征时只能看到自身和它之前的文本信息。
- prefix LM(前缀语言模型,BERT,encoder-only)前缀部分可以双向互看,后缀生成部分仍然只能看左侧(包括整个前缀)。它的目标仍是生成,但条件(前缀)建模更强,天然适合“给定上下文再生成”的场景。优点是兼顾理解与生成,统一了 encoder-only 和 decoder-only 的一部分能力;缺点是 mask 更复杂,训练与实现成本更高,推理阶段优势不如纯 causal LM 明显。例如,今天的天气很[MASK],适合出去玩。相比 causal LM,因为它用掩码语言模型预训练,不擅长做生成任务,连续长文本生成能力较弱;Encoder 的双向注意力会存在低秩问题,这可能会削弱模型表达能力,就生成任务而言,引入双向注意力并无实质好处。
- causal LM(因果语言模型,GPT,decoder-only)因果语⾔模型是⼀种自回归模型,它只能根据之前的文本生成后续的文本,而不能根据后续的文本生成之前的文本。在训练时,因果语⾔模型的目标是预测下⼀个词的概率,兼顾理解和生成,给定之前的所有词作为上下文。例如,今天的天气很...,今天的天气很 暖和,适合出去玩。
- T5,encoder-decoder:encoder 对输入做双向建模,decoder 以自回归方式生成,并通过 cross-attention 读取 encoder 表示。优点是条件建模最强,特别适合翻译、摘要、问答等“输入→输出”明确的任务;缺点是结构更重,推理时 encoder+decoder 都要跑一次,长生成和开放式对话场景下效率与统一性不如 causal LM。这种结构天然适合“输入到输出”的条件生成任务,如机器翻译、摘要和问答,生成内容严格受输入约束,信息流是“先理解,再生成”。
【问题】LLM 出现复读机现象,是什么原因?数据数量和质量都不好,硬件资源限制只能选择较小的模型,试图做一个领域大模型,很容易遇到大模型复读机问题。
- 数据集同质化,数据量太小,数据重复过多,模型过拟合到重复模式;
- 学习率过高,陷入局部最优;训练轮数过多或过少,过拟合;
- 温度设置 0.1,Top-K/Top-p 采样过于严格;
【问题】如果要提升大模型的多轮对话能力,有哪些可以改进的点?
- 数据层:将多轮对话线性化为 context → response:
输入包含完整历史(system / user / assistant 轮次,含 role 标记)。
目标只预测当前 assistant 回复,前文全部做 mask。
控制上下文长度:滑窗截断、保留最近 K 轮或关键信息摘要。
- 训练层:
- SFT(基础):标准 causal LM loss,仅对 assistant token 计算。
- 偏好对齐(进阶):DPO / PPO / GRPO,偏好样本基于“同一对话历史下的多候选回复”。
- Curriculum:先短对话 → 再长对话,降低早期不稳定。
- 上下文建模与记忆机制:纯粹扩大 context window 只解决“能看到”,不解决“会用”。可引入显式对话状态建模,将长期稳定信息与短期上下文解耦;结合摘要式记忆、key-value memory 或外部记忆模块,避免历史信息被注意力稀释。
- 推理与自我监控机制:模型在生成前或生成后,隐式检查是否违背历史约束或用户目标。
3.4,评测,幻觉,一致性
【问题】大模型生成评测:大模型生成内容的评测方式有哪些,具体如何操作?
- 直接评估指标:在人工智能领域长期以来广泛使用的传统指标。如准确率(accuracy)和F1得分(F1 score)等指标属于这个类别。这种方法涉及从模型中获取单一的输出,并将其与参考值进行比较,可以通过约束条件或提取所需信息的方式来实现评估。
- 间接或分解的启发式方法:利用较小的模型来评估主模型生成的答案,这些较小的模型可以是微调过的模型。
- 基于模型的评估:模型本身提供最终的评估分数或评估结果。
【评估工具】
- ChatbotArena:借鉴游戏排位赛机制,让人类对模型两两评价
- SuperCLUE:中文通用大模型综合性评测基准,尝试全自动测评大模型
- C-Eval:采用 1.4 万道涵盖 52 个学科的选择题,评估模型中文能力
- FlagEval:采用“能力—任务—指标”三维评测框架
【问题】大模型幻觉问题:阐述大模型的幻觉现象及抑制方法?
【答案】幻觉指的是一本正经的胡说八道:看似流畅自然的表述,实则不符合事实或者是错误的。比如在医疗应用中,对患者生成的报告如果存在幻觉可能导致错误诊断甚至影响生命安全。
- 通过使用外部知识验证主动检测和减轻幻觉:RAG
- SelfCheckGPT:如果模型真的掌握某个事实,那么多次生成的结果应该是相似的且事实一致的;相反,如果模型在胡扯,那么随机采样多次的结果会发散甚至矛盾。从模型中采样多个response(比如通过变化温度参数)并测量不同response之间的信息一致性,以确定哪些声明是事实,哪些是幻觉。
- 事实核心采样:采样随机性对事实性的破坏在句子后半段更严重。句首缺乏前文约束,只要语法与语境合理,生成内容相对自由;而随着上下文逐步确定,可保持事实一致的候选词显著减少。核心思想是在生成过程中动态调整 top-p,而不是使用固定的采样阈值。
【问题】大模型输出一致性:如何确保大模型输出内容的一致性?
- 参数控制:温度 & 随机种子固定
- 提示词工程:定义输出格式和约束条件,提供明确的边界条件
- 结构化输出:JSON Schema/Function Calling
- 提供清晰的示例
【问题】提示工程方法:提示工程的主要方法有哪些?
Few-Shot:通过少量示例触发上下文学习(ICL),示例质量、数量与顺序直接影响效果。
COT:显式展开中间推理,适合复杂问题;变体包括 Zero-Shot CoT、自洽性 CoT、Least-to-Most。
Instruction Engineering:结构化模板(角色、任务、格式、约束、示例),强调具体性与可测试性。
RAG:检索外部文档注入上下文,降低幻觉、支持知识更新。
Task Decomposition & Prompt Chaining:复杂任务拆分为子任务,逐步验证与组合,提升可控性与复用性。
更多推荐













所有评论(0)