文章目录
- 网络结构 BackBone
-
- Lists:
- AlexNet 2012
-
- 创新点
- 参数计算
- Network in Network 2014
- VGGNet 2014
- InceptionV1 (GoogleNet) 2014
-
- Inception模块
- GoogleNet使用多个卷积核的原因
- Inception为什么使用1x1卷积层
- 为什么使用全局平局池化层
- 为什么使用侧枝(辅助分类器)
- GoogleNet在哪些地方使用了全连接层
- InceptionV2/3 2015
-
- InceptionV2相对于GoogleNet区别
- InceptionV3相对于GoogleNet区别
- Inception模块的设计核使用原则
- Xception 2016
-
- Inception模块特点和不足
- Extreme Inception模块 (SeparableConv)
- Xception中的Separable Conv和MobileNet中的Depthwise Separable Conv有什么区别?
- InceptionV4 & Inception ResNet 2016
-
- InceptionV4改进了什么
- Inception-ResNet-v1改进了什么
- Inception-ResNet-v2改进了什么
- ResNet 2015
-
- 残差模块(DBA: Deeper Bottleneck Architectures)
- ResNet动机
- ResNet的短接方式
- 为什么残差F(x)=H(x)-x比原始H(x)更容易优化?
- 为什么恒等映射系数是1,而不是其他
- ResNet为什么好?
- 都使用 relu 了, 导数恒等于 1, 怎么还会有梯度消失问题?
- ResNet 残差模块中激活层应该如何放置
- ResNetV1 & ResNetV2
- Wide Resnet 2016
- ResNeXt 2016
-
- ResNeXt在ResNet上做了什么改进
- DenseNet 2016
-
- DenseNet改进了什么?
- DenseBlock 每一层输出的特征图谱是怎么构成的, 如何确定输出通道数
- Transition Layer 怎么构成的, 有什么作用
- 深层的网络层输入的特征图谱很大, 怎么解决
- SqueezeNet 2016
-
- 设计原则
- Fire Module模块
- 网络结构
- MobileNet 2017
-
- 网络特点
- 可分离卷积的参数量和计算
-
- 分组卷积
- Separable Conv 参数
- Separable Conv 计算量FLOPs
- MobileNets为什么快
- MobileNetV2 2018
-
- Linear Bottleneck
- Inverted Residual
- 网络创新的总结
- MobileNetV1/2为什么使用`ReLU6`,哪些层后面不用ReLU?
- 反思deepwise后面加不加非线性激活层?
- MobileNetV2 的网络结构及与其他轻量级网络的区别
- mV1和mV2的参数
- MobileNetV3 2019
- MobileDets 2020
- ShuffleNet 2017
-
- ShuffleNet Unit
- 网络结构
- ShuffleNet计算量
- ShuffleNetV2 2018
-
- ShuffleNetV2的四条Guide
- ShuffleNetV2改进了哪些?
-
- 补充
- 从ShuffleNetV2角度看当前现有轻量化网络的问题
- 简述 ShuffleNetV1/2 和 MobileNetV1/2 的区别
- SENet 2017
-
- SENet原理
-
- SEBlock
- SE-Block 放置的位置是否会严重影响性能?
- SENet网络结构
- SENet中的Attention
-
- Channel Attetion (即Excitation部分)
- Spatial Attention
-
- Convolutional Block Attention Module (CBAM) 2018
- Block Attention Module (BAM) 2018
- CBNet 2019
- NAS 2019
- FBNetV1 2019
- FBNetV2 2020
- FBNetV3 2020
- 特殊网络
-
- Stacked Hourglass Networks
- 同时使用多层特征
- Hourglass Network 模块
- 残差模块
- 关节点之间的相互参考
- 中间监督
- BP
-
- FC
- BN
- Conv
- Activation
- Pooling
- Dropout
- Clip
- Loss
网络结构 BackBone
- 网络的参数:通常只计算卷积层核和全连接层的参数,不计算SN等也有参数的层
- FLOPS:floating point operations per second,计算速度
- FLOPs:floating point operations,浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度。
Lists:
AlexNet 2012
创新点
- ReLU + Dropout + 数据扩充(平移(图片归一化256x256, 从其中随机提取224x224)+反转/水平flip+光照和彩色变换) + 重叠池话 + LRN(后面不怎么用)
参数计算
- 注意AlexNet的第2/4/5卷积层是在两个GPU上并行运行的
CNN1 | 11x11x3x96+96=34944 |
CNN2 | 5x5x48x128+128)x2=307456 |
CNN3 | 3x3x256x384+384=885120 |
CNN4 | (3x3x192x192+192)x2=663936 |
CNN5 | (3x3x192x128+128)x2=442624 |
FC1 | (6x6x128x2)x4096+4096=37752832 |
FC2 | 4096x4096+4096=16781312 |
FC2 | 4096x1000+1000=4097000 |
参数数量总数 | 60965224 |
卷积层参数 | 2334080,占总参数的3.8% |
全连接层参数 | 58631144,占总参数量的96.2% |
Network in Network 2014
VGGNet 2014
-
- 常用的是VGG16和VGG19
- 常用的是VGG16和VGG19
- 常用的是VGG16和VGG19
- VGGNet 的网络结构延续了 AlexNet 的设计思想. 将卷积层分成 5 段, 每一段之间通过池化层分隔开, 后面同样跟了 3 层全连接层
- 小池化核,2x2,AlexNet使用3x3
- 全连接层转为卷积,例如7x7x512的层要跟4096个神经元的层做全连接,则替换为对7x7x512的层作通道数为4096、卷积核为1x1的卷积。这个是参考的 OverFeat工作(One-Stage 目标检测)
- 同样跟了 3 层全连接层, 同时他用多个小卷积核替换了 AlexNet 中的大卷积核, 可以在减少参数量的同时提高感受野的范围;通道更多,每层通道翻倍到512
小卷积核和多卷积子层
更宽
- 统建更深层的网络, 使得提取到的特征图谱的表征能力更强.VGGNet 比较常用的结构有 VGG16 和 VGG19. 二者的区别在于前者每个卷积段的卷积层数量是(2, 2, 3, 3, 3), 后者每个卷积段中的卷积层数量是(2, 2, 4, 4, 4).
更深
- 论文中说明了:① LRN层无性能增益 ② 随着深度增加,分类性能逐渐提高 ③ 多个小卷积核比单个大卷积核性能好
InceptionV1 (GoogleNet) 2014
- 思想:卷积神经网络中的最优局部稀疏结构可以被现有的组件逼近和覆盖, 因此, 只要找到这个局部最优结构, 并在网络结构中重复使用它, 就可以进一步提升神经网络的拟合能力.
Inception模块
- InceptionV1跳出了传统的卷积神经网络的简单堆叠结构,提出了Inception模块
- 综合了1x1、3x3和5x5这三个尺寸的卷积核提取特征,还结合了3x3的最大池化层
- 并使用1x1卷积核降低特征维度
- GoogleNet全貌(治好了我多年的颈椎病…)
- 说明:① 9个Inception模块(遵循了5个段落卷积层的设计方式:3a-3b-4a-4b-4c-4d-4e-5a-5b) 串接,其中第3和6个inception模块后面接了辅助分类器(大概是防止网络过深导致梯度消失训练慢,该分类器由一层平均池化层, 一层 1x1 卷积层, 两层全连接层和 Softmax 激活层组成)
- ② 采用通道方向进行并接(DepthConcat)
- ③ 最后的分类层由全局平均池化层, 全连接层, Softmax 激活层组成
- ④ 第一个Inception之前还接了两个LRN
- ⑤ 分类分支采用了40% dropout
GoogleNet使用多个卷积核的原因
- 就是问Inception模块的设计目的
- Inception模块重视模型的局部区域拟合能力。它们认为:一张图像通常具有总体特征和细节特征这两类特征,一般小卷积核能够更好的捕捉一些细节特征,随着深层网络的小卷积不断计算下去,总体特征也会慢慢的被提炼出来(感受野慢慢增大)。
- 但是这样存在一个问题,那就是在如果只采用小卷积,那么网络结构的前段一般只有细节特征,后段才慢慢有一些总体特征(感受野增大),而我们希望这两方面的特征总是能够一起发挥作用,因此,Inception 模型考虑采用更多不同尺寸的卷积核来提取特征
Inception为什么使用1x1卷积层
- 首先明确Inception有两个版本,naive版本没有1x1卷积层,但是导致计算量增长太快
- 文章在3×3和5×5的卷积之前,3×3max pooling之后使用了1×1卷积,使其输出的 feature map 的 depth 降低了,从而达到了降维的效果,抑制的过快增长的计算量。
为什么使用全局平局池化层
- GAP 的第一个作用就是可以替代全连接层, 根据全连接层本身的计算规则可知, 使用全局平均池化, 将池化核的个数设置为全连接的神经元个数, 就可以获得相同维度的计算结果.
- 全连接层包含大量参数, 容易产生过拟合现象, 从而影响整个模型的泛化能力. GAP 本身不包含任何参数, 它直接在 feature map 和样本标签空间内建立了联系, 也就是一个 feature map 对应一个 label. 明确学习目标, 简化学习过程.
- 全连接层通常需要 dropout 来避免过拟合, 而 GAP 本身就可以看做是一种正则, 因此可以使用模型的泛化性能更好
为什么使用侧枝(辅助分类器)
- 网络额外增加了2个辅助的softmax用于向前传导梯度(辅助分类器)。
- 训练期间:辅助分类器是将中间某一层的输出用作分类,并按一个较小的权重(0.3)加到最终分类结果中,这样相当于做了模型融合,同时给网络增加了反向传播的梯度信号,也提供了额外的正则化,对于整个网络的训练很有裨益。
- 测试的时候,这两个额外的softmax会被去掉。也就是说在测试的时候,只会用最后的softmax结果作为分类依据。
- 当时Inception网络太深了,不好训练,因此网络中加了两个侧枝,通过中间层的feature map,来得到预测结果(有了ResNet的shortcut以后,这种侧枝用的比较少了)。
GoogleNet在哪些地方使用了全连接层
- 侧枝:Avgpool+conv+FC+FC+SoftmaxActivation
- 最终分类器:GAP+FC+SoftmaxActivation
InceptionV2/3 2015
InceptionV2相对于GoogleNet区别
- ① 加入了 BN 层, 减少了 Internal Covariate Shift 问题(内部网络层的数据分布发生变化)
- ② 参考了 VGGNet 用两个 3×3 的卷积核替代了原来 Inception 模块中的 5×5 卷积核, 可以在降低参数量的同时加速计算.
InceptionV3相对于GoogleNet区别
- 分解(Factorization):可以将一个卷积层拆分成多个卷积层, 进一步加深网络深度, 增加神经网络的非线性拟合能力
- 输入从 224×224 变成了 299×299, 更加精细设计了 35×35, 17×17, 8×8 特征图谱上的 Inception 模块:
- 第一个卷积段的 7×7 大小的卷积核分解成了 3 个 3×3 大小的卷积核. 在
- 第二个卷积段也由 3 个 3×3 大小的卷积核组成;
- 第三个卷积段使用了 3 个 Inception 模块, 同时将模块中的 5×5 卷积分解成了两个 3×3 大小的卷积.;
- 在第四个卷积段中, 使用了 5 个分解程度更高的 Inception 模块, 具体来说, 是将 n×n 大小的卷积核分解成 1×n 和 n×1 大小的卷积核, 在论文中, 对于 17×17 大小的特征图谱, 使用了 n=7 的卷积分解形式.
- 在第五个卷积段中, 面对 8×8 大小的特征图谱, 使用了两个设计更加精细的 Inception 模块. 它将 3×3 大小的卷积层分解成 1×3 和 3×1 的卷积层, 这两个卷积层不是之前的串联关系, 而是并联关系.
Inception模块的设计核使用原则
- 在网络的浅层要避免过度的压缩特征信息, 特征图谱的尺寸应该温和的降低;
- 高维的特征信息更适合在本地进行处理, 在网络中逐渐增加非线性激活层, 这样可以使得网络参数减少, 训练速度更快;
- 低维信息的空间聚合不会导致网络表达能力的降低, 因此, 当进行大尺寸的卷积之前, 可以先对输入进行进行降维处理, 然后再进行空间聚合操作;
- 网络的深度和宽度需要反复权衡, 通过平衡网络中每层滤波器的个数和网络的层数使用网络达到最大性能.
Xception 2016
- 对InceptionV3的另一种改进
- 提出 Extreme Inception模块
Inception模块特点和不足
- 提出的动机:Inception模块是一大类在imageNet上取得很好结果的网络的基本模型,有别于VGG等传统的网络通过堆叠简单的3x3卷积实现特征提取,Inception模块通过组合1x1,3x3,5x5和pooling等结构,用更少的参数和更少的计算开销可以学习到更丰富的特征表示。通常,在一组特征图上进行卷积需要三维的卷积核,也即卷积核需要 同时学习空间上的相关性和通道间的相关性。将这两种相关性显式地分离开来,是Inception模块的思想之一:
- 特点:
- Inception模块首先使用 1x1 的卷积核将特征图的各个通道映射到一个新的空间,在这一过程中学习通道间的相关性;再通过常规的3x3或5x5的卷积核进行卷积,以同时学习空间上的相关性和通道间的相关性。
- 不足:
- 通道间的相关性和空间相关性仍旧没有完全分离,也即3x3或5x5的卷积核仍然是多通道输入的, 那么是否可以假设它们们可以被完全分离?
Extreme Inception模块 (SeparableConv)
- 若将Inception模块简化,仅保留包含3x3的卷积的分支, 就如下图所示
- 再将所有 1x1 的卷积进行拼接, 就如下图3所示, 进一步增多3x3的卷积的分支的数量,使它与1x1的卷积的输出通道数相等
- 注意:此时每个3x3的卷积即作用于仅包含一个通道的特征图上
- 调节每个3x3的卷积作用的特征图的通道数,即调节 3x3 的卷积的分支的数量与1x1的卷积的输出通道数的比例,实现Inception模块和Extreme Inception模块之间的状态。
Xception中的Separable Conv和MobileNet中的Depthwise Separable Conv有什么区别?
- ① 顺序不同:MobileNet 中的 Separable Conv 中, 是先进行 Depthwise Conv, 再进行 1x1 的 Pointwise Conv; 而 Xception 主要是优化 InceptionV3, 因此它是先进性 1x1 的卷积, 然后再进行 Depthwise Conv; ( 顺序的区别影响不大, 因为这些操作是堆叠组合的, 相对位置差不多 )
- ② 不接激活函数:Xception 中, 作者发现在 1x1 的卷积之后不使用 ReLU 等激活函数时具有较好的效果. 这一点在 MobileNetV2 中被详细分析过。
- 通道在经过 1x1 降维后, 过少的通道数目容易被 ReLU 激活函数破坏其携带的特征信息, 因此1x1之和常常不接激活函数.
- (ShuffleNet 也是如此, 只不过他的通道数是在 depthwise 的时候很小, 所以没有在 depthwise conv 之后使用 relu, 但是疑惑的是为什么第一个 1x1 GConv 的输出通道数也很低, 但是仍然用了 ReLU?)
- 面对通道数较低的特征图谱, 使用 ReLU 会因为低维数据坍塌现象, 即 ReLU 有可能会让某个通道的值全为 0, 从而维度降低, 这些低维度时会引起信息缺少, 而其他的激活函数又存在梯度消失问题, 所以没有使用激活
InceptionV4 & Inception ResNet 2016
- Inception系列的缺点:人工设计的痕迹太重,模型复杂
InceptionV4改进了什么
- InceptionV4 使用了更复杂的结构重新设计了 Inception 模型中的每一个模块. 包括 Stem 模块, 三种不同的 Inception 模块以及两种不同的 Reduction 模块. 每一个模块的具体参数设置均不太一样, 但是整体来说都遵循的 卷积分解和空间聚合 的思想.
- stem部分其实就是多次卷积+2次pooling(pooling采用了Inception-v3论文里提到的卷积+pooling并行的结构,来防止bottleneck问题)
- bottleneck问题:输入输出维度差距较大,就像一个瓶颈一样,InceptionV4主要是针对池化操作来说,因为池化的信息损失太多了。所以需要做卷积分支来补充信息。
- stem后用了3种共14个Inception模块,三种Inception模块具体是怎么取舍参数的论文没有过多解释,估计还是靠经验判断吧。
- 三种Inception模块间的Reduction模块起到pooling作用,同样使用了并行的结构来防止bottleneck问题。
Inception-ResNet-v1改进了什么
- Inception ResNet v1 网络主要被用来与 Inception v3 模型性能进行比较, 因此它所用的 Inception 子网络的计算相对常规模块有所减少 (为了对照测试,把参数设置的和v3类似,再在各个模块将残差思想添加上,短接链接)
Inception-ResNet-v2改进了什么
- Inception ResNet v1 的不同主要有两点, 第一是使用了 InceptionV4 中的更复杂的 Stem 结构, 第二是对于每一个 Inception 模块, 其空间聚合的维度都有所提升. 其模型结构如下所示:
ResNet 2015
- 虚线表示包含下采样的短接路径,代码中就是采用conv1x1实现尺寸和通道的调整(stride)!
if stride != 1 or self.inplanes != planes * block.expansion:
# stride != 1: block的第一层;
# self.inplanes != planes * block.expansion
# : block之间需要调整通道才能相加downsample = nn.Sequential( # conv1x1<>downsampleconv1x1(self.inplanes, planes * block.expansion, stride),norm_layer(planes * block.expansion),)
- ResNet 的网络结构依然遵循经典的五段式, 其中第一段是一个比较大的卷积层(7x7, 64, s2), 主要用来获取最初的特征图谱, 后四段是由不同数量的残差模块组成的
残差模块(DBA: Deeper Bottleneck Architectures)
- 残差模块有两种, 分别为基本的 ResNet Block(上图左侧) 和经过 1x1 卷积降维的 Bottleneck(上图右侧). 在 ResNet50 以上的通常都用 Bottleneck, 因为不仅层数更深, 同时参数量也更少, 提取特征的能力更强一些.
每一段使用的残差模块的数量都不同一样, 深层残差网络的 残差模块主要在 conv4 大量堆叠.
ResNet动机
- 作者认为产生模型退化的根本原因很大程度上也许不在于过拟合, 而在于梯度消失问题. 为了解决模型退化问题, 作者基于以上假设, 提出了深度残差学习框架, 没有直接堆叠网络层来 fit 期望的映射函数, 而是选择让这些网络层来 fit 一个残差映射.
- 这样一来, 在深层网络中, 如果某一层的输出已经较好的拟合了期望结果, 那么它们的梯度就会被直接传送到两层网络之前, 从而减少了深度神经网络中由于连乘问题导致的梯度消失现象, 进而使得网络有可能拟合到更好的结果上.
ResNet的短接方式
将本章节的第一张图,实现表示输入输出维度一致,虚线表示不一致!
- (A). 使用恒等映射, 如果需要改变输出维度时, 对增加的维度用0来填充, 不会增加任何参数.(这种就是之前讨论的 parameter-free 的恒等短接)
- (B). 在输入输出维度一致时使用恒等映射, 不一致时使用矩阵映射以保证维度一致, 增加部分参数.
- ?. 对所有的block均使用矩阵映射, 大量增加参数
- 效果上通常 C > B > A,认为A没有进行残差学习;但是线性变换需要引入额外的参数,需要处理的维度高,使得模型的size和时间复杂度都会加倍!所以对于bottlenect来说,选择恒等短接大大降低复杂度!
为什么残差F(x)=H(x)-x比原始H(x)更容易优化?
- 由于恒等连接的存在,会有保底效果,可以完全不学习也不会损失精度,更容易优化
为什么恒等映射系数是1,而不是其他
- 梯度传播过程中,是系数连乘,大于小于1,可能会导致梯度消失和爆炸
ResNet为什么好?
- ① shortcut 可以解决梯度消失问题:反馈信号的传播需要经过很多层,那么信号可能会变得非常微弱,甚至完全丢失,导致网络无法训练。这个问题被称为梯度消失( vanishing gradient)
- ② 深度学习中的表示瓶颈:在 Sequential 模型中,每个连续的表示层都构建于前一层之上,这意味着它只能访问前一层激活中包含的信息。如果某一层太小(比如特征维度太低),那么模型将会受限于该层激活中能够塞入多少信息。没有短接,任何信息的丢失都是永久性的。
- ③ 作者们认为神经网络的退化才是难以训练深层网络根本原因所在,而不是梯度消散。虽然梯度范数大,但是如果网络的可用自由度对这些范数的贡献非常不均衡,也就是每个层中只有少量的隐藏单元对不同的输入改变它们的激活值,而大部分隐藏单元对不同的输入都是相同的反应,此时整个权重矩阵的秩不高。并且随着网络层数的增加,连乘后使得整个秩变的更低。
这也是我们常说的网络退化问题,虽然是一个很高维的矩阵,但是大部分维度却没有信息,表达能力没有看起来那么强大。打破了网络的对称性,提升了网络的表征能力
都使用 relu 了, 导数恒等于 1, 怎么还会有梯度消失问题?
- 一方面, relu 正半轴导数为 1, 可以缓解梯度消失问题, 但是负半区导数为 0, 仍然存在梯度消失问题.
- 另一方面, 存在 relu 那一层的导数为 1, 但是其他层的导数并不一定为 1, 神经网络中不只有 relu 这一种变换, 其他的网络层的导数若大量小于 1, 仍然能够引起梯度消失问题. 当网络层数很深时, relu 的作用就不那么明显, 此时 shortcut 的作用就显现出来了.
- 故relu只是相对于其他激活函数可以缓解梯度消失,并不能消除。
ResNet 残差模块中激活层应该如何放置
- 推荐采用预激活的方式来放置激活层: BN+ReLU+Conv
ResNetV1 & ResNetV2
- ResNet v1: Deep Residual Learning for Image Recognition 2015
- ResNet v2: Identity Mappings in Deep Residual Networks 2016
- 将激活函数调整了位置,后激活 -> 先激活
- 如下图:Post和Pre的概念是相对于weight(conv)层来说的,那么我们不难发现,图(a), (b), ?都是”Post-activation”,图(d), (e)都是”Pre-activation”
- 图(a)是原始的结构,fff为RELU
- 图(b)是相加后再进行BN和RELU,此时fff表示BN和RELU。可以预见这种结果效果会更差,因为BN和RELU阻碍了信息的传递,试验结果也确实如此,loss在训练开始阶段下降很慢,最后的结果也不如原始的结构。
- 图(c)是在相加之前做RELU。一个很简单的让变成等式的方法就是将RELU移到相加操作的前面,但是这会导致FFF之后输出的值永远是非负数,直觉上残差函数输出的值应该在(?∞,+∞)(-\infty,+\infty)(?∞,+∞)之间。这会导致正向传播的信息单调增加,影响了表达能力,训练结果是错误率7.84%也确实比原始的错误率要高。
- 图(d)表示调整RELU的位置进行前激活。这种结构的表现和原始的结构类似,可能是因为激活函数之前没有享受到BN带来的好处
- 图(e)表示调整RELU和BN的位置进行前激活。这种结构会有比较明显的效果提升
- 优点:
- 更容易优化:这个影响在训练1001层的resnet的时候特别明显,使用原始的结构,training error在训练之初下降的非常慢,因为如果相加上进行RELU激活对传递过来的负数信息是有影响的。而如果是等式,信息可以直接从一个单元传递到另一个单元,1001层的resnet loss下降的非常快。另外对于层数少一些的resnet比如164层,为relu似乎对性能的影响很小。
- 降低过拟合:将BN放入RELU的前面可以带来正则化的效果,降低过拟合,会得到更高的精度。
- PS:为什么“identity”分支发生变化(图b),会影响信息传递,从而影响训练呢?
- 综上得到 ResNetV2 (图e)
Wide Resnet 2016
- Wide Residual Networks
- 核心结构
- 加宽(more feature planes),宽度是什么:
- 对于卷积层来说,宽度是指输出维度(通道)
- 对于一个网络来说,宽度则是指所有参数层的总体输出维度数。而深度是指参数层(卷积层、全连接层)的层数
- 增加深度,用更多卷积层
- 卷积核都小于3*3
- 随着宽度增加,参数指数倍增加,参数很多时很难训练,做Cifar10和Cifar100时很难调。
- 正则化使用dropout,而ResNet用的BN在这里不好用了
- 网络宽度由因子k决定
ResNeXt 2016
ResNeXt在ResNet上做了什么改进
- ResNeXt 实际上是将 ResNet Block 当中的输入数据的通道划分到了不同的组, 每个组的计算过程相对独立, 最终将所有组的计算结果进行空间聚合, 作为最终的输出.
- ResNeXt 可以在不增加参数量的情况下进一步提高 ResNet 的特征提出能力, 从而表现出更好的网络性能.
- ResNeXt 的卷积方式实际上可以看做是通道分组卷积. 在实现上, 只需要将普通的卷积替换成 Group Conv 即可, 下图是 Group=32 的示例.
DenseNet 2016
DenseNet改进了什么?
- DenseNet延续了ResNet的短接连接的思想,与 ResNet 不同的是, 他采用了一个更暴力的方式, 就是将所有网络层都连接起来, 具体来说, 就是每一层的输入会来自于 前面所有层的输出(这些层的特征图谱大小是相同的, 因此可以在 Channel 维度上进行叠加). 如果假设一个 DenseBlock 的层数是 L, 那么 DenseNet 就会有 L(L+1)/2 个短接路径. (排列组合)
- 传统的CNN网络,会使pooling层会卷积层降低特征图谱的尺寸,这个不利于恒等变换的连接,而DenseNet要全部连接上,所以需要特征图大小保持一致:
- 为了解决这个问题, DenseNet 将网络分成了若干个
DenseBlock + Transition
的结构. 在 DenseBlock 内部, 特征图谱大小相同, 可以直接连接, 在具有不同大小特征图谱的 DenseBlock 之间, 使用 Transition Layer 进行过渡. - Element-wise Addition & Channel-wise Concatenation
DenseBlock 每一层输出的特征图谱是怎么构成的, 如何确定输出通道数
- DenseBlock 内部的网络层都具有相同大小的特征图谱, 因此可以直接使用 dense connect 的方式在通道维度上进行连接.
- 在 DenseBlock 内部, 每一层网络输出的特征图谱的通道数是通过一个 超参数增长率 k 来决定的, 这个 k 可以设定的比较小, 比如32, 在 DenseBlock 中, 所有的网络层都输出 k 维通道
- 虽然每一个网络层的输出图谱通道数较低, 但是每一层的输入是综合前面所有层的输出的, 因此随着网络层的增加, 其最终的输出通道数依然是增加的(会叠加前面所有的输出), 只不过每一层只有 k 层通道数自己独自输出的.
Transition Layer 怎么构成的, 有什么作用
- 对于不同的 DenseBLock, 其具有的尺寸是不同的, 因此无法直接使用 dense 链接, 为此, 作者利用 1x1 卷积层和 2x2 池化层定义了一个 transition layer;
- 其主要作用有两个, ① 降低通道维数 ② 是对特征图谱进行下采样. Transition Layer 的结构为: BN + ReLU + 1x1 Conv + 2x2 AvgPooling. ③ Transition层可以起到压缩模型的作用。假定Transition的上接DenseBlock得到的特征图channels数为 m,Transition层可以产生 θmθmθm 个特征(通过卷积层),其中 θ\thetaθ 是压缩系数(compression rate)。当 θ=1θ=1θ=1 时,特征个数经过Transition层没有变化,即无压缩,而当压缩系数小于1时,这种结构称为
DenseNet-C
,文中使用 θ=0.5 。
深层的网络层输入的特征图谱很大, 怎么解决
- 由于深层的网络层输入非常大, 因此 DenseBlock 内部会采用 bottleneck 来减少计算量, 主要是在原来的 3×3 卷积层之前添加 1×1 的卷积层, 变成 BN + ReLU + 1x1 Conv + BN + ReLU + 3x3 Conv 的结构(
DenseNet-B
) - 1×1 卷积会将 l×k 的通道数降低成 4×k 的通道数, 从而提升计算效率.
- 对于使用bottleneck层的DenseBlock结构和压缩系数小于1的Transition组合结构我们称为
DenseNet-BC
。
SqueezeNet 2016
设计目标:不是为了得到最佳的CNN识别精度,而是希望简化网络复杂度,同时达到public网络的识别精度
设计原则
- 替换3x3的卷积kernel为1x1的卷积kernel:卷积模板的选择,从12年的AlexNet模型一路发展到2015年底Deep Residual Learning模型,基本上卷积大小都选择在3x3了,因为其有效性,以及设计简洁性。本文替换3x3的卷积kernel为1x1的卷积kernel可以让参数缩小9X。但是为了不影响识别精度,并不是全部替换,而是一部分用3x3,一部分用1x1。具体可以看后面的模块结构图。
- 减少输入3x3卷积的input feature map数量,如果是conv1-conv2这样的直连,那么实际上是没有办法减少conv2的input feature map数量的。所以作者巧妙地把原本一层conv分解为两层,并且封装为一个Fire Module。
- 减少pooling,这个观点在很多其他工作中都已经有体现了,比如GoogleNet以及Deep Residual Learning。
Fire Module模块
网络结构
- bypass在fire3/5/7/9的输入输出间加上短接连接 (ResNet思想)
- complex bypass针对通道数不同的模块间的连接
MobileNet 2017
- 可分离卷积的概念可以追溯到2012的 “Simplifying ConvNets for Fast Learning"
- 可分离卷积可以分为:空间可分离卷积和深度可分离卷积
- 空间可分离类似于将二维高斯分解为两个方向的一维卷积的迭代。这里不考虑,只关注于MobileNet关注的深度分离卷积
- 深度可分离卷积 = 深度卷积 + 逐点卷积
- 设计原则:构建出模型 size 小, 并且执行速度快的卷积网络.
网络特点
- 整体框架和 AlexNet 以及 VGGNet 类似, 都是通过不断堆叠卷积层的方式来构建深层的卷积神经网络
- 不同之处在于MobileNet 除了在第一层使用了标准的卷积层之外, 其余的卷积层都是基于深度可分离卷积构建的(Depthwise Convolution 和 Pointwise Convolution)
- Depthwise Conv(用 Group Conv 实现, group_num = in_channels): 对每个 input channel (input depth) 使用一个单独的 filter. 因此输出通道数保持不变, 依然为 CinCinCin
- Pointwise Conv(用 1x1 Conv 实现, 每个卷积核深度为 CinC_{in}Cin?): 利用 1x1 卷积跨通道的融合 depthwise conv 的输出, 并输出指定的通道数 CoutC_{out}Cout?, 从而建立新的特征图谱.
- 作者认为ReLU6作为非线性激活函数,在低精度计算下具有更强的鲁棒性。(这里所说的“低精度”,我看到有人说不是指的float16,而是指的定点运算(fixed-point arithmetic))
- 各模块的参数占用量
可分离卷积的参数量和计算
输入特征图谱为: Win×Hin×CinW_{in}×H_{in}×C_{in}Win?×Hin?×Cin?
输出特征图谱为: Wout×Hout×CoutW_{out}×H_{out}×C_{out}Wout?×Hout?×Cout?
卷积核大小为: Wk×Hk×CinW_k×H_k×C_{in}Wk?×Hk?×Cin?
分组卷积
- 分组数GGG必须满足能够同时被 CinC_{in}Cin? 和 CoutC_{out}Cout? 整除,
- 分组卷积的参数量为 每组的参数量 乘以 组数
Wk×Hk×CinG×CoutG×G=Wk×Hk×CinG×CoutW_{k} \times H_{k} \times \frac{C_{\text {in}}}{G} \times \frac{C_{\text {out}}}{G} \times G=W_{k} \times H_{k} \times \frac{C_{\text {in}}}{G} \times C_{\text {out}} Wk?×Hk?×GCin??×GCout??×G=Wk?×Hk?×GCin??×Cout? - 分组卷积的 FLOPs 为 参数量 和 输出图谱尺寸 的乘积
Wk×Hk×CinG×Cout×Wout×HoutW_{k} \times H_{k} \times \frac{C_{i n}}{G} \times C_{o u t} \times W_{o u t} \times H_{o u t} Wk?×Hk?×GCin??×Cout?×Wout?×Hout?
Separable Conv 参数
- 标准卷积:
Wk×Hk×Cin×CoutW_{k} \times H_{k} \times C_{i n} \times C_{o u t} Wk?×Hk?×Cin?×Cout? - 分离卷积
- ① Depthwise (G=Gin=GoutG=G_{in}=G_{out}G=Gin?=Gout?):Wk×Hk×CinG×Cout=Wk×Hk×CoutW_{k} \times H_{k} \times \frac{C_{i n}}{G} \times C_{o u t}=W_{k} \times H_{k} \times C_{o u t}Wk?×Hk?×GCin??×Cout?=Wk?×Hk?×Cout?
- ② Pointwise (1x1):Wk×Hk×Cin×Cout=Cin×CoutW_{k} \times H_{k} \times C_{i n} \times C_{o u t}=C_{i n} \times C_{o u t}Wk?×Hk?×Cin?×Cout?=Cin?×Cout?
- 参数节省率
Wk×Hk×Cin+Cin×CoutWk×Hk×Cin×Cout=1Cout+1Wk×Hk\frac{W_{k} \times H_{k} \times C_{i n}+C_{i n} \times C_{o u t}}{W_{k} \times H_{k} \times C_{i n} \times C_{o u t}}=\frac{1}{C_{o u t}}+\frac{1}{W_{k} \times H_{k}} Wk?×Hk?×Cin?×Cout?Wk?×Hk?×Cin?+Cin?×Cout??=Cout?1?+Wk?×Hk?1?
Separable Conv 计算量FLOPs
- 卷积计算量 = 参数量与输出图谱尺寸乘积 Wout×HoutW_{out}×H_{out}Wout?×Hout?
- 计算量节省率和参数的节省率相同
MobileNets为什么快
- 分离卷积比一般卷积的参数量和计算量都大约缩小了 卷积和面积 的倍数
- MobileNet中, 复杂度基本集中到Conv1x1上 (参数量上, Conv 1x1 占比约 75%, FC 约 24%. 而在 FLOPs 上, Conv 1x1 占比约 95%, Conv DW 3x3 约 3%, FC 不到 1%) 而卷积层使用
im2col+GEMM
的方式实现时, 1×1的卷积层不需要在内存中重新排序, 因此它的实际执行速度很快. - 原文还给出了两个超参数来进一步压缩模型大小, 分别 width multiplier ααα 和 resolution multiplier ρρρ, 前者用于控制特征图谱的通道数, 后者用于控制输入图片的尺寸.
MobileNetV2 2018
- 在实际使用的时候, 发现V1的深度卷积部分的卷积核比较容易训废掉:训完之后发现深度卷积训出来的卷积核有不少是空的:
- 作者认为是relu导致的神经元死了!对低维度做ReLU运算,很容易造成信息的丢失!而在高维度进行ReLU运算的话,信息的丢失则会很少!
- 所以由此就有两个改进点:① 减少ReLU的使用(减少损失)② 将通道数扩充!低通道会导致损失很多!即在3x3前面再加个1x1升维!
- MobileNetV2 的改进主要有两点: Linear Bottleneck 和 Inverted Residual.
Linear Bottleneck
- Linear Bottleneck:在原先的 DepthwiseConv+PointwiseConv之前再加上一个PointwiseConv
- 添加了这一层Pointwise convolution之后,Depthwise convolution的Filter数量取决于之前的Pointwise的通道数。而这个通道数是可以任意指定的,因此解除了3x3卷积核个数的限制。
- 同时去掉了最后一个 conv 1x1 的 ReLU, 这是因为 ReLU 会造成低维度数据的坍塌, 在 channel 少的 feature map 后如果使用 ReLU, 就会破坏 feature map, 造成信息缺失.
Inverted Residual
- ResNet的DBA模块是先降维再升维,MobileNetV2是反过来的,所以叫Inverted
- 原因①是因为在内存的使用上更加高效(论述过程比较繁琐, 没细看) ② 因为在实际实验中效果也比较好.
- 深度卷积本身没有改变通道的能力,来的是多少通道输出就是多少通道。如果来的通道很少的话,DW深度卷积只能在低维度上工作,这样效果并不会很好,所以我们要“扩张”通道 既然我们已经知道PW逐点卷积也就是1×1卷积可以用来升维和降维,那就可以在DW深度卷积之前使用PW卷积进行升维(升维倍数为t,t=6),再在一个更高维的空间中进行卷积操作来提取特征:
- 参考ResNet,添加了短接支路
- 刚好V2的block通道数的变化和resnet的相反,作者将其命名为Inverted residuals。就是论文名中的Inverted residuals
网络创新的总结
- 链接
MobileNetV1/2为什么使用ReLU6
,哪些层后面不用ReLU?
- ReLU6 就是将普通的 ReLU 的最大输出值限制为 6(对输出值做 clip)
- 原因:因为在移动端设备上, 由于资源限制, 使用的数据类型通常为 float16, 如果不对 ReLU 的输出值限制范围, 则其输出值为 0 到正无穷, 而低精度的 float 16 无法很好的精确描述如此大范围的数值, 因此会带来精度损失.
- 在Separable Block中对于 channel 数量较少的 1x1 conv, 使用 Linear Bottleneck 来替换 ReLU.
个人理解
:对于 channel 较少的层, 其本身某一维度的张量容易被 ReLU 置为全0, 张量维度的减小意味着特征描述容量的下降, 从而造成当前层的特征信息损耗.
反思deepwise后面加不加非线性激活层?
链接
- 在shuffleNet和Xception中都建议了depthwise conv后面不要使用non-linearity,在Xception中还有实验对比:
- 不使用non-linearity不仅收敛速度快,而且performance更优。但是在Inception中结论是相反的(Rethinking the inception architecture for computer vision)。论文中提到的一个合理解释是:depth很关键,由于Inception中的中间层是全channel的,所以non-linearity是有利的,但是对于depthwise conv,其特征是单channle的,所以non-linearity有害,可能造成了信息丢失。
- 感觉按照这个说法, v2也可以试试conv1x1-> ReLU6-> Dconv3x3-> conv1x1-> ReLU6。可以对比一下。。 TODO!
MobileNetV2 的网络结构及与其他轻量级网络的区别
mV1和mV2的参数
MobileNetV3 2019
- Searching for MobileNetV3
- 是搜出来的!NAS
- 修改了:
- 网络的架构基于NAS实现的MnasNet(效果比MobileNetV2好)
- 引入MobileNetV1的深度可分离卷积
- 引入MobileNetV2的具有线性瓶颈的倒残差结构
- 引入基于squeeze and excitation结构的轻量级注意力模型(SE):主要为了利用结合特征通道的关系来加强网络的学习能力!!!
- 使用了一种新的激活函数h-swish(x)
- 网络结构搜索中,结合两种技术:资源受限的NAS(platform-aware NAS)与NetAdapt
- 修改了MobileNetV2网络端部最后阶段
- 激活函数h-swish,基于swish改进的:
- 2017的论文Searching for Activation function:Swish具备无上界有下界、平滑、非单调的特性。并且Swish在深层模型上的效果优于ReLU,可以涨一个点!
- 2017的论文Searching for Activation function:Swish具备无上界有下界、平滑、非单调的特性。并且Swish在深层模型上的效果优于ReLU,可以涨一个点!
- 随着网络的深入,应用非线性激活函数的成本会降低,能够更好的减少参数量。作者发现swish的大多数好处都是通过在更深的层中使用它们实现的。因此,在V3的架构中,只在模型的后半部分使用h-swish(HS)
- NAS
- 搜出来的Block:参考mV1,mV2和MnasNe+SE
- 更改末端计算量大的层:
- MobileNet V2的inverted bottleneck结构是使用1x1卷积作为最后一层,以扩展到高维特征空间(320->1280的那一层1x1 conv BN H-Swish)。它有丰富的预测功能,但计算量大。反向瓶颈层是960->960->320那部分。
- V3为了减少延迟并保留高维特性,我们将该1x1层移到最终的平均池化之后(960→Avg-pool→1x1 conv)。现在计算的最后一组特征图大小由7x7变成了1x1,可以大幅度减少计算量。
- 这样去掉了反向瓶颈层中的projection和滤波器层,在不损失精度的情况下,将延迟减少了10毫秒,即15%的运行时间。
MobileDets 2020
- MobileDets: Searching for Object Detection Architectures for Mobile Accelerators
- NAS … …
- 在移动端上的目标检测架构,目前比较流行的三大派系分别为:谷歌出品的MobileNet(v1-v3) 系列、旷视科技产品的ShuffleNet(v1-v2) 系列、Facebook出品的FBNet(v1-v3) 系列
ShuffleNet 2017
- 提出动机:之前的网络的分组卷积 (降低计算量+跨通道解耦);都只是对 3x3 的卷积核进行分组卷积. 而对于这些网络结构来说, 占计算量 90% 甚至 95% 的 1x1 卷积却没有进行分组卷积. 其主要原因就是这些网络需要 1x1 卷积来学习跨通道的信息.
- ShuffleNet对1x1卷积的分组卷积,提出了自己的解决方案
ShuffleNet Unit
- Channel Shuffle
- 基于ReNet的DBN进行的改进,DBN:
- ① bottlenect 中的3x3卷积替换成 Xception/MobileNet 中的 Depthwise Conv. ② 将两个 1x1 卷积替换成 Group Conv, ③ 对第一个 1x1 卷积的输出图谱执行 Shuffle Channel 操作即可.
- PS:第二个 Group Conv(Pointwise) 的目的是恢复通道数以匹配 shortcut 连接, 为了简单起见, 我们没有这里使用额外的 Channel Shuffle 操作, 因为这已经可以产生不错的效果了.
- PS:在 Depthwise Conv 之后, 没有使用 ReLU 等激活层, 其原因是因为 Depthwise Conv 输出的通道数较低, 使用 ReLU 会因为低维数据坍塌现象, 即 ReLU 有可能会让某个通道的值全为 0, 从而维度降低, 这些低纬度时会引起信息缺少, 而其他的激活函数又存在梯度消失问题, 所以没有使用激活
- PS:为什么第一个GConv的输出通道也很低,但确用了ReLU?
- 改进图示如下
- 上图从左到右分别为:原始ResNet的DBN;改进的Shuffle Unit;进行下采样时的Shuffle Unit,其中Concat是通道合并,类似于Inception的思想!
网络结构
- Shuffle Channel实现
- Shuffle Channel 的实现十分简单, 只需要一个reshape, transpose和flatten操作即可, 如下所示:
111 123
111222333 -(reshape)-> 222 -(transpose)-> 123 -(flatten)-> 123123123333 123
class ShuffleBlock(nn.Module):def __init__(self, groups):super(ShuffleBlock, self).__init__()self.groups = groupsdef forward(self, x):'''Channel shuffle: [N,C,H,W] -> [N,g,C/g,H,W] -> [N,C/g,g,H,w] -> [N,C,H,W]'''N,C,H,W = x.size()g = self.groups# 维度变换之后必须要使用.contiguous()使得张量在内存连续之后才能调用view函数return x.view(N,g,int(C/g),H,W).permute(0,2,1,3,4).contiguous().view(N,C,H,W)
- 网络结构最开始由 3x3 的卷积层和最大池化层组成, 二者的步长均为2, 也就说这里的 Downsample 总步长为 4. 然后是三个不同的 Stage(3,7,3), 每个 Stage 最开始第一个 building block 的步长为2(stride=2), 用于降低特征图谱的尺寸, 同时会借助旁路的 avg pool 使得 channels 数量翻倍. 最后是由 GAP+FC+Softmax 组成的分类层.
ShuffleNet计算量
- 是基于ResNet改进的,所以将其和ResNet复杂度进行比较
- Input feature map: c×h×wc×h×wc×h×w;bottlenect 3x3 卷积的通道数: mmm
- FLOPs:
ResNet: hw(2cm+9m2)hw(2cm+9m^2)hw(2cm+9m2)
ResNeXt: hw(2cm+9m2/g)hw(2cm+9m^2/g)hw(2cm+9m2/g), ggg 代表分组数量
ShuffleNet: hw(2cm/g+9m)hw(2cm/g+9m)hw(2cm/g+9m), ggg 代表 1x1 卷积的分组数量, 3x3 是 Depthwise Conv, 分组数等于通道数
也就说, 当给定计算资源限制后, ShuffleNet 可以使用更大的特征图谱, 这对于小型网络来说非常重要, 因为小型网络通畅没有足够的通道来处理信息.
ShuffleNetV2 2018
ShuffleNetV2的四条Guide
- ①
Pointwise Conv
中, 当输入输出通道维度相等时,内存访问成本(MAC
)最小. 证明如下:
- ②
Group Conv
虽然有助于提高精度, 但是过多的分组会增加 MAC
- ③
Building Block
中过多的子模块会降低并行程度:将多个卷积模块组合作为一个 building block 的方式通常可以提高精度, 因为特征表达能力明显增强, 但是它对 GPU 并行设备非常不友好, 即使是并行排列的子模块, 也会大幅降低实际并行速度, 因为它们需要引入额外的开销, 比如 kernel launching 和信息同步(synchronization)。文章中有实验测试 TODO - ④ Element-wise 操作也会影响速度:在轻量模型 ShuffleNetV1 和 MobileNetV2 中,element-wise 操作占用了相当多的时间(15%, 23%),尤其是在GPU上。这里的元素操作符
主要包括 ReLU、Shortcut(Tensor add)、Add Bias等
。它们的 FLOPs 较小,但 MAC 相对较高, 也就是说他们具有较高的MAC/FLOPs ratio
。特别地,本文还考虑了深度卷积(depthwise convolution)作为一个 element-wise 运算符的情况,因为它也具有较高的MAC/FLOPs比。
ShuffleNetV2改进了哪些?
- 根据上面四条 Guide, ShuffleNetV2 的设计目标是在保持较大通道数的情况下, 减少密集卷积和分组数量, 为此, 它使用
Channel Split
方法对 ShuffleNetV1 进行了如下改进: - 改进如下
- 上图从左到右:第一和第二是ShuffleNetV1的核心,违反了G1/G2/G3。所以改进(第三第四)如下:
- ① 将输入图谱的 Channel 分成两部分(分配比例默认 1:1), 一部分直接通过 Shortcut 传递, 另一部分有 bottleneck 传递;
这里的channel split 目的在于减少后序两条路径的通道上,以减少后序的组数 G2
- ② 为了遵循 G1, G2, bottleneck 的三个卷积层的输入输出通道均相等, 同时两端的 1x1 卷积使用普通卷积, 而不是 Group Conv; (Channel Split 本身也具有一定的分组作用,减少分组)
- ③ 对于下采样模块, 没有使用 Channel Split, 这样输出通道数刚好可以翻倍, 另外将原先的 3x3 AVG Pool 替换成了 3x3 DepthwiseConv + 1x1 Conv.
- 这两个 building-block 反复堆叠,进而构建整个网络, 总体网络结构与ShuffleNet v1相似。唯一区别:
在全局平均池之前添加一个传统的1×1卷积层来混合特性,而在ShuffleNet v1中没有
补充
- concat, channel shuffle, 以及下一层的 channel split 可以 merge 到同一个 element-wise 中去, 减少 element-wise 的冗余;
- ShuffleNet 可以和 Residual / SE 联合使用, 如下所示:
从ShuffleNetV2角度看当前现有轻量化网络的问题
- ShuffleNetV1:
- 使用基于 ResNet bottleneck 的基本结构, point-wise conv 的通道比不为 1, 违反 G1;
- 使用大量的 Group Conv, 分组过多, 违反 G2;
- Shortcut, ReLU, 存在大量的 Element-wise 操作(15%), 违反 G4
- MobileNetV1:
- 使用 Point-Wise 改变通道维度, 违反 G1;
- 使用 Gourp Conv, 分组过多, 违反 G2;
- MobileNetV2:
- 使用 Inverted Residual bottleneck, 通道比不为 1, 违反 G1;
- 使用大量的 Group Conv, 范围 G2;
- 在一个很 “厚” 的特征图谱上使用 ReLU, 以及大量的 Shortcut, 使用 Element-wise 操作较多(23%), 违反 G4;
- NAS 网络:
- building block 内部存在过多路径, 碎片化程度严重, 违反 G3;
简述 ShuffleNetV1/2 和 MobileNetV1/2 的区别
- Xception: 基于 InceptionV3, 先进行 1x1 Pointwise Conv, 在进行 Group Conv. (由于 building block 是堆叠使用的, 因此相对位置的变化影响并不大), 在 1x1 卷积降维后不使用 ReLU.
- MobileNetV1: 将 3x3 Conv 替换成 Depthwise Conv + Pointwise Conv, 正常使用 ReLU6.
MobileNetV2: Inverted Residual + Linear Bottleneck, 两边小中间大, 最后的 1x1 卷积不使用 ReLU6. - ShuffleNetV1: 基于 ResNet Bottleneck, 在 Bottleneck 两端的 1x1 卷积上也使用 Group Conv, 为了促进组间通信, 在第一个 1x1 卷积后使用 Channel Shuffle. 两边大中间小, 在中间的 DWConv 不使用 ReLU. 疑问: 为什么输出通道少的第一个 1x1 GConv 依然使用 ReLU?
- ShuffleNetV2: 基于 4 条 Guide, 利用 Channel Split 改良 ShuffleNetV1 Unit, 减少 MAC 通信和 FLOPs, 提升模型运行效率
SENet 2017
SENet原理
SEBlock
- 该模块可以加入到任意的特征图谱上, 进而可以重新校准各个通道上的特征信息
- Squeeze: 在特征图谱上进行全局平均池化, 得到 channel embedding,
- Excitation: 利用 FC? + ReLU? + FC + Sigmoid 的组合普通各个通道之间的依赖关系, 为了能够同时关注多个通道, 使用 Sigmoid 激活(而不是 One-Hot 激活), 这样, 就有可能有多个通道的权重都很高. 上面的 r 代表通道个数的衰减系数。使用两个 FC 的原因主要是为了构成 bottleneck 结构, 减少参数量和计算量.
SE-Block 放置的位置是否会严重影响性能?
- 不会, 通常网络是堆叠放置的, 因此改变 SE Block 的绝对位置并不会对其相对位置产生太大的影响, 因此, SE Block 对于各种位置都具有较好的性能, 如下实验所示.
SENet网络结构
- SE Block 可以使用在任意的网络中, 下表是在 ResNet-50 和 ResNeXt-50 中使用的情况, 可以看出, SE BLock 会在每个 bottleneck 中使用
SENet中的Attention
Channel Attetion (即Excitation部分)
- global池化(池化窗口就是h×wh×wh×w 得到的就是1×1窗口,通道数不变)得到 1×1×c1×1×c1×1×c 的feature map,然后它再接两个全连接层(第一个全连接层神经元个数是c/rc/rc/r,相当于对ccc进行了降维,输入是ccc个特征,第二个全连接层神经元个数为ccc,相当于又增维回到了ccc个特征,这样做比直接用一个 Fully Connected 层的好处在于具有更多的非线性,可以更好地拟合通道间复杂的相关性,极大地减少了参数量和计算量),然后再接一个sigmod层(这里采用sigmod应该是通道之间是具有相关性的,所以不能用softmax,softmax的话,最终加起来必须为1),输出1×1×c1×1×c1×1×c,
原来的feature map维度h×w×ch×w×ch×w×c,得到的是通道的权值维度1×1×c1×1×c1×1×c,然后它们进行相乘(每个通道乘上一个权值)
Spatial Attention
Convolutional Block Attention Module (CBAM) 2018
- Spatial Attention 可以告诉神经网络特征图谱上 “where to focus”
- CBAM 插入到 backbone 网络的 basic block 部分
Block Attention Module (BAM) 2018
- 和 CBAM 结构类似, 只不过插入位置不同
CBNet 2019
- A Novel Composite Backbone Network Architecture for Object Detection
- 名义上是单模型,实际是多模型的特征融合,只是和真正的多模型策略略有不同。作者的起点是,设计新的模型往往需要在ImageNet上进行预训练,比较麻烦。因而提出的Composite Backbone Network (CBNet),采用经典网络的多重组合的方式构建网络,一方面可以提取到更有效的特征,另一方面也能够直接用现成的预训练参数(如ResNet,ResNeXt等)比较简单高效。
NAS 2019
- 神经网络结构搜索(Neural Architecture Search,NAS)是自动机器学习(Auto-ML)领域热点之一?
- NAS的工作可以根据三个方面进行划分:search space(搜索空间)、search strategy(搜索策略)、performance estimation strategy(性能评估策略)。
- Search Space:搜索空间定义为在一定原则下可以表示的结构。引入适合任务的先验知识能够减少搜索空间并且简化搜索。然而,这也会引入人为偏差,阻碍寻找到新颖的超出当前人类知识的结构构建模块。
- Search Strategy:搜索策略详细说明如何探索搜索空间。它包含了典型的探索-开发的权衡,一方面,希望能够快速找到优良的结构,另一方面,希望避免提前收敛到结构次优的区域。
- Performance Estimation Strategy:NAS典型目标是找到在未知数据上能够得到高性能的结构。性能评估是涉及评估性能的过程:最简单的方式是在数据上执行标准的训练和验证,不幸的是该过程计算昂贵并且能够探索的结构数量受限制。
- Search Strategy目前有三种流行的搜索方法:Reinforcement Learning(RL)、Evolutionary Algorithm(EA)、Gradient Based(GB)
- 在NAS过程中,最为耗时的其实就是对于候选模型的训练。而初版的NAS因为对每个候选模型都是从头训练的,因此会相当耗时。一个直观的想法是有没有办法让训练好的网络尽可能重用。
- ① 思路是利用网络态射从小网络开始,然后做加法。
- ② 思路是从大网络开始做减法,如One-Shot Architecture Search方法。最近比较火的One-Shot(主要涉及到的论文有:SMASH、ENAS、One-Shot、DARTS、ProxylessNAS、FBNet、SPOS、Single-Path NAS、FairNAS)。
FBNetV1 2019
- FBNet: Hardware-Aware Efficient ConvNet Design via Differentiable Neural Architecture Search
FBNetV2 2020
- FBNetV2: Differentiable Neural Architecture Search for Spatial and Channel Dimensions
- 本文的贡献点主要在于提出了一种 channel 维度的 mask 机制 和 spatial 维度的 subsampling 机制,能扩大 DNAS 系列方法的搜索空间,同时几乎不增加显存和计算开销。
FBNetV3 2020
- FBNetV3: Joint Architecture-Recipe Search using Neural Acquisition Function
- 这篇论文提到了一个比较有意思的点:网络架构与训练策略同时进行搜索。这是之前的方法所并未尝试的一个点,之前的方法主要聚焦在网络架构,而训练方法则是采用比较常规的一组训练方式。
特殊网络
Stacked Hourglass Networks
- 堆叠沙漏网络结构!
- 姿态估计(pose estimation)在计算机视觉领域是一个非常重要的方向,人类动作理解,人机互动等等应用都需要精确的姿态识别。目前,绝大多数的2d姿态识别都是识别人体的关键点
- 全卷积的神经网络,由一个或多个 hourglass 模块组成。
- hourglass 模块以一个统一的结构捕获全局和局部特征。当多个 hourglass 模块在网络中堆叠时, hourglass 模块可以重新处理这些特征来捕获更高级别的信息。这些特征使得 hourglass 网络也成为目标检测的理想选择。
- 许多当前的检测器(FPN, DSSD)已经采用了类似 hourglass 网络的网络
同时使用多层特征
- stacked hourglass model(以下简写做SHM)的主要贡献在于利用多尺度特征来识别姿态。以前估计姿态的网络结构,大多只使用最后一层的卷积特征,这样会造成信息的丢失。事实上,对于姿态估计这种关联型任务,全身不同的关节点,并不是在相同的feature map上具有最好的识别精度。举例来说,胳膊可能在第3层的feature map上容易识别,而头部在第5层上更容易识别,见下图。所以,需要设计一种可以同时使用多个feature map的网络结构。
Hourglass Network 模块
- 首先Conv层和Max Pooling层用于将特征缩放到很小的分辨率;
- 每一个Max Pooling(降采样)处,网络进行分叉,并对原来pre-pooled分辨率的特征进行卷积;
- 得到最低分辨率特征后,网络开始进行upsampling,并逐渐结合不同尺度的特征信息. 这里对较低分辨率采用的是最近邻上采样(nearest neighbor upsampling)方式,将两个不同的特征集进行逐元素相加.
- 整个hourglass是对称的,获取低分辨率特征过程中每有一个网络层,则在上采样的过程中相应低就会有一个对应网络层.
- 得到hourglass网络模块输出后,再采用两个连续的 1×1 Conv层进行处理,得到最终的网络输出.
- Stacked Hourglass Networks输出heatmaps的集合,每一个heatmap表征了关节点在每个像素点存在的概率.
- c4b这个网络层,它是由c7和c4a合并来的,这里有两块操作:
(1)c7层通过上采样将分辨率扩大一倍,上采样相当于pool层的反操作,为了将feature map的分辨率扩大,比如c7的kernel size为 4x4 ,那么上采样后得到的kernel size 为 8x8 。
(2)c4a层与c4层的大小保持一致,可以看作是c4层的“副本”,它的kernel size 是c7的两倍,刚好与被上采样后的c7大小一致,可以直接将数值相加,那么就得到了c4b
残差模块
- Hourglass网络中使用的Residual模块.
- Residual模块提取较高层次的特征,同时保留原有层次的信息.
- 未使用大于3×3的Filters
- 限制每层的参数总数,以减少总的内存消耗
关节点之间的相互参考
- 沙漏网络串联,关节点之间是可以互相参考预测的,即知道双肩的位置后,可以更好的预测肘部节点,给出腰部和脚踝位置,又可以用于预测膝盖。其他姿态估计文章有利用图模型(Graphic Model)来结合CNN做预测的,这个图模型就是对人体关节点的结构做抽象归纳。但是目前的图模型效果一般。
- 既然热力图代表了输入对象的所有关节点,那么热力图就包含了所有关节点的相互关系,可以看作是图模型。所以将第一个沙漏网络给出的热力图作为下一个沙漏网络的输入,就意味着第二个沙漏网络可以使用关节点件的相互关系,从而提升了关节点的预测精度
- 如上图,N1代表第一个沙漏网络,提取出的混合特征经过1个1x1全卷积网络后,分成上下两个分支,上部分支继续经过1x1卷积后,进入下一个沙漏网络。下部分支先经过1x1卷积后,生成heat map,就是图中蓝色部分.
- 上图中蓝色方块比其他三个方块要窄一些,这是因为heat map矩阵的depth与训练数据里的节点数一致,比如 [1x64x64x16],其他几个则具有较高的depth,如 [1x64x64x256]
- heat_map继续经过1x1卷积,将depth调整到与上部分支一致,如256,最后与上部分支合并,一起作为下一个沙漏网络的输入。
中间监督
- Hourglass网络输出heatmaps集合(蓝色方框部分),与真值进行误差计算. 其中利用1×1的Conv层对heatmaps进行处理以保证中间特征的通道数一致. 每一个Hourglass网络都添加Loss层.
- 传统的识别或者检测网络,loss只比较最后的预测与ground truth之间的差异。因为堆叠沙漏网络的每一个子沙漏网络都会有heat map作为预测,所以将每个沙漏输出的heat map参与到loss中,实验证实,预测精确度要远远好于只考虑最后一个沙漏预测的loss,这种考虑网络中间部分的监督训练方式,就叫做中间监督(Intermediate Supervision)
BP
参考 - 连接
FC
- y?=WTx?+b?\vec{y}=W^{T} \vec{x}+\vec{b}y?=WTx+b
- yi=∑jxjWji+bi,j>>iy_{i}=\sum_{j} x_{j} W_{j i}+b_{i},j >> iyi?=∑j?xj?Wji?+bi?,j>>i
?L?bi=∑j?L?yj??yj?bi=?L?yi??yi?bi=?L?yi\begin{aligned} \frac{\partial L}{\partial b_{i}} &=\sum_{j} \frac{\partial L}{\partial y_{j}} * \frac{\partial y_{j}}{\partial b_{i}} \\ &=\frac{\partial L}{\partial y_{i}} * \frac{\partial y_{i}}{\partial b_{i}} \\ &=\frac{\partial L}{\partial y_{i}} \end{aligned}?bi??L??=j∑??yj??L???bi??yj??=?yi??L???bi??yi??=?yi??L?? | ?L?b?=?L?y?\frac{\partial L}{\partial \vec{b}}=\frac{\partial L}{\partial \vec{y}}?b?L?=?y??L? |
---|---|
?L?Wij=∑k?L?yk??yk?Wij=?L?yj??yj?Wij=?L?yj?xi\begin{aligned} \frac{\partial L}{\partial W_{i j}} &=\sum_{k} \frac{\partial L}{\partial y_{k}} * \frac{\partial y_{k}}{\partial W_{i j}} \\ &=\frac{\partial L}{\partial y_{j}} * \frac{\partial y_{j}}{\partial W_{i j}} \\ &=\frac{\partial L}{\partial y_{j}} * x_{i} \end{aligned}?Wij??L??=k∑??yk??L???Wij??yk??=?yj??L???Wij??yj??=?yj??L??xi?? | ?L?W=x?(?L?y?)T\frac{\partial L}{\partial W}=\vec{x}\left(\frac{\partial L}{\partial \vec{y}}\right)^{T}?W?L?=x(?y??L?)T |
?L?xi=∑j?L?yj??yj?xi=∑j?L?yj?Wij=W?i??L?y?\begin{aligned} \frac{\partial L}{\partial x_{i}} &=\sum_{j} \frac{\partial L}{\partial y_{j}} * \frac{\partial y_{j}}{\partial x_{i}} \\ &=\sum_{j} \frac{\partial L}{\partial y_{j}} * W_{i j} \\ &=\vec{W}_{i} * \frac{\partial L}{\partial \vec{y}} \end{aligned}?xi??L??=j∑??yj??L???xi??yj??=j∑??yj??L??Wij?=Wi???y??L?? | ?L?x?=W?L?y?\frac{\partial L}{\partial \vec{x}}=W \frac{\partial L}{\partial \vec{y}}?x?L?=W?y??L? |
BN
μB=1m∑ixi\mu_{B} =\frac{1}{m} \sum_{i} x_{i}μB?=m1?∑i?xi? | ?μB?xi=?1m∑jxj?xi=1m\frac{\partial \mu_{B}}{\partial x_{i}} =\frac{\partial \frac{1}{m} \sum_{j} x_{j}}{\partial x_{i}} =\frac{1}{m}?xi??μB??=?xi??m1?∑j?xj??=m1? |
---|---|
σB2=1m∑i(xi?μB)2\sigma_{B}^{2} =\frac{1}{m} \sum_{i}\left(x_{i}-\mu_{B}\right)^{2}σB2?=m1?∑i?(xi??μB?)2 | ?σB2?xi=?1m∑j(xj?μB)2?xi=2m∑j(xj?μB)?(xj?μB)?xi=2m(∑j(xj?μB)?xj?xi?∑j(xj?μB)?μB?xi)=2m((xi?μB)?1m∑j(xj?μB))=2m((xi?μB)?1m∑jxj?μB)=2m(xi?μB)\begin{aligned} \frac{\partial \sigma_{B}^{2}}{\partial x_{i}} &=\frac{\partial \frac{1}{m} \sum_{j}\left(x_{j}-\mu_{B}\right)^{2}}{\partial x_{i}} \\ &=\frac{2}{m} \sum_{j}\left(x_{j}-\mu_{B}\right) \frac{\partial\left(x_{j}-\mu_{B}\right)}{\partial x_{i}} \\ &=\frac{2}{m}\left(\sum_{j}\left(x_{j}-\mu_{B}\right) \frac{\partial x_{j}}{\partial x_{i}}-\sum_{j}\left(x_{j}-\mu_{B}\right) \frac{\partial \mu_{B}}{\partial x_{i}}\right) \\ &=\frac{2}{m}\left(\left(x_{i}-\mu_{B}\right)-\frac{1}{m} \sum_{j}\left(x_{j}-\mu_{B}\right)\right) \\ &=\frac{2}{m}\left(\left(x_{i}-\mu_{B}\right)-\frac{1}{m} \sum_{j} x_{j}-\mu_{B}\right) \\ &=\frac{2}{m}\left(x_{i}-\mu_{B}\right) \end{aligned}?xi??σB2???=?xi??m1?∑j?(xj??μB?)2?=m2?j∑?(xj??μB?)?xi??(xj??μB?)?=m2?(j∑?(xj??μB?)?xi??xj???j∑?(xj??μB?)?xi??μB??)=m2?((xi??μB?)?m1?j∑?(xj??μB?))=m2?((xi??μB?)?m1?j∑?xj??μB?)=m2?(xi??μB?)? |
x^i=xi?μBσB2+?\hat{x}_{i} =\frac{x_{i}-\mu_{B}}{\sqrt{\sigma_{B}^{2}+\epsilon}}x^i?=σB2?+??xi??μB?? | ?x^j?xi=?(xj?μB)σB2+?+?σB2+?(xj?μB)(σB2+?)?xi=1m(m?xj?xi?1σB2+??xj?μB(σB2+?)32)\begin{aligned} \frac{\partial \hat{x}_{j}}{\partial x_{i}} &=\frac{\partial\left(x_{j}-\mu_{B}\right) \sqrt{\sigma_{B}^{2}+\epsilon}+\partial \sqrt{\sigma_{B}^{2}+\epsilon}\left(x_{j}-\mu_{B}\right)}{\left(\sigma_{B}^{2}+\epsilon\right) \partial x_{i}} \\ &=\frac{1}{m}\left(\frac{m \frac{\partial x_{j}}{\partial x_{i}}-1}{\sqrt{\sigma_{B}^{2}+\epsilon}}-\frac{x_{j}-\mu_{B}}{\left(\sigma_{B}^{2}+\epsilon\right)^{\frac{3}{2}}}\right) \end{aligned}?xi??x^j???=(σB2?+?)?xi??(xj??μB?)σB2?+??+?σB2?+??(xj??μB?)?=m1?(σB2?+??m?xi??xj???1??(σB2?+?)23?xj??μB??)? |
yi=γx^i+βy_{i} =\gamma \hat{x}_{i}+\betayi?=γx^i?+β | ?L?β=∑i?L?yi?yi?β=∑i?L?yi\begin{aligned} \frac{\partial L}{\partial \beta} &=\sum_{i} \frac{\partial L}{\partial y_{i}} \frac{\partial y_{i}}{\partial \beta} \\ &=\sum_{i} \frac{\partial L}{\partial y_{i}} \end{aligned}?β?L??=i∑??yi??L??β?yi??=i∑??yi??L?? ?L?γ=∑i?L?yi?yi?γ=∑i?L?yix^i=x?i^T?L?y?\begin{aligned} \frac{\partial L}{\partial \gamma} &=\sum_{i} \frac{\partial L}{\partial y_{i}} \frac{\partial y_{i}}{\partial \gamma} \\ &=\sum_{i} \frac{\partial L}{\partial y_{i}} \hat{x}_{i} \\&=\hat{\vec{x}_{i}}^{T} \frac{\partial L}{\partial \vec{y}} \end{aligned}?γ?L??=i∑??yi??L??γ?yi??=i∑??yi??L?x^i?=xi?^?T?y??L?? ?L?xi=∑j?L?yj?yj?xi=∑j?L?yi?yj?x^j?x^j?xi=γ∑j?L?yi?x^j?xi\begin{aligned} \frac{\partial L}{\partial x_{i}} &=\sum_{j} \frac{\partial L}{\partial y_{j}} \frac{\partial y_{j}}{\partial x_{i}} \\ &=\sum_{j} \frac{\partial L}{\partial y_{i}} \frac{\partial y_{j}}{\partial \hat{x}_{j}} \frac{\partial \hat{x}_{j}}{\partial x_{i}} \\ &=\gamma \sum_{j} \frac{\partial L}{\partial y_{i}} \frac{\partial \hat{x}_{j}}{\partial x_{i}} \end{aligned}?xi??L??=j∑??yj??L??xi??yj??=j∑??yi??L??x^j??yj???xi??x^j??=γj∑??yi??L??xi??x^j??? |
Conv
- 设conv的输入是 X,X∈Rn×m×c1,n,m,c1X, X \in \mathbb{R}^{\mathrm{n} \times \mathrm{m} \times \mathrm{c}_{1}}, n, m, c_{1}X,X∈Rn×m×c1?,n,m,c1? 分别为输入的高,宽,通道数.
- conv的核kernel是3×33×33×3,步长strides是1×11 \times 11×1
- conv的权重是 W,W∈R3×3×c1×c2W, W \in \mathbb{R}^{3 \times 3 \times c_{1} \times c_{2}}W,W∈R3×3×c1?×c2?
- conv的偏置是 b?,b?∈Rc2×1\vec{b}, \vec{b} \in \mathbb{R}^{c_{2} \times 1}b,b∈Rc2?×1
- conv的输出是 Y,Y∈Rn×m×c2,c2Y, Y \in \mathbb{R}^{\mathrm{n} \times \mathrm{m} \times \mathrm{c}_{2}}, c_{2}Y,Y∈Rn×m×c2?,c2? 为输出的通道数(这里卷积采用same的padding模式).
Yi,j,k=(∑k1=1c1∑i1=13∑j1=13Wi1,j1,k1,kXi2,j2,k1)+bkY_{i, j, k}=\left(\sum_{k_{1}=1}^{c_{1}} \sum_{i_{1}=1}^{3} \sum_{j_{1}=1}^{3} W_{i_{1}, j_{1}, k_{1}, k} X_{i_{2}, j_{2}, k_{1}}\right)+b_{k} Yi,j,k?=(k1?=1∑c1??i1?=1∑3?j1?=1∑3?Wi1?,j1?,k1?,k?Xi2?,j2?,k1??)+bk? - 其中 i2=i+i1?1,j2=j+j1?1i_{2}=i+i_{1}-1, j_{2}=j+j_{1}-1i2?=i+i1??1,j2?=j+j1??1
- 设损失函数为 LLL 已知 ?L?Y\frac{\partial L}{\partial Y}?Y?L? 求 ?L?X,?L?W,?L?b?\frac{\partial L}{\partial X}, \frac{\partial L}{\partial W}, \frac{\partial L}{\partial \vec{b}}?X?L?,?W?L?,?b?L?
?L?bk1=∑kc2∑i,j?L?Yi,j,k?Yi,j,k?bk1=∑i,j?L?Yi,j,k1?Yi,j,k1?bk1=∑i,j?L?Yi,j,k1?L?Wi1,j1,k1,k2=∑kc2∑i,j?L?Yi,j,k?Yi,j,k?Wi1,j1,k1,k2=∑i,j?L?Yi,j,k2?Yi,j,k2?Wi1,j1,k1,k2=∑i,j?L?Yi,j,k2Xi2,j2,k1?L?Xi2,j2,k1=∑kc2∑i,j?L?Yi,j,k?Yi,j,k?Xi2,j2,k1=∑k∑i,j?L?Yi,j,kWi1,j1,k1,k\begin{aligned} \frac{\partial L}{\partial b_{k_{1}}} &=\sum_{k}^{c_{2}} \sum_{i, j} \frac{\partial L}{\partial Y_{i, j, k}} \frac{\partial Y_{i, j, k}}{\partial b_{k_{1}}} \\ &=\sum_{i, j} \frac{\partial L}{\partial Y_{i, j, k_{1}}} \frac{\partial Y_{i, j, k_{1}}}{\partial b_{k_{1}}} \\ &=\sum_{i, j} \frac{\partial L}{\partial Y_{i, j, k_{1}}} \end{aligned} \\ \begin{aligned} \frac{\partial L}{\partial W_{i_{1}, j_{1}, k_{1}, k_{2}}} &=\sum_{k}^{c_{2}} \sum_{i, j} \frac{\partial L}{\partial Y_{i, j, k}} \frac{\partial Y_{i, j, k}}{\partial W_{i_{1}, j_{1}, k_{1}, k_{2}}} \\ &=\sum_{i, j} \frac{\partial L}{\partial Y_{i, j, k_{2}}} \frac{\partial Y_{i, j, k_{2}}}{\partial W_{i_{1}, j_{1}, k_{1}, k_{2}}} \\ &=\sum_{i, j} \frac{\partial L}{\partial Y_{i, j, k_{2}}} X_{i_{2}, j_{2}, k_{1}} \end{aligned} \\ \begin{aligned} \frac{\partial L}{\partial X_{i_{2}, j_{2}, k_{1}}} &=\sum_{k}^{c_{2}} \sum_{i, j} \frac{\partial L}{\partial Y_{i, j, k}} \frac{\partial Y_{i, j, k}}{\partial X_{i_{2}, j_{2}, k_{1}}} \\ &=\sum_{k} \sum_{i, j} \frac{\partial L}{\partial Y_{i, j, k}} W_{i_{1}, j_{1}, k_{1}, k} \end{aligned} ?bk1???L??=k∑c2??i,j∑??Yi,j,k??L??bk1???Yi,j,k??=i,j∑??Yi,j,k1???L??bk1???Yi,j,k1???=i,j∑??Yi,j,k1???L???Wi1?,j1?,k1?,k2???L??=k∑c2??i,j∑??Yi,j,k??L??Wi1?,j1?,k1?,k2???Yi,j,k??=i,j∑??Yi,j,k2???L??Wi1?,j1?,k1?,k2???Yi,j,k2???=i,j∑??Yi,j,k2???L?Xi2?,j2?,k1????Xi2?,j2?,k1???L??=k∑c2??i,j∑??Yi,j,k??L??Xi2?,j2?,k1???Yi,j,k??=k∑?i,j∑??Yi,j,k??L?Wi1?,j1?,k1?,k??
Activation
- Relu
relu(x)={xx>00x≤0relu′(x)={1x>00x<0?L?xi=?L?yi?yi?xi={?L?yixi>00xi<0\begin{aligned} relu(x) &=\left\{\begin{array}{ll}x & x>0 \\ 0 & x \leq 0\end{array}\right.\\ r e l u^{\prime}(x) &=\left\{\begin{array}{ll}1 & x>0 \\ 0 & x<0\end{array}\right.\end{aligned} \\ \begin{aligned} \frac{\partial L}{\partial x_{i}} &=\frac{\partial L}{\partial y_{i}} \frac{\partial y_{i}}{\partial x_{i}} \\ &=\left\{\begin{array}{ll}\frac{\partial L}{\partial y_{i}} & x_{i}>0 \\ 0 & x_{i}<0\end{array}\right.\end{aligned} relu(x)relu′(x)?={ x0?x>0x≤0?={ 10?x>0x<0???xi??L??=?yi??L??xi??yi??={ ?yi??L?0?xi?>0xi?<0?? - Sigmoid
sigmoid(x)=11+e?xsigmoid′(x)=e?x(1+e?x)2=sigmoid(x)(1?sigmoid(x))?L?xi=?L?yi?yi?xi=?L?yie?xi(1+e?xi)2\begin{aligned} sigmoid(x) &=\frac{1}{1+e^{-x}} \\ sigmoid^{\prime}(x) &=\frac{e^{-x}}{\left(1+e^{-x}\right)^{2}} \\ &= sigmoid(x)(1-sigmoid(x))\end{aligned} \\ \begin{aligned} \frac{\partial L}{\partial x_{i}} &=\frac{\partial L}{\partial y_{i}} \frac{\partial y_{i}}{\partial x_{i}} \\ &=\frac{\partial L}{\partial y_{i}} \frac{e^{-x_{i}}}{\left(1+e^{-x_{i}}\right)^{2}} \end{aligned} sigmoid(x)sigmoid′(x)?=1+e?x1?=(1+e?x)2e?x?=sigmoid(x)(1?sigmoid(x))??xi??L??=?yi??L??xi??yi??=?yi??L?(1+e?xi?)2e?xi??? - Tanh
tanh?(x)=ex?e?xex+e?xtanh?′(x)=4(ex+e?x)2=1?tanh(x)2?L?xi=?L?yi?yi?xi=?L?yi4(ex+e?x)2\begin{aligned} \tanh (x) &=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} \\ \tanh ^{\prime}(x) &=\frac{4}{\left(e^{x}+e^{-x}\right)^{2}} \\ &= 1 - tanh(x)^2 \end{aligned} \\ \begin{aligned} \frac{\partial L}{\partial x_{i}} &=\frac{\partial L}{\partial y_{i}} \frac{\partial y_{i}}{\partial x_{i}} \\ &=\frac{\partial L}{\partial y_{i}} \frac{4}{\left(e^{x}+e^{-x}\right)^{2}} \end{aligned} tanh(x)tanh′(x)?=ex+e?xex?e?x?=(ex+e?x)24?=1?tanh(x)2??xi??L??=?yi??L??xi??yi??=?yi??L?(ex+e?x)24?? - Softmax
softmax?(xi)=exi∑jexj?softmax?(xi)?xi=?exi∑jexj?xi=exi∑jexj?exiexi(∑jexj)2=exi(∑jexj?1)(∑jexj)2?softmax?(xj)?xi=?exj∑kexk?xi=?exj(∑kexk)2\begin{aligned} \operatorname{softmax}\left(x_{i}\right) &=\frac{e^{x_{i}}}{\sum_{j} e^{x_{j}}} \\ \frac{\partial \operatorname{softmax}\left(x_{i}\right)}{\partial x_{i}} &=\frac{\partial \frac{e^{x_{i}}}{\sum_{j} e^{x_{j}}}}{\partial x_{i}} \\ &=\frac{e^{x_{i}} \sum_{j} e^{x_{j}}-e^{x_{i}} e^{x_{i}}}{\left(\sum_{j} e^{x_{j}}\right)^{2}} \\ &=\frac{e^{x_{i}}\left(\sum_{j} e^{x_{j}}-1\right)}{\left(\sum_{j} e^{x_{j}}\right)^{2}} \end{aligned} \\ \begin{aligned} \frac{\partial \operatorname{softmax}\left(x_{j}\right)}{\partial x_{i}} &=\frac{\partial \frac{e^{x_{j}}}{\sum_{k} e^{x_{k}}}}{\partial x_{i}} \\ &=-\frac{e^{x_{j}}}{\left(\sum_{k} e^{x_{k}}\right)^{2}} \end{aligned} softmax(xi?)?xi??softmax(xi?)??=∑j?exj?exi??=?xi??∑j?exj?exi???=(∑j?exj?)2exi?∑j?exj??exi?exi??=(∑j?exj?)2exi?(∑j?exj??1)???xi??softmax(xj?)??=?xi??∑k?exk?exj???=?(∑k?exk?)2exj??? - 则有
?L?xi=∑j?L?yj?yj?xi=?∑j≠i?L?yjexj(∑kexk)2+?L?yiexi(∑kexk?1)(∑kexk)2=?L?yiexi∑kexk?∑j?L?yjexj(∑kexk)2\begin{aligned} \frac{\partial L}{\partial x_{i}} &=\sum_{j} \frac{\partial L}{\partial y_{j}} \frac{\partial y_{j}}{\partial x_{i}} \\ &=-\sum_{j \neq i} \frac{\partial L}{\partial y_{j}} \frac{e^{x_{j}}}{\left(\sum_{k} e^{x_{k}}\right)^{2}}+\frac{\partial L}{\partial y_{i}} \frac{e^{x_{i}}\left(\sum_{k} e^{x_{k}}-1\right)}{\left(\sum_{k} e^{x_{k}}\right)^{2}} \\ &=\frac{\partial L}{\partial y_{i}} \frac{e^{x_{i}}}{\sum_{k} e^{x_{k}}}-\sum_{j} \frac{\partial L}{\partial y_{j}} \frac{e^{x_{j}}}{\left(\sum_{k} e^{x_{k}}\right)^{2}} \end{aligned} ?xi??L??=j∑??yj??L??xi??yj??=?j??=i∑??yj??L?(∑k?exk?)2exj??+?yi??L?(∑k?exk?)2exi?(∑k?exk??1)?=?yi??L?∑k?exk?exi???j∑??yj??L?(∑k?exk?)2exj??? - Selu
selu?(x)=λ{xx>0α(ex?1)x≤0selu?′(x)=λ{1x>0αexx<0λ=1.0507009873554804934193349852946α=1.6732632423543772848170429916717\begin{aligned} \operatorname{selu}(x) &=\lambda\left\{\begin{array}{ll}x & x>0 \\ \alpha\left(e^{x}-1\right) & x \leq 0\end{array}\right.\\ \operatorname{selu}^{\prime}(x) &=\lambda\left\{\begin{array}{l}1 \quad x>0 \\ \alpha e^{x} \quad x<0\end{array}\right.\\ \lambda &=1.0507009873554804934193349852946 \\ \alpha &=1.6732632423543772848170429916717 \end{aligned} selu(x)selu′(x)λα?=λ{ xα(ex?1)?x>0x≤0?=λ{ 1x>0αexx<0?=1.0507009873554804934193349852946=1.6732632423543772848170429916717? - 则有:
?L?xi=?L?yi?yi?xi=λ?L?yi{1xi>0αexxi<0\begin{aligned} \frac{\partial L}{\partial x_{i}} &=\frac{\partial L}{\partial y_{i}} \frac{\partial y_{i}}{\partial x_{i}} \\ &=\lambda \frac{\partial L}{\partial y_{i}}\left\{\begin{array}{ll}1 & x_{i}>0 \\ \alpha e^{x} & x_{i}<0\end{array}\right.\end{aligned} ?xi??L??=?yi??L??xi??yi??=λ?yi??L?{ 1αex?xi?>0xi?<0??
Pooling
- Max-pooling
- 假设2x2,正向传播如下:
Yi,j=max?(X2i,2j,X2i,2j+1,X2i,2j+1,X2i+1,2j+1)Y_{i, j}=\max \left(X_{2 i, 2 j}, X_{2 i, 2 j+1}, X_{2 i, 2 j+1}, X_{2 i+1,2 j+1}\right) Yi,j?=max(X2i,2j?,X2i,2j+1?,X2i,2j+1?,X2i+1,2j+1?) - 其偏导数为:
?Yi,j?Xa,b={1Xa,b=max?(X2i,2j,X2i,2j+1,X2i,2j+1,X2i+1,2j+1)0else设损失函数为L,已知 ?L?Yi,j,求 ?L?Xa,b,其中 a∈[2i,2i+1],b∈[2j,2j+1]?L?Xa,b=∑i,j?L?Yi,j?Yi,j?Xa,b=?L?Yi,j?Yi,j?Xa,b={?L?Yi,jXa,b=max?(X2i,2j,X2i,2j+1,X2i,2j+1,X2i+1,2j+1)0else \frac{\partial Y_{i, j}}{\partial X_{a, b}}=\left\{\begin{array}{ll} 1 & X_{a, b}=\max \left(X_{2 i, 2 j}, X_{2 i, 2 j+1}, X_{2 i, 2 j+1}, X_{2 i+1,2 j+1}\right) \\ 0 & \text {else} \end{array}\right. \\ \begin{aligned} \text { 设损失函数为} L, \text { 已知 } \frac{\partial L}{\partial Y_{i, j}}, & \text { 求 } \frac{\partial L}{\partial X_{a, b}} \text { ,其中 } a \in[2 i, 2 i+1], b \in[2 j, 2 j+1] \\ \frac{\partial L}{\partial X_{a, b}} &=\sum_{i, j} \frac{\partial L}{\partial Y_{i, j}} \frac{\partial Y_{i, j}}{\partial X_{a, b}} \\ &=\frac{\partial L}{\partial Y_{i, j}} \frac{\partial Y_{i, j}}{\partial X_{a, b}} \\ &=\left\{\begin{array}{ll} \frac{\partial L}{\partial Y_{i, j}} & X_{a, b}=\max \left(X_{2 i, 2 j}, X_{2 i, 2 j+1}, X_{2 i, 2 j+1}, X_{2 i+1,2 j+1}\right) \\ 0 & \text { else } \end{array}\right. \end{aligned} ?Xa,b??Yi,j??={ 10?Xa,b?=max(X2i,2j?,X2i,2j+1?,X2i,2j+1?,X2i+1,2j+1?)else? 设损失函数为L, 已知 ?Yi,j??L?,?Xa,b??L?? 求 ?Xa,b??L? ,其中 a∈[2i,2i+1],b∈[2j,2j+1]=i,j∑??Yi,j??L??Xa,b??Yi,j??=?Yi,j??L??Xa,b??Yi,j??={ ?Yi,j??L?0?Xa,b?=max(X2i,2j?,X2i,2j+1?,X2i,2j+1?,X2i+1,2j+1?) else ??
- 假设2x2,正向传播如下:
- Avg-pooling
Yi,j=14(X2i,2j+X2i,2j+1+X2i,2j+1+X2i+1,2j+1)Y_{i, j}=\frac{1}{4}\left(X_{2 i, 2 j}+X_{2 i, 2 j+1}+X_{2 i, 2 j+1}+X_{2 i+1,2 j+1}\right) Yi,j?=41?(X2i,2j?+X2i,2j+1?+X2i,2j+1?+X2i+1,2j+1?) - 其偏导数为:
?Yi,j?Xa,b=14\frac{\partial Y_{i, j}}{\partial X_{a, b}} =\frac{1}{4} \\ ?Xa,b??Yi,j??=41? - 设损失函数为LLL,已知?L?Yi,j\frac{\partial L}{\partial Y_{i, j}}?Yi,j??L?,求?L?Xa,b\frac{\partial L}{\partial X_{a, b}}?Xa,b??L?, 其中 a∈[2i,2i+1],b∈[2j,2j+1]a \in[2 i, 2 i+1], b \in[2 j, 2 j+1]a∈[2i,2i+1],b∈[2j,2j+1]
?L?Xa,b=∑i,j?L?Yi,j?Yi,j?Xa,b=?L?Yi,j?Yi,j?Xa,b=14?L?Yi,j\frac{\partial L}{\partial X_{a, b}} =\sum_{i, j} \frac{\partial L}{\partial Y_{i, j}} \frac{\partial Y_{i, j}}{\partial X_{a, b}} \\ =\frac{\partial L}{\partial Y_{i, j}} \frac{\partial Y_{i, j}}{\partial X_{a, b}} \\ =\frac{1}{4} \frac{\partial L}{\partial Y_{i, j}} ?Xa,b??L?=i,j∑??Yi,j??L??Xa,b??Yi,j??=?Yi,j??L??Xa,b??Yi,j??=41??Yi,j??L?
Dropout
- 设rrr为保留的比例
dropout?(x)={xrkeep 0drop dropout ′(x)={1rkeep 0drop \begin{aligned} \operatorname{dropout}(x) &=\left\{\begin{array}{ll}\frac{x}{r} & \text { keep } \\ 0 & \text { drop }\end{array}\right.\\ \text { dropout }^{\prime}(x) &=\left\{\begin{array}{ll}\frac{1}{r} & \text { keep } \\ 0 & \text { drop }\end{array}\right.\end{aligned} dropout(x) dropout ′(x)?={ rx?0? keep drop ?={ r1?0? keep drop ?? - 则:
?L?xi=?L?yi?yi?xi={1r?L?yikeep0drop\begin{aligned} \frac{\partial L}{\partial x_{i}} &=\frac{\partial L}{\partial y_{i}} \frac{\partial y_{i}}{\partial x_{i}} \\ &=\left\{\begin{array}{ll}\frac{1}{r} \frac{\partial L}{\partial y_{i}} & k e e p \\ 0 & d r o p\end{array}\right.\end{aligned} ?xi??L??=?yi??L??xi??yi??={ r1??yi??L?0?keepdrop??
Clip
clip(x;a,b)={ax<axa≤x≤bbx>bclip′(x;a,b)={0x<a1a≤x≤b0x>bclip(x ; a, b)=\left\{\begin{array}{ll}a & x<a \\ x & a \leq x \leq b \\ b & x>b\end{array}\right. \\ clip^{\prime}(x ; a, b)=\left\{\begin{array}{ll}0 & x<a \\ 1 & a \leq x \leq b \\ 0 & x>b\end{array}\right. clip(x;a,b)=????axb?x<aa≤x≤bx>b?clip′(x;a,b)=????010?x<aa≤x≤bx>b?
- 则:
?L?xi=?L?yi?yi?xi={0x<a?L?yia≤x≤b0x>b\begin{aligned} \frac{\partial L}{\partial x_{i}} &=\frac{\partial L}{\partial y_{i}} \frac{\partial y_{i}}{\partial x_{i}} \\ &=\left\{\begin{array}{ll}0 & x<a \\ \frac{\partial L}{\partial y_{i}} & a \leq x \leq b \\ 0 & x>b\end{array}\right.\end{aligned} ?xi??L??=?yi??L??xi??yi??=????0?yi??L?0?x<aa≤x≤bx>b??
Loss
- 交叉熵损失函数 + Sigmoid
J(θ)=?1m∑i=1my(i)log?(hθ(x(i)))+(1?y(i))log?(1?hθ(x(i)))J(\theta)=-\frac{1}{m} \sum_{i=1}^{m} y^{(i)} \log \left(h_{\theta}\left(x^{(i)}\right)\right)+\left(1-y^{(i)}\right) \log \left(1-h_{\theta}\left(x^{(i)}\right)\right) J(θ)=?m1?i=1∑m?y(i)log(hθ?(x(i)))+(1?y(i))log(1?hθ?(x(i))) - 将 hθ(x)=11+e?θTxh_{\theta}(x)=\frac{1}{1+e^{-\theta T_{x}}}hθ?(x)=1+e?θTx?1? 带入:(Sigmoid)
J(θ)=?[yTlog?11+e?θTx+(1?yT)log?e?θTx1+e?θTx]=?[?yTlog?(1+e?θTx)+(1?yT)log?e?θTx?(1?yT)log?(1+e?θTx)]=?[(1?yT)log?e?θTx?log?(1+e?θTx)]=?[(1?yT)(?θTx)?log?(1+e?θTx)]\begin{aligned} J(\theta)=&-\left[y^{T} \log \frac{1}{1+e^{-\theta^{T} x}}+\left(1-y^{T}\right) \log \frac{e^{-\theta^{T} x}}{1+e^{-\theta^{T} x}}\right] \\&=-\left[-y^{T} \log \left(1+e^{-\theta^{T} x}\right)+\left(1-y^{T}\right) \log e^{-\theta^{T} x}-\left(1-y^{T}\right) \log \left(1+e^{-\theta^{T} x}\right)\right] \\ &=-\left[\left(1-y^{T}\right) \log e^{-\theta^{T} x}-\log \left(1+e^{-\theta^{T} x}\right)\right] \\ &=-\left[\left(1-y^{T}\right)\left(-\theta^{T} x\right)-\log \left(1+e^{-\theta^{T} x}\right)\right] \end{aligned} J(θ)=??[yTlog1+e?θTx1?+(1?yT)log1+e?θTxe?θTx?]=?[?yTlog(1+e?θTx)+(1?yT)loge?θTx?(1?yT)log(1+e?θTx)]=?[(1?yT)loge?θTx?log(1+e?θTx)]=?[(1?yT)(?θTx)?log(1+e?θTx)]? - 则求导
??θjJ(θ)=???θj[(1?yT)(?θTx)?log?(1+e?θTx)]=(1?yT)x?e?θT1+e?θTxx=(11+e?θTx?yT)x=(hθ(x)?yT)x\begin{aligned} \frac{\partial}{\partial \theta_{j}} J(\theta) =-\frac{\partial}{\partial \theta_{j}} &\left[\left(1-y^{T}\right)\left(-\theta^{T} x\right)-\log \left(1+e^{-\theta^{T} x}\right)\right] \\=(1&\left.-y^{T}\right) x-\frac{e^{-\theta^{T}}}{1+e^{-\theta^{T} x}} x \\=&\left(\frac{1}{1+e^{-\theta^{T} x}}-y^{T}\right) x \\&=\left(h_{\theta}(x)-y^{T}\right) x & \end{aligned} ?θj???J(θ)=??θj???=(1=?[(1?yT)(?θTx)?log(1+e?θTx)]?yT)x?1+e?θTxe?θT?x(1+e?θTx1??yT)x=(hθ?(x)?yT)x?? - 交叉熵 + Softmax
- 设softmax的输入为 x?,x?∈Rn×1\vec{x}, \vec{x} \in \mathbb{R}^{n \times 1}x,x∈Rn×1
- 设softmax的输出为 y?,y?∈Rn×1\vec{y}, \vec{y} \in \mathbb{R}^{\mathrm{n} \times 1}y?,y?∈Rn×1
- 设onehot后的标签为 l?,l?∈Rn×1\vec{l}, \vec{l} \in \mathbb{R}^{\mathrm{n} \times 1}l,l∈Rn×1
- 设标签kkk
- 则交叉熵简化为:
E=?l?log?(y?)=?log?(yk)\begin{aligned} E &=-\vec{l} \log (\vec{y}) \\ &=-\log \left(y_{k}\right) \end{aligned} E?=?llog(y?)=?log(yk?)? - 求导:
?E?xi=∑j?E?yj?yj?xi=?E?yk?yk?xi=1ykexk(∑lexl)2?E?xk=∑j?E?yj?yj?xk=?E?yk?yk?xk=?1ykexk(∑lexl?1)(∑lexl)2=?1ykexk∑lexl+1ykexk(∑lexl)2\begin{aligned} \frac{\partial E}{\partial x_{i}} &=\sum_{j} \frac{\partial E}{\partial y_{j}} \frac{\partial y_{j}}{\partial x_{i}} \\ &=\frac{\partial E}{\partial y_{k}} \frac{\partial y_{k}}{\partial x_{i}} \\ &=\frac{1}{y_{k}} \frac{e^{x_{k}}}{\left(\sum_{l} e^{x_{l}}\right)^{2}} \end{aligned} \\ \begin{aligned} \frac{\partial E}{\partial x_{k}} &=\sum_{j} \frac{\partial E}{\partial y_{j}} \frac{\partial y_{j}}{\partial x_{k}} \\ &=\frac{\partial E}{\partial y_{k}} \frac{\partial y_{k}}{\partial x_{k}} \\ &=-\frac{1}{y_{k}} \frac{e^{x_{k}}\left(\sum_{l} e^{x_{l}}-1\right)}{\left(\sum_{l} e^{x_{l}}\right)^{2}} \\ &=-\frac{1}{y_{k}} \frac{e^{x_{k}}}{\sum_{l} e^{x_{l}}}+\frac{1}{y_{k}} \frac{e^{x_{k}}}{\left(\sum_{l} e^{x_{l}}\right)^{2}} \end{aligned} ?xi??E??=j∑??yj??E??xi??yj??=?yk??E??xi??yk??=yk?1?(∑l?exl?)2exk????xk??E??=j∑??yj??E??xk??yj??=?yk??E??xk??yk??=?yk?1?(∑l?exl?)2exk?(∑l?exl??1)?=?yk?1?∑l?exl?exk??+yk?1?(∑l?exl?)2exk???