GPT-2 中的 Pre-Layer Normalization (Pre-LN) 架构详解

作者:mwq30123日期:2025/10/19

GPT-2 中的 Pre-Layer Normalization (Pre-LN) 架构详解

1. 概述

Pre-Layer Normalization (Pre-LN) 是一种对原始 Transformer 架构的重要改进。顾名思义,它的核心思想是将层归一化 (Layer Normalization) 操作从残差连接之后移动到每个子层(如自注意力、前馈网络)的之前

这一看似微小的结构调整,却极大地提升了深度 Transformer 模型训练的稳定性,有效缓解了梯度消失或爆炸的问题。GPT-2 是推广并确立 Pre-LN 架构作为大型语言模型(LLM)标准实践的关键模型之一,其后的 GPT-3 及众多现代 LLM 都沿用了这一设计。

本文档将详细对比 Pre-LN 与原始的 Post-LN 架构,阐述 Pre-LN 的核心优势,并分解其在 GPT-2 Decoder Block 中的具体实现流程。

2. 两种架构的对比:Post-LN vs. Pre-LN

A. Post-LN (原始 Transformer 架构)

在 2017 年的《Attention Is All You Need》论文中,作者提出的原始 Transformer 架构采用了 Post-LN 结构。其数据流如下:

数据流: Sublayer -> Add -> Norm

  1. 输入 x 首先通过一个子层(如多头自注意力)。
  2. 子层的输出与原始输入 x 进行残差连接(Add)。
  3. 最后,对相加后的结果进行层归一化(Norm)。

流程图:

1      Input: x
2         |
3   +----(残差连接)----+
4   |                 |
5   v                 |
6 Sublayer(Attention/FFN) 
7   |                 |
8   v                 |
9  (+)----------------+
10   |
11   v
12LayerNorm
13   |
14   v
15 Output: y
16

问题: 这种结构在网络较深时,训练过程非常不稳定,对学习率和预热(warmup)阶段的设置极为敏感,容易导致梯度爆炸或模型不收敛。

B. Pre-LN (GPT-2 及现代 LLM 架构)

为了解决 Post-LN 的不稳定性,研究者们提出了 Pre-LN 结构,并被 GPT-2 等模型成功应用。

数据流: Norm -> Sublayer -> Add

  1. 输入 x 首先进行层归一化(Norm)。
  2. 归一化后的结果被送入子层进行计算。
  3. 子层的输出与原始输入 x 进行残差连接(Add)。

流程图:

1      Input: x
2         |
3   +----(残差连接)----+
4   |                 |
5   v                 |
6LayerNorm            |
7   |                 |
8   v                 |
9 Sublayer (Attention/FFN)
10   |                 |
11   v                 |
12  (+)----------------+
13   |
14   v
15 Output: y
16

3. Pre-LN 的核心优势:为何选择它?

Pre-LN 架构之所以成为现代 LLM 的标配,主要得益于以下几个关键优势:

  1. 改善梯度流,提升训练稳定性
    这是最核心的优势。在反向传播中,梯度可以直接通过 Pre-LN 结构中的残差连接路径(一个简单的加法操作)无损地向前传递。这条“梯度高速公路”没有被 LayerNorm 层的复杂计算所阻碍,从而有效避免了梯度在深层网络中因连乘效应而消失或爆炸的问题。
  2. 规范化的子层输入
    在 Pre-LN 中,多头自注意力层和前馈网络层接收到的输入始终是经过归一化的,其均值和方差相对稳定。这使得这些子层的学习任务变得更加简单,优化过程也更加平滑,降低了模型对参数初始化的敏感度。
  3. 降低对学习率预热的敏感度
    Post-LN 架构通常需要一个精心设计的、较长的学习率预热(warmup)阶段,以防止训练初期的梯度爆炸导致模型崩溃。而 Pre-LN 的内在稳定性使其对学习率和预热策略的依赖性大大降低,简化了超参数调优的过程。

4. GPT-2 Decoder Block 详解 (Pre-LN 实现)

