【AI知识点】残差网络(ResNet,Residual Networks)

残差网络(ResNet,Residual Networks) 是由微软研究院的何凯明等人在 2015 年提出的一种深度神经网络架构,在深度学习领域取得了巨大的成功。它通过引入残差连接(Residual Connection) 解决了深层神经网络中的梯度消失(Vanishing Gradient) 问题,从而实现了对非常深层网络的有效训练。

ResNet 的提出使得神经网络可以训练出更深层的模型,极大提升了模型的性能。在 2015 年的 ImageNet 大规模视觉识别挑战赛(ILSVRC 2015)中,ResNet 获得了冠军,并且它也是许多后续深度学习模型的基础。


1. 深度网络中的问题

随着神经网络层数的增加,深度网络面临两个主要问题:

  1. 梯度消失和梯度爆炸:在反向传播中,梯度会随着层数的增加逐层变小或变大,导致前几层的权重更新非常缓慢或更新过大,模型难以有效训练。
  2. 退化问题:在非常深的网络中,增加更多的层有时反而会导致模型的训练误差增大,而不是进一步减少。理想情况下,增加更多的层应该至少不会使性能变差,但实际上在深度网络中,随着层数增加,网络的表示能力可能反而下降。

2. 残差学习的核心思想

ResNet 的核心思想是引入残差块(Residual Block),通过跳跃连接(Skip Connection) 让信息直接跳过一层或多层网络,从而解决深度网络中的退化问题。

下图为跳过两层的残差连接示意图

图片来源:ResNet的原始论文 Deep Residual Learning for Image Recognition

假设普通的深度网络中的映射为 H ( x ) H(x) H(x),在 ResNet 中,我们将其重新表示为残差函数 F ( x ) F(x) F(x) 加上输入 x x x 的直接跳跃连接:
H ( x ) = F ( x ) + x H(x) = F(x) + x H(x)=F(x)+x
其中:

  • x x x 是输入,
  • F ( x ) F(x) F(x) 是要学习的残差函数,它表示某一层对输入的变化量。

这种设计的核心思想是,与其直接学习映射 H ( x ) H(x) H(x),ResNet 通过学习残差 F ( x ) = H ( x ) − x F(x) = H(x) - x F(x)=H(x)x,让网络去拟合残差。在实践中,残差学习更容易收敛,因为直接保留输入 x x x,可以有效防止梯度消失。


3. ResNet 的结构

ResNet 的基本单元是残差块(Residual Block),其结构如下:

图片来源:https://en.wikipedia.org/wiki/Residual_neural_network

  • 输入 x x x 通过两层卷积,卷积层后接 Batch Normalization 和 ReLU 激活函数得到 F ( x ) F(x) F(x)
  • 跳跃连接:将输入 x x x 加到 F ( x ) F(x) F(x) 上得到输出 H ( x ) H(x) H(x)
  • 输出 H ( x ) H(x) H(x),该输出再输入到下一层。
  • 如果输入的维度和输出的维度不同,则会引入 1x1卷积 进行调整,以确保两者维度一致。如图右边所示。

4. 为什么残差学习有效?

在 ResNet 中,跳跃连接可以让网络层直接学习更深层次的特征,而不必从头学习每一层的映射。它的两个关键优势是:

  1. 更容易优化:因为每一层只是学习输入与输出之间的残差,它减小了学习的难度。这意味着,如果某一层无法学习到任何有效的信息,网络至少可以通过跳跃连接直接传递输入,确保不会出现退化现象。

  2. 防止梯度消失:在反向传播过程中,跳跃连接让梯度能够绕过一些中间层,直接传递到前面的层,从而缓解了梯度消失的问题。


5. ResNet 的不同版本

ResNet 提出了多个不同深度的版本,包括 18 层、34 层、50 层、101 层和 152 层等。

  • ResNet-18 和 ResNet-34:这些是比较浅的版本,通常用于计算资源有限的情况下。
  • ResNet-50、ResNet-101 和 ResNet-152:这些是较深的版本,能够学习更加复杂的特征,用于高性能任务,比如大规模图像分类和目标检测。

ResNet-50 为例,它由 49 个卷积层和 1 个全连接层组成,其中包括多个残差块,深度足以捕获复杂的模式,但通过残差连接,训练仍然较为稳定。

下图为原始的 Resnet-18 架构图.

图片来源:https://en.wikipedia.org/wiki/Residual_neural_network


6. ResNet 的改进版本

ResNet 的成功使得许多后续的深度学习模型引入了残差结构,且出现了一些改进版本:

a. Wide ResNet(WRN)

  • Wide ResNet 是通过增加每层的宽度(通道数)来提升网络的表示能力,提出了比增加深度更有效的优化方法。实验表明,增加网络宽度(而不是深度)在某些任务上表现更好。

b. ResNeXt

  • ResNeXt 是对 ResNet 的进一步扩展,它引入了“分组卷积”的概念,将卷积操作分为多个组进行并行计算,类似于“组卷积”的概念,从而提升网络的计算效率,同时保持较高的准确率。

