Identity Mappings in Deep Residual Networks2016【论文理解】

前言

此论文是对Deep residual networks [1]残差网络模块结构的改进和实验,提出了残差模块第二版,此新的模块形式不管是在前向传播或者是反向传播都有很好的优势,并且在网络训练上更加的容易,收敛更快,精度更高,泛化性更低!

原始的残差模块

如下图, X l X_l Xl为输入, X l + 1 X_{l+1} Xl+1为输出,有如下公式 y l = h ( X l ) + F ( X l , W l ) , y_l = h(X_l) + F(X_l, W_l), yl=h(Xl)+F(Xl,Wl) X l + 1 = f ( y l ) , X_{l+1} = f(y_l), Xl+1=f(yl)在下图所示的结构中 h ( X l ) = X l , h(X_l) = X_l, h(Xl)=Xl F F F为残差函数,如下图红色方框中的部分,其中 f = R e l u f = Relu f=Relu为激活函数。
在这里插入图片描述

改进的残差模块

文中尝试创造一个直接的信息传递通道,推导表明,如果 h ( X l ) h(X_l) h(Xl) f ( y l ) f(y_l) f(yl)都是恒等映射,那么信号可以直接从一个单元传播到任何其他单元,包括向前和向后传递。实验表明使用此结构能够使训练变得更加容易,如下图
在这里插入图片描述
绿色方框内的改进是经过了多种实验得到的结果,但最初的设想是为了构造一个 f ( y l ) = y l f(y_l) = y_l f(yl)=yl的单位映射,我们将激活函数(ReLU和BN)视为权重层的“预激活”,而不是传统意义上的“后激活”。此时的公式: y l = X l + F ( X l , W l ) , y_l = X_l + F(X_l, W_l), yl=Xl+F(Xl,Wl) X l + 1 = y l , X_{l+1} = y_l, Xl+1=yl

模块分析

对新的模块 y l = X l + F ( X l , W l ) , y_l = X_l + F(X_l, W_l), yl=Xl+F(Xl,Wl) X l + 1 = y l , X_{l+1} = y_l, Xl+1=yl两公式结合可以得到 X l + 1 = X l + F ( X l , W l ) , X_{l+1}= X_l + F(X_l, W_l), Xl+1=Xl+F(Xl,Wl)对此公式进行循环递归从 l l l浅层模块到 L L L深层模块的公式如下:
X L = X l + ∑ i = l L − 1 F ( X i , W i ) , X_L= X_l + \sum_{i=l}^{L-1}F(X_i, W_i), XL=Xl+i=lL1F(Xi,Wi)此时可以发现有两个特别有意思的性质:(1)对于L个模块的特征 X L X_L XL都可以由浅层特征 X l X_l Xl加上一系列的残差函数求得;(2)任何特征都可以从 X 0 X_0 X0求得,不管是前向传播和反向传播,信息都能到达网络的最底层,对梯度而言,不管梯度是有多小。
对于loss假设为 ϵ \epsilon ϵ,则根据链式法则求得反向传播:

∂ ϵ ∂ X l = ∂ ϵ ∂ X L ( 1 + ∂ ∂ X l ∑ i = l L − 1 F ( X i , W i ) ) \frac{\partial \epsilon}{\partial X_l}=\frac{\partial \epsilon}{\partial X_L}(1 +\frac{\partial }{\partial X_l} \sum_{i=l}^{L-1}F(X_i, W_i) ) Xlϵ=XLϵ(1+Xli=lL1F(Xi,Wi))

每一个部分的梯度都只有两个部分构成,说明梯度不管多小都可以回传到最前层。其中 ∂ ϵ ∂ X L \frac{\partial \epsilon}{\partial X_L} XLϵ直接传播信息而不涉及任何权重层 ∂ ϵ ∂ X L ∂ ∂ X l ∑ i = l L − 1 F ( X i , W i ) , \frac{\partial \epsilon}{\partial X_L}\frac{\partial }{\partial X_l} \sum_{i=l}^{L-1}F(X_i, W_i) , XLϵXli=lL1F(Xi,Wi)经过之前的权重层传递信息。所以, ∂ ϵ ∂ X L \frac{\partial \epsilon}{\partial X_L} XLϵ直接保证了信息会之前传送到前层的每一层!!防止了梯度消失的问题!

结果图

在这里插入图片描述
不仅训练更加容易,而且精度更加高!

模块代码

keras

def BatchActivate(x):
    x = BatchNormalization()(x)
    x = Activation('relu')(x)
    return x
def convolution_block(x, filters, size, strides=(1,1), padding='same', activation=True):
    x = Conv2D(filters, size, strides=strides, padding=padding)(x)
    if activation == True:
        x = BatchActivate(x)
    return x
def residual_block(blockInput, num_filters=16, batch_activate = False):
    x = BatchActivate(blockInput)
    x = convolution_block(x, num_filters, (3,3) )
    x = convolution_block(x, num_filters, (3,3), activation=False)
    x = Add()([x, blockInput])
    if batch_activate:
        x = BatchActivate(x)
    return x

参考

[1]He, K., Zhang, X., Ren, S., Sun, J.: Deep residual learning for image recognition. In: CVPR. (2016)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值