卷积神经网络实例探究
残差网络(ResNets)
非常非常深的神经网络时很难训练的,因为存在梯度消失和梯度爆炸的问题。
使用**跳跃连接(skip connection)**可以构建残差神经网络。
跳跃连接,可以使某一层获取激活值,然后迅速反馈给另外一层,甚至是神经网络更深层。
ResNets是由残差块(Residual block)构建的。
残差块
有一个两层的神经网络:
在L层激活得到a[l+1],然后再次激活,两层后得到a[l+2]。
计算过程为:
z[l+1]=W[l+1]a[l]+b[l+1]a[l+1]=g(z[l+1])z[l+2]=W[l+2]a[l+1]+b[l+2]a[l+2]=g(z[l+2])
这里的激活函数g使用ReLu
非线性激活函数。
因此,从a[l]到a[l+2]要经过上面的所有步骤。
在残差网络中有一点变化,将a[l]直接向后,拷贝到神经网络的深层,并在Relu激活函数前加上a[l],等于跳过了中间层,不再沿着主路径传递,走了捷径。
即在计算a[l+2]的时候,不仅使用z[l+2],还要加上前两层的a[l],求和再通过激活函数计算出a[l+2]。
所以a[l]的插入时机是 线性激活之后,Relu
激活之前。
“跳跃连接”就是指a[l]跳过一层或者好几层,从而将信息传递到神经网络更深层。
这里的两层神经网络,就称为一个残差块。
而ResNet网络就是将很多这样的残差块堆积在一起,形成一个很深的网络。
ResNet的论文给出了一个ResNet网络。
这是一个普通的网络,包含多个卷积层。
这是加入了残差块的ResNet网络,有多个残差块构成。
如果使用一个标准优化算法来训练一个普通的网络,那么可以根据训练经验得到:随着网络深度加深,训练的误差会减小,然后再增大。
而从理论上说,随着网络深度加深,应该训练的越来越好才对,但实际上,如果没有残差网络,深度越深意味着用优化算法越难训练。
残差网络为什么有效
还以上面给出的两层神经网络为例,对于a[l+2]有:
a[l+2]=g(z[l+2]+a[l])=g(W[l+2]a[l+1]+b[l+2]+a[l])
如果使用L2正则化或权重衰减,那么W[l+2]的值会减小,同样b的值也会减小。
假设W[l+2]=0,b[l+2]=0,那么(W[l+2]a[l+1]+b[l+2])的值为0。
激活函数是Relu,可得:a[l+2]=g(a[l])=a[l]。
因此即使发生梯度消失的情况,激活值并不会变为0。
如果a[l+2]和a[l]有不同的维度,不能直接相加,那么需要在增加一个矩阵,标记为Ws。
例如,输入维度是128,而a[l+2]维度是256,那么Ws的维度是256×128,它同样通过神经网络学习参数,是一个固定矩阵。
1×1卷积
使用池化层可以减小输入的宽度和高度,但是无法减小输入的通道。
使用1×1的过滤器进行卷积,可以减小(也可以增加)输入的信道。
例如上图,输入维度为28×28×192,要想将通道减小为32,使用32个维度为1×1×192的过滤器可以实现,这样在保证了所有元素值的同时,减小了通道数。