一文详解残差网络

简介: 残差网络(ResNet)源于2016年的论文《Deep Residual Learning for Image Recognition》,旨在解决深层网络中的梯度消失和爆炸问题。通过引入残差块,即在网络中添加跳跃连接,使得信息可以直接跨过多层传递,从而有效解决了网络加深导致的训练困难。ResNet不仅显著提高了模型性能,还促进了深度学习领域的发展。

[TOC]

残差网络

残差网路的由来

​ 残差网络这一思想的起源是在2016年论文《Deep Residual Learning for Image Recognition》中第一次被提出,目前的引用已经高达3w,现代的深度卷积神经网络大多都是使用此网络模型结构。

1.png

​ 在神经网络的发展期间,深度卷积网络是存在一定瓶颈的----即梯度爆炸梯度弥散。由此,为了解决层次过高带来的卷积网络梯度不稳定的问题,残差网络因此诞生

深度卷积网络的瓶颈

​ 理论上,增加网络层数后,网络可以进行更加复杂的特征提取,效果也会更好,这一点从神经网络的求导操作中即可得出,因此也意味着当模型更深时可以取得更好的效果。

​ 但是VGGGoogLeNet等网络(不了解的同学可以先去看看其他相关文章,本文不再赘述)单纯增加层数的时候遇到了一些瓶颈:简单的只增加卷积层,训练的误差不但没有降低,反而越来越高。

2.png

在CIFAR-10、imageNet等数据集上,单纯增加3x3卷积,训练和测试的误差都变大了。但这并不是过拟合的问题,因为56的网络的训练误差同样很高。这主要是深层网络中存在着梯度消失或者爆炸问题,模型的层数越多则会越难训练。

​ 从另一个角度考虑,加入我们把浅层模型直接拿过来,在此基础上增加新的层(就是把网络变得更深),我们此时可以考虑一种极端情况,新增加的层”什么都不学习“(就是F(x) = x),“什么都不学习”我们称为"恒等映射",用数学表达式成为:F(x) = x。其中F(x)是我们希望拟合的一个网络结构(就是我们的网络),或者是一种映射关系。

残差网络

​ 但是神经网络的各种激活函数并没有能够使得网络做到恒等映射残差的网络的初衷便是尽量使得模型做到恒等映射(即什么都不做),这样就不会因为网络的层数问题产生梯度爆炸和梯度弥散

残差网络原理

​ 上文中说了,残差网络就是一个使得卷积网络恒等映射(什么都不做)的激活函数。即F(x) = x。

​ 我们假设有一个网络的输出是H(x),输入为x,layers所做的一系列操作是F(x)。要让此网络做到F(x) = x,也就是做到H(x) = F(x) + x(F(x) = 0),换句话说:残差网络就是输出等于输入的网络(恒等映射)(如图)。

3.png

​ 从另一个角度分析:我们的卷积网络遇到了梯度爆炸和梯度弥散并且导致了网络的错误率随着层数的增加而增加。想降低错误率,我们要想个办法使得我们的卷积网络的错误率至少不会越来越高,然后再去谈降低错误率,而这正是残差网络的作用。

4.png

残差网络的实现

​ 具体实现上,残差网络有集中构建方式,如上图所示。上图中左侧虚线部分的输出和x直接相加,右侧的x经过1x1卷积层(此处的1x1卷积层就是上文中的恒等映射=>第二张图片)再与虚线部分相加。虚线部分包含了两个3x3卷积层。左侧虚线部分能和输入x直接相加的前提是,虚线里的3x3卷积层没有改变x的维度,可以直接相加。因为如果一旦改变了x的维度,一种办法是使用1x1的卷积层直接相加(肯定不会改变x的维度),另一种是用0填充x

import torch
from torch import nn
from torch.nn import functional as F

class Residual(nn.Module):
    """The Residual block of ResNet."""
    def __init__(self, input_channels, num_channels,
                 use_1x1conv=False, strides=1):
        super().__init__()
        self.conv1 = nn.Conv2d(input_channels, num_channels,
                               kernel_size=3, padding=1, stride=strides)
        self.conv2 = nn.Conv2d(num_channels, num_channels,
                               kernel_size=3, padding=1)
        if use_1x1conv:
            self.conv3 = nn.Conv2d(input_channels, num_channels,
                                   kernel_size=1, stride=strides)
        else:
            self.conv3 = None
        self.bn1 = nn.BatchNorm2d(num_channels)
        self.bn2 = nn.BatchNorm2d(num_channels)
        self.relu = nn.ReLU(inplace=True)

    def forward(self, X):
        Y = F.relu(self.bn1(self.conv1(X)))
        Y = self.bn2(self.conv2(Y))
        if self.conv3:
            X = self.conv3(X)
        Y += X
        return F.relu(Y)

ResNet-34

