ResNet(残差网络)详解
ResNet(残差网络)是一种深度神经网络架构,主要用于解决深度学习中的梯度消失和梯度爆炸问题,特别在深层网络的训练中表现出色。
ResNet 的核心概念
1. 残差学习
- 在传统的深度神经网络中,每一层学习直接映射: H ( x ) H(x) H(x)。
- 在残差网络中,层学习残差映射: F ( x ) = H ( x ) − x F(x) = H(x) - x F(x)=H(x)−x。
- 模型的目标是优化残差映射,而不是优化直接映射。
2. 残差块(Residual Block)
- 残差块包含跳跃连接(或快捷连接),允许输入 x x x 绕过一个或多个层。
- 一个残差块可以表示为: y = F ( x , W i ) + x y = F(x, {W_i}) + x y=F(x,Wi)+x。
- 这里, F ( x , W i ) F(x, {W_i}) F(x,Wi) 表示权重为 W i {W_i} Wi 的层所学习的残差映射, x x x 是块输入, y y y 是块输出。
3. 跳跃连接(Skip Connection)
- 跳跃连接直接将输入添加到后续层的输出。
- 它们有助于缓解梯度消失问题,因为梯度可以通过这些连接直接传播。
数学原理
1. 残差学习公式
-
残差学习可以数学表示为:
y = F ( x , W i ) + x y = F(x, {W_i}) + x y=F(x,Wi)+x
其中 F ( x , W i ) F(x, {W_i}) F(x,Wi) 是权重为 W i {W_i} Wi 的层的输出, x x x 是输入, y y y 是输出。
2. 梯度传播
- 在残差网络中,梯度直接通过跳跃连接传播,从而减少梯度消失的风险。
- 梯度更新公式中包含了跳跃连接部分,帮助保持梯度的稳定性。
代码
import tensorflow as tf
from tensorflow.keras.layers import Input, Conv2D, BatchNormalization, ReLU, Adddef residual_block(x, filters, kernel_size=3):y = Conv2D(filters, kernel_size, padding='same')(x)y = BatchNormalization()(y)y = ReLU()(y)y = Conv2D(filters, kernel_size, padding='same')(y)y = BatchNormalization()(y)out = Add()([x, y]) # 跳跃连接out = ReLU()(out)return out# 输入层
inputs = Input(shape=(64, 64, 3))# 创建残差块
x = Conv2D(64, 3, padding='same')(inputs)
x = residual_block(x, 64)
x = residual_block(x, 64)# 构建模型
model = tf.keras.Model(inputs=inputs, outputs=x)model.summary()
这个示例创建了一个包含两个残差块的简单 ResNet 模型。每个残差块包含两个卷积层和一个跳跃连接,通过 Add() 将输入和卷积层的输出相加。这种结构有助于缓解深层网络中的梯度消失问题,使得可以构建更深的网络结构
ResNet 与传统神经网络的区别
- 传统深度网络试图直接学习输入到输出的映射。
- ResNet 通过残差块学习输入与输出之间的差异(残差)。
- 这种方法使得网络可以更深,同时保持训练的有效性。
ResNet 的引入是深度学习领域的一次重大创新,它使得训练非常深的网络成为可能,显著提高了图像识别和分类任务的性能。