残差连接(Residual Connection / Skip Connection)和归一化(Normalization)的结合,是现代深度学习模型(尤其是深度神经网络和Transformer架构)成功的关键因素之一。

核心概念回顾

  1. 残差连接 (Residual Connection):

    • 思想: 不是让网络层直接学习目标映射 H(x),而是让它们学习残差映射 F(x) = H(x) - x。然后,最终的输出是 H(x) = F(x) + x
    • 实现: 将某一层(或一组层)的输入 x 直接跳过这些层,加到这些层的输出 F(x) 上。通常通过简单的加法(y = F(x, {W_i}) + x)或连接(y = F(x, {W_i}) || x)实现,加法更常见。
    • 主要作用:
      • 缓解梯度消失/爆炸: 在反向传播时,梯度可以通过残差路径(+ x 部分)几乎无损地传递回浅层,使得深层网络能够被有效训练。
      • 恒等映射: 如果最优的 F(x) 是零映射(即什么都不做是最好的),那么学习 F(x) = 0 比学习 H(x) = x 更容易(因为后者需要精确的恒等变换)。
      • 促进信息流动: 允许原始输入信息更直接地传递到后面的层,减少信息在多层变换中的损失或扭曲。
      • 简化优化: 优化残差映射 F(x) 通常比优化原始映射 H(x) 更容易。
  2. 归一化 (Normalization):

    • 思想: 对神经网络层内部的激活值或权重进行标准化处理,使其分布(如均值、方差)保持稳定。
    • 常见类型:
      • 批归一化 (Batch Normalization, BN): 对单个特征通道在一个小批量(Batch)的所有样本上进行归一化(减均值除标准差)。广泛应用于CNN。
      • 层归一化 (Layer Normalization, LN): 对单个样本的所有特征通道(或一个子集)进行归一化。广泛应用于RNN、Transformer。
      • 实例归一化 (Instance Normalization, IN): 对单个样本的单个特征通道进行归一化。常用于风格迁移。
      • 组归一化 (Group Normalization, GN): 将通道分组,对单个样本的每个组进行归一化。是BN在小批量场景下的替代方案。
    • 主要作用:
      • 加速训练收敛: 通过稳定层输入的分布,减少内部协变量偏移(Internal Covariate Shift),使得网络可以使用更大的学习率。
      • 缓解梯度问题: 有助于缓解梯度消失/爆炸问题。
      • 轻微的正则化效果: BN在训练时使用小批量的统计量,引入了随机性,有轻微正则化效果。

残差连接与归一化的结合:协同效应

将残差连接和归一化结合使用,能产生强大的协同效应,解决深度模型训练中的关键挑战:

  1. 解决残差加法带来的分布偏移:

    • 残差连接 y = F(x) + x 将两个不同来源(原始输入 x 和变换后的输出 F(x))的数据相加。F(x)x 的分布可能差异很大(尤其是 F(x) 经过了权重矩阵和非线性激活)。
    • 直接将它们相加可能导致 y 的分布发生剧烈变化(分布偏移),这不利于后续层的处理和学习。
    • 归一化的作用:y 输入到下一层之前(或之后,取决于具体结构),应用归一化层(如 BN 或 LN)可以将 y 重新调整到期望的分布(例如,零均值、单位方差),稳定后续层的输入。这抵消了残差加法可能引入的分布不稳定性。
  2. 稳定深层训练:

    • 深度网络的核心问题是梯度在反向传播过程中会逐层衰减(消失)或急剧增大(爆炸)。
    • 残差连接的作用: 提供了一条梯度可以几乎无损回传的“高速公路”。
    • 归一化的作用: 通过稳定各层的输入分布,使得梯度计算更加稳定可靠,避免了因输入分布剧烈变化导致的梯度异常。
    • 结合效果: 残差连接确保了梯度流的通畅,而归一化确保了梯度流经的路径是平滑稳定的。两者共同作用,使得训练非常深的网络(如数百层的 ResNet 或数十层的 Transformer)成为可能。
  3. 提升模型性能和收敛速度:

    • 稳定的梯度流和输入分布使得优化器(如 SGD, Adam)能够更有效地工作。
    • 模型能够更快地收敛到更好的解,通常也能获得更高的最终精度。

结合方式:常见模式

