GPT-2 中的残差权重初始化

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

GPT-2 中的残差权重初始化

1. 概述

在深度残差网络中,每一层的输出都会被加到其输入上。如果不对这些层的权重进行特殊处理,随着网络深度的增加,残差路径上累加的信号方差可能会不断增大,导致数值不稳定和训练发散。

为了解决这个问题,GPT-2 的作者在论文中提出了一种针对残差连接路径上的层进行特殊缩放的初始化方法

2. 哪些是“残差权重”?

在 GPT-2 的一个 Decoder Block 中,有两个子层的输出会直接被加到残差流(Residual Stream)上。因此,这两层的权重就是我们所说的“残差权重”:

  1. 多头自注意力层的输出投影层: 在 Hugging Face 的实现中,这层通常被称为 c_proj
  2. 前馈网络 (FFN) 的第二个线性层: 这也是一个投影层,同样被称为 c_proj

3. GPT-2 的初始化策略

GPT-2 的权重初始化分为两个步骤:一个通用的标准初始化,和一个针对上述“残差权重”的特殊缩放。

步骤一:通用的标准初始化

模型中的所有权重(包括嵌入层、QKV 投影层、FFN第一层以及残差层)首先都会从一个均值为 0、标准差为 0.02 的正态分布中进行初始化。

  • 权重 (Weights) : W∼N(0,0.022)W \sim \mathcal{N}(0, 0.02^2)W∼N(0,0.022)
  • 偏置 (Biases) : 所有偏置都初始化为 0。

这是模型参数的基础初始化值。

步骤二:针对残差权重的特殊缩放

在完成通用初始化之后,GPT-2 会专门对“残差权重”进行一次额外的缩放操作。

缩放公式:

根据 GPT-2 论文的描述,这些残差层的权重会被乘以一个缩放因子:

1N\frac{1}{\sqrt{N}}N​1​

其中,NNN 是模型中残差层(或说残差连接)的总数量

  • 在一个标准的 GPT-2 模型中,每个 Transformer Block(n_layer)都包含 2 个残差连接(一个在自注意力后,一个在 FFN 后)。
  • 因此,总的残差层数量 N=2×nlayerN = 2 \times n_{\text{layer}}N=2×nlayer​。

例如:

  • 对于 gpt2-base,它有 12 个 Block (n_layer=12),所以 N=2×12=24N = 2 \times 12 = 24N=2×12=24。缩放因子就是 124\frac{1}{\sqrt{24}}24​1​。
  • 对于 gpt2-large,它有 36 个 Block (n_layer=36),所以 N=2×36=72N = 2 \times 36 = 72N=2×36=72。缩放因子就是 172\frac{1}{\sqrt{72}}72​1​。

这个操作通常是在代码层面,将这些特定层的权重张量乘以该缩放因子来完成。

4. 为什么要进行特殊缩放?

核心目的:控制残差流中的方差累积。

  • 问题: 在一个深度网络中,残差流 xxx 会经过多个 Block 的累加:xfinal=xinitial+output1+output2+⋯+outputNx_{\text{final}} = x_{\text{initial}} + \text{output}_1 + \text{output}_2 + \dots + \text{output}_Nxfinal​=xinitial​+output1​+output2​+⋯+outputN​。如果每个 outputi\text{output}_ioutputi​ 的方差是 σ2\sigma^2σ2,那么在理想情况下,最终输出的方差会累积到 N×σ2N \times \sigma^2N×σ2。当 NNN 很大时,方差会爆炸,导致训练不稳定。
  • 解决方案: 通过将每个残差层的权重乘以 1N\frac{1}{\sqrt{N}}N​1​,其输出的方差大约会被缩放到原来的 1N\frac{1}{N}N1​(因为方差与权重的平方成正比)。
  • 效果: 这样,当 NNN 个残差输出累加时,总的方差大约保持在 σ2\sigma^2σ2 的水平(N×σ2N=σ2N \times \frac{\sigma^2}{N} = \sigma^2N×Nσ2​=σ2),从而保证了无论网络有多深,流经主干道的信息信号强度都能保持稳定。

