首先在了解ResNet
之前,我们需要知道目前CNN
训练存在两大问题:
、
BN等Tricks)处理了。ResNet本身是一种拟合残差的结果,让网络学习任务更简单,可以有效地解决梯度弥散的问题。
ResNet网络变种包括ResNet V1、ResNet V2、ResNext`以及Res2Net网络等。
ResNet残差块的结构如图所示。
ResNet
网络的优点有:
1000
层以上。同样,ResNet
网络的设计技巧有:
通过分析ResNet
网络可以知道,ResNet
可以被看做许多路径的集合,通过研究ResNet
的梯度流表明,网络训练期间只有短路径才会产生梯度流,深的路径不是必须的,通过破坏性试验可以知道,路径之间是相互依赖的,这些路径类似集成模型,其预测准确率平滑地与有效路径的数量有关。
由于ResNet
网络中存在很多short cut
,所以ResNet
又可以被视为很多路径的集合网络。相关实验表明,在ResNet
网络训练期间,只有短路径才会产生梯度流动,说明深的路径不是必须的。通过破坏网络中某些short cut
实验可以看出,在随机破坏了ResNet
网络中的某些short cut
后,网络依然可以训练,说明在网络中,即使这些路径是共同训练的,它们也是相互独立,不相互依赖的,可以将这些路径理解为集成模型,这也是理解ResNet
网络的性能较好的一个方向。
首先,需要看下组对于主干以及分支网络的各种设计:
具体效果为什么第五个好呢?先看下面的梯度求导吧!
推导一下ResNet
的前向与反向,步骤如下:
我们从上面公式可以看到深层 L L L与浅层 l l l之间的关系;则,假设损失函数为 l o s s loss loss,那么反向传播公式为:
∂ l o s s ∂ x l = ∂ los s ∂ x L ∂ x L ∂ x l = ∂ loss ∂ x L ( 1 + ∂ ∂ x l ∑ i = l L − 1 F ( x i , W i ) ) \frac{\partial l o s s}{\partial x_{l}}=\frac{\partial \operatorname{los} s}{\partial x_{L}} \frac{\partial x_{L}}{\partial x_{l}}=\frac{\partial \operatorname{loss}}{\partial x_{L}}\left(1+\frac{\partial}{\partial x_{l}} \sum_{i=l}^{L-1} F\left(x_{i}, W_{i}\right)\right) ∂xl∂loss=∂xL∂loss∂xl∂xL=∂xL∂loss(1+∂xl∂∑i=lL−1F(xi,Wi))
从上式我们可以看到,ResNet
有效得防止了:“当权重很小时,梯度消失的问题”。同时,上式中的优秀特点只有在假设成立时才有效。所以,ResNet需要尽量保证亮点:
因此,在上面五组实验中,第五个(图e)效果最好的原因是:1) 反向传播基本符合假设,信息传递无阻碍;2)BN层作为pre-activation,起到了正则化的作用。
对于图(b),是因为 B N BN BN在addition之后会改变分布,影响传递,出现训练初期误差下降缓慢的问题!
对于图©,是因为这样做导致了 R e s i d u a l Residual Residual的分支的分布为负,影响了模型的表达能力。
对图(d),与图(a)在网络上相当于是等价的,指标也基本相同。
而除了像是从梯度反传的角度说明 ResNet
比较好的解决了梯度弥散的问题,还有一些文章再探讨这些个问题。比如**“The Shattered Gradients Problem: If resnets are the answer, then what is the question?”这篇工作中认为,即使BN过后梯度的模稳定在了正常范围内,但梯度的相关性实际上是随着层数增加持续衰减的**。
而经过证明,ResNet可以有效减少这种相关性的衰减。对于 L L L 层的网络来说,没有残差表示的Plain Net梯度相关性的衰减在 1 2 L \frac{1}{2^{L}} 2L1 ,而ResNet的衰减却只有 1 L \frac{1}{\sqrt{L}} L1 。这也验证了ResNet论文本身的观点,网络训练难度随着层数增长的速度不是线性,而至少是多项式等级的增长
在现有的经验上,网络的设计一般都是往深处设计,作者认为一味的增加深度不是一个有效的方法,residual block
的宽度对网络的性能同样很有帮助,所以切入点在每一层的宽度上。
上图为论文中的图,原始的ResNet
如图(a)与(b)所示,(b)是使用了bottleneck
的residual block
,而©与(d)是WRN
的结构,主要是通道在原始ResNet
通道数上加宽了k
倍。
具体参数如下表:
而随着网络深度与宽度的加深,训练参数量过大会导致过拟合,作者提出在residual block
里面加入dropout
,也是就开头讲到的(d)。
从实验结果看,也能说明,当网络层数depth
较浅,或者宽度 k
较小时,网络还不需要加dropout
,但是当层数增加,宽度增加,参数量指数增大时,加入dropout
可以有效防止model
的overfitting
。
在ResNet
提出deeper
可以带来网络性质提高的同时,WideResNet
则认为Wider
也可以带来深度网络性能的改善。为了打破或deeper
,或wider
的常规思路,ResNeXt则认为可以引入一个新维度,称之为cardinality
。
上图中左边为ResNet
结构,右边为cardinality=32
的ResNeXt
结构(也就是含32个group
)。其等效结构如下:
目前现有的特征提取方法大多都是用分层方式表示多尺度特征。分层方式即要么对每一层使用多个尺度的卷积核进行提特征(如目标检测中的SPPNet
),要么就是对每一层提取特征进行融合(如FPN
)。
本文提出的Res2Net
在原有的残差单元结构中又增加了小的残差块,在更细粒度上,增加了每一层的感受野大小。Res2Net
也可以嵌入到不同的特征提取网络中,如ResNet, ResNeXt
等等。
在Res2Net
中提出了一个新维度叫做scale
。Res2Net
的结构如下图所示:
上图左边是最基本的卷积模块。右图是针对中间的3x3卷积进行的改进。
当然,Res2Net
可以与像SE
模块进行复用。
最后,论文中也给出了关于depth
,cardinality
以及scale
的效果对比,如下图所示:
作者首先提出了,在传统网络的设计的中可能会存在Representational Bottleneck问题,并且该问题会导致模型性能的降低。其次,通过数学和实验研究探讨网络中出现的Representational Bottleneck问题。
论文中,先给定一个深度为L层的网络,通过 d 0 d_{0} d0维的输入 X 0 ∈ R d 0 × N X_{0} \in R^{d_{0} \times N} X0∈Rd0×N可以得到个被编码为 X L = σ ( W L ( … F 1 ( W 1 X 0 ) ) ) X_{L}=\sigma\left(W_{L}\left(\ldots F_{1}\left(W_{1} X_{0}\right)\right)\right) XL=σ(WL(…F1(W1X0)))的特征,其中 W i ∈ R d i × d i − 1 W_{i} \in R^{d_{i} \times d_{i-1}} Wi∈Rdi×di−1为权重。
这里称 d i > d i − 1 d_{i}>d_{i-1} di>di−1的层为expand层,称 d i < d i − 1 d_{i}
当训练模型的时候,每一次反向传播都会通过输入得到的输出与Label矩阵( T ∈ R d L × N T \in R^{d_{L} \times N} T∈RdL×N)之间的Gap来进行权重更新。
X i = { f i ( W i X ^ i − 1 ) 1 ≤ i < L σ ( W L X ^ L − 1 ) i = L \mathbf{X}_{i}=\left\{\begin{array}{ll} f_{i}\left(\mathbf{W}_{i} \hat{\mathbf{X}}_{i-1}\right) & 1 \leq i
作者抛出了两个问题:
Softmax Bottleneck
由上面的卷积公式可以得知,交叉熵损失的输出为 log X L = log σ ( W L X L − 1 ) \log X_{L}=\log \sigma\left(W_{L} X_{L-1}\right) logXL=logσ(WLXL−1),其秩以 W L X L − 1 W_{L} X_{L-1} WLXL−1的秩为界,即 min ( d L , d L − 1 ) \min \left(d_{L}, d_{L-1}\right) min(dL,dL−1)。由于输入维度 d L − 1 d_{L-1} dL−1小于输出维度 d L d_{L} dL,编码后的特征由于秩不足而不能完全表征所有类别。这解释了Softmax层的一个Softmax bottleneck实例。能否通过引入非线性函数来缓解Softmax层的秩不足,性能得到了很大的改善?
Representational bottleneck
作者推测,扩展channel大小的层(即层),如下采样块,将有秩不足,并可能有Representational bottleneck。
能否通过扩大权重矩阵的 W i W_{i} Wi秩来缓解中间层的Representational bottleneck问题?
给定某一层生成的第 i i i个特征, X i = f i ( W i X i − 1 ) ∈ R d i × w h N X_{i}=f_{i}\left(W_{i} X_{i-1}\right) \in R^{d_{i} \times w h N} Xi=fi(WiXi−1)∈Rdi×whN, rank ( X i ) \operatorname{rank}\left(X_{i}\right) rank(Xi) 的阈值为 min ( d i , d i − 1 ) \min \left(d_{i}, d_{i-1}\right) min(di,di−1)(假设 N > > d i N>>d_{i} N>>di)。这里 f ( X ) = X ∘ g ( X ) f(X)=X \circ g(X) f(X)=X∘g(X),其中 ∘ \circ ∘表示与另一个函数 g g g的点乘。在满足不等式 rank ( f ( X ) ) ≤ rank ( X ) ⋅ rank ( g ( X ) ) \operatorname{rank}(f(X)) \leq \operatorname{rank}(X) \cdot \operatorname{rank}(g(X)) rank(f(X))≤rank(X)⋅rank(g(X))的条件下,特征的秩范围为:
rank ( X i ) ≤ rank ( W i X i − 1 ) ⋅ rank ( g i ( W i X i − 1 ) ) \operatorname{rank}\left(\mathbf{X}_{i}\right) \leq \operatorname{rank}\left(\mathbf{W}_{i} \mathbf{X}_{i-1}\right) \cdot \operatorname{rank}\left(g_{i}\left(\mathbf{W}_{i} \mathbf{X}_{i-1}\right)\right) rank(Xi)≤rank(WiXi−1)⋅rank(gi(WiXi−1))
因此,可以得出结论,秩范围可以通过增加 ( W i X i − 1 ) \left(W_{i} X_{i-1}\right) (WiXi−1)的秩和用适当的用具有更大秩的函数 g i g_{i} gi来替换展开,如使用 s w i s h swish swish或 E L U ELU ELU激活函数,这与前面提到的非线性的解决方法类似。
当 d i d_{i} di固定时,如果将特征维数 d i − 1 d_{i-1} di−1调整到接近 d i d_{i} di,则上式可以使得秩可以无限接近到特征维数。对于一个由连续的1×1,3×3,1×1卷积组成的bottleneck块,通过考虑bottleneck块的输入和输出通道大小,用上式同样可以展开秩的范围。
针对Layer-Level秩
作者生成一组由单一层组成的随机网络 f ( W X ) f(WX) f(WX):其中 W ∈ R d out × d in , X ∈ R d i n × N W \in R^{d_{\text {out }} \times d_{\text {in }}}, X \in R^{d_{i n} \times N} W∈Rdout ×din ,X∈Rdin×N, d o u t d_{out} dout随机采样, d i n d_{in} din则按比例进行调整,来判断Layer-Level秩。
特征归一化后的秩 ( rank ( f ( W X ) ) / d out ) \left(\operatorname{rank}(f(W X)) / d_{\text {out }}\right) (rank(f(WX))/dout )是由每个网络产生。为了研究 f f f而广泛使用了非线性函数。对于每种标准化Channel大小,作者以通道比例 ( d i n / d o u t ) \left(d_{i n} / d_{o u t}\right) (din/dout)在[0.1, .0]之间 和每个非线性进行10,000个网络的重复实验。图a和b中的标准化秩的展示图。
针对通道配置
随机生成具有expand层(即 d out > d in d_{\text {out }}>d_{\text {in }} dout >din )的L-depth网络,以及使用少量的condense层的设计原则使得 d out = d in d_{\text {out }}=d_{\text {in }} dout =din ,这里使用少量的condense层是因为condense层直接降低了模型容量。在这里作者将expand层数从0改变为 L − 1 L-1 L−1,并随机生成网络。例如,一个expand层数为0的网络,所有层的通道大小都相同(除了stem层的通道大小)。作者对每个随机生成的10,000个网络重复实验,并对归一化秩求平均值。结果如图c和d所示。
此外,作者测试了采样网络的实际性能,每个配置有不同数量的expand层,有5个bottleneck,stem通道大小为32。数据集用CIFAR100,在表1中给出了5个网络的平均准确率。
因此,作者这里给出了扩展给定网络秩的设计原则:
结论:表征瓶颈(representation bottleneck)将发生在这些扩展层和倒数第2层
解决方案:
- 中间层处理;扩大卷积层的输入通道大小,替换ReLU6s来细化每一层
- 替换ReLU6s来细化每一层;作者扩大了倒数第2层的输入通道大小,并替换了ReLU6
关于ResNet
的变种网络,之后再进行变种的其实还有蛮多的,后面我们会说到提高感受野的时候,再进行扩展,如unipose(魔改res2net)等。还有一些如HO-ResNet,结合了数值微分方程相关的,各位感兴趣的可以看看,基本上面试上问到的可能性不大。
我曾在19,20年联合了各大厂面试官,连续推出两版《百面计算机视觉》,受到了广泛好评,帮助了数百位同学们斩获了BAT等大小厂算法Offer。现在,我们继续出发,持续更新最强算法面经。
我曾经花了4个月,跨专业从双非上岸华五软工硕士,也从不会编程到进入到百度与腾讯实习。
欢迎加我私信,点赞朋友圈,参加朋友圈抽奖活动。如果你想加入<百面计算机视觉交流群>,也可以私我。