一个标准的 GPT-2 Decoder Block 完整地体现了 Pre-LN 的设计哲学。当输入张量 x 流经该模块时,其具体流程如下:

第一部分:带掩码的多头自注意力

  1. Pre-Norm: 输入 x 首先通过第一个层归一化模块 LayerNorm1
  2. Attention: 归一化后的结果被送入带因果掩码的多头自注意力层进行计算。
  3. Residual Add: 注意力层的输出与原始输入 x 相加。

第二部分:前馈网络 (FFN)

  1. Pre-Norm: 第一部分的输出结果通过第二个层归一化模块 LayerNorm2
  2. FFN: 归一化的结果被送入前馈网络(通常是 Linear -> GELU -> Linear 结构)进行非线性变换。
  3. Residual Add: FFN 的输出与第二部分的输入(即第一部分的结果)相加。

最终的输出即为该 Decoder Block 的结果,它将被传递给下一个同样的 Block。

5. 总结

Pre-Layer Normalization (Pre-LN) 是对 Transformer 架构的一次简单而深刻的优化。通过将层归一化操作前置,它构建了一条通畅的梯度传播路径,并确保了核心计算模块的输入始终处于稳定分布,从而从根本上解决了原始 Post-LN 架构在训练深度模型时的不稳定性问题。

这一改进是 GPT-2 及其后续模型能够成功扩展到前所未有的深度和规模的关键因素之一,并已成为当今设计和训练大型语言模型的黄金标准。


GPT-2 中的 Pre-Layer Normalization (Pre-LN) 架构详解》 是转载文章,点击查看原文


相关推荐


管理 Claude code上下文:实用手册
是魔丸啊2025/10/18

转载 Anthropic 的 Claude 代码和更广泛的 Claude 系列现在为开发者提供了前所未有的控制能力,可以控制模型看到的内容量和推理深度。最近的产品更新(特别是 Sonnet 4 的 100 万 token 上下文窗口和 Claude 扩展的"思考"控制)使上下文管理变得更加强大和重要:您可以在单个会话中处理整个代码库——但前提是您需要有意地构建提示、文件和会话状态。本文解释了如何可靠地管理 Claude 代码的上下文:命令和用法、思考预算控制、CLAUDE.md 模式、子代理工作


Nx带来极致的前端开发体验——任务缓存
西陵2025/10/16

前言 前面我们讲过,为了提高项目的构建速度,社区将大部分的精力放到构建工具上,例如rspack、esbuild、swc等,利用语言优势提升构建速度。而像 webpack 这种老牌构建工具则将优化方向放在缓存上,但是他缓存的是构建流程中的中间结果,例如每个文件经过 loader 转换后的产物。 而本章节要介绍的任务缓存是指缓存任务执行之后的产物,例如构建或者测试任务,对于一个 package 来说,如果他的代码没发生改变,下一次执行 build 命令时可以直接读取上一次的构建产物,而无需再次进行构


excel中关联word邮件合并使用
山西璟绘地理信息有限责任公司2025/10/15

你在日上的工作中是不是需要批量的输出格式相同但是局部需要替换的文档,如果是几份就是人工修改一下,但是如果你面对的石海量的文档,你还会人工编辑吗?首先时间不容许,其次性价比特别低,如果站在打工摸鱼的角度无可厚非,但是如果你真的愿意提高效率,接下来讲的就是你需要的,开整。 这个就是典型的使用场景: 变量: 1、统一社会信用代码 2、名称 3、原法定代表人 4、现法定代表人 5、行政村盖章落款 6、日期 准备工作: 1、首先做好一个模板,如上图所示 2、建立自己的数据库,一般


Redis(61)Redis的连接数上限是多少?
Victor3562025/10/14

Redis 的连接数上限取决于系统的硬件资源、操作系统的配置以及 Redis 自身的配置。这一限制主要来自以下几个方面: 硬件资源:包括可用的 CPU、内存等。 操作系统的限制:文件描述符数量、网络连接等。 Redis 配置:最大客户端连接数配置。 Redis 配置的限制 Redis 的最大连接数由 maxclients 配置项决定。默认情况下,这个值设置为 10000。 在 redis.conf 文件中,你可以找到并修改这个配置项: maxclients 10000 或者动态配置: re