5. 初始化总结

下表总结了 GPT-2 中不同层的初始化方式:

层 / 参数标准初始化特殊缩放 (仅限残差层)
嵌入层 (wte, wpe)N(0,0.022)\mathcal{N}(0, 0.02^2)N(0,0.022)不适用
注意力 QKV 投影 (c_attn)N(0,0.022)\mathcal{N}(0, 0.02^2)N(0,0.022)不适用
注意力输出投影 (c_proj)N(0,0.022)\mathcal{N}(0, 0.02^2)N(0,0.022),权重乘以 12×nlayer\frac{1}{\sqrt{2 \times n_{\text{layer}}}}2×nlayer​​1​
FFN 第一个线性层 (c_fc)N(0,0.022)\mathcal{N}(0, 0.02^2)N(0,0.022)不适用
FFN 第二个线性层 (c_proj)N(0,0.022)\mathcal{N}(0, 0.02^2)N(0,0.022),权重乘以 12×nlayer\frac{1}{\sqrt{2 \times n_{\text{layer}}}}2×nlayer​​1​
所有偏置 (bias)初始化为 0不适用

结论: GPT-2 的残差权重初始化是一种精巧的设计,它通过在标准正态初始化之后,对特定的残差层权重应用一个与网络深度相关的缩放因子,成功地稳定了深度 Transformer 模型的训练过程,是其能够有效扩展到更多层数的关键技术之一。


GPT-2 中的残差权重初始化》 是转载文章,点击查看原文


相关推荐


SpringBoot启动优化7板斧:砍掉70%启动时间的魔鬼实践
皮皮林5512025/10/18

1.延迟初始化:按需加载的智慧 2.组件扫描精准打击:告别无差别扫描 3.JVM参数调优:启动加速的隐藏开关 4.自动配置瘦身:砍掉Spring Boot的"赘肉" 5.类加载优化:让JVM轻装上阵 6.数据库连接优化:断开启动时的枷锁 7.编译优化:AOT与分层编译的威力 综合优化案例:电商平台实战 启动优化检查清单 各优化手段效果对比图 1. 延迟初始化:按需加载的智慧 实践方案: # application.properties spring.main.lazy-initializat


除了JSON/XML,你还应该了解的数据描述语言ASN.1 —— 附《SpringBoot实现ASN.1在线解析工具》
风象南2025/10/17

前言 在日常开发中,我们经常接触JSON、XML等数据格式,但你是否听说过ASN.1?这种在通信、安全、物联网领域广泛使用的数据描述语言。 可能对一部分开发者来说有些陌生,但在特定场景下却有着不可替代的作用。今天,我们就来深入了解一下ASN.1,并用SpringBoot实现一个在线解析工具。 什么是ASN.1? 基本概念 ASN.1(Abstract Syntax Notation One)是一种标准化的数据描述语言,由ITU-T(国际电信联盟)和ISO(国际标准化组织)共同制定。它提供了一种平


Redis(62)如何优化Redis的连接数?
Victor3562025/10/15

优化 Redis 的连接数可以通过以下策略实现: 使用连接池。 合理配置 Redis。 调整操作系统限制。 使用客户端连接复用。 实现批量操作。 分布式架构及读写分离。 以下将详细探讨这些策略,并提供相应代码示例。 1. 使用连接池 连接池可以重用现有连接,减少连接创建和释放的开销,从而提升性能。 Java 示例(Jedis 连接池) 添加 Jedis 依赖: 确保在 pom.xml 文件中添加 Jedis 依赖: <dependency> <groupId>redis.clie


nginx反向代理与缓存功能
Justin_192025/10/14

目录 一,正向代理和反向代理 1,正向代理概述 2,反向代理概述 二,配置实战 1,实现反向代理负载均衡 三,nginx配置跨域cors 1,跨域的定义 2,同源的定义 3,不同源的限制 4,nginx解决跨域的原理 5,案例 一,正向代理和反向代理 1,正向代理概述 正向代理是一个位于客户端和目标服务器之间的代理服务器。为了从目标服务器得到目标,客户端向代理服务器发送一个请求,并且指定目标服务器,再代理向目标服务器转发请求,将得到的目标返回给客户端。 正向


