1. 先导知识
在VGG中,卷积网络达到了19层,在GoogLeNet中,网络史无前例的达到了22层。那么,网络的精度会随着网络的层数增多而增多吗?在深度学习中,网络层数增多一般会伴着下面几个问题

  • 计算资源的消耗
  • 模型容易过拟合
  • 梯度消失/梯度爆炸问题的产生

问题1可以通过GPU集群来解决,对于一个企业资源并不是很大的问题;问题2的过拟合通过采集海量数据,并配合Dropout正则化等方法也可以有效避免;问题3通过Batch Normalization也可以避免。貌似我们只要无脑的增加网络的层数,我们就能从此获益,但实验数据给了我们当头一棒。
作者发现,随着网络层数的增加,网络发生了退化(degradation)的现象:随着网络层数的增多,训练集loss逐渐下降,然后趋于饱和,当你再增加网络深度的话,训练集loss反而会增大。注意这并不是过拟合,因为在过拟合中训练loss是一直减小的。
当网络退化时,浅层网络能够达到比深层网络更好的训练效果,这时如果我们把低层的特征传到高层,那么效果应该至少不比浅层的网络效果差,或者说如果一个VGG-100网络在第98层使用的是和VGG-16第14层一模一样的特征,那么VGG-100的效果应该会和VGG-16的效果相同。所以,我们可以在VGG-100的98层和14层之间添加一条直接映射(Identity Mapping)来达到此效果。
从信息论的角度讲,由于DPI(数据处理不等式)的存在,在前向传输的过程中,随着层数的加深,Feature Map包含的图像信息会逐层减少,而ResNet的直接映射的加入,保证了 l + 1 l+1 l+1层的网络一定比 l l l 层包含更多的图像信息。
基于这种使用直接映射来连接网络不同层的思想,残差网络应运而生。
2. 残差网络
2.1. 残差块
残差网络是由一系列残差块组成的(图1)。一个残差块可以表示为:
x l + 1 = x l + F ( x l , W l ) ( 1 ) x_{l+1}=x_l+F(x_l, W_l)\qquad (1) xl+1=xl+F(xl,Wl)(1)
在这里插入图片描述
在卷积网络中, x l x_l xl可能和 x l + 1 x_{l+1} xl+1的Feature Map的数量不一样,这时候就需要使用 1 × 1 1 \times 1 1×1卷积进行升维或者降维(图2)。这时,残差块表示为:
x l + 1 = h ( x l ) + F ( x l , W l ) ( 2 ) x_{l+1}=h(x_l)+F(x_l, W_l)\qquad (2) xl+1=h(xl)+F(xl,Wl)(2)
其中 h ( x l ) = W l ′ x l h(x_l)={W_l}^\prime x_l h(xl)=Wlxl W l ′ {W_l}^\prime Wl 1 × 1 1 \times 1 1×1 卷积操作,但是实验结果 1 × 1 1 \times 1 1×1 卷积对模型性能提升有限,所以一般是在升维或者降维时才会使用。
残差块分成两部分直接映射部分和残差部分。 h ( x l ) h(x_l) h(xl)是直接映射,反应在图1中是左边的直线; F ( x l , W l ) F(x_l, W_l) F(xl,Wl)是残差部分,一般由两个或者三个卷积操作构成,即图1中右侧包含卷积的部分。
在这里插入图片描述
一般,这种版本的残差块叫做resnet_v1,keras代码实现如下:

def res_block_v1(x, input_filter, output_filter):
    res_x = Conv2D(kernel_size=(3,3), filters=output_filter, strides=1, padding='same')(x)
    res_x = BatchNormalization()(res_x)
    res_x = Activation('relu')(res_x)
    res_x = Conv2D(kernel_size=(3,3), filters=output_filter, strides=1, padding='same')(res_x)
    res_x = BatchNormalization()(res_x)
    if input_filter == output_filter:
        identity = x
    else: #需要升维或者降维
        identity = Conv2D(kernel_size=(1,1), filters=output_filter, strides=1, padding='same')(x)
    x = keras.layers.add([identity, res_x])
    output = Activation('relu')(x)
    return output

2.2. 残差网络
在实现过程中,一般是直接stack残差块。