macOS 内核路由表操作:直接 API 编程指南
liulilittle2025/10/12

🖧 macOS 内核路由表操作:直接 API 编程指南 本文将探讨如何在 macOS 系统中,通过直接调用系统 API 来高效添加和删除内核路由表项,避免调用外部命令带来的性能开销,并提供完整的 C++ 实现代码。 🧭 概述 在 macOS(基于 BSD 内核)系统中,路由表管理是网络编程的核心组成部分。传统上,管理员和开发者通常使用 route 命令或 netstat 工具来查看和管理路由表。然而,对于需要高性能网络控制的应用程序(如网络优化工具或自定义路由解决方案),直接通过系统


基于单片机的Boost升压斩波电源电路
清风6666662025/10/11

基于单片机的Boost升压斩波电源电路设计 点击链接下载资料:https://download.csdn.net/download/m0_51061483/92081480 1. 系统功能概述 本系统以单片机为核心控制单元,设计并实现了一种Boost升压型斩波电源电路。系统能够实现输入5V电压,通过Boost电路升压至可调的20V输出范围。用户可通过按键设置目标输出电压,液晶LCD模块实时显示当前输出电压与设定电压,形成完整的闭环控制系统。 系统采用PWM控制技术与DA(数模转换)调


从入门到实战:全面解析Protobuf的安装配置、语法规范与高级应用——手把手教你用Protobuf实现高效数据序列化与跨语言通信
羑悻的小杀马特.2025/10/9

文章目录 本篇摘要一.`Protocol Buffers(Protobuf)`简介1. **核心定义**2. **核心作用**3. **对比优势**4. **使用关键点**总结 二.`基于windows及ubuntu22.04安装Protobuf``windows`ubuntu22.04 三.快速上手protobuf编写及测试规范说明编译命令编译生成结果 四.proto3语法解析之字段规则与消息定义五. `Protobuf 命令行decode操作`六.仓库链接七.本篇


cygwin + redis
欧的曼2025/10/8

1. 下载 Redis 源码 推荐安装稳定版(如 Redis 7.0.12,可从 Redis 官网下载页 获取最新稳定版链接): wget https://download.redis.io/releases/redis-7.0.12.tar.gz 2. 解压并进入源码目录 3. 编译 Redis(关键步骤) 找到Cygwin安装目录下的usr\include\dlfcn.h文件,修改如下代码,将#if __GNU_VISIBLE、#endif 这两行注释掉。(使用// 或 /


【OpenCV】图像处理入门:从基础到实战技巧
朋鱼燕2025/10/6

目录 1.对图像的基本理解 2.数据读取-图像 ​编辑 3.数据读取-视频 4.ROI区域 1.对图像的基本理解 图像是由一个个像素点组成的,RGB图像有三个通道,而灰度图像只有一个通道 RGB每个通道的像素点的值的范围是0-255,数值越大,对应该颜色通道的亮度越亮 2.数据读取-图像 在文件的路径下读取一张图像,不能包含中文 opencv的读取格式是BGR cv2.waitKey(0)按下任意键才关闭图像,换成1000的话是显示1000


【Docker】说说卷挂载与绑定挂载
你的人类朋友2025/10/5

前言 我最开始接触 Docker 的时候,遇到 mysql 这样的容器,我一般使用卷挂载。它的好处就是将挂载的位置交给 Docker 管理,我们规定卷的名字即可,不需要关心挂载的位置。我感觉这样很方便,所以后面我基本一遇到挂载就用卷挂载。 但是最近,我慢慢地开始喜欢上绑定挂载了。特别是要部署一个什么环境之类的【如 n8n、redis】,都会优先使用绑定挂载。这个挂载方式会让我更有一种掌控感。 今天就来总结这两种挂载方式的相关知识。 正文 一、什么是 Docker 数据挂载? 在 Docker 中

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0