最常见的结合方式是在残差块(Residual Block)内部或周围放置归一化层。具体位置有多种设计,各有优缺点:

  1. Pre-Normalization (Pre-Norm):

    • 结构: Norm -> Layer (Conv/Linear/Attention) -> Activation -> + Shortcut
    • 流程: 输入 x 先经过归一化层(如 LN),然后进入主要的计算层(卷积、全连接、注意力等),再经过激活函数(如 ReLU, GELU),最后与原始输入 x(或经过投影的 x)相加。
    • 优点: 梯度流更稳定,尤其对非常深的模型(如 Transformer)效果更好。训练通常更稳定。
    • 缺点: 原始输入 x 没有经过归一化就直接参与加法,理论上加法后的分布可能不如 Post-Norm 稳定(但在实践中,Pre-Norm 的稳定性优势通常更显著)。
    • 典型应用: Transformer 架构(如 GPT, BERT 的后续变种,T5)普遍采用 Pre-LN 结构。
  2. Post-Normalization (Post-Norm):

    • 结构: Layer (Conv/Linear/Attention) -> Norm -> Activation -> + ShortcutLayer -> Activation -> Norm -> + Shortcut
    • 流程: 输入 x 先经过主要的计算层和激活函数,然后进行归一化,最后再与原始输入 x(或经过投影的 x)相加。
    • 优点: 加法操作 F(x) + x 的输出 y 会立即被归一化,理论上能更直接地稳定输出分布。
    • 缺点: 对于非常深的模型,梯度流经过多个 Post-Norm 层时可能会累积不稳定因素,导致训练困难(如梯度消失或爆炸)。
    • 典型应用: 原始 ResNet 使用 Conv -> BN -> ReLU 结构(BN 在卷积后、激活前),加法后不再归一化(可视为一种 Post-Norm 变体)。原始 Transformer 论文使用的是 Post-LN(Add & Norm 在计算层之后)。
  3. 其他变体:

    • 有些结构会在残差块内部使用多个归一化层。
    • 有些结构(如原始的 ResNet)只在卷积层后使用 BN,残差加法后不再归一化(因为 BN 已经稳定了卷积层的输出,且 CNN 的深度相对 Transformer 较浅)。

实际应用例子

  1. ResNet (图像识别 - CNN 代表):

    • 结构: 核心是残差块。一个基本块包含:
      • 卷积层 1 -> 批归一化 (BN) -> ReLU
      • 卷积层 2 -> 批归一化 (BN)
      • 残差连接:将块的输入 x 加到第二个 BN 的输出上 (F(x) + x)
      • ReLU (在加法之后)
    • 结合方式: 这是 Post-Normalization 的一种形式(BN 在卷积后,加法前)。BN 稳定了卷积层的输出 F(x),使得 F(x) + x 的分布相对可控,然后最后的 ReLU 再进行非线性变换。BN 在这里至关重要,它使得 ResNet 能够训练超过 100 层,并在 ImageNet 等任务上取得突破性成果。
  2. Transformer Encoder/Decoder Layer (NLP/CV - Transformer 代表):

    • 结构 (以 Pre-LN 为例,如 BERT, GPT):
      • 子层 1 (如 Multi-Head Self-Attention):
        • 输入 x
        • 层归一化 (LN) -> 多头注意力计算 -> Dropout
        • 残差连接:x + Dropout(Attention(LN(x)))
      • 子层 2 (如 Feed-Forward Network):
        • 输入 y (子层 1 的输出)
        • 层归一化 (LN) -> 全连接层 1 -> 激活 (如 GELU) -> Dropout -> 全连接层 2 -> Dropout
        • 残差连接:y + Dropout(FFN(LN(y)))
    • 结合方式: 这是典型的 Pre-Normalization (Pre-LN)。在每个子层(注意力或前馈网络)的核心计算之前进行层归一化 (LN)。LN 稳定了子层的输入,然后子层进行计算,最后通过残差连接与子层输入相加。这种 Pre-LN 结构被证明在训练非常深的 Transformer 模型(如大型语言模型)时比原始的 Post-LN 更稳定。
  3. Vision Transformer (ViT - CV):

    • 结构: ViT 将 Transformer 架构应用于图像。其编码器层结构与上述 Transformer Encoder Layer 几乎完全相同。
    • 结合方式: 同样采用类似 Pre-LN 或 Post-LN 的结构(现代实现多倾向 Pre-LN),在每个多头注意力层和前馈网络层前后使用层归一化 (LN) 和残差连接。这使得 ViT 能够有效处理图像块序列,并在大规模图像识别任务上取得优异性能。
  4. BERT / GPT (NLP):

    • 结构: BERT(编码器)和 GPT(解码器)的核心构建块就是 Transformer 层。
    • 结合方式: 与上述 Transformer 例子一致。BERT/GPT 及其后续变种(RoBERTa, GPT-2, GPT-3 等)的成功,很大程度上依赖于残差连接和层归一化 (LN) 的结合,使得训练包含数亿甚至数千亿参数的数十层深度模型成为可能。