def resnet_v1(x):
    x = Conv2D(kernel_size=(3,3), filters=16, strides=1, padding='same', activation='relu')(x)
    x = res_block_v1(x, 16, 16)
    x = res_block_v1(x, 16, 32)
    x = Flatten()(x)
    outputs = Dense(10, activation='softmax', kernel_initializer='he_normal')(x)
    return outputs

2.3. 为什么叫残差网络
在统计学中,残差和误差是非常容易混淆的两个概念。误差是衡量观测值和真实值之间的差距,残差是指预测值和观测值之间的差距。对于残差网络的命名原因,作者给出的解释是,网络的一层通常可以看做 y = H ( x ) y=H(x) y=H(x),而残差网络的一个残差块可以表示为 H ( x ) = F ( x ) + x H(x)=F(x)+x H(x)=F(x)+x,也就是 F ( x ) = H ( x ) − x F(x)=H(x)-x F(x)=H(x)x,在单位映射中, y = x y=x y=x便是观测值,而 H ( x ) H(x) H(x)是预测值,所以 F ( x ) F(x) F(x)便对应着残差,因此叫做残差网络。
2.4 跳跃连接缓解梯度消失的数学原理​​

  • 梯度消失的本质问题​​
    在传统深层网络中(如VGG),梯度通过链式法则反向传播时需连续乘以权重矩阵和小梯度:
    问题​​:若权重或激活导数的绝对值 <1,连乘后梯度指数级衰减(消失)。
    ​​后果​​:浅层权重几乎不更新,网络无法有效训练。
  • 跳跃连接的数学形式​​
    残差块(Residual Block)的结构:
    x l + 1 ​ = F ( x l ​ ) + x l ​ x_{l+1}​=F(x_l​)+x_l​ xl+1=F(xl)+xl
    F ( x l ​ ) F(x_l​) F(xl):残差函数(如两个 3x3 卷积)。
    + x l +x_l +xl​:跳跃连接(恒等映射)。
  • 跳跃连接如何解决梯度消失?​​
    对残差块求梯度时,跳跃连接引入了一个​​恒等路径​​:
    ∂ L ∂ x l ​ = ∂ L ∂ x l + 1 ​ ⋅ ( ∂ F ( x l ) ∂ x l ​​ + 1 ) \cfrac{∂L}{∂x_l}​=\cfrac{∂L}{∂x_{l+1}}​⋅(\cfrac{∂F(x_l)}{∂x_l}​​+1) xlL=xl+1L(xlF(xl)​​+1)
    ​​关键项​​: ∂ F ( x l ) ∂ x l ​​ + 1 \cfrac{∂F(x_l)}{∂x_l}​​+1 xlF(xl)​​+1
    即使 ∂ F ( x l ) ∂ x l ≈ 0 \cfrac{∂F(x_l)}{∂x_l}≈0 xlF(xl)0(梯度消失),仍有 +1 项保证梯度至少以 ​​单位强度(≈1)​​ 回传。
    梯度衰减从 ​​连乘​​ 变为 ​​累加​​,避免指数级缩小。
    2.5 残差网络解决模型退化问题的原理
    ​​残差学习(Residual Learning)​​:让网络学习残差映射 F(x)=H(x)−x,而非直接学习 H(x)。
    ​​优势​​:
    若恒等映射(H(x)=x)是最优解,网络只需将 F(x) 推向0(比直接拟合恒等映射更容易)。
    深层网络的表现至少不劣于浅层网络(退化问题被消除)。
    为什么 F(x)→0 更容易?​​
    ​​零初始化对称性​​:神经网络权重通常以零附近的小随机值初始化(如He初始化)。
    初始状态下 F(x)≈0,此时 H(x)=x(即初始网络近似恒等映射)。
    优化器只需对 F(x) 做微小调整即可逼近目标,而传统网络需从随机状态直接拟合 H(x)=x(需大幅调整权重)。
    ​​梯度动态更稳定​​:
    残差 F(x) 的梯度直接与目标残差 (H(x)−x) 相关,梯度方向更明确。
    传统网络中,梯度需同时学习“保持恒等”和“拟合复杂变换”,容易冲突。
    参考:
    详解残差网络
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