实践出真知(神经网络篇)
-
Roofline model 与深度学习模型的性能分析
- Roofline Model 提出了使用 Operational Intensity(计算强度)进行定量分析的方法,并给出了模型在计算平台上所能达到理论计算性能上限公式。
- Roof-line Model :模型在一个计算平台的限制下,到底能达到多快的浮点计算速度。更具体的来说,Roof-line Model 解决的,是“计算量为A且访存量为B的模型在算力为C且带宽为D的计算平台所能达到的理论性能上限E是多少”这个问题。
- 所谓“Roof-line”,指的就是由计算平台的算力和带宽上限这两个参数所决定的“屋顶”形态:算力决定“屋顶”的高度(绿色线段),带宽决定“房檐”的斜率(红色线段)
-
计算瓶颈区域
Compute-Bound:
不管模型的计算强度有多大,它的理论性能最大只能等于计算平台的算力。当模型的计算强度大于计算平台的计算强度上限时,模型在当前计算平台处于Compute-Bound
状态,即模型的理论性能受到计算平台算力的限制,无法与计算强度成正比。但这其实并不是一件坏事,因为从充分利用计算平台算力的角度上看,此时模型利用了计算平台的全部算力。可见,计算平台的算力越高,模型进入计算瓶颈区域后的理论性能也就越大。 -
带宽瓶颈区域
Memory-Bound:
当模型的计算强度小于计算平台的计算强度上限时,由于此时模型位于“房檐”区间,因此模型理论性能完全由计算平台的带宽上限房檐的斜率)以及模型自身的计算强度所决定在模型处于带宽瓶颈区间的前提下,计算平台的带宽越大(房檐越陡),或者模型的计算强度越大,模型的理论性能可呈线性增长。
-
- 计算平台的两个指标:算力与带宽
- 算力:也称为计算平台的性能上限,指的是一个计算平台倾尽全力每秒钟所能完成的浮点运算数。单位是
FLOPS
orFLOP/s
- 带宽:也即计算平台的带宽上限,指的是一个计算平台倾尽全力每秒所能完成的内存交换量。“内存”是广义上的内存。对于CPU计算平台而言指的就是真正的内存;而对于GPU计算平台指的则是显存。
- 计算强度上限:两个指标(算力除以带宽)相除即可得到计算平台的计算强度上限。它描述的是在这个计算平台上,单位内存交换最多用来进行多少次计算。
- 算力:也称为计算平台的性能上限,指的是一个计算平台倾尽全力每秒钟所能完成的浮点运算数。单位是
- 模型的两个指标:计算量与访存量
- 计算量:指的是输入单个样本(对于CNN而言就是一张图像),模型进行一次完整的前向传播所发生的浮点运算个数,也即模型的时间复杂度,单位是
#FLOP
orFLOPs
- 访存量:指的是输入单个样本,模型完成一次前向传播过程中所发生的内存交换总量,也即模型的空间复杂度。单位是
Byte
- 模型的计算强度 :由计算量除以访存量就可以得到模型的计算强度,它表示此模型在计算过程中,每
Byte
内存交换到底用于进行多少次浮点运算。单位是FLOPs/Byte
。可以看到,模计算强度越大,其内存使用效率越高。 - 模型的理论性能 :我们最关心的指标,即模型在计算平台上所能达到的每秒浮点运算次数(理论值)。单位是
FLOPS
orFLOP/s
。下面我们即将介绍的 Roof-line Model 给出的就是计算这个指标的方法。
- 计算量:指的是输入单个样本(对于CNN而言就是一张图像),模型进行一次完整的前向传播所发生的浮点运算个数,也即模型的时间复杂度,单位是
-
卷积神经网络的复杂度分析
- 经典模型演进中的很多创新点都与改善模型计算复杂度紧密相关,复杂度一般分为时间复杂度与空间复杂度
- 时间复杂度:即模型的运算次数,可用FLOPs衡量,也就是浮点运算次数(FLoating-point OPerations)
- 单个卷积核的时间复杂度计算
- 卷积神经网络的整体复杂度
- 单个卷积核的时间复杂度计算
- 空间复杂度(访存量)包括两部分:总参数量 + 各层输出特征图。
- 复杂度对模型的影响
- 时间复杂度决定了模型的训练/预测时间。如果复杂度过高,则会导致模型训练和预测耗费大量时间,既无法快速的验证想法和改善模型,也无法做到快速的预测。
- 空间复杂度决定了模型的参数数量。由于维度诅咒的限制,模型的参数越多,训练模型所需的数据量就越大,而现实生活中的数据集通常不会太大,这会导致模型的训练更容易过拟合。
- 当我们需要裁剪模型时,由于卷积核的空间尺寸通常已经很小(3x3),而网络的深度又与模型的表征能力紧密相关,不宜过多削减,因此模型裁剪通常最先下手的地方就是通道数。
- 时间复杂度:即模型的运算次数,可用FLOPs衡量,也就是浮点运算次数(FLoating-point OPerations)
- inception网络优化复杂度
- inception V1 通过1*1 卷积降维的同时优化时间与空间复杂度。
- inception V1 使用全局平均池化GAP代替扁平展开Flatten
- inception V2 使用两个3*3 卷积级联代替5*5卷积分支:两个3*3 卷积级联的感受野与1个5*5卷积感受野是一致的
- inception V3 使用N*1 与1*N卷积级联代替N*N卷积,确保了感受野的不变
- Xception使用 Depth-wise Separable Convolution
- 围绕模型复杂度的优化展开,其基本逻辑就是乘变加。模型的优化换来了更少的运算次数和更少的参数数量,一方面促使我们能够构建更轻更快的模型(例如MobileNet),一方面促使我们能够构建更深更宽的网络(例如Xception),提升模型的容量。
- 经典模型演进中的很多创新点都与改善模型计算复杂度紧密相关,复杂度一般分为时间复杂度与空间复杂度
-
经典网络MobileNet系列
- MobileNet V1
- MobileNet V2:
- 主要引入了两个改动:Linear Bottleneck 和 Inverted Residual Blocks
- MobileNet V3
-
Wasserstein Gan
- 解决的问题
- 彻底解决GAN训练不稳定的问题,不再需要小心平衡生成器和判别器的训练程度
- 基本解决了collapse mode的问题,确保了生成样本的多样性
- 训练过程中终于有一个像交叉熵、准确率这样的数值来指示训练的进程,这个数值越小代表GAN训练得越好,代表生成器产生的图像质量越高
- 不需要精心设计的网络架构,最简单的多层全连接网络就可以做到
- 使用的方法
- 判别器最后一层去掉sigmoid
- 生成器和判别器的loss不取log
- 每次更新判别器的参数之后把它们的绝对值截断到不超过一个固定常数c
- 不要用基于动量的优化算法(包括momentum和Adam),推荐RMSProp,SGD也行
- 算法流程
- GAN网络训练的难点
- 判别器训练得太好,生成器梯度消失,生成器loss降不下去;判别器训练得不好,生成器梯度不准,四处乱跑。只有判别器训练得不好不坏才行,但是这个火候又很难把握。
- 最小化第二种生成器loss函数,会等价于最小化一个不合理的距离衡量,导致两个问题,一是梯度不稳定,二是collapse mode即多样性不足。
- 第一种形式等价在最优判别器下等价于最小化生成分布与真实分布之间的JS散度,由于随机生成分布很难与真实分布有不可忽略的重叠以及JS散度的突变特性,使得生成器面临梯度消失的问题;第二种形式在最优判别器下等价于既要最小化生成分布与真实分布直接的KL散度,又要最大化其JS散度,相互矛盾,导致梯度不稳定,而且KL散度的不对称性使得生成器宁可丧失多样性也不愿丧失准确性,导致collapse mode现象。
- WGAN前作针对分布重叠问题提出了一个过渡解决方案,通过对生成样本和真实样本加噪声使得两个分布产生重叠,理论上可以解决训练不稳定的问题,可以放心训练判别器到接近最优,但是未能提供一个指示训练进程的可靠指标,也未做实验验证。
- WGAN本作引入了Wasserstein距离,由于它相对KL散度与JS散度具有优越的平滑特性,理论上可以解决梯度消失问题。接着通过数学变换将Wasserstein距离写成可求解的形式,利用一个参数数值范围受限的判别器神经网络来最大化这个形式,就可以近似Wasserstein距离。在此近似最优判别器下优化生成器使得Wasserstein距离缩小,就能有效拉近生成分布与真实分布。WGAN既解决了训练不稳定的问题,也提供了一个可靠的训练进程指标,而且该指标确实与生成样本的质量高度相关。作者对WGAN进行了实验验证。
- 解决的问题
-
经典网络架构
- RepVGG:Making VGG-style ConvNets Great Again
- 提出了一种简单有强有的CNN架构RepVGG,相比EfficientNet、RegNet等架构,RepVGG具有更佳的精度-速度均衡
- 提出采用重参数化技术对plain架构进行训练-推理解耦
- 在图像分类、语义分割等任务上验证了RepVGG的有效性。
- 这应该是plain模型首次在精度上达到SOTA指标 (在image net 上),是ACNet与Inception 思想相结合的产物
- EfficientNet
- RegNet
- RepVGG:Making VGG-style ConvNets Great Again
-
神经网络有趣的应用
- Deep Fake(Deep face lab)