第03章:卷积神经网络
- author: zhouyongsdzh@foxmail.com
- date: 2017-09-18
- weibo: @周永_52ML
卷积神经网络
什么是卷积?
关于卷积的理解参考博客最容易理解的对卷积(convolution)的解释,里面有很多的示例可以帮助理解卷积的物理意义。
一句话归纳卷积的物理意义:一个函数(如:单位响应)在另一个函数(如:输入信号)上的加权叠加。四个字概括:加权叠加。
卷积的数学定义:称$(f*g)(n)$为$f,g$的卷积。
连续定义:
$$
(f_g)(n) = \int_{-\infty}^{\infty} f(\delta) g(n - \delta) \; d \delta
$$
离散定义:
$$
(f_g)(n) = \sum_{\delta=-\infty}^{\infty} f(\delta) g(n - \delta)
$$
关于卷积概念这里有一个血腥的示例讲解,可以帮助我们很好的理解:
比如说你的老板命令你干活,你却到楼下打台球去了,后来被老板发现,他非常气愤,扇了你一巴掌(注意,这就是输入信号,脉冲),于是你的脸上会渐渐地(贱贱地)鼓起来一个包,你的脸就是一个系统,而鼓起来的包就是你的脸对巴掌的响应(系统响应信号)。好,这样输入信号和信号系统就建立起来了意义对应的联系。下面还需要一些假设来保证论证的严谨:假定你的脸是_线性时不变系统_,也就是说,无论什么时候老板打你一巴掌,打在你脸的同一位置(这似乎要求你的脸足够光滑,如果你说你长了很多青春痘,甚至整个脸皮处处连续处处不可导,那难度太大了,我就无话可说了哈哈),你的脸上总是会在相同的时间间隔内鼓起来一个相同高度的包来,并且假定以鼓起来的包的大小作为系统输出。好了,那么,下面可以进入核心内容——卷积了!
如果你每天都到地下去打台球,那么老板每天都要扇你一巴掌,不过当老板打你一巴掌后,你5分钟就消肿了,所以时间长了,你甚至就适应这种生活了…… 如果有一天,老板忍无可忍,以0.5秒的间隔开始不间断的扇你的过程,这样问题就来了,第一次扇你鼓起来的包还没消肿,第二个巴掌就来了,你脸上的包就可能鼓起来两倍高,老板不断扇你,脉冲不断作用在你脸上,效果不断叠加,这样这些效果就可以求和了,结果就是你脸上的包的高度随时间变化的一个函数了(注意理解);如果老板再狠一点,频率越来越高,以至于你都辨别不清时间间隔了,那么,求和就变成积分了。可以这样理解,在这个过程中的某一固定的时刻,你的脸上的包的鼓起程度和什么有关呢?和之前每次打你都有关!但是各次的贡献是不一样的,越早打的巴掌,贡献越小,所以这就是说,某一时刻的输出是之前某一点的输入乘以各自的衰减系数之后得到某一点的输出,然后再把不同时刻的输出点放在一起(积分or累加),形成一个函数,这就是卷积,卷积之后的函数就是你脸上的包的大小随时间变化的函数。本来你的包几分钟就可以消肿,可是如果连续打,几个小时也消不了肿了,这难道不是一种平滑过程么?反映到剑桥大学的公式上,f(a)就是第a个巴掌,g(x-a)就是第a个巴掌在x时刻的作用程度,乘起来再叠加就ok了,大家说是不是这个道理呢?我想这个例子已经非常形象了,你对卷积有了更加具体深刻的了解了吗?$f(a)$是a时刻的输入函数,$g(x-a)$是a时刻的输入信号在x时刻的响应程度。
卷积网络结构
// doing
—
ResNet
何凯明等人在2015年提出的ResNet,帮助微软在ImageNet比赛分类任务上获得冠军,并获评CVPR2016最佳论文(《Deep Residual Learning for Image Recognition》)。因为它“简单与实用”并存,之后许多目标检测、图像分类任务都是建立在ResNet的基础上完成的,成为计算机视觉领域重要的基石结构。
为什么会出现ResNet?
写在前面:梳理ResNet的思路
_我们用深度学习的初衷是想用更深的网络去学习更丰富的不同level的特征,提升模型的performance。但是单纯的增加网络层数,会导致两个问题:1. 梯度消失or爆炸问题,可以通过Normalization解决;2. 退化问题,即error在train和test上均增加。那么核心问题来了,有没有办法既能加深网络深度(初衷是为了提升模型performance)又能解决退化问题?ResNet可以解决这个问题,采用Identity Mapping的思想(保证train error不增加),并且学习残差函数比学习恒等映射函数更容易。_
网络的深度为什么重要?
自从深度神经网络在ImageNet大放异彩之后,后来问世的深度神经网络就朝着网络层数越来越深的方向发展。我们知道:深度网络能够抽取不同level的特征信息,网络的层数越多,意味着能够提取到不同level的特征越丰富。并且,越深的网络提取的信息越抽象,越具有语义信息。
为什么不能简单的增加网络层数?
对于原网络,如果简单的增加深度,会导致梯度弥散或梯度爆炸的问题。在网络结构上对该问题的解决方法是采用Normalization的方法,根据问题场景采用BN或LN等,如此可训练几十层的网络。
通过上述方法可以训练了,但是人们又发现另外一个问题,就是退化问题,即随着网络深度的增加,模型在训练集上的精度达到饱和甚至下降,这个问题显然不是由过拟合(overfitting)造成的,因为网络加深后不仅测试误差变高了,它的训练误差竟然也变高了。怎么解决这种加深网络深度但网络性能却下降的退化问题(degradation problem)呢?。
如何解决退化问题?
深度残差网络。作者首先论文里通过实验结进一步描述了这种退化问题:当传统神经网络的层数从20增加为56时,网络的训练误差和测试误差均出现了明显的增长,也就是说,网络的性能随着深度的增加出现了明显的退化。实验结果如下图所示:
(ResNet 训练和测试误差)
ResNet思想
假设存在一个性能最强的完美网络$\mathcal{N}$,与它相比我们的网络中有一些层是多余的,那么这些多余的层的训练目标是恒等变换,只有达到这个目标我们的网络性能才能跟$\mathcal{N}$一样。对于这些需要实现恒等变换的多余的层,要拟合的目标就成了$H(x)=x$。
为什么是恒等映射?为什么残差网络更容易学习?
在传统网络中,网络的输出目标是$F(x)=x$,这比较困难;而在残差网络中,拟合的目标成了$x-x=0$,网络输出目标为$F(x)=0$,这比前者要容易得多。
如果深层网络的后面那些层是恒等映射,那么模型就退化为一个浅层网络,相对的train error就不会增加了,那现在要解决的就是学习恒等映射函数了。_(这里学习恒等映射是为了解决train error问题,之所以学习深层网络的恒等映射是为了抽取不同level的特征,提升模型性能)_。
但是直接让一些网络层去拟合一个潜在的恒等映射函数$H(x) = x$,比较困难,这可能就是深层网络难以训练的原因。如果把网络设计为$H(x) = F(x) + x$, 如下图。我们可以把问题转换为学习一个残差函数$F(x) = H(x) - x$. 只要$F(x)=0$,就构成了一个恒等映射$H(x) = x$。 而且,拟合残差肯定更加容易。注意:这里之所以要拟合恒等映射函数,是为了不增大train error,即保持与浅层网络一样的train error。
问题:为什么拟合残差会更加容易? 难道等价于拟合一个简单的函数,而不是像H(x)那样复杂的的函数?
关于ResNet有效性的一个解释:F是求和前网络映射,H是从输入到求和后的网络映射。比如把x=5映射到5.1,那么引入残差前是F’(5)=5.1,引入残差后是H(5)=5.1, H(5)=F(5)+5, F(5)=0.1。这里的F’和F都表示网络参数映射,引入残差后的映射对输出的变化更敏感。比如s输出从5.1变到5.2,映射F’的输出增加了1/51=2%,而对于残差结构输出从5.1到5.2,映射F是从0.1到0.2,增加了100%。明显后者输出变化对权重的调整作用更大,所以效果更好。残差的思想都是去掉相同的主体部分,从而突出微小的变化,看到残差网络我第一反应就是差分放大器…(比较抽象,不好理解?)
问题:如果x=-1要映射为1,进而是1.2,那么还是“差分放大器”吗?如何理解去掉相同的主体部分?
网络上的一段话:
“作者想到了构建恒等映射(Identity mapping)来解决这个问题,问题解决的标志是:增加网络层数,但训练误差不增加。为什么是恒等映射呢,一个可解释的思路:_20层的网络是56层网络的一个子集,56层网络的解空间包含着20层网络的解空间。如果我们将56层网络的最后36层全部短接,这些层进来是什么出来也是什么(也就是做一个恒等映射),那这个56层网络不就等效于20层网络了吗,至少效果不会相比原先的20层网络差吧。_同样是56层网络,不引入恒等映射为什么就不行呢?因为退化问题使得网络难以训练,虽然网络的深度加深了,但是实际上无法有效训练网络,训练不充分的网络不但无法提升性能,甚至降低了性能。”问题:这里博主把无法得到有效网络归因于梯度消失,是否合理? 网络加深,train error增大,肯定是网络学习的不好,那么为什么学习的不好?梯度问题还是优化算法问题? 不合理,因为不是梯度消失or爆炸问题,而是退化问题。
之所以称其为“残差”网络,是因为假设网络要学习$H(x)$,那么由于图中identity x之间跨过了2层,那么其实相当于拟合的是$F(x)=H(x)-x$,这就是残差概念的来源。
核心问题探讨:退化问题的本质是什么?
论文《Skip connections eliminate singularities》给出了一个结论:深度神经网络难以训练的原因并非梯度消失或爆炸,而是神经网络权重$W$的退化。虽然梯度范数大,但是如果网络的可用自由度对这些范数的贡献非常不均衡,也就是每个层中只有少量的隐藏单元对不同的输入改变它们的激活值,而大部分隐藏单元对不同的输入都是相同的反应,此时整个权重矩阵的秩不高。并且随着网络层数的增加,连乘后使得整个秩变的更低。
这也是我们常说的网络退化问题,虽然是一个很高维的矩阵,但是大部分维度却没有信息,表达能力没有看起来那么强大。
问题:为什么每层的隐层单元对不同的输入,其敏感度有如此大的差异?根源在哪里?初始化方法吗?
skip connection可以改善梯度弥散问题
梯度弥散是因为反向传播过程的链式法则导致的梯度消失(趋于0),从而模型参数无法进一步更新导致停滞。skip connection可以改善这部分问题。用公式表示为:
$$
\frac{\partial H(x)} {\partial x} = \frac{\partial \left(F(x) + x \right)} {\partial x} = \frac{\partial F(x)}{\partial x} + 1
$$
无论$\frac{\partial F(x)}{\partial x}$如何小,那么输出$H(x)$对输入$x$都有了一定的梯度,误差仍然可以继续反向传播。所以,残差网络效果好,很大程度上依赖于残差连接回传的梯度缓解了梯度消失等问题。
关于为什么是$x$不是$\frac{x}{2}$?
kaiming的paper《Identity Mappings in Deep Residual Networks》里面就有提到了。大概意思是假如不是$x$而是$\lambda_i x$的话,梯度里会有一项$\prod^{L-1} \lambda_i$,就是从输出到当前层之间经过的shortcut上的所有相乘,假如$\lambda_i$都大于 1 那经过多层之后就会爆炸,都小于 1 就会趋向于 0 而变得和没有 shortcut一样了。
深度残差学习
Highway Network
Highway网络结构
所谓Highway网络,就是输入某一层网络的数据一部分经过非线性变换,另一部分直接从该网络跨过去不做任何转换,就想走在高速公路上一样,而多少的数据需要非线性变换,多少的数据可以直接跨过去,是由一个权值矩阵和输入数据共同决定的。专业术语称之为Skip Connection。
定义输入层$x^{[l]} \in R^n$,Highway Network结构表达式为:
$$
\begin{align}
h_{proj} &= \text{Relu} \left( W_{proj} \cdot x^{[l]} + b_{proj} \right) \quad \in R^n \\\
h_{gate} &= \sigma \left( W_{gate} \cdot x^{[l]} + b_{gate} \right) \quad \in R^n \\\
h_{highway} &= h_{gate} \odot h_{proj} + (1 - h_{gate}) \odot x^{[l]} \quad\in R^n
\end{align}
$$
如果我们想更改x的维度从A变成B的话,一种方法是采用zero-padding和下采样的方法,或者是引入一个维度为A*B的变换矩阵,使每次都乘上这个矩阵。
ResNet与HighwayNetwork比较
shortcut connection也叫skip connection,跳跃式传递。在ResNet中引入了一种叫residual network残差网络结构,与普通CNN的区别在于从输入源直接向输出源多连接了一条传递线,这是一种identity mapping(恒等映射),用来进行残差计算。其目的是为了防止网络层数增加而导致的梯度弥散问题与退化问题。
比较Residual Network与Highway Network在connection上的差异
- 门函数与参数:Highway networks使用了带有门函数的shortcut。但是这些门函数需要参数,而ResNet的shortcut不需要参数;
- 连接有效性:当Highway networks的门函数的shortcut关闭时,相当于没有了残差函数,但是ResNet的shortcut一直保证学习残差函数;
- 效果:当Highway networks的层数急剧增加时,没有表现出准确率持续上升;
总之,ResNet可以看成是Highway networks的特例,但是从效果上来看,要比Highway networks好。