​ 基于基础的残差网络,我们可以构建出ResNet网络,论文中给出了基于ImageNet的数据集的ResNet-34和VGG-19的对比图。如下图中最左侧是VGG-19,中间只使用3x3卷积层的网络,右侧使用了残差网络的思想的ResNet-34ResNet-34除了第一层是7x7的卷积层、最后一层是全连接层外,中间全部都是3x3的卷积层

5.png

​ 最右侧是ResNet-34,命名为ResNet-34,是因为网络中7×7卷积层、3×3卷积层和全连接层共34层。在计算这个34层时,论文作者并没有将BatchNorm、ReLU、AvgPool以及Shortcut中的层考虑进去。右侧ResNet-34中的3×3卷积层的颜色不同,共4种颜色。每种颜色表示一个模块,由一组残差基础块组成,只不过残差基础块的数量不同,从上到下依次是[3, 4, 6, 3]个残差基础块。另外,图4右侧,残差基础块中用实线Shortcut表示维度没有变化(可以直接相加);虚线Shortcut表示维度变化了,比如通道数从64变为128,无法直接相加,或者在xx上填充0,或者使用1×1卷积层改变维度。

相关文章
|
机器学习/深度学习 人工智能
手动实现一个扩散模型DDPM(下)
手动实现一个扩散模型DDPM(下)
1726 2
|
机器学习/深度学习 算法 数据挖掘
YOLOv6 | 模型结构与训练策略详细解析
YOLOv6 | 模型结构与训练策略详细解析
3099 0
YOLOv6 | 模型结构与训练策略详细解析
|
机器学习/深度学习 人工智能 数据管理
文生图的基石CLIP模型的发展综述
CLIP(Contrastive Language-Image Pre-training)是OpenAI在2021年发布的多模态模型,用于学习文本-图像对的匹配。模型由文本和图像编码器组成,通过对比学习使匹配的输入对在向量空间中靠近,非匹配对远离。预训练后,CLIP被广泛应用于各种任务,如零样本分类和语义搜索。后续研究包括ALIGN、K-LITE、OpenCLIP、MetaCLIP和DFN,它们分别在数据规模、知识增强、性能缩放和数据过滤等方面进行了改进和扩展,促进了多模态AI的发展。
3175 0
|
7月前
|
机器学习/深度学习 数据采集 人工智能
如何赋予大语言模型以“灵魂”?深度解析增量预训练(Continual Pre-training)逻辑与实战代码
本文深入解析大模型增量预训练(CPT/DAP/CFT)三大路径,厘清RAG、微调与预训练的适用边界;结合eBay、AWS等实战案例,详解低成本高效CPT方法,并提供Unsloth框架下Qwen-3-4B金融领域实操代码。
1203 1
如何赋予大语言模型以“灵魂”?深度解析增量预训练(Continual Pre-training)逻辑与实战代码
|
机器学习/深度学习 计算机视觉
《深度剖析:残差连接如何攻克深度卷积神经网络的梯度与退化难题》
残差连接通过引入“短路”连接,解决了深度卷积神经网络(CNN)中随层数增加而出现的梯度消失和退化问题。它使网络学习输入与输出之间的残差,而非直接映射,从而加速训练、提高性能,并允许网络学习更复杂的特征。这一设计显著提升了深度学习在图像识别等领域的应用效果。
893 13
|
PyTorch 算法框架/工具
Pytorch学习笔记(三):nn.BatchNorm2d()函数详解
本文介绍了PyTorch中的BatchNorm2d模块,它用于卷积层后的数据归一化处理,以稳定网络性能,并讨论了其参数如num_features、eps和momentum,以及affine参数对权重和偏置的影响。
2868 0
Pytorch学习笔记(三):nn.BatchNorm2d()函数详解
|
机器学习/深度学习 算法 计算机视觉
经典神经网络论文超详细解读(五)——ResNet(残差网络)学习笔记(翻译+精读+代码复现)
经典神经网络论文超详细解读(五)——ResNet(残差网络)学习笔记(翻译+精读+代码复现)
6581 1
经典神经网络论文超详细解读(五)——ResNet(残差网络)学习笔记(翻译+精读+代码复现)
|
算法 数据挖掘 调度
【调度算法】NSGA III(1)
【调度算法】NSGA III
2898 0
|
机器学习/深度学习 自然语言处理 大数据
【Transformer系列(2)】注意力机制、自注意力机制、多头注意力机制、通道注意力机制、空间注意力机制超详细讲解
【Transformer系列(2)】注意力机制、自注意力机制、多头注意力机制、通道注意力机制、空间注意力机制超详细讲解
8872 2
【Transformer系列(2)】注意力机制、自注意力机制、多头注意力机制、通道注意力机制、空间注意力机制超详细讲解
|
机器学习/深度学习 PyTorch 算法框架/工具
详解三种常用标准化Batch Norm & Layer Norm & RMSNorm
通过本文的介绍,希望您能够深入理解Batch Norm、Layer Norm和RMSNorm的原理和实现,并在实际应用中灵活选择和使用,提升深度学习模型的性能和稳定性。
4693 5