最近搜索了下这几两个概念,记录一下个人理解。
-
shortcut
x、y是相邻两层,通过W_H连接,通过将多个这样的层前后串接起来就形成了深度网络。其中H表示网络中的变换。
为了解决深度网络的梯度发散问题,Highway在两层之间增加了(带权的)shortcut。
其中C=1-T。 -
残差连接(skip connect)
若没有加入identity分支,那么就是用非线性变化函数来描述一个网络的输入输出,即输入为X,输出为F(x),F通常包括了卷积,激活等操作。
但是当我们强行将一个输入添加到函数的输出的时候,虽然我们仍然可以用G(x)来描述输入输出的关系,但是这个G(x)却可以明确的拆分为F(x)和X的线性叠加。将输出表述为输入和输入的一个非线性变换的线性叠加。它解决了深层网络无法训练的问题。
首先我们定义残差单元:
Xl和Xl+1表示的是第l个残差单元的输入和输出,F是残差结构,表示学习到的残差,当h(xl)=xl时表示的就是恒等映射,f是relu激活函数。
通过递归,可以得到任意深层单元L特征的表达:
反向传播过程为:
表示损失函数到达L的梯度,小括号里的1表示短路机制(identity x)可以无损地传播梯度,而另一项残差梯度则需要经过带有weights的层,残差梯度不会那么巧全为-1,就算其很小,由于1的存在不会导致梯度消失,所以残差学习会更容易。
再举个例子看看残差网络是如何改善梯度消失现象的:
假设输入只有一个特征,没有偏置单元,每层只有一个神经元:
我们先进行前向传播,这里将Sigmoid激励函数写为s(x):
z1 = w1*x
a1 = s(z1)
z2 = w2*a1
a2 = s(z2)
…
zn = wn*an-1 (这里n-1是下标)
an = s(zn)
根据链式求导和反向传播,我们很容易得出,其中C是代价函数
那如果在a1和a2之间加入残差连接,如下所示:
那么z2=a1*w2+a1
所以z2对a1求导的结果就是(w2+1)
上边的链式求导、反向传输的结果中的w2就变成了(w2+1)
所以残差连接可以有效缓解梯度消失的现象。
最后一个例子:
ResNet网络就是用到了这种残差连接。