c. DenseNet

  • DenseNet 也是一种基于跳跃连接的网络结构,但不同于 ResNet 中的简单残差连接,DenseNet 在每一层都连接了所有前面的层。它直接将前面所有层的输出拼接到一起,再传入当前层进行计算。DenseNet 的参数更少,且在某些任务上表现优于 ResNet。

7. ResNet 在实际中的应用

ResNet 在许多实际任务中表现优异,尤其是在图像处理任务上,它成为了许多深度学习模型的基础组件:

  • 图像分类:ResNet 广泛应用于图像分类任务中,特别是在 ImageNet 这种大规模数据集上的表现非常突出。
  • 目标检测和分割:ResNet 被广泛用于目标检测和语义分割的任务中,例如 Faster R-CNN、Mask R-CNN 等模型都使用 ResNet 作为特征提取器。
  • 自然语言处理:虽然 ResNet 主要用于图像处理,但它的残差思想也被迁移到自然语言处理(NLP)领域,用于构建深层语言模型。

8. ResNet 的成功原因总结

  • 有效解决了深度网络的训练问题:通过残差连接,ResNet 能够训练非常深的网络,而不会出现梯度消失或退化问题。
  • 简单有效的结构:残差块结构简单,容易实现,而且在各种深度学习任务中表现良好。
  • 可扩展性强:ResNet 的结构非常灵活,可以轻松地扩展到不同深度或不同宽度的版本,以适应不同的计算资源和任务需求。

9. ResNet 与传统卷积神经网络的比较

特性传统卷积神经网络(CNN)残差网络(ResNet)
层数层数相对较少层数可以非常深,50 层甚至更多
训练难度深层网络容易训练困难残差块降低了训练难度
梯度消失问题容易出现梯度消失问题跳跃连接缓解了梯度消失问题
网络性能层数增加后性能提升有限深层网络的性能提升显著
训练速度较难优化,训练速度较慢相对较快,优化效果更好

10. 总结

ResNet(残差网络) 通过引入残差连接,有效解决了深度神经网络中的梯度消失和退化问题,使得训练深层网络变得更加可行和高效。它的成功不仅提升了图像分类、目标检测等任务的性能,还成为了许多现代深度学习模型的重要组成部分。


11. 进一步了解

可以阅读ResNet的原始论文:Deep Residual Learning for Image Recognition

我个人认为其实我们人类学习也可以借鉴残差学习的思想、有时候不用按部就班去学,可以适当跳过一些地方(比如暂时不需要或者比较难懂的),直接学习关键的残差部分。另外,跳跃思维,也称为发散性思维,我感觉也有点残差学习的影子。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于图像的3D动物重建与生成

一、背景与目标 3D-Fauna 是一款用于基于图像和视频进行四足动物3D重建与生成的开源方案。自然界展示了复杂的相似性与多样性,该方法通过学习来自网上图片的四足动物的3D形态,能够从单张图片生成可动画化的带有纹理的3D网格模型。其最终目标是通过大量扩展现有的解决方案,实…

【网络篇】计算机网络——运输层详述(笔记)

目录 一、运输层 1. 概述 2. 运输层和网络层的关系 3. 运输层协议概述 二、多路复用和多路分解 1. 综述 2. 无连接的多路复用与多路分解(UDP) 3. 面向连接的多路复用与多路分解(TCP) 4. Web 服务器与TCP 三、UDP&#x…

Django学习笔记十三:优秀案例学习

Django CMS 是一个基于 Django 框架的开源内容管理系统,它允许开发者轻松地创建和管理网站内容。Django CMS 提供了一个易于使用的界面来实现动态网站的快速开发,并且具有丰富的内容管理功能和多种插件扩展。以下是 Django CMS 的一些核心特性和如何开始…

力扣之1336.每次访问的交易次数

