Resnet中的残差连接

 

1 Skip Connect

想必做深度学习的都知道skip connect,也就是残差连接,那什么是skip connect呢?如下图

上面是来自于resnet【1】的skip block的示意图。我们可以使用一个非线性变化函数来描述一个网络的输入输出,即输入为X,输出为F(x),F通常包括了卷积,激活等操作。

当我们强行将一个输入添加到函数的输出的时候,虽然我们仍然可以用G(x)来描述输入输出的关系,但是这个G(x)却可以明确的拆分为F(x)和X的线性叠加。

这就是skip connect的思想,将输出表述为输入和输入的一个非线性变换的线性叠加,没用新的公式,没有新的理论,只是换了一种新的表达。

它解决了深层网络的训练问题,作者的原论文中达到了上千层。

残差连接是何的首创吗?当然不是,传统的神经网络中早就有这个概念,文【2】中则明确提出了残差的结构,这是来自于LSTM的控制门的思想。

y = H(x,WH)•T(x,WT) + X•(1- T(x,WT))

可以看出,当T(x,WT) = 0,y=x,当T(x,WT) = 1,y= H(x,WH) 。关于LSTM相关的知识,大家可以去其他地方补。

在该文章中,研究者没有使用特殊的初始化方法等,也能够训练上千层的网络。但为什么这篇文章没有resnet火呢?原因自然有很多了,何的文章做了更多的实验论证,简化了上面的式子,得了cvpr best paper,以及何的名气更大等等因素。

总之,为我们所知道的就是下面的式子

y = H(x,WH) + X,此所谓残差连接,skip connection。

2 Why skip connect

那为什么要这么做呢?首先大家已经形成了一个通识,在一定程度上,网络越深表达能力越强,性能越好。
不过,好是好了,随着网络深度的增加,带来了许多问题,梯度消散,梯度爆炸;在resnet出来之前大家没想办法去解决吗?当然不是。更好的优化方法,更好的初始化策略,BN层,Relu等各种激活函数,都被用过了,但是仍然不够,改善问题的能力有限,直到残差连接被广泛使用。

大家都知道深度学习依靠误差的链式反向传播来进行参数更新,假如我们有这样一个函数:

其中的f,g,k大家可以自行脑补为卷积,激活,分类器。

cost对f的导数为:

有隐患,一旦其中某一个导数很小,多次连乘后梯度可能越来越小,这就是常说的梯度消散,对于深层网络,传到浅层几乎就没了。但是如果使用了残差,每一个导数就加上了一个恒等项1,dh/dx=d(f+x)/dx=1+df/dx。此时就算原来的导数df/dx很小,这时候误差仍然能够有效的反向传播,这就是核心思想。

我们举个例子直观理解一下:
假如有一个网络,输入x=1,非残差网络为G,残差网络为H,其中H=F(x)+x

有这样的一个输入输出关系:

在t时刻:

非残差网络G(1)=1.1,

残差网络H(1)=1.1, H(1)=F(1)+1, F(1)=0.1

在t+1时刻:

非残差网络G’(1)=1.2,

残差网络H’(1)=1.2, H’(1)=F’(1)+1, F’(1)=0.2

这时候我们看看:

非残差网络G的梯度 = (1.2-1.1)/1.1

而残差网络F的梯度 = (0.2-0.1)/0.1

因为两者各自是对G的参数和F的参数进行更新,可以看出这一点变化对F的影响远远大于G,说明引入残差后的映射对输出的变化更敏感,输出是什么?不就是反应了与真值的误差吗?

所以,这么一想想,残差就应该是有效的,各方实验结果也证明了。

 

References

【模型解读】resnet中的残差连接,你确定真的看懂了?

发布了52 篇原创文章 · 获赞 15 · 访问量 2万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览