ResNet
神经网络随着深度加深,会产生很多问题,比如梯度消失和梯度爆炸,可能还会使网络恶化性能变差,所以有时深层次的网络效果反而没有浅层网络好。深层次的网络按理说应该可以学会浅层+恒等映射的形式,这样也能达到浅层的效果,但是由于网络degradation的问题,这并不成立,也就是说,深层次网络解的集合没有包含浅层解。为了解决这一问题,Residual就被提出了。
Residual 模块
从上图中可以看到,将前面层的输出直接连接到后面层作为输入的一部分,这就是Residual block的思想。
- H(x)=F(x)+x,x为浅层的输出,H(x)为深层的输出,F(x)为夹在中间的两层代表的变换,当浅层的x代表的特征已经足够优秀,这时任何对于特征x的改变都会让loss变大的话,F(x)就会自动趋向于学习成为0,x则从恒等映射的路径继续传递。
- 这样一来,这个模块就能实现恒等映射的功能。也可以理解为,这个模块的解集包含了原来的解x。
ResNet包含了很多个上述模块,我自己的理解是,这种结构能一定程度上在任务训练时给予其神经网络的层数选择权。因此ResNet多了网络层数一个维度,可以使得效果更好,而不是像之前plain那样网络层数是作为超参数确定的,在训练过程种无法改变。
关于ResNet,由于我现有知识储备有限,暂时了解的就是这么多,但是我看到一篇文章写得很好,包含很多定量的数学分析,有时间我会精读,这里分享给大家。ResNet论文解读
inception network
- 在构建卷积层或者池化层的时候,一般filter的大小是我们要提前设置好的,这相当于一个超参数。但是试想如果能在训练的时候让模型自己选择,那么网络效果应该可以变得更好。inception的出发点就是这个,即代替人工来确定卷积层中的过滤器类型,或者确定是否需要创建卷积层或池化层。
- 从图中我们可以看到给出了3种卷积核的形式以及最大池化的形式,inception做的事情就是把这几种对应的feature map都垒起来,成为一个256通道的输出。即我们现在给网络添加了这些超参数的所有可能值,然后把这些输出连接起来,让网络自己学习它需要什么样的参数,采用哪些过滤器组合。
- 这样可以使得网络效果更好,但由于提出了卷积核的各种可能,势必会带来的一个问题就是计算成本增大了。
要想应用这个网络,就必须先解决计算成本的问题,怎么解决计算量这个问题呢?我们来看下面两张图片。
- 如果我们用5✖5的卷积直接计算的话,就会需要(28×28×32)×(5×5×192)≈1.2亿次的乘法运算,这个成本是相当高的。
- 但是如果我们采用第二张图的方法:先让一个1✖1的卷积核将通道减少到16个,然后再用5✖5的卷积核使其重新变成28✖28✖32的大小(要注意不管采用什么方法,为了最后与其他类型卷积核的输出维度相匹配,我们一定要保证最后输出的尺寸不变)。总体来说,我们先缩小网络,然后再扩大它,而中间这一层就犹如一个瓶颈。
- 现在来考虑一下计算量:前一层:(28×28×16)×(1×1×192)≈240万,后一层:(28×28×32)×(5×5×16)≈1000万,两者相加就是1240万,下降到了原来的十分之一,可见方法是可行的。
- 有人可能会问,中间的瓶颈层大幅缩小通道规模会不会影响神经网络的性能?**然而事实证明,只要合理构建瓶颈层,你既可以显著缩小通道规模,从而节省了计算,又不会降低网络性能。**这就是inception Network的好处。
以下是在看视频的一些想法,先记录一下,正确与否还有待自己未来学习后再回过头来判断。
想法:这是从正向传播角度来考虑计算量的减少,但如果这样构造,会不会使得反向传播算法的计算量提高呢,会不会使得迭代次数也提高呢?思考了一下后:参数个数好像减少为原来的一半了。
猜想:这有点像FFT蝶形运算,如果所有的神经网络都按这种框架构造,会不会使得计算量大大简化???
总结(自己的想法)
- 感觉ResNet和inception
Network都是从将超参数转化成可训练的参数这一角度出发对网络进行的改进。ResNet是将网络深度这个超参数参数化了,而inception Network是将卷积核的规格这个超参数参数化了。 - 我们在搭建CNN时,关于网络深度、卷积核的选择,这些往往是要在开始训练前确定好的,网络一旦搭建好,超参数也就确定了。但搭建网络时这些超参数具体应该如何选取,我们也不清楚到底哪个用于训练效果会好一些。所以现在对CNN网络的改进,大方向就是一定程度上将超参数融合进网络参数,让训练的时候网络自己决定,因为说到底,只有训练数据是最清楚自己的。
- 以后我的网络结构改进方向可以朝着如何搭建网络才能使超参数融入网络参数这方面考虑,可以考虑首先这两者结合会不会碰撞出火花?