用博客记录一下提升神经网络整体性能的一些通用操作~
Non-local Neural Networks
论文链接
github链接
不论是作用在空间还是时间,CNN和RNN操作都总是在建立一次只处理一个局部邻近区域的块,此时若想捕捉长距离依赖,只能通过不断重复这些操作,在数据中逐步传递信号。但这种方式计算复杂,优化困难,特别是对于多跳依赖模型(multi-hop,如信息在远距离的位置之间来回传递)。
论文提出了能捕捉长距离依赖的非局部操作,在某个位置的响应计算为所有位置的特征的加权和。该操作的优点在于:
- 能抛开相隔距离,计算任意两个位置之间的联系
- 即使只有少数层,效果也很好
- 维持输入尺寸;且“位置”可以指时间或者空间,也就是说该操作对图像,序列,视频问题都适用
如上图所示,左一图中的球与之后几帧图像中的人和球的位置都产生了联系。较远处的像素也对该位置的响应有贡献,有助于网络捕捉到更丰富全面的信息。
非局部操作-公式
x,y分别对应输入信号和相同尺寸的输出信号;i,j分别是需要计算响应的位置和将要遍历的所有位置;f函数计算
x
i
x_{i}
xi与
x
j
x_{j}
xj的关系,g函数计算输入信号在位置j上的表征,
C
(
x
)
C(x)
C(x)是一个正则化因子。该公式计算所有位置的信号对当前计算位置的信号的影响。
非局部操作-变体
在上述公式下,如何选择f函数,g函数和正则化项呢?论文中,g函数被简单地定义为线性embedding:
g
(
x
i
)
=
W
g
x
j
g(x_{i})=W_{g}x_{j}
g(xi)=Wgxj,可用1x1的卷积进行操作;对于f和正则化的选择,作者提出了四种变体:
variant | func f | Normalization |
---|---|---|
Gaussian | ||
Embedded Gaussian | 最终可看做是softmax | |
Dot product | ||
Concatenation |
Non-local block
使用残差连接,将公式包装成可以插入到任何架构中的块:
x和y分别对应输入以及非局部操作公式的输出。实现过程如图所示:
为了减轻计算负担,可以采取以下两种方式:
- 将权重矩阵的通道数量控制为输入的一半,在上面的残差连接步骤时再增加为输入的通道数量
- 对输入进行下采样后再做非局部操作。如在g和 ϕ \phi ϕ函数后加一个最大池化层
Densely Connected CNN
论文链接
github链接
近期的一些工作证明如果网络在靠近input的入口处和接近输出的出口处这二者之间有更短的连接,CNN可以更深,更准确,更好训练。因为input经过多层网络的传递之后被“冲淡”。
作者认为在深层的网络中存在许多冗余,为了改善这个结构,不注重网络的深度,而是考虑特征重用,提出了DenseNet:每一层都接受之前所有层的输出的拼接作为输入,同时每一层产生的输出也将成为之后所有层的输入的一部分。
DenseNet有以下优点:
- 减轻了梯度消失的问题
这种结构改善了信息流(information flow),每一层与损失函数的梯度以及原始输入都有直接的联系。 - 减少参数
传统的前向传播结构可被视为维护一个状态,将这个状态在层与层之间传播,每层改变状态,并传递原状态中希望保留的部分。实际上很多层是冗余的,无法带来多少效果的提升,但每层又都有自己的权重参数。
而在DenseNet中,网络无需在冗余的特征映射上进行学习,相当于减少了参数。 - 加强了特征的传播,鼓励特征重用
DenseNet明确区分了要保留的信息和新加入的信息。拼接不同层的特征映射,增强了之后每层的输入的可变性(variation),提升学习效率。
Dense Connectivity
在DenseNet中,第
l
l
l层的输出
x
l
x_{l}
xl是在之前所有层的输出拼接的结果之上进行一系列操作
H
l
H_{l}
Hl。作者采用的操作为BN-ReLU-3x3Conv。
Growth rate
输入层的通道数量为
k
0
k_{0}
k0,操作
H
l
H_{l}
Hl产生
k
k
k个特征映射,
k
k
k称为growth rate。
第
l
l
l层有
k
0
+
k
∗
(
l
−
1
)
k_{0}+k*(l-1)
k0+k∗(l−1)个特征映射。实验证明,一个相对较小的growth rate即可得到state-of-the-art的结果。
Transition Layers
当特征映射的尺寸发生变化时,无法对特征映射进行拼接。为了在进行下采样之后仍然可以进行拼接,作者将网络划分为多个dense layer组成的dense block,并在block之间构建包含池化操作和卷积操作的transition layer以灵活改变尺寸,如1x1Conv-2x2pooling。
一些变体
DenseNet-B:在3x3Conv前加入1x1Conv构成Bottleneck layer,减少输入的特征映射数量。即BN-ReLU-1x1Conv(产生4k个特征映射)-BN-ReLU-3x3Conv。
DenseNet-BC:在trainsition layer进一步压缩模型,引入一个参数:压缩因子 θ \theta θ, 0 ≤ θ ≤ 1 0\le\theta\le1 0≤θ≤1,包含m个特征映射的dense block在trainsition layer产生 θ m \theta m θm个特征映射。