总结

残差连接解决了深度模型训练中的梯度流问题,使得训练极深网络成为可能。归一化(BN, LN 等)解决了网络内部激活值分布不稳定的问题,加速收敛并提升稳定性。两者的结合是协同的:

  • 归一化补偿了残差连接中直接加法操作可能引起的输入分布偏移,为后续层提供了稳定的输入。
  • 残差连接为归一化层提供了更通畅、更稳定的梯度回传路径。
  • 这种组合极大地增强了深度模型的训练稳定性、收敛速度和最终性能,是现代深度学习架构(从 ResNet 到 Transformer 及其各种衍生模型)不可或缺的核心设计范式。选择 Pre-Norm 还是 Post-Norm 取决于具体架构和深度,Pre-Norm 在极深模型中通常表现出更好的稳定性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95781.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95781.shtml
英文地址,请注明出处:http://en.pswp.cn/web/95781.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K8s集群+Rancher Server:部署DolphinScheduler 3.2.2集群

本文手把手演示了如何在 K8s Rancher 环境中快速拉起一套生产可用的 Apache DolphinScheduler 3.2.2 集群。全文围绕“镜像加速、依赖本地化、存储持久化”三大痛点展开,附有详细的代码解析,收藏细看吧! 环境准备 1、软件准备2、环境规划部署…

查询语言的进化:SQL之后,为什么是GQL?数据世界正在改变