前端人必看!3个技巧让你彻底搞懂JS条件判断与循环
良山有风来2025/10/13

那些年我们踩过的坑 还记得刚学JavaScript的时候吗?遇到复杂的条件判断就头晕,写循环时总是搞不清该用for还是while。最尴尬的是,代码跑起来总是不按预期的来,bug找得头都大了! 说实话,这些困扰我都经历过。但后来我发现,只要掌握了几个核心技巧,这些看似复杂的问题都能轻松解决。 今天我就把压箱底的干货拿出来,用最通俗易懂的方式,带你彻底搞懂JS的条件判断和循环控制。看完这篇文章,你不仅能写出更优雅的代码,还能避开90%新手都会踩的坑! 条件判断:让你的代码更“聪明” 条件判断就像给代


(1)100天python从入门到拿捏
C嘎嘎嵌入式开发2025/10/11

官方文档 python教程 window系统下查看python版本 win+R键打开cmd输入下面的命令 python --version 或者 python -V 类似c语言以.c为后缀,c++以.cpp为后缀,python文件的扩展名以.py结尾 Jupyter Notebook文件以.ipynb为后缀,该类文件通常包含代码、文本和可视化结果 Python 3简介 Python 3 是一种高级、解释型的编程语言,广泛用于 Web 开发、数据科学、机器学习、自


前端梳理体系从常问问题去完善-框架篇(react生态)
大前端helloworld2025/10/9

前言 国庆去趟了杭州,但是人太多了,走路都觉得空气很闷,天气也很热,玩了两天就回宿舍躺了,感觉人太多,看不到风景,而且消费也很高,性价比不是很值得,就呆在公寓,看了两本书,有一本是名著,《呼啸山庄》虽然是写的是爱情,但爱情背后是人性。爱情啊,这个课题本来就是让人很难读懂得,关于爱,也看了一篇文章。关于爱上人渣得,爱上人渣,或是那些求而不得甚至是受制于禁忌的爱,本质上也是在追求这种刺激,或者说正是因为这样的对象能给自己麻木的感官更大的刺激,从而误以为这就是「爱」的本质,就像是人们虽然知道「吊桥效应


Spec-Kit:AI驱动的软件开发全流程管理工具套件
是魔丸啊2025/10/8

Spec-Kit 是一套专为AI辅助开发场景设计的命令行工具套件,提供了从需求规格到代码实现的标准化工作流程。通过8个核心命令,它确保软件开发的每个环节都保持高质量和一致性。 核心理念 端到端管理:覆盖需求规格化、架构设计、任务分解、代码实现全流程 AI优化设计:专为与Claude等AI助手协作而优化 质量保证:内置多层次验证机制 知识沉淀:项目宪法、设计决策完整记录 这篇文章主要是想记录下spec-kit的核心command具体在干嘛。所以翻译了下所有的command(按照实际使用顺序)


Node.js(十二)插件开发
燎原人生2025/10/6

一、Node.js 原生插件(Native Addon)开发入门教程 1. 准备环境 安装 Node.js(建议最新版) 安装 node-gyp 工具(用于编译 C++ 代码) npm install -g node-gyp 安装编译环境 Windows: 需要安装 Windows Build ToolsmacOS: 需要安装 XcodeLinux: 需要安装 g++、make 等 2. 创建项目目录 mkdir my-native-addon cd my-native-


Qiankun 子应用生命周期及使用场景解析
excel2025/10/5

在前端微前端架构中,Qiankun 是常用的微前端框架。它允许主应用动态加载多个子应用,而子应用必须遵循特定生命周期,保证能够被正确加载、挂载和卸载。本文将详细解析 子应用的三个核心生命周期函数:bootstrap、mount、unmount,并说明它们的使用场景,同时给出具体示例。 1. 子应用生命周期概览 子应用生命周期分为三个阶段: Bootstrap(初始化阶段) Mount(挂载阶段) Unmount(卸载阶段) 每个阶段有明确的调用时机和职责。 2. bootstrap:初始

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0