一、引言
残差链接是一种常见的类图网络组件,在2015年之后的许多网络架构(如Xception)中都可以见到。2015年末,何凯明等人在一个挑战赛上获胜,其中引入了这一方法。残差链接可以解决困扰所有大规模深度学习模块的两个共性问题:梯度消失和表示瓶颈。通常来说,向任何多于10层的模型中添加残差连接,都可能会有所帮助。残差连接让前面某层的输出作为后面某层的输入,从而在序列网络中有效地创造一条捷径。前面层的输出没有与后面层的激活连接在一起,而是与后面的激活相加(这里假设两个激活的形状相同)。如果形状不同,我们可以用一个线性变换将前面层的激活改变成目标形状。
如果特征图尺寸相同,在Keras中实现残差连接的方法如下,用的是恒等残差连接,这个例子假设我们有一个四维输入张量x:
from keras import layers
x=...
y=layers.Conv2D(128,3,activation='relu',padding='same')(x)#对x进行变换
y=layers.Conv2D(128,3,activation='relu',padding='same')(y)
y=layers.Conv2D(128,3,activation='relu',padding='same')(y)
y=layers.add([y,x])#将原始x与输出特征相加
如果特征图的尺寸不同,实现残差连接的方法如下,用的是线性残差连接。同样,假设我们有一个四维张量x:
from keras import layers
x=...
y=layers.Conv2D(128,3,activation='relu',padding='same')(x)#对x进行变换
y=layers.Conv2D(128,3,activation='relu',padding='same')(y)
y=layers.MaxPooling2D(2,strides=2)(y)
residual=layers.Conv2D(128,1,strides=2,padding='same')(x)#使用1*1卷积,将原始x张量线性下采样为与y具有相同的形状
y=layers.add([y,residual])#将残差张量与输出特征相加
二:表示瓶颈与梯度消失
表示瓶颈:在Sequential模型中,每个连续的表示层都构建于前一层之上,这意味着它只能访问前一层激活中包含的信息。如果某一层太小,那么模型将会受限于该层激活中能够塞入多少信息。残差连接可以将较早的信息重新注入到下游数据中,从而解决了部分深度学习模型的这一问题。
梯度消失:反向传播是用于训练深度神经网络的主要算法,工作原理是将来自输出损失的反馈信号向下传播到更底部的层。如果这个反馈信号的传播需要经过很多层,那么信号可能会变得非常微弱,甚至丢失,导致网络无法训练。残差连接在深度前馈网络中的工作原理更加简单,它引入了一个纯线性的信息携带轨道,类似于LSTM,与主要的层堆叠方向平行,从而有助于跨越任意深度的层来传播梯度。
求点赞+关注,谢谢啦!