数据是现代世界的核心驱动力。 在数据驱动的世界里,查询语言就像人与数据沟通的桥梁。 如何高效地获取、操作和理解数据,取决于查询语言的演进。 自20世纪70年代关系型数据库兴起以来,SQL(Structured Query Language&#xff0…

AgentThink:一种在自动驾驶视觉语言模型中用于工具增强链式思维推理的统一框架

文章目录摘要1. 引言2. 相关工作2.1 自动驾驶中的语言模型2.2 自动驾驶中的视觉问答3. 方法3.1 数据生成流水线3.2 两阶段训练流程3.2.1 基于 SFT 的推理预热3.2.2 基于 RLFT 的推理增强3.3 推理与评估4. 实验4.1 主要实验结果4.2 工具使用分析4.3 消融实验4.4 泛化性评估5. 结…

Bug 排查日记:打造高效问题定位与解决的技术秘籍

一、引言在软件开发的漫漫征程中,Bug 如影随形,成为开发者们必须跨越的一道道障碍。它们或如微小的瑕疵,影响用户体验;或似隐藏的炸弹,引发系统故障,导致严重后果。高效排查 Bug,不仅是保障软件…

使用 Sentry 为 PHP 和 Web 移动小程序提供多平台错误监控

今天我在 reddit 上看到 Sentry 的推广,想到 19 年我第一次在公司自研产品b2b2c上使用 Sentry 的经历,后面在其他项目上多次使用Sentry,今天就顺手分享一下在 Laravel 项目中接入 Sentry 的实践心得。现代项目往往涉及 Web、移动端和小程序&a…

Python包管理工具全对比:pip、conda、Poetry、uv、Flit深度解析

在Python开发中,包的管理和使用是重要环节,现如今python包管理工具众多,如何选择合适的管理工具?常用的工具有pip、conda、Poetry、uv、Flit,下面这些工具进行详细对比分析。一、工具概览对比工具类型开发者主要特点适…

车载诊断架构 --- Service 14一丢丢小汇总

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做你把时间花在哪里,你的人生就在哪里。千万别看见别人发光,就觉得自己暗淡。人生如逆旅,你我皆行人。唯有不断阅己、越己、悦己才能活出生命的意…

Struts2 工作总结

一 in,在SQL中,IN 是一个条件操作符,用于指定多个可能的值,通常用在 WHERE 子句中。它的作用是检查某个字段的值是否在给定的值列表中,相当于多个 OR 条件的简写形式。不使用 IN(冗长)SELECT * …

MQTT 认证与授权机制实践(二)

四、实战案例:主流 Broker 的认证授权配置指南(一)EMQ X:企业级物联网 Broker 的安全方案1. 认证配置(用户名密码 证书)EMQ X 作为一款企业级物联网 Broker,在安全认证方面提供了丰富且灵活的配…

多路转接介绍及代码实现

目录 1.多路转接技术的产生背景 2.select 3.poll 3.epoll 1.多路转接技术的产生背景 一个技术的出现必然有它要解决的问题,那么多路转接解决的问题是什么嗯? 我们知道,一个进程里面有一个文件描述符表管理这个进程所打开的文件,我们进行网络通信的时候,本质就是创建一个…

《sklearn机器学习——回归指标1》

skearn.metrics模块实现一些损失函数,评分,并且应用函数去测度回归标签。其中一些已经改进,可以处理多指标案例:mean_squared_error,mean_absolute_error,explained_variance_score和r2_score。 这些函数使…

消息存储机制-索引文件及页缓存

对于生产者来说,将消息写到commit log文件里面。这里会有消息的逻辑队列,逻辑队列里面保存了消息的偏移量。除了consumerquenue之外,它还会将数据分发到另外一个文件叫indexfile索引文件里面。这个索引文件可以保存消息的一些信息&#xff0c…

辗转相除法(欧几里得算法)的证明

欢迎访问我的主页: https://heeheeaii.github.io/ 辗转相除法是一种用于计算两个非负整数最大公约数的有效算法。它的证明主要分为两个部分: 证明核心引理: gcd(a,b)gcd(b,amodb)证明算法的收敛性: 证明算法一定会在有限步内结束。 辗转相除法…

RL【3】:Bellman Optimality Equation

系列文章目录 文章目录系列文章目录前言Definition of optimal policyBellman optimality equationIntroductionMaximization on the right-hand sideContraction mapping theoremSolutionOptimalityAnalyzing optimal policies总结前言 本系列文章主要用于记录 B站 赵世钰老师…

有序数组,距离目标最近的k个数 二分查找

🤔 新手做题思路:第1步:理解题目- 找距离x最近的k个数- 数组已排序- 返回结果也要排序(升序)- 距离相同时,选择较小的数第2步:关键insight- 数组已排序 → 考虑二分查找- 最近的k个数一定是连续…

学习心得分享

我认为知识是一定要系统化的学习,结构化梳理,这样在运用或思考的时候,能够回忆起自己在这一块梳理的知识结构,如果有记录那么能快速回忆并理解,如果没有记录,那么说明对自己来说超纲了,把知识进…

为什么说 Linode 和 DigitalOcean 的差距,不止于 VPS?

在今天这个全球化的商业战场上,中国企业的出海已从“选择题”变为“必答题”。当我们满怀雄心,将产品和业务推向海外市场时,基础设施的选择,往往是决定成败的第一步。它不仅关乎成本与性能,更直接影响着团队的开发效率…

NSSCTF每日一题_Web_[SWPUCTF 2022 新生赛]奇妙的MD5

为了保持做题的感觉和持续学习,也就有了每日一题系列,选一些有意义的题目或者一些CTF新颖题目作为参考学习。[SWPUCTF 2022 新生赛]奇妙的MD51. 访问首页界面并进行分析估计题目MD5提示,查询得知ffifdyop 这个字符串是一个奇妙的MD5字符串因为将“ffifdy…

服务器IP暴露被攻击了怎么办?

当服务器IP暴露后,可能会面临各种网络攻击,如DDoS攻击、端口扫描、恶意入侵等,这将严重影响服务器的正常运行和数据安全。本文将从检测攻击类型、采取紧急防护措施、优化服务器配置、寻求专业支持以及预防未来攻击五个方面,详细探…

TDengine 时间函数 TIMETRUNCATE 用户手册

TDengine TIMETRUNCATE 函数用户使用手册 函数概述 TIMETRUNCATE 是 TDengine 中的一个时间处理标量函数,用于将时间戳按照指定的时间单位进行截断操作。该函数在时间数据聚合、分组和统计分析中非常有用,特别适用于智能电表等时序数据的分析场景。 语…