题目: sql建表语句: Create table If Not Exists Visits (user_id int, visit_date date); Create table If Not Exists Transactions (user_id int, transaction_date date, amount int); Truncate table Visits; insert into Visits (user_id,…

Unity3d使用JsonUtility.FromJson读取json文件

使用JsonUtility.FromJson方法不需要额外引用第三方库。该方法只能读取json对象,而不能读取json数组。 假如我们有如下的json数组: [ {"id":1, "name":"first2021", "level":5, "score":100, "…

The 2024 ICPC Kunming Invitational Contest F. Collect the Coins(二分)

在知乎内查看 题目 思路来源 官方题解 题解 一旦某个速度v满足,那么大于速度v的都满足,所以可以被二分,但是二分的check不好想,卡住了 最后去看了题解,其实维护的是,一个机器人在目标点收集硬币时&…

UGUI(三大现成UI控件)

Rawimage 可以是任意类型的图,所以这里的泛型就更宽泛,不止sprite 相比Image唯二的不同 uvrect有点像平铺 Text suddenly come to a Free island. best fit开启后会有范围选择 Image image 组件是挂在RectTransform的ui下的,换句话说&…

windows C++-创建数据流代理(二)

完整的数据流演示 下图显示了 dataflow_agent 类的完整数据流网络: 由于 run 方法是在一个单独的线程上调用的,因此在完全连接网络之前,其他线程可以将消息发送到网络。 _source 数据成员是一个 unbounded_buffer 对象,用于缓冲…

整理/删除重复文件

文件分类 #!/bin/bash if [ "$#" -ne 1 ]; thenecho "use: $0 <download_url>"exit 1 fi TARGET_DIR"$1" mkdir -p "$TARGET_DIR/jpg" mkdir -p "$TARGET_DIR/mp4" for img in "$TARGET_DIR"/*.jpg; doif…

k8s 中的 PV 的动态供给

目录 1 存储类 Storageclass 介绍 1.1 StorageClass 说明 1.2 StorageClass 的属性 2 存储分配器 NFS Client Provisioner 2.1 官网存储分配器的部署介绍 2.2 实现动态创建 PV 模版清单文件的介绍 2.2.1 Storageclass 存储类的模版 2.2.2 创建 Provisioner 制备器的模版 2.2.3…

ctf.bugku - POST

题目来源 &#xff1a;POST - Bugku CTF 访问请求&#xff0c;返回如下信息&#xff1b; 从这里可以得到信息&#xff1b;想要得到flag &#xff0c;需要发送post请求&#xff0c;并且请求带有what参数&#xff0c;参数值为flag 构造消息体&#xff1b; burpsuite中&#x…

连续点击三次用户

有用户点击日志记录表 t2_click_log&#xff0c;包含user_id(用户ID),click_time(点击时间)&#xff0c;请查询出连续点击三次的用户数&#xff0c; 连续点击三次&#xff1a;指点击记录中同一用户连续点击&#xff0c;中间无其他用户点击&#xff1b; CREATE TABLE t2_click…

仿小米的Disucz模板

整套模板是忽悠兄原创设计开发&#xff0c;这是一款简约大气的模板&#xff0c;保留Discuz预留功能&#xff0c; 必须一键式配置完成&#xff0c;使用插件配置到位&#xff0c;专业的网站肯定不使用DIY啦&#xff0c;二次开发了大部分功能&#xff0c; 更强大&#xff0c;别人…

微信小程序开发-配置文件详解

文章目录 一&#xff0c;小程序创建的配置文件介绍二&#xff0c;配置文件-全局配置-pages 配置作用&#xff1a;注意事项&#xff1a;示例&#xff1a; 三&#xff0c;配置文件-全局配置-window 配置示例&#xff1a; 四&#xff0c;配置文件-全局配置-tabbar 配置核心作用&am…

C++笔记之原子操作

C++笔记之原子操作 code review! 文章目录 C++笔记之原子操作1.初始化2.赋值3.取值4.赋给另一个原子类型5.`exchange`6.`compare_exchange_weak` 和 `compare_exchange_strong`使用场景7.注意事项在 C++ 中,原子类型提供了对共享变量的无锁操作,确保多线程环境下的安全。以下…

Linux搭建Hadoop集群(详细步骤)

前言 Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下&#xff0c;开发分布式程序。充分利用集群的威力进行高速运算和存储。 说白了就是实现一个任务可以在多个电脑上计算的过程。 一&#xff1a;准备工具 1.1 VMware 1.2L…

免费高可用软件

高可用软件是指那些能够提供高可用性、高可靠性的软件&#xff0c;它们在各种应用场景下都能确保系统的稳定运行。以下是四款免费的高可用软件&#xff0c;它们在不同领域都表现出色&#xff0c;能够满足各种高可用性需求。 一、PanguHA PanguHA是一款专为Windows平台设计的双…

计算机的错误计算(一百一十六)

摘要 计算机的错误计算&#xff08;一百一十&#xff09;分析了&#xff08;二&#xff09;中例1循环迭代错误计算的原因。应读者建议&#xff0c;本节将用错数讨论其例2的错误计算原因。 例1. 已知 计算 在 的错数&#xff0c;并用实例分析计算过程中的错误数字数量。…

设计模式之适配器模式(Adapter)

一、适配器模式介绍 适配器模式(adapter pattern )的原始定义是&#xff1a;将类的接口转换为客户期望的另一个接口&#xff0c; 适配器可以让不兼容的两个类一起协同工作。 适配器模式是用来做适配&#xff0c;它将不兼容的接口转换为可兼容的接口&#xff0c;让原本由于接口…

2024Java最新面试题总结(针对于一些小厂、中厂)

这是根据个人面试经历总结出来的一些经验希望可以帮助到有需要的人。 面试的时候&#xff0c;会先让你进行自我介绍&#xff0c;这个大家准备一两分钟的面试稿就可以。然后就是正式面试&#xff0c;面试官一般是两个人以上&#xff0c;开始&#xff0c;面试官会先提问一些基本…