模型压缩大杀器!详解高效模型设计的自动机器学习流水线

◎作者档案
作者:科技猛兽
欢迎大家联系极市小编(微信ID:fengcall19)加入极市原创作者行列

目录

  • 为什么要进行Model Compression?

论述当前深度学习存在的挑战。

  • 自动机器学习流水线 (AutoML Pipeline):让模型更加高效

简述自动机器学习的流水线。
第1步:ProxyLessNAS:搜索最适宜的模型架构。
第2步:AMC:压缩模型,减少参数量。
第3步:HAQ:进一步量化模型,减小内存占用。

  • 自动机器学习流水线的演进

论述如何进行网络体系结构、剪枝和量化策略的联合搜索。

1 为什么要进行Model Compression?

摩尔定律告诉我们:芯片的性能每隔18个月将会提高一倍

尽管摩尔定律的现象已经被观察到了数十年,但是,它仍应该被视为一种对现象的观测或对未来的推测,而不是一个物理定律。

换句话说,未来的增长率在逻辑上无法保证会跟过去的数据一样,也就是逻辑上无法保证摩尔定律会持续下去。而且,摩尔定律已经在2013年年底放缓

比如说英特尔在22纳米跟14纳米的CPU制程上已经放慢了技术更新的脚步,之后的时间里,晶体管数量密度预计只会每3年增加一倍。

而另一方面,在现代深度学习中,更复杂的问题往往需要更复杂的计算量来处理;摩尔定律的放缓使得当前的算力往往无法满足复杂AI问题的要求,尤其是在移动端这种算理有限的设备上面。

图1:摩尔定律正在放缓

评价一个深度学习模型,除了Accuracy之外,我们还要考虑下面这5个方面:

  • 延迟:Latency (ms)
  • 能耗:Energy Consumption (J/度电)
  • 计算量:Computational Cost (FLOPs/BitOPs)
  • 模型参数量:Parameter (M)
  • 运行占用内存:Memory (MB)

科技猛兽:衡量模型复杂度的指标解读
https://zhuanlan.zhihu.com/p/266275736

所以当前深度学习面临的一个挑战是:模型非常大 (Large Model Size),也就需要大量的能源消耗 (Large Energy Consumption),密集的计算量 (Computation Intensive)和密集的内存占用 (Memory Intensive)。以上问题使得模型在部署的过程中会遇到很大的挑战。

举一个例子: AlphaGo打一局比赛约需要1920块CPU和280块GPU的算力,以及3000\$的电费(electric bill),对于端侧设备 (Edge-side devices)来讲,会很快耗尽电池的电量 (Drains Battery);对于数据中心来讲会增加总持有成本TCO (Total Cost of Ownership)

图2:模型非常大,也就需要大量的能源消耗

所以,模型压缩对于深度学习的部署来讲意义重大,尤其是硬件资源受限的端侧设备。

模型压缩的方法有很多,可以参考下面的链接:

科技猛兽:模型压缩工作总结
https://zhuanlan.zhihu.com/p/262359207

借助AutoML技术,可以使得深度学习模型变得更加高效,以部署在端侧设备上面。所以本文介绍的重点是这一流水线具体是什么样的,以及后续有哪些改进的工作。

2 自动机器学习流水线 (AutoML Pipeline):让模型更加高效

  • 2.1 自动机器学习的流水线

自动机器学习流水线是指基于自动机器学习(AutoML)完成模型的优化过程。

输入: 模型要部署的目标硬件设备。约束条件(Latency,Energy Consumption,Model Size,Memory,FLOPs等)。

输出: 部署的模型。

中间过程:

$\rightarrow$ AutoML搜索最适宜的模型架构,最大化精度。

$$
\textit{A}^,\textit{w}^= \mathop{\arg\max}{\textit{A},\textit{w}} ACC{val}(\textit{A},\textit{w})\tag{T1}
$$

$\rightarrow$ 对这个模型进行压缩,减少参数量。

$$
P^= \mathop{\arg\max}{P} ACC{val}(P(\textit{A}^,\textit{w}^*))\tag{T2}
$$

$\rightarrow$ 对压缩后的模型进行量化,进一步减少内存占用。

$$
Q^= \mathop{\arg\max}{Q} ACC{val}(Q(\textit{A}^,\textit{w}^*))\tag{T3}
$$

  • 2.2 第1步:ProxyLessNAS:搜索最适宜的模型架构

MIT: ProxyLessNAS: Direct Neural Architecture Search on Target Task and Hardware

刚才讲到,当把模型部署在手机,头盔,智能手表,手环等移动端设备的时候,我们不仅希望模型的准确度高,还希望它具有低的延迟和低的耗电量。以往的做法是将相同的模型不加改进而直接部署在多种设备上面,比如下图:

图3:相同的模型不加改进而直接部署在多种设备上

这种做法的优点是简单快捷,不需要任何额外的设计成本;但是这种做法的缺点是没有考虑到不同硬件设备之间的差异性:比如GPU的并行度 (Degree of Parallelism)比CPU要高,cache size更大,内存带宽 (Memory bandwidth,单位时间里存储器所存取的信息量,也称为存储器在单位时间内读出/写入的位数或字节数)性能也有不同。因此使用同样的模型得到的结果往往是次优的。

ProxyLessNAS解决的就是这个问题,即希望针对不同的硬件设备专业化神经网络模型,以在目标硬件设备上面获得更好的准确率和较高的硬件效率。

图4:针对不同的硬件设备专业化神经网络模型

为每个硬件设计专门的深度学习模型代价是十分高昂的,往往需要请一个组的深度学习专家来进行模型设计和调参,显然是无法承受的。于是我们考虑使用AutoML的方法,自动化地设计神经网络的模型,来替代人类专家进行神经网络架构的设计,一定程度上能够解决人力资源不足的问题。

但是,神经架构搜索的成本是十分高昂的,谷歌提出的NASNet在小规模数据集CIFAR-10上面搜索一次所需要的时间,换算成单块GPU大约需要5年。所以,考虑到这样巨大的计算资源的要求,之前的神经架构搜索算法大多采用基于代理 (Proxy)的方法。

代理任务 (Proxy Task)相比于目标任务 (Target Task),一般具有:

  • 更小的数据集 (e.g. CIFAR→ImageNet)
  • 训练更少的epochs
  • 更小的搜索空间
  • 使用更浅的模型。

总之,代理任务相当于是目标任务的缩小简化版。之后,把代理任务搜索得到的结果迁移到目标任务上面,如下图所示:

图5:代理任务相当于是目标任务的缩小简化版

这样做的问题有3点:

  • 在代理任务上搜索得到的最优结果在目标任务上是次优的,尤其是当考虑Latency时。
  • 需要堆叠重复的单元,限制了块的多样性,从而降低了性能。
  • 不能根据目标任务的实际硬件要求进行优化。

ProxyLessNAS提出的动机就是为了解决以上的3点限制,作者希望能直接在目标任务和硬件 ( target task and hardware)上搜索出最优模型的架构,而避免使用代理Proxy,这解决了上面的第1个问题。同时,ProxyLessNAS不去堆叠重复的单元,每个block都可以被搜索,这解决了上面的第2个问题。最后,ProxyLessNAS还能考虑目标硬件的Latency,这解决了上面的第3个问题。ProxyLessNAS实现的结果如下图:

图6:ProxyLessNAS

首先简述ProxyLessNAS的做法:

把NAS的过程视为路径级剪枝的过程 (Path-level Pruning)。首先训练一个包含所有的操作的超网络 (over-parameterized network)。每个操作有自己的二值化架构参数和权重参数,并采样梯度下降的方法训练二值化的架构参数,那些架构参数比较低的操作到最后将会被剪掉。

在训练这个超网络的时候,由于操作数量很多,会导致GPU显存不足 (GPU memory explosion),这个问题很常见,因为GPU显存会随着候选操作的数量呈线性增长。解决的办法是每次只激活一条路径进行训练,即:每个操作的架构参数是二值化的。每次更新参数时,只允许一个操作处于激活状态。这样一来,GPU的显存的需求的复杂度就会从 $O(N)$ 变为 $O(1)$ 。

在One-Shot NAS方法中:

$$
m{O}^{\text{One-Shot}}(x)=\sum{i=1}^{N}{o_i(x)}\tag{1}
$$

在DARTS方法中:

$$
m{O}^{\text{DARTS}}(x)=\sum{i=1}^{N}{p_ioi(x)}=\sum{i=1}^{N}{\frac{exp(\alphai)}{\sum{}^{}{exp(\alpha_j)}}o_i(x)} \tag{2}
$$

二值化就是每次只激活一条路径,表达式是:

$$
g=\text{binarize}(p_1,p_2,...,p_N)=\left{\begin{array}{ll} [1,0,...,0],\quad p_1 \ ...\ [0,0,...,1],\quad p_N\end{array} \right .\tag{3}
$$

$$
m{O}^{\text{Binary}}(x)=\sum{i=1}^{N}{g_io_i(x)}=\left{\begin{array}{ll} o_1(x),\quad p_1 \ ...\ o_N(x),\quad p_N\end{array} \right .\tag{4}
$$

图7:同时学习权重参数和二值化的架构参数

图7所表达的含义就是每次只激活一条路径进行更新参数。具体怎么更新呢?

  1. 首先取一个batch的数据,根据 $(3)$ 式采样出一个 $g$ ,这时候就相当于只激活了一条路径,其他未被激活的路径的参数被freeze了。
  2. 使用training set 来update采样的这条路径的参数,如上图左所示。
  3. 再根据 $(3)$ 式采样出一个 $g$ ,使用validation set 来update架构参数,如上图右所示。
  4. 上述3步迭代执行。

更新架构参数时,首先要明确这里的架构参数是什么?答案是: $\alpha$ ,这些 $\alpha$ 通过 $\text{softmax}$ 的操作得到 $p$ ,再通过采样得到 $g$ ,最后, $g$ 再参与计算图。所以,在反向传播时,我们手里有的只是 $\frac{\partial L}{\partial g_i},i={1,2,3,..,N}$ 。可我们要计算的是 $\frac{\partial L}{\partial \alpha_i},i={1,2,3,..,N}$ 。

那么具体的方法是:

$$
\frac{\partial L}{\partial \alphai}=\sum{j=1}^{N}{\frac{\partial L}{\partial p_j}\frac{\partial p_j}{\partial \alphai}}\approx\sum{j=1}^{N}{\frac{\partial L}{\partial g_j}\frac{\partial p_j}{\partial \alphai}}=\sum{j=1}^{N}{\frac{\partial L}{\partial g_j}\frac{\partial (\frac{exp(\alphai)}{\sum{k}{exp(\alpha_k)}})}{\partial \alphai}}=\sum{j=1}^{N}{\frac{\partial L}{\partial g_j}pj(\delta{ij}-p_i)}\tag{5}
$$

在反向传播时,以上所有的参数都已知了,于是可以求出 $\frac{\partial L}{\partial \alpha_i},i={1,2,3,..,N}$ 。

但这样做也存在一个问题,即你需要保存所有的 $o_i(x)$ ,使得GPU memory变成了 $O(N)$ ,即显存使用量依然与 $N$ 相关。

为了解决这个问题,作者采取的做法是:

  1. 首先根据(3)式sample出2条路径,屏蔽其他的路径,这样强制使得 $N=2$ 。
  2. 采样之后, $\left{ p_i \right}$ 和 $\left{ g_i \right}$ 将会被重置。
  3. 根据(4)式更新这2条路径的架构参数 $\alpha$ ,更新完后,乘上一个系数,保持二者之和不变,即始终保持未被采样的路径的架构参数之和不变。

一个采样路径被增强(路径权重增加),另一个采样路径被衰减(路径权重降低),而所有其他路径保持不变。以这种方式,不管 $N$ 的值如何,在架构参数的每个更新步骤中只涉及两条路径,从而将存储器需求降低到训练紧凑模型的相同水平。

说白了,就是我更新架构参数的时候不更新所有的架构参数,只采样2条路径,更新这2条路径的架构参数,同时保持未被采样的路径的架构参数之和不变。

除此之外,为了解决第3个问题,就必须把延迟Latency作为目标函数要考虑的部分。但是,Latency这个指标是不可微分的 (non-differentiable),因此,得想个办法把Latency这东西变得可微分。

做法是:首先在目标硬件上收集各种候选操作的延迟Latency,构成一个数据集,去搭建一个延迟预测的模型。这样一来,基于这个模型就可以获得网络的延迟预测期望值。这个期望值就可以作为一个正则项,整合到损失函数当中,通过梯度进行直接的优化。

假设网络一共有 $L$ 个Block,对于第 $i$ 个Block来讲,我们求出它的Latency的期望值:

$$
{E}[\text{Latency}i]=\sum{j}{p_j^i}\times F(o_j^i)\tag{6}
$$

式中的 $j$ 表示第 $j$ 个候选操作。 $F$ 表示这个predictor的预测值。

在反向传播求微分时,表达式就变为了:

$$
\frac{\partial E[\text{Latency}_i]}{\partial p_j^i}=F(o_j^i)\tag{7}
$$

而式中的 $F(o_j^i)$ 是已知的。

最后,总的网络的Latency可以写成:

$$
E[\text{Latency}]=\sum_{i}{E[\text{Latency}_i]}\tag{8}
$$

这一流程可以表示为图8:

图8:把Latency变得可微分

损失函数为:

$$
Loss=Loss_{CE}+\lambda_1||w||_2^2+\lambda_2 E[\text{Latency}]\tag{9}
$$

通过调节超参数 $\lambda_1,\lambda_2$ 就能根据目标任务的实际硬件调整模型的复杂度。

实验结果:

实验1: 首先在CIFAR上进行验证,只使用 $\frac{1}{6}$ 的参数就能达到之前的准确率的效果。

图9:在CIFAR上进行验证

实验2: 接着在ImageNet上进行搜索,在实验中作者使用了3种硬件平台,分别是mobile phone, GPU 和 CPU。Latency的测试,分别使用:

  • V100 (GPU,batch size=8)
  • Intel(R) Xeon(R) CPU E5-2640 v4 (CPU,batch size=1)
  • Google Pixel 1 phone (mobile phone,batch size=1)

通过下图10 (mobile phone测试) 可以清晰地看出ProxyLessNAS在延迟和精度方面的提升:

图10:在ImageNet上进行搜索

通过下图11 (GPU测试) 可以清晰地看出ProxyLessNAS在延迟和精度方面的提升:

图11:在ImageNet上进行搜索

因为对比的网络都是为mobile phone设计的,所以在GPU上ProxyLessNAS的优势更加明显。

实验3: 对比ProxyLessNAS在不同硬件设备上的结果:

一个有趣的发现是:GPU上搜到的模型只在GPU上高效;CPU上搜到的模型只在CPU上高效;mobile phone上搜到的模型只在mobile phone上高效,这就表明了我们一开始的结论:为不同硬件设计专门化的神经网络的正确性和必要性。

图12:为不同硬件设计专门化的神经网络

图13:适合不同硬件设备 \(GPU,CPU,mobile phone\)的专门化的网络

图13展示了搜索出的适合不同硬件设备 (GPU,CPU,mobile phone)的专门化的网络。不同硬件平台在搜索过程中,模型会逐渐表现出不同的特性。

搜索空间的设计方面,为了使网络可深可浅,候选操作中加入 $\text{zero}$ 即可。

比如最上方的代表GPU端最适宜的模型,它倾向于选择更浅的模型和更大的块 (shallow and wide model with early pooling)

比如最中间的代表CPU端最适宜的模型,它倾向于选择更深的模型和更小的块 (deep and narrow model with late pooling)

这是因为GPU比CPU具有高得多的并行性,因此它可以利用大的MBConv操作。

至此,我们完成了AutoML Pipeline的第1步:搜索出适宜该硬件的最佳模型,接下来进入压缩过程。

  • 2.3:第2步:AMC:压缩模型,减少参数量

MIT: AMC: AutoML for Model Compression and Acceleration on Mobile Devices

在神经网络的压缩过程中,每一层的压缩比可以是由有经验的工程师来决定。所以,人力资源成为了这项任务的瓶颈。手工压缩方法需要相关领域的专家知识,需要人工在推理速度,大小与准确率之间权衡,因此人工给出的压缩比往往是次优的。因此,我们希望借助AutoML技术,找到一种自动给出神经网络每层压缩比的方法,用AI来优化AI,以减少人力资源的消耗。这就是AMC (AutoML for Model Compression and Acceleration on Mobile Devices)方法的初衷。

在之前的工作中有许多基于规则的模型压缩方法,比如在神经网络的第一层剪枝量小;在FC层中剪枝量大;在对剪枝量比较敏感的层中剪枝量小等等。然而,这样的剪枝方法是次优的。所以我们希望AutoML自动地给出每一层剪枝量的数值。

AMC通过使用强化学习的方法,设置一个DDPG的agent。压缩模型的精度对于每一层的稀疏度非常敏感,要求一个细粒度的动作空间。所以,把每一层的剪枝率建模为连续的数值 (continuous compression ratio) ,并在强化学习的奖励信息时,综合考虑模型的精确度和模型复杂度。在agent运行时,为agent输入某一个Layer $L_t$ 的相关信息,它可以自动输出这个Layer的剪枝率 $at$ 。之后,再为agent输入下一个Layer $L{t+1}$ 的相关信息,这样不断循环完整个网络。

AMC针对不同的场景提出了2种compression policy:

对于延迟关键型 (Latency-critical) 的AI应用 (手机应用,自动驾驶,广告排名等),目标是在给定硬件设备资源限制 (FLOPs, latency, and model size)的条件下获得最高精度。此时作者限制了搜索空间,其动作空间(修剪比例)被限制,从而使代理下的压缩模型总是在资源预算下。

对于质量关键型 (Quality-critical) 的AI应用 (Google Photo等),目标是在不损失精度的前提下得到最小的模型。此时作者定义了一个关于精度和硬件资源的奖励函数,在不伤害模型精度的情况下能够探索压缩限制。

图14:AMC针对不同的场景提出:不同的方案

剪枝的方法分为2类:fine-grained pruning (细粒度剪枝)structured pruning (粗粒度结构化剪枝)

Fine-grained pruning [5]就是剪掉权值矩阵 (weight tensor)中的不重要的某个元素,这种方法可以在不损失精度的前提下得到高精度。但是这种细粒度的方法会导致不规则的稀疏矩阵,且往往需要专门设计的硬件 [6]。一般用于减小模型大小

Coarse-grained pruning 旨在剪去权重张量中的整个规则区域,比如说整个channel,block等等。这里我们研究结构化修剪方法,剪枝每个卷积层和全连接层的输入通道。这种方法不需要专门设计的硬件

比如,对于一个卷积层 $(n,c,k,k)$ ,细粒度剪枝的稀疏度定义为: $#\text{zeros}/(n,c,k,h)$ ,即0元素的个数除以总的元素个数。对于结构化剪枝,压缩channel数之后为 $(n,c’,k,k)$ 稀疏度定义为: $c’/c$ 。一般用于模型加速

图15:粗粒度剪枝和细粒度剪枝

如图16所示为AMC的整体流程,主要有2部分组成,左侧是一个DDPG的强化学习Agent,右侧是一个神经网络压缩的环境,以channel pruning为例。我们将神经网络的压缩建模为一个自底向上,逐层进行的过程。

图16:AMC:自动给出神经网络每层压缩比的方法

状态空间:

$$
(t,n,c,h,w,\text{stride},k,\text{FLOPs}[t],reduced,rest,a_{t-1})
$$

其中:

该层的kernel的维度为: $(n,c,k,k)$ 。

该层的输入为 $(c,h,w)$ 。

$t$ 是第几个Layer。

$\text{FLOPs}[t]$ 是该层的计算量。

Reduced是先前层减少的计算量。

Rest是下面层的剩余的总数量。

状态空间里的每一维都会归一化到[0, 1]。

动作空间:

作者提出使用连续的动作空间 $a\in(0,1]$ ,支持更细粒度的和更精确的压缩。

环境 Environment:

硬件设备就相当于是强化学习的Environment,给RL Agent反馈,使之满足资源约束。

搜索协议:

资源受限型压缩: 通过限制动作空间(每层的稀疏比),我们可以精确地到达目标压缩比。我们使用以下的奖励:

$$
R_{err}=-Error\tag{10}
$$

这个奖励并没有提供model size reduction的激励,因此我们可以通过限制动作空间来达到目标压缩比。下面的算法描述了该过程:在最开始几层作者允许任意的压缩比 $a_t$ 。用最大的压缩比压缩完接下来所有的层后,如果网络的压缩比满足给定的硬件限制,则使用 $a_t$ 对这一层进行压缩。否则就增大 $a_t$ 。

图17:资源受限型压缩算法

精度保证型压缩: 通过调整奖励函数,我们可以精确地发现压缩的极限而无精度损失。

$$
R_{\text{FLOPs}}=-Error\cdot \text{log}(\text{FLOPs})\tag{11}
$$

$$
R_{\text{Param}}=-Error\cdot \text{log}(\text{#Params})\tag{12}
$$

这个奖励函数对误差更敏感,与此同时,它提供了一个对于减少运算量或模型大小的激励。agent可以自动化地找到压缩的极限。

AMC的具体算法是:

图18:AMC的具体算法

实验结果:

实验1:CIFAR-10:

作者在 CIFAR-10 上对 AMC 进行了全面分析,以验证 2 种搜索策略的有效性。 CIFAR 数据集包括 50k 训练和 10k 测试 10 个类别的 32×32 微小图像。 作者将训练图像分成 45k / 5k 训练/验证。 在验证图像上获得准确性奖励。 作者的方法具有很高的计算效率:RL 可以在 1 小时内在单个 GeForce GTX TITAN Xp GPU 上完成搜索。

图19:CIFAR-10实验结果AMC 得到的最佳裁剪方式

如上图19所示为在 CIFAR-10 上进行的FLOPs-Constrained Compression的实验。对比了三个经验策略:uniform 为均匀设置压缩比,deep,shallow 分别表示大尺度裁剪深层或浅层参数。使用奖励 $R_{err }$ 准确地找到稀疏度,并裁剪 Plain-20 和 ResNet-56的 50%参数,并将其与经验剪枝方法进行比较。 结果是AMC 得到的最佳裁剪方式不同于人工设定的裁剪它学习了瓶颈结构。

如上图20所示为在 CIFAR-10 上进行的Accuracy-Guaranteed Compression的实验。使用奖励 $R_{Param}$ 。AMC在压缩60\%的参数量的前提下基本没有精确度上的损失。

图20:AMC大幅超过了手工设计的剪枝方式

实验2:ImageNet:

为了得到满意的性能,作者采用:剪枝-finetune迭代的方法,一共迭代4次。在这4次中整个模型的总密度设置为[50%,35%,25%和 20%]。。对于每个阶段,在给定整体稀疏度条件下, AMC确定每个层的稀疏度。 然后根据某个策略对模型进行剪枝和finetune 30个epoch。

根据这个思路,作者将 ImageNet 上 ResNet-50 压缩率增加到5倍(人工调参得到的模型压缩率为 3.4,如下图所示)而不会损失模型精度(原始 ResNet50 的[top-1,top-5] 准确度= [76.13%,92.86%]; AMC 压缩后模型的准确度= [76.11%,92.89%])。下图21为每个块的密度信息,我们可以发现 AMC 的密度分布与手工设定模型压缩的结果完全不同,这表明 AMC 可以充分探索设计空间并分配稀疏度。

图21:ImageNet 上 ResNet-50 压缩率增加到5倍

每个阶段每层的密度如下图22所示。峰显示出不同层的剪枝率的大小,3×3 卷积层的剪枝率较大,因为其具有较高的冗余度。而对于 1×1 卷积,结构更紧,稀疏度较低。

图22:每个阶段每层的密度

下图为AMC与其他SOTA剪枝方法 (FP,RNP,SPP,CP)的对比:AMC超过了基于规则的剪枝方法。

图23:AMC超过了基于规则的剪枝方法

至此,我们完成了AutoML Pipeline的第2步:对搜索得到的模型进行压缩,下面是量化过程。

  • 2.4:HAQ:进一步量化模型,减小内存占用

MIT: HAQ: Hardware-Aware Automated Quantization with Mixed Precision

在传统的方法中,我们采样单一精度的量化,即使用相同的比特数(比如8 bit)对所有层的参数进行量化。如下图所示:

图24:使用相同的比特数\(比如8 bit\)对所有层的参数进行量化

但这会带来一个问题:即是否使用相同的比特数对于每一层来讲都是最优的呢?

这个问题的解决方案与AMC十分相似,就是进行Layer-wise的量化过程,即依然使用DDPG的方法来决定每一层的量化精度。

问: 如何确定不同硬件加速器每一层权重输出值的位宽?

如下图所示,对于第1层,我们用4 bit表示weight,用5 bit表示activation;对于第2层,我们用6 bit表示weight,用7 bit表示activation;对于第3层,我们用5 bit表示weight,用4 bit表示activation。如果能够合理地安排每一层的bit数,就可以取得很好的准确率。

图25:不同的层使用不同的精度

而且,最近已经有许多硬件设备开始支持混合精度的计算,比如说:

  1. NVIDIA最近推出了支持1位、4位、8位和16位算术运算的图灵GPU架构:Tensor Core。
  2. Apple的A12 Bionic。

所以有了硬件的支持,下一个问题是如何提供软件的支持。

图26:许多硬件设备开始支持混合精度的计算

我们回到上面的问题:如何确定不同硬件加速器每一层权重输出值的位宽?

注意这个问题有3个关键词:

  • 方法要针对不同的硬件设备:hardware-specialized。
  • 方法要是Layer-wise的。
  • 方法要能决定weight和activation的位宽。

首先混合精度要解决的第一个问题是会带来一个较大的设计空间:我们来计算下这个空间的具体大小:

比如说:每一层的weight参数有1 bit-8 bit这8种情况。同理,每一层的activation参数也有1 bit-8 bit这8种情况。那么每一层的参数有64种情况。假设神经网络有 $n$ 层,那么一共就有 $64^n$ 种情况。

状态空间:

$$
Ok=(k,c{in},c{out},s{kernel},s{stride},s{feat},n{params},i{dw},i{w/a},a{k-1})
$$

再对比一下AMC的状态空间:

$$
Ot=(t,n,c,h,w,\text{stride},k,\text{FLOPs}[t],reduced,rest,a{t-1})
$$

前8项和最后一项是相同的,只是换了说法,它们分别代表:

  • 第 $k$ 层的索引。
  • 输入channel数。
  • 输出channel数。
  • 卷积核尺寸 $s_{kernel}$ 。
  • 卷积核stride $s_{stride}$ 。
  • feature map的大小 $s_{feat}$ 。
  • 该层的参数: $n_{params}$ 。
  • 上一层的动作: $a_{k-1}$ 。

除此以外, $i{dw}$ 代表的是这一层是否是Depthwise Convolution。 $i{w/a}$ 代表量化的是weight还是activation。与AMC一样,状态空间里的每一维都会归一化到[0, 1]。

如果这一层是FC层,那么:

$$
Ok=(k,h{in},h{out},1,0,s{feat},n{params},0,i{w/a},a_{k-1})
$$

动作空间:

与AMC一样,动作空间也采用连续值的设计,因为离散值会失去顺序信息。从输出的动作值 $a_k$ 到离散的量化精度 $b_k$ 的转化公式为:

$$
bk=\text{round}(b{\text{min}}-0.5+ak\times(b{\text{max}}-b_{\text{min}}+1))\tag{13}
$$

式中, $b{\text{min}}=2, b{\text{max}}=8$ 。

量化操作:

假设第 $k$ 层的某个权值 $w$ ,量化精度是 $a_k$ bits,我们首先将它truncate到 $[-c,c]$ 的范围内。scale factor $s=c/(2^{a_k-1}-1)$ 。

那么量化结果可以表示为:

$$
\text{quantize}(w,a_k,c)=\text{round}(\text{clamp}(w,c)/s)\times s\tag{14}
$$

比如下图所示: $a_k=4,c=1$ ,图中没有画出符号位,所以数值位只剩下了3位。scale factor代表每一个离散值 (比如101)包含的连续值的宽度。注意为了保证量化结果的正确性,000和111代表的连续值的范围区间与其他值不同。

图27:量化过程

而 $c$ 的选择主要是根据下式,即使得量化后的权值与未量化的权重的分布尽量接近。

$$
c=\arg \minx D{KL}(W_k||\text{quantize}(W_k,a_k,x))\tag{15}
$$

为了限制模型的资源消耗,作者模仿AMC中的做法,即:RL agent给出每一层的量化精度 $a_k$ ,如果超过了限制,就从头sequentially减小量化位宽,直到满足资源限制为止。

奖励函数:

$$
R=\lambda\times(\text{acc}{\text{quant}}-\text{acc}{\text{origin}})\tag{16}
$$

式中, $\text{acc}{\text{quant}}$ 是量化以后finetune的模型的精度, $\text{acc}{\text{origin}}$ 是full-precision模型的精度。

实验结果:

整体的实验是基于MobileNet-v1和MobileNet-v2。

实验1:Latency-Constrained Quantization

下图为HAQ在MobileNet-v1上的结果:

图28:MobileNet-v1上的结果

下图为HAQ在MobileNet-v2上的结果:

图29:MobileNet-v2上的结果

我们可以发现在端侧设备 (Edge:Xilinx Zynq-7020 FPGA) 上和在云(Cloud:Xilinx VU9P) 上搜索得到的结构是非常不同的。在端侧设备上HAQ会给depthwise卷积层赋予更的量化精度,给pointwise卷积层赋予更的量化精度。而云上前若干层的现象很相似,但是最后几层恰恰相反,HAQ会给depthwise卷积层赋予更的量化精度,给pointwise卷积层赋予更的量化精度。这也鼓励我们要根据不同的硬件给出specialized的解决方案,因为它们的特性是不一样的,具体体现在batch size,memory bandwidth,peak FLOPs等许多方面。

量化的结果如下图所示:

图30:ImageNet的量化结果

与baseline PACT相比,HAQ获得了精度和Latency的提升。

实验2:Energy-Constrained Quantization

图30:Energy-Constrained Quantization

可以清楚地看到,HAQ优于基于规则的量化baseline:它在消耗相似的Energy的同时获得了

更好的性能。HAQ的能量消耗接近原始的MobileNet-V1模型的一半而几乎没有精度损失,证明混合精度在专门化的硬件设备上的有效性。

实验3:Model Size-Constrained Quantization

这次, 作者用k-means算法将值量化为k个不同的质心,而不是使用线性量化进行压缩,因为k-means量化可以更有效地减小模型大小。

与韩松老师的Deep Compression的结果对比如下:

图31:Model Size-Constrained Quantization

可以发现比HAQ比Deep Compression性能好得多:它在相同的模型大小下实现了更高的精度。对于像MobileNets这样的紧凑模型,Deep Compression会显著降低性能,尤其是在大幅度量化的情况下,而HAQ可以更好地保持精度。

例如,当Deep Compression将MobileNet-v1的权重量化为2 bit时,精确度从70.90显著下降到37.62;而HAQ在相同的模型大小下仍然可以达到57.14的精确度。这是因为HAQ通过系统地搜索最优量化策略来充分利用混合精度。

图32:Model Size-Constrained Quantization的量化可视化结果

如图32为Model Size-Constrained Quantization的量化可视化结果。HAQ给depthwise convolution 分配了更多的量化位数,给pointwise convolution 分配了更少的量化位数。

直观来说,这是因为前者的参数个数比后者少很多。比较图29和图32,在不同的优化目标下,策略有很大的不同(在延迟优化下,depthwise convolution的位数较少,在模型大小优化下,depthwise convolution的位数较多)。

表明HAQ可以做到针对不用的硬件设备 (云,端侧),不同的约束条件 (Latency,Energy,Model size),不同的模型给出最适宜的量化策略。

至此,我们完成了AutoML Pipeline的最后一步量化的工作。总结一下:

流水线的输入是

模型要部署的目标硬件设备。
约束条件(Latency,Energy Consumption,Model Size,Memory,FLOPs等)。

1 我们先利用AutoML设计为给定的硬件,在给定的条件下设计最适宜的架构。

2 再使用AMC为给定的硬件,在给定的条件下搜索最适宜剪枝的策略,以保持高精度。

3 最后使用HAQ为给定的硬件,在给定的条件下搜索最适宜量化的策略,以保持高精度。

至此,一个AutoML Pipeline完成,输出最终的模型,纵观整个过程,每一步都使用了AutoML技术。

自动机器学习流水线的演进

MIT: APQ: Joint Search for Network Architecture, Pruning and Quantization Policy

在上面介绍的自动机器学习流水线中,给定目标硬件设备 $M$目标资源约束 $C$ ,我们依次对模型进行了架构搜索,结构化剪枝,混合精度量化的过程。这一系列过程进行完后,我们得到了适用于 $M$ 的最优模型,且它的资源消耗满足 $C$ 的限制。

自动机器学习流水线的中间过程:

$\rightarrow$ AutoML搜索最适宜的模型架构,最大化精度。

$$
\textit{A}^,\textit{w}^= \mathop{\arg\max}{\textit{A},\textit{w}} ACC{val}(\textit{A},\textit{w})\tag{T1}
$$

$\rightarrow$ 对这个模型进行压缩,减少参数量。

$$
P^= \mathop{\arg\max}{P} ACC{val}(P(\textit{A}^,\textit{w}^*))\tag{T2}
$$

$\rightarrow$ 对压缩后的模型进行量化,进一步减少内存占用。

$$
Q^= \mathop{\arg\max}{Q} ACC{val}(Q(\textit{A}^,\textit{w}^*))\tag{T3}
$$

不足是:

  • 这一过程分3步进行略微繁琐。
  • 需要调节大量的hyper-parameters,超过了可接受的人力范围。

那么,接下来的想法是:这3步可否合并为一步进行呢?即:联合搜索网络架构,剪枝和量化策略?

我们希望的中间过程:

$$
\textit{A}^,\textit{w}^,P^,Q^= \mathop{\arg\max}{\textit{A},\textit{w},P,Q} ACC{val}(Q(P(\textit{A},\textit{w})))\tag{T4}
$$

但是,直接使用NAS联合搜索这3个维度会带来以下的问题:

  • 搜索空间变得很大,使搜索过程很难进行。因为剪枝和量化过程需要finetune的过程,极大增加了搜索的成本,如下图所示。

图33:不同方法的搜索成本

  • 每一步都有不同的目标函数,使得流水线最终的策略是次优的。浮点模型的最佳神经架构对于量化模型可能不是最佳的。

所以,我们可以采用APQ的策略,把架构搜索,剪枝,量化这3步可否合并为一步进行。

问:面对这样巨大的联合搜索空间,如何加快搜索过程?

答:核心思想是训练一个quantization-aware accuracy predictor加速搜索过程。

图34:quantization-aware accuracy predictor加速搜索过程

但是,训练一个quantization-aware accuracy predictor并不容易,因为我们需要大量的 (模型,精度) 数据集,而每得到这样的一个样本,就需要做以下2件事情:

  1. 训练这个模型,得到初始的fp32 weights。
  2. 量化并fine-tune得到int8 weights,并验证Accuracy。

做完这2步 (hundreds of GPU hours),才算得到一组数据。而我们要构建这样一个数据集,无疑会花费巨大的成本。

训练Quantization-Aware的Accuracy Predictor:

所以,为了减少第1步的计算量,这里借鉴One-Shot NAS的方法:训练一个supernet,其中包含许多个subnet,这些subnet直接继承supernet的权重,不做任何fine-tune,在验证集上评估精确度,即可得到一组数据 (fp32 model, fp32 accuracy)。这样一来,将计算成本降低至 $O(1)$ 。利用这些大量的低成本 的数据集 (fp32 model, fp32 accuracy), 我们可以训练出一个Accuracy Predictor (fp32),它的输入是模型架构,输出是预测精度

为了减少第2步的计算量,需要获得(quantized model, quantized accuracy)的数据。这里不能借鉴One-Shot NAS的方法,因为量化的模型,如果不做fine-tune,精度会很差。所以我们使用上一步得到的Accuracy Predictor (fp32),使用少量的高成本 的数据集 (int8 model, int8 accuracy) 对它进行fine-tune,类似于迁移到量化数据上。

fine-tune结束后,即得到Quantization-Aware的Accuracy Predictor (int8),它的输入是模型,量化精度,输出是预测的精确度。整个过程如下图35所示:

图35:训练Quantization-Aware的Accuracy Predictor

使用上述的方法,就可以不用去费力地获得数据点:(NN architecture, quantization

policy, quantized accuracy),而省去了复杂的训练过程。

我们得到了Quantization-Aware Accuracy Predictor以后,就可以利用它,输入模型的架构,即可得到模型的accuracy,这一过程可以表示为:

$$
\text{acc} = P(\text{arch}, \text{prune}, \text{quantize})\tag{17}
$$

下一步要做的就是把这三个自变量进行编码,对搜索空间进行建模:

搜索空间: once-for-all network

Backbone设置为MobileNetV2,kernel size={3, 5, 7},channel number={4B, 6B, 8B}

depth={2 stages, 3 stages, 4 stages},once-for-all network的性质有:

  • 对于每个提取的子网络,可以直接评估性能,而无需重新训练,因此训练成本只需支付一次。
  • 支持operator,channel的搜索。

由于once-for-all network的网络训练的性质,很难同时实现这两个目标:因为如果搜索空间变得太大,精度近似将是不准确的。

为了解决这个问题,我们采用Progressive Shrinking (PS) 算法来训练一次性网络。具体来说,我们首先在once-for-all network的网络中训练一个具有最大kernel大小、channel数量和depth的完整子网络,并将其用作teacher,从once-for-all network的网络中逐步发展更小的子网络样本。在蒸馏过程中,经过训练的子网络仍然会更新权重,以防止精度损失。Progressive Shrinking (PS)算法有效降低了一次性网络训练过程中的方差。通过这样做,我们可以确保从一劳永逸的网络中提取的子网络保持竞争精度,而无需重新训练。

有了搜索空间的定义,具体的编码方式是:

将depthwise convolution和pointwise convolution的kernel size,channel number,quantization bits进行编码成one-hot vector,再concate在一起。作为这个block的encoding。

例如: 一个block有3个选择的kernel size大小 (3,5,7)和4个选择的channel number (16,24,32,40),如果我们选择kernel size = 3,channel number = 32,那么我们得到两个向量[1,0,0]和[0,0,1,0],我们将它们concate在一起,并使用[1,0,0,0,1,0]来表示这个块的体系结构。 假设pointwise/depthwise层的weights/activations 的位宽选择是4或8,我们使用[1,0,0,1,0,1,1,0]来表示量化策略的选择(4,8,8,4)。 那么对于一个5层网络,我们可以用一个75-dim (5×(3+4+2×4)=75)的向量来表示这样的编码。

在我们的设置中,kernel size的选择是[3,5,7],channel number的选择取决于每个块的基本通道号,位宽的选择是[4,6,8],总共有21个块要设计。

Quantization-Aware Accuracy Predictor的结构如下图所示:隐藏层为400个神经元。

左侧为Full-precision accuracy predictor,右侧为Quantization-Aware Accuracy Predictor。输入层添加了量化的编码,利用左侧网络的预训练权重,加上(int8 model, int8 accuracy)的数据集,进行fine-tune后得到。值得注意的是不需要很多(int8 model, int8 accuracy)的数据集,这极大地缩小了训练的成本。

图36:Quantization-Aware Accuracy Predictor

这样,得到了Quantization-Aware Accuracy Predictor以后,也建模了编码方式,我们就能根据遗传算法在三个维度上联合搜索最适宜的架构。为了衡量Latency和Energy的信息,作者仿照ProxyLessNAS,首先构建一个查找表,其中包含不同架构配置和位宽下每层的Latency和Energy。需要这些信息时直接查表即可。在遗传算法迭代的过程中,Latency和Energy超过限制的个体将会被直接排除掉。遗传算法具体如下:

图37:APQ算法

APQ的具体流程如下图38所示:

图38:APQ方法流程

1 首先训练好一个once-for-all network $S$ 。

2 利用 $S$ 生成用于训练Full-precision accuracy predictor的数据集 $D{FP}$ 和生成用于训练Quantization-Aware Accuracy Predictor的数据集 $D{MP}$ 。

3 使用数据集 $D{FP}$训练Full-precision accuracy predictor $M{FP}$ 。

4 使用Full-precision accuracy predictor在数据集 $D{MP}$ 上finetune得到Quantization-Aware Accuracy Predictor $M{MP}$ 。

5 根据遗传算法首先初始化一代,共 $N$ 个样本。

6 使用 $M_{MP}$ 选出这一代的精英Topk。

7 变异出 $N/2$ 个下一代新个体,杂交出 $N/2$ 个下一代新个体。

8 循环进入第6步,循环 $T$ 次。

9 从精英Topk中选出最优个体作为结果输出。

量化方案:

与HAQ一致,设权值为 $w$ ,量化精度为 $b$ ,则量化之后的权值在 $[-v,v]$ 为:

$$
w'=\max(0, \min(2v,round(\frac{w}{2^b-1})\cdot v))-v\tag{18}
$$

实验结果:

整体的实验是基于ImageNet,BitFusion的硬件平台。

实验1:与MobileNetV2+HAQ的对比:

图39:与MobileNetV2+HAQ的对比

实验2: 与Multi-Stage Optimized Model的对比:

图40:与Multi-Stage Optimized Model的对比

实验3: Predictor-Transfer的对比实验

图41:Predictor-Transfer的对比实验

作者尝试了使用Predictor-Transfer技术与不使用的对比,当使用Predictor-Transfer时,左图显示可以获得更快和更高的收敛速度,而右图显示需要更少的数据量。使用Predictor-Transfer时,我们可以使用少于3000个数据点实现85\%的pair-wise accuracy (从候选数据集随机选择2个样本,Predictor能够正确识别哪一个更好的比例),而如果没有这种技术,至少需要4000个数据。

图42:APQ在精确度上超过了SOTA

可以发现,APQ在精确度上超过了SOTA,且极大地减少了 $CO_2$ 排放和云计算的边际成本。

至此,我们完成了对AutoML Pipeline的优化过程。

总结:

本文介绍了自动机器学习流水线 (AutoML Pipeline),它的输入是给定的硬件条件和资源限制,输出是最优的模型,主要分为架构搜索,剪枝,混合精度量化三个部分。还介绍了它的改进,即联合搜索三个部分的最优策略。

参考文献:

[1] ProxyLessNAS: Direct Neural Architecture Search on Target Task and Hardware


[2] AMC: AutoML for Model Compression and Acceleration on Mobile Devices


[3] HAQ: Hardware-Aware Automated Quantization with Mixed Precision


[4] APQ: Joint Search for Network Architecture, Pruning and Quantization Policy


[5] EIE: efficient inference engine on compressed deep neural network


[6] Deep compression: Compressing deep neural networks with pruning, trained quantization and huffman coding

目录

  • Literature Review for Super Resolution

综述超分网络的数据集,常用的4种框架,上采样的方法吗,训练策略等等。

  • 渐进式方法1:Laplacian金字塔超分辨率网络

如何在多个金字塔级别上逐步重建高分辨率图像。

  • 渐进式方法2:ProSR:完全渐进式超分辨率网络

如何同时设计渐进式的超分网络架构和训练策略。

1 Literature Review for Super Resolution

1.1 超分问题的定义

超分任务是从给定的低分辨率(LR)图像中恢复高分辨率(HR)图像的过程, 我们使用LR来代表低分辨率图像,HR代表高分辨率图像。那么,对这个高分辨率图像做一步操作 $D$ 来得到低分辨率图像:

$$
I_x=D(I_y; \delta)\tag{1}
$$

上面这个式子把高分辨率图像通过退化映射函数degradation mapping function变成了低分辨率图像, $\delta$ 代表超参数或者噪声。但是在多数情况下, $D$ 的具体形式都是未知的,只有LR是已知的。具体来说, $D$ 这个退化过程也受很多因素的影响:压缩伪影,各向异性退化、传感器噪声和散斑噪声等等,但是我们在对 $D$ 建模的时候,一般采用最原始的downsampling操作,如下式所示:

$$
D(I_y; \delta)=(I_y)\downarrow_s,\left{ s \right}\subset\delta\tag{2}
$$

其中, $\downarrow_s$ 为比例因子为 $s$ 的降采样操作,最常用的降采样操作是双三次插值,也有其他方法将退化映射建模为几个操作的组合:

$$
D(I_y; \delta)=(I_y\otimes \kappa)\downarrows+n\varsigma,\left{ \kappa,\varsigma,s \right}\subset\delta\tag{3}
$$

其中, $\kappa$ 代表模糊kernel,$Iy\otimes \kappa$ 代表模糊核 $\kappa$ 与HR图像之间的卷积操作。 $n\varsigma$ 为可加的带标准差 $\varsigma$ 的高斯白噪声,3式与2式相比,更接近实际情况,对SR更加有利。

此时,我们需要得到高分辨率图像的真值的近似估计(HR approximation) $\hat{I_y}$

$$
\hat{I_y}=F(I_x;\theta)\tag{4}
$$

这里的 $F$ 代表超分模型, $\theta$ 代表模型参数。

因此,SR的目标函数为:

$$
\hat \theta= \mathop{\arg\min}_{\theta}L(\hat{I_y}, I_y)+\lambda\Phi(\theta)\tag{5}
$$

其中,损失函数为逐像素差的均方误差, $\Phi(\theta)$ 是正则化项,更强大的模型往往采用将多种损失函数相结合的方式, 下文会详细地介绍。

1.2 超分问题的数据集

如下表所示:

超分问题常见数据集

除了上述数据集以外,还有许多常见的数据集也能应用在超分任务中,它们是:ImageNet,MS-COCO , VOC2012 , CelebA 等。另外,在训练超分网络时我们也常常需要结合多个数据集一起训练,比如 T91 和 BSDS300,结合DIV2K 和 Flickr2K。

1.3 超分问题的质量评估方法

图像质量是指图像的视觉属性,主要关注对观众的感知评价。一般来说,图像质量评估方法包括基于人类感知的主观方法(即图像看起来有多逼真)和客观计算方法。前者更符合我们的需要,但往往费时费钱,因此后者是当前主流。然而,这些方法并不一定相互一致,因为客观方法往往不能非常准确地捕捉人类的视觉感知,这可能导致IQA结果的巨大差异。

大概可以分为3个类别:

  • full-reference methods:利用相关的图片评价
  • reduced-reference methods:利用提取的特征评估
  • no-reference methods:blind IQA,不使用相关的图片

1. 峰值信噪比 Peak signal-to-noise ratio (PSNR):

峰值信噪比(PSNR)是一种常用的客观指标,通常用来衡量有损变换(比如image compression, image inpainting)的图像质量

对于超分任务,PSNR是通过通过图片间的最大像素值 $L$ 和图像之间的均方误差 $MSE$ 定义,PSNR与ground truth图像与生成图像的均方误差(MSE)的对数成反比。假设HR图像 $I$ 和重建图像 $\hat I$ ,两者的像素都是 $N$ ,PNSR(db)的计算方法如下所示:

$$
PSNR=10\cdot \log{10}(\frac{L^2}{\frac{1}{N}\sum{i=1}^{N}{I(i)-\hat{I}(i)^2}})\tag{6}
$$

如果8bit表示一个像素点的取值,那么 $L$ 应取为255,因为这时像素点的取值的范围在0-255之间。PSNR的典型值从20到40不等,越高越好。值得注意的是,当 $L$ 一定时,PNSR只与像素间的MSE有关,所以,PSNR只关心像素值之间的差异,它并不能很好地代表感知质量。它往往导致在真实场景中效果较差,但由于缺乏感知衡量标准,运用最为广泛。

2. 结构相似度 SSIM

结构相似度(SSIM)是想要衡量图像之间的结构相似性,包括亮度、对比度和结构这三个方面。

假设HR图像 $I$ 和重建图像 $\hat I$ ,两者的像素都是 $N$,我们先定义图像的均值和方差:

$\muI=\frac{1}{N}\sum{i=1}^{N}{I(i)}\tag{7}$ $\sigmaI=(\frac{1}{N-1}\sum{i=1}^{N}{(I(i)-\mu_I)^2})^{\frac{1}{2}}\tag{8}$

亮度的对比计算为:

$$
C_l(I,\hat I)=\frac{2\muI\mu{\hat I}+C_1}{\muI^2+\mu{\hat I}^2+C_1}\tag{9}
$$

对比度的对比计算为:

$$
C_c(I,\hat I)=\frac{2\sigmaI\sigma{\hat I}+C_1}{\sigmaI^2+\sigma{\hat I}^2+C_1}\tag{10}
$$

结构的对比是通过归一化的像素值实现的:

$$
\sigma{I,\hat I}=\frac{1}{N-1}\sum{i=1}^{N}{(I(i)-\muI)(\hat I(i)-\mu\hat I)}\tag{11}
$$

$$
Cs(I,\hat I)=\frac{\sigma{I,\hat I}+C_3}{\sigmaI\sigma{\hat I}+C_3}\tag{12}
$$

SSIM公式可以表示为亮度、对比度和结构比较的加权乘积,分别计算。

$$
SSIM(I,\hat I)=[C_l(I,\hat I)]^\alpha[C_c(I,\hat I)]^\beta[C_s(I,\hat I)]^\gamma\tag{13}
$$

式中, $\alpha,\beta,\gamma$ 分别为亮度、对比度和结构比较函数的权重。C1, C2是设置的常量,避免计算的不稳定。SSIM从HVS的角度来评价重建质量,更符合视觉感知,被广泛应用。

由于图像统计特征可能分布不均或失真,局部评估图像质量比全局更可靠。均值SSIM (MSSIM)是一种局部评估质量的方法,它将图像分割成多个窗口,并对每个窗口获得的SSIM进行平均。

3 Mean Opinion Score

直接由人来打分,分数在1-5之间。

1.4 超分网络的4种框架

图像超分辨率是一个ill-posed problem(病态问题),超分网络离不了上采样,上采样在超分网络中是非常关键的一点,但是上采样的时机,次数,以及方式千变万化。尽管现有模型的体系结构差异很大,但基于所采用的上采样操作及其在模型中的位置,它们可以归属于四个模型框架(如下图1所示)。

以往的超分模型可以归结为以下4类:

图1:超分框架

立方体代表的是输出的大小,虚线框中的表示可堆叠的块。绿色块代表可学习的上采样块,黄色块代表下采样的块,蓝色块代表一般卷积。

  • 1 Pre-upsampling Super-resolution:

图2:Pre-upsampling Super-resolution

这种方法考虑到了直接学习低分辨率图像到分辨率图像的困难,所以采用传统的上采样方法(双线性插值法,双三次插值法) 先将图像直接上采样到高分辨率,再利用深度神经网络进行精调。具体而言,LR图像被使用传统方法上采样到粗糙的HR图像,然后CNN应用到这些粗糙的HR上面,用于重建高质量细节的图像。典型的工作是:

董超老师SRCNN: TPAMI 2015: Image super-resolution using deep convolutional networks
ICCV 2015: Deep networks for image super-resolution with sparse prior
VDSR ICCV 2016: Accurate image super-resolution using very deep convolutional networks
DRCN CVPR 2016: Deeply-recursive convolutional network for image super-resolution
DRRN ICCV 2017: Image super-resolution via deep recursive residual network

这种方法的优点是:

  • 因为最困难的上采样操作交给了传统方法来解决,深度神经网络只需要来对粗糙的生成图片进行精调,所以说大大降低了训练的难度。
  • 这种做法可以得到任意大小的HR图片,处理任意维度的LR图片,并灵活调节超分任务的scale factor。

这种方法的缺点是:

  • 传统的上采样操作会带来很多副作用,比如噪声放大和模糊的问题。
  • 增加了不必要的计算成本,并且不提供用于重建高分辨率图像的附加高频信息。

  • 2 Post-upsampling Super-resolution:

图3:Post-upsampling Super-resolution

这种方法的提出是为了解决Pre-upsampling Super-resolution的计算成本太高的问题,并充分发挥深度学习的优势,Post-upsampling的做法希望把主要的计算任务放在在低分辨率的位置,把上采样的操作放在模型的最后方。并把上采样的操作换成可学习的层。典型的工作是:

CVPR 2016: Real-time single image and video super-resolution using an efficient sub-pixel convolutional neural network
CVPR 2017: Enhanced deep residual networks for single image super-resolution
ECCV 2016: Accelerating the super-resolution convolutional neural network

这种方法的优点是:

大量的计算在低分辨率的空间进行,这样可以提高计算的效率。

这种方法的缺点是:

  • 上采样仅在一个步骤中执行,那么当放大倍数比较大时(4,8),极大地增加了学习难度。
  • 每一种放大因子都需要训练一个独立的模型,无法满足多尺度超分任务的需求。

  • 3 Progressive upsampling Super-resolution:

为了解决Post-upsampling Super-resolution的问题,后人开始尝试渐进式地进行上采样,也就是本文所介绍的主题。具体而言,该框架下的模型是基于深度卷积神经网络的级联,并逐步重建高分辨率图像。该方法一般分几个阶段,在每个阶段,图像被上采样一次,得到更高的分辨率,并且后面接上CNN做一次精调。典型的工作是:

CVPR 2017: Deep Laplacian Pyramid Networks for Fast and Accurate Super-Resolution
TPAMI 2018: Fast and accurate image super-resolution with deep laplacian pyramid networks(上篇的扩大版)
CVPR 2018: A Fully Progressive Approach to Single-Image Super-Resolution

这种方法的优点是:

  • 通过把复杂的上采样任务分解为几步进行,渐进式操作减少了学习的困难,尤其是在上采样比较多的情况。

这种方法的缺点是:

  • 多阶段上采样导致模型的设计复杂,存在很多种不同的情况,以及训练稳定性的问题。
  • 需要更加复杂,先进的训练策略和指导(详见后文介绍的2篇工作)。

  • 4 Iterative Up-and-down Sampling Super-resolution:

为了更好地捕捉LR-HR图像对的相互依存性,也有学者使用了back-projection的操作,即:迭代地在上采样之后进行back-projection操作并精调 (refinement),通过计算reconstruction error来调整HR 图像。

比如,DBPN通过交替连接上采样层和下采样层,并使用所有intermediate reconstruction来重建最终的HR结果。SRFBN采用迭代上下采样feedback block,这些feedback block包括更密集的跳跃连接,以学习更好的表示。主要的工作有:

DBPN CVPR 2018: Deep back-projection networks for super-resolution
SRFBN CVPR 2019: Feedback network for image super-resolution
RBPN CVPR 2019: Recurrent back-projection network for video super-resolution

该框架下的模型能够更好地挖掘LR-HR图像对之间的深层关系,从而提供更高质量的重建结果。然而,back-projection的设计标准仍然不清楚。由于该机制刚刚被引入到基于深度学习的SR中,该框架具有很大的潜力,需要进一步探索。

对比:

图4:各类方法的结构对比,a,c,d属于1类模型;b属于2类模型;e属于3类模型

1.5 常见的上采样方法

1.5.1 插值法:

上采样是超分网络中最关键的操作,主要有传统的基于插值的算法和基于深度学习的上采样方法。传统的上采样技术包括最近邻插值和双线性插值等等。

最近邻插值:每个待插值的位置选择最相邻的像素值,而不考虑其他像素,这种策略很直觉,它的优势是:处理速度快。但缺点是:生成图片质量低、块状化。

双线性插值:首先对图像的一个轴进行线性插值,然后在另一轴上执行,如图3所示。 感受野为2*2,且保持速度较快。

双三次插值:首先对图像的一个轴进行三次插值,然后在另一轴上执行,如图3所示。使用4x4的像素进行计算,与双线性插值相比,得到的图片质量更平滑,但速度更慢。anti-aliasing的双三次插值是目前构造SR数据集的主流方法。

事实上,基于插值的上采样方法仅基于图像的本身内容提高图像的分辨率,不带来任何更多的信息。但是,还会引入许多的副作用:计算复杂度增加,噪声增强,模糊等等。

1.5.2 可学习的上采样方法:

  • 转置卷积层

为了克服基于插值方法的缺点,端到端地学习上采样,在SR领域引入了转置卷积层

转置卷积

转置卷积(transpose convolution),也叫反卷积 (deconvolution),先对低分辨率图像插入0值,再通过卷积 (kernel=3,stride=1,padding=1) 的过程获得输出。转置卷积的方法在超分任务里面广泛应用。然而,很容易在每个轴上引起“不均匀重叠”,并且两个轴上的相乘结果进一步创建了大小变化的棋盘状图案,从而损害了SR性能。

  • 亚像素层sub-pixel layer

亚像素层

核心思想是通过卷积操作产生大量的channel之后,再通过reshape得到最终的输出。比如说要上采样 $s$ 倍,那么就需要先得到 $s^2$ 个不同的channel。设输入的维度是 $h\times w\times c$ ,则输出的维度是 $h\times w\times s^2c$ 。接下来进行一步reshaping的操作(比如shuffle)把特征最终变为: $sh\times sw\times c$ 。亚像素层的方法在超分任务里面广泛应用。

与转置卷积层相比,亚像素层具有更大的感受野,它提供了更多的上下文信息以帮助生成更多逼真的细节。然而,由于感受野的分布是不均匀的,并且块状区域实际上共享相同的感受野,因此可能会导致在不同块的边界附近出现一些伪影,也可能会导致不平滑的输出结果。

  • Meta upscale module

Meta upscale module

上述方法需要预先定义缩放因子 (scale factor),即针对不同的因子训练不同的上采样模块,效率低下,因此不符合实际需要。具体来说,使用RDN (residual dense network)作为超分网络,RDN网络结构包含3个卷积层以及16个residual dense blocks (RDBs) ,RDB结构如上图所示,每个RDB包含8个卷积层,channel数为64。

利用Feature Learning Module提取特征$F^{LR}$,假设上采样尺度因子为$r$,对HR图像中的每个像素点$(i,j)$的值,都由$F^{LR}$中的像素点$(i_l,j_l)$和相对应的卷积核决定。

因此,首先,up-scale module需要将$(i,j)$ 与$(i_l,j_l)$ 对应,然后利用一个特殊的卷积核,根据 $(i_l,j_l)$ 的值求得HR图像中$(i,j)$位置的像素值。up-scale formulate如下:

$$
I^{SR}(i,j)=\Phi(F^{LR}(i_l,j_l), W(i,j))\tag{14}
$$

其中,$\Phi(\cdot)$代表feature mapping function用来计算pixel value。$W(i,j)$代表计算SR中像素点$(i,j)$时的卷积核。本文提出了基于尺度因子和坐标的Meta-Upscale Module来动态预测权重 $W(i,j)$。Meta-Upscale Module由三个重要的模块组成:Location Projection, Weights Prediction以及Feature Mapping。

Location Projection 就是对于HR图像中的每个像素点 $(i,j)$ , 均需找到 $F^{LR}$ 中的一个像素点$(i_l,j_l)$与之相对应,即: $(i_l,j_l)=T(i,j)=(\lfloor \frac{i}{r} \rfloor, \lfloor \frac{j}{r} \rfloor)$。

Weights Prediction是利用一个网络预测上采样网络的权重。 对于传统的可学习的上采样方法,不同的尺度因子都有与之对应的、从训练集中学到的卷积核$W$。但是,本文的Meta-Upscale Module利用神经网络来预测weights。

Feature Mapping:在得到$F^{LR}$ 、利用weight prediction network得到卷积核后,要做的最后一件事情就是将权重作用在feature map上面,即:mapping feature to the value of the pixel on the HR image。公式如下:

$$
\Phi(F^{LR}(i_l,j_l),W(i,j))=F^{LR}(i_l,j_l)\cdot W(i,j)\tag{15}
$$

总结下这种方法的思路:

对于HR图像上的每个目标位置,此模块将其投影到LR特征图上的一个小块( $k ×k×c{in}$ ),根据密集层的projection offsets和scale factor预测卷积权重 ( $k ×k×c{in}×c_{out}$ )并执行卷积。使用这种方式,Meta upscale module可以通过单个模型实现连续放大。并且由于有大量的训练数据,该模块在固定放大倍数上可以表现出相当甚至更好的性能。首次通过动态预测权重 (dynamically predict weights),实现了单一模型对输入图片进行任意尺度的上采样。

如今,这些可学习的上采样方法已成为应用最广泛的上采样方法。特别是在Post-upsampling Super-resolution框架中,这些图层通常用于最终上采样阶段,基于低维空间提取的高层表示重建HR图像,从而在避免高维空间的巨大的计算量的情况下,实现端到端的SR。

1.6 常见的网络架构设计

1.6.1 Residual Learning

全局残差学习

只学习两幅图像的残差,这样就避免了学习完整图像到另一个完整图像之间复杂的变换,简化了任务难度。神经网络只需要学习丢失的高频细节信息即可。

局部残差学习

是ResNet网络的技巧,提出的目的是为了解决网络的梯度消失、梯度爆炸的问题,增强网络的学习能力。主要由skip-connnection和逐像素加法进行计算,前者连接输入与输出,后者在不同网络层之间进行连接。

1.6.2 Recursive Learning

模块设计的主要目的是:减少网络的参数量以及实现更大的感受野。具体做法是:将递归引入模型,多次使用相同权重的模块,这些模块之间是参数共享的。

DRCN采用16次单卷积层递归,感受野达到41×41,远大于SRCNN的13×13,并且没有过多参数。

DRRN将残差块作为递归单元进行25次递归,性能优于17个残差块的baseline。

MemNet是基于记忆块而设计,记忆块由6个recursive ResBlock组成,每个递归的输出拼起来,再经过一个额外的1×1卷积进行记忆和遗忘。CARN也采用了包含多个残差块的递归单元。

CARN也使用了相似的几个ResBlock作为递归单元。

递归学习在不引入额外参数的情况下学习到更先进的表示,但并没有带来计算量的减少,同时ye也带来了梯度消失和梯度爆炸的问题。因此通常将残差学习和递归学习结合来缓解这些问题。

1.6.3 Attention Mechanism

在带有Attention Mechanism的block中,feature map的每个channel通过Global Average Pooling变成一个值,再经过2个FC层变成一个scale factor,与这个feature map相乘。

更进一步,Non-Local Attention是针对超分网络中感受野较小的问题,为了capture the long-range dependencies between pixels。具体使用一个主干分支提取特征,和一个non-local的mask分支与主干分支作用 (相乘)。local分支通常是个encoder-decoder的结构,输出作为attention使用。non-local的mask分支通过Gaussian Function或Embedded Gaussian Function(如下)来计算特征图中任意2个位置之间的pairwise relationships来输出scaling weights。如下图所示:

Non-local操作可以看成attention

  • Gaussian: $f(\mathbb{x}_i, \mathbb{x}_j)=e^{\mathbb{x}_i^T \cdot \mathbb{x}j}, \mathcal{C}(x)=\sum{\forall j} f(\mathbb{x}_i, \mathbb{x}_j)$
  • Embedded Gaussian: $f(\mathbb{x}_i, \mathbb{x}_j)=e^{\theta(\mathbb{x}_i)^T \cdot \phi(\mathbb{x}j)}, \mathcal{C}(x)=\sum{\forall j} f(\mathbb{x}_i, \mathbb{x}_j)$,其中 $\theta(xi)=W{\theta}x_i$ 和 $\phi(xi)=W{\phi}x_i$ 为两个embedding。

1.6.4 Dense Connections

密集连接有助于缓解梯度消失、增强信号传播和鼓励特征重用。通过采用小增长率(growth rate,即密集块中的信道数)和在级联所有输入特征映射后对channel number进行压缩来极大程度地减少模型的大小。

1.6.5 Multi-path Learning

Multi-path Learning是指通过模型的多个路径传递特性,这些路径执行不同的操作,以提供更好的建模能力。具体来说,它可以分为以下3种类型:

Global Multi-path Learning:

全局多路径学习是指利用多个路径提取图像不同方面的特征。这些路径在传播过程中可以相互交叉,从而大大提高了特征提取的能力。

LapSRN

包含一种从粗到细预测子带残差的特征提取分支,以及信息重构分支用来重构HR图像。

同样,DSRN利用LR路径和HR路径分别在低维空间和高维空间中提取信息。这两条路径不断交换信息,进一步提高学习能力。

Local Multi-path Learning:

MSRN采用了一种新的多尺度特征提取块,如上图所示,在该块中,采用核大小为3×3和5×5的两个卷积运算同时提取特征,然后将输出拼接起来,再次进行相同的运算,最后再进行一个额外的1×1卷积。skip-connection通过elementwise加法连接输入和输出。通过这种局部多路径学习,SR模型可以更好地从多个尺度提取图像特征,进一步提高性能。

Scale-specific Multi-path Learning:

考虑到Local Multi-path Learning要经过相同的特征提取环节,后人直接在不同尺度上使用相同的特征提取过程,它们共享模型的主要部分。不同尺度的操作的区别在于一开始的pre-processing环节和最后的上采样环节,换句话讲,在网络的开始端和结束端分别附加特定尺度的预处理路径和上采样路径。训练时,只启用和更新所选比例对应的路径。通过这种方式,大多数参数可以在不同的尺度上共享。

通过这种方式,MDSR通过共享不同scale的参数极大地减少了模型参数,同时获得了single scale相似的性能。

1.6.6 Advanced Convolution

Dilated Convolution. 空洞卷积: 增大感受野,有助于生成逼真的细节

Group Convolution:分组卷积: 可以在little performance loss的情况下减少大量的参数和运算,而CARN-M在性能损失很小的情况下将参数数量减少了5倍,运算减少了4倍。

1.6.8 Pyramid Pooling

受空间金字塔池层的激励,提出了金字塔池模块,以更好地利用全局和局部上下文信息。

Pyramid的思路就是把不同size的feature concat在一起。对于尺寸是 $h\times w\times c$ 的feature map,每个channel被划分成 $M\times M$ 块并通过GAP全局池化,生成 $M\times M\times c$ 的结果。再通过 $1\times1$ 卷积把输出压缩为single channel。之后,再经过双线性插值把结果进行上采样到原来feature map的维度。当 $M$ 变化时,模块结合全局和局部的上下文信息以提升性能。

1.7 常见的损失函数

损失函数用来测量生成的高分辨率图像与ground truth高分辨率图像之间的差异。然后用这个差(误差)来优化监督学习模型。早起研究人员使用pixel-wise的 $L_2$ 损失,但后来发来不能准确地评估损失。因此出现了损失函数的改进:

  • Pixel Loss:

$$
L{pixel{l1}}(I,\hat I)=\frac{1}{hwc}\sum{i,j,k}|{\hat I{i,j,k}- I_{i,j,k}}|\tag{16}
$$

$$
L{pixel{l2}}(I,\hat I)=\frac{1}{hwc}\sum{i,j,k}({\hat I{i,j,k}- I_{i,j,k}})^2\tag{17}
$$

  • Content Loss:希望生成的图片从视觉上看更像是真实的图片

$$
L_{content}(\hat I,I,\phi,l)=\frac{1}{h_lw_lcl}\sqrt{\sum{i,j,k}{(\phi{i,j,k}^{(l)}(\hat I))-(\phi{i,j,k}^{(l)}(I))^2}}\tag{18}
$$

$\phi$ 是特征提取网络,往往是分类网络,用来提取网络的高维特征。

content loss代表2副图像高维特征之间的欧氏距离。它把分类网络引入超分中,不再关注pixel之间的匹配,而是使生成的图片从视觉上看更像是真实的图片。

  • Texture Loss:希望重构的图片与原图有相同的风格

使用不同feature channel之间的相关性correlation来衡量。设feature map有 $c_l$ 个channel,则:先使用19式计算Gram矩阵,这个矩阵的维度是 $c_l\times c_l$ 的:

$$
G_{ij}^{(l)}(I)=vec(\phi_i^{(l)}(I))\cdot vec(\phi_j^{(l)}(I))\tag{19}
$$

这里的 $\phi_i^{(l)}(I)$ 指的是第 $l$ 层的第 $i$ 个channel。

$$
L_{texture}(\hat I,I,\phi,l)=\frac{1}{cl^2}\sqrt{\sum{i,j,k}{(G{i,j}^{(l)}(\hat I))-(G{i,j}^{(l)}(I))^2}}\tag{20}
$$

  • Total Variation Loss:希望生成1的图片更平滑

利用Total Variation (TV)损失抑制生成图像中的噪声。它取相邻像素之间的绝对差值之和,并测量图像中有多少噪声。对于生成的图像,TV loss计算如下:

$$
L{TV}(\hat I)=\frac{1}{hwc}\sqrt{\sum{i,j,k}{(\hat I{i,j+1,k}-\hat I{i,j,k})^2 + (\hat I{i,j,k+1}-\hat I{i,j,k})^2}}\tag{21}
$$

这里, $i,j,k$ 分别对高度,宽度和通道进行迭代。

  • Adversarial Loss:希望重构的图片与原图有相同的风格

基于GAN的超分网络的损失函数,我们一般把超分模型作为生成器,并且额外定义一个判别器来评价图像是不是真实的。SRGAN的GAN Loss是:

$$
L_{gan_ce_g}(\hat I; D)=-\log D(\hat I)\tag{22}
$$

$$
L_{gan_ce_d}(\hat I,I_s; D)=-\log D(I_s)-\log(1-D(\hat I))\tag{23}
$$

其中, $L{gan_ce_g}$ 和 $L{gan_ce_d}$ 分别代表生成器和判别器的损失函数。

后人将其改进为least square error:

$$
L_{gan_ce_g}(\hat I; D)=(D(\hat I)-1)^2\tag{24}
$$

$$
L_{gan_ce_d}(\hat I,I_s; D)=(D(I_s)-1)^2+(D(\hat I))^2\tag{25}
$$

ESRGAN进一步使用了:relativistic GAN作为GAN Loss:

C为判别器的输出, $\sigma$ 是sigmoid函数,ESRGAN取得不是判别器的输出,而是输出的相对值Ra。

$$
LD^{Ra}=-E{xr}[\log(D{Ra}(x_r,xf))]-E{xf}[\log(1-D{Ra}(x_f,x_r))]\tag{26}
$$

$$
LG^{Ra}=-E{xr}[\log(1-D{Ra}(x_r,xf))]-E{xf}[\log(D{Ra}(x_f,x_r))]\tag{28}
$$

值得注意的是尽管使用GAN Loss和content Loss的PSNR不如使用Pixel Loss的结果,但是这样做的生成图片的视觉效果会更优。

上面我们对超分任务进行了一个简单的综述,因为渐进式上采样的方法与其他方法在效果,实现难度上相比最优,所以在超分领域应用最为广泛。因此本文重点关注的是Progressive upsampling的工作,也就是对应上文的1.4的第3类方法。

2 渐进式方法1:Laplacian金字塔超分辨率网络

TPAMI 2018: Fast and accurate image super-resolution with deep laplacian pyramid networks (Ming-Hsuan Yang团队)

贡献:Laplacian金字塔超分辨率网络(LapSRN):

  • 在多个金字塔级别上逐步重建高分辨率图像的子带残差。
  • 利用recursive layer在金字塔级别之间和内部共享参数,从而大大减少了参数的数量。

这篇工作(MS-LapSRN)与作者之前的Deep Laplacian Pyramid Networks(LapSRN)相比,为了使结果进一步提升,作者加了3点改进,下文都会一一介绍:

  • Parameter sharing
  • Local skip connections
  • Multi-scale training

详细解读:

图5:Laplacian金字塔超分辨率网络(LapSRN)

模型由2部分组成,特征抽取分支图像重构分支

  • 特征抽取分支:

图6:特征抽取分支

就是一堆用来提特征的CNN网络的级联; 应用转置卷积层来进行上采样,后面再跟上卷积层来预测子带残差(上采样图片和GT之间的差异)。注意这里解释一下子带的含义,带其实是频带的意思,超分网络预测的其实是上采样图片和对应大小的GT之间的差异,而这个差异从低频到高频都有,每个频段都有,所以说超分网络模型其实是逐步地去预测这些差异的,具体来说就是浅层预测的是差异的低频部分,而深层预测的是差异的高频部分。

下面详细看下特征抽取分支的结构:

首先是一个卷积层 $Conv_{in}$ ,它的作用是把三维的输入转化为一个高维的特征。

接下来进入循环,循环的次数为 $\text{log}_{2}S$ , $S$ 是放大倍数。

Feature embedding的作用是上采样之前的特征提取。

然后是转置卷积,即图中的Feature Upsampling,用来上采样,每次上采样2倍。

然后是转置卷积之后的卷积层 $Conv_{res}$ ,它的作用就是之前讲到的预测上采样图片和对应大小的GT之间的差异

问: Feature embedding的结构是什么?

答: 在Deep Laplacian Pyramid Networks for Fast and Accurate Super-Resolution这篇工作中,作者使用的是CNN的堆叠。但是这样做的坏处是显而易见的:即参数的数量会随着上采样的数量成比例增长,所以作者使用了2种办法解决这个问题:

第1个办法:共享参数于不同尺度之间: 就是图6中的红色剪头,表示这些层都是共享参数的,以减少网络的Params。

第2个办法:共享参数于同一尺度内部: 比如说在scale=4的这个阶段,Feature embedding应该由一堆Conv layers堆叠而成,可是还是那个问题:参数量太大。所以作者想到了Deep recursive layers来增加深度的同时而不增加参数量。

谈道Deep recursive layers就不得不说:DRCN和DRRN这2篇工作,上面有全称。

图7:DRCN

图8:DRRN

DRCN和DRRN的结构分别如图7和图8所示:

为了节约参数量,DRCN(图7,图8.c)堆叠了16个conv,这些conv是参数共享的,之后再把它们的输出值连同Input信息整合在一起。这么做虽说节约了参数,可是也占用了大量的显存,而且前向传播过程很慢。

DRRN(图8.d)直接共享Block的参数,一个Block是2个conv,128个filter。identity分支都来自first block的输出,如此多的残差连接很好地解决了梯度消失和梯度爆炸的问题,因为梯度在反向传播时存在多个路径。

作者实际在共享参数时,采用的是DRCN的做法:我们一起来计算下LapSRN的深度是多少。

图9:Recursive Block的结构

我们假设每个Feature embedding块有 $R$ 个Recursive Block,每个Recursive Block有 $D$ 个卷积层,超分的倍数是 $L=\text{log}_{2}S$ ,则LapSRN的深度是:

$$
depth=(D\times R+1)\times L+2\tag{1}
$$

式中, $1$ 代表上采样的转置卷积, $2$ 代表 $Conv_{in}$ 和最后一层卷积。

你可能会问为什么 $Conv_{res}$ 没有计算,因为它不在网络的path中,所以不计算深度。

对于Local skip connections的问题,作者试验了以下3种方式:

图10:Local skip connections的3种方式

注意:LapSRN依旧使用的是pre-activation和without BatchNormalization。

  • 图像重构分支:

由 $\text{log}_{2}S$ 个阶段组成,每个阶段的输入首先上采样,采样的方式是转置卷积。

上采样的图像预测的残差图像相加(element-wise addition),以生成高分辨率输出图像。作为下个阶段的输入图像。

图像重构分支,就是图5下面绿色框中的部分。我们站在作者的角度想想是怎么设计的:首先浅层网络预测了上采样的图片和对应大小的GT之间的残差的低频部分,那么为了更好地逼近对应大小的GT,你得到的残差就应该加上上采样的图片。所以我们看到图像重构分支的add操作,如下图11所示:

图11:图像重构分支的add操作

  • 损失函数:

对于损失函数这方面,作者并没有使用 $L_2$ 损失,因为它会使得超分结果过度平滑且视觉感知质量差。所以这里作者使用了Charbonnier损失函数:

Charbonnier Loss的表达式如下所示:

$$
Charbonnier_Loss=\sqrt{x^2+\epsilon^2}\tag{2}
$$

损失函数定义为:

$$
LS(y,\hat y;\theta)=\frac{1}{N}\sum{i=1}^{N}\sum_{l=1}^{L}{\rho(y_l^{(i)}-\hat yl^{(i)})}=\frac{1}{N}\sum{i=1}^{N}\sum_{l=1}^{L}{\rho(y_l^{(i)}-x_l^{(i)}-\hat r_l^{(i)})}\tag{3}
$$

式中, $L=\text{log}_{2}S$ 表示超分的倍数, $\rho$ 表示Charbonnier Loss。 $\hat y_l=x_l+\hat r_l$ 表示放大 $l$ 倍的输出。 $y_l$ 为放大 $l$ 倍的GT,是真值 $y$ 通过下采样得到的。

还使用了multi-scale的训练方法:

$$
L(y,\hat y;\theta)=\sum_{S={2,4,8}}^{}L_S(y,\hat y;\theta)\tag{4}
$$

  • 对比实验:

1 模型设计对比:

图12:模型设计对比实验

Pyramid structure: 作者对比了去除金字塔结构但保留Global Residual learning。结果如棕色曲线所示,性能变差许多。

Global Residual learning: 作者对比了去除全局残差连接的模型。结果如蓝色曲线所示,发现收敛缓慢,并且在训练期间波动很大。

$L_2$ 损失函数: 作者对比了使用$L_2$ 损失函数的模型。结果如绿色曲线所示。

multi-scale training: 作者对比了不使用多重损失函数来监督每个金字塔级别的中间输出,结果如下图13所示:

图13:没有多尺度监督的模型不能很好地减少空间混叠伪影

2 参数共享对比:

图14:参数共享的对比实验结果

作者比较了不同尺度之间的共享参数同一尺度下的共享参数的效果

LapSRN-D10R1(Recursive=1, conv=10)代表不在不同尺度之间的共享参数,也不在同一尺度下共享参数。

LapSRN-D5R2(Recursive=2, conv=5)代表不在不同尺度之间的共享参数,但在同一尺度下的2个Recursive Block之间共享参数。

LapSRN-D2R5(Recursive=5, conv=2)代表不在不同尺度之间的共享参数,但在同一尺度下的5个Recursive Block之间共享参数。

3 更深的模型对比:

使用不同的local residual learning方式的结果: 注意这里local residual learning方式指的就是上文描述的No Skip-connection,Distinct Source Skip-connection和Shared Source Skip-connection。

图15:使用不同的local residual learning方式的结果

作者发现Shared Source local Skip-connection 方法取得了最好的效果。

$D$ 和 $R$ 数量的影响: 前文提到 $R$ 代表的是Recursive Block的数量,$D$代表的是每个Recursive Block中的卷积层数量。不同的Recursive Block之间的参数是共享的。

图16:不同D和R数量对结果的影响

如上图16所示为不同D和R数量对结果的影响,全部使用的是shared source skip connection,可视化的结果如图17所示,发现 $D5R8$ 的performance是最优的。

图17:不同D和R数量对结果的影响

3 渐进式方法2:ProSR:完全渐进式超分辨率网络

CVPR 2018: A Fully Progressive Approach to Single-Image Super-Resolution

贡献:ProGANSR:多尺度渐进式的单图像超分辨率(SISR)方法。

  • 在2018年的SISR挑战赛中,ProSR在SSIM方面排名第2,在PSNR方面排名第4。
  • 运行速度比Top-ranking模型快5倍。

与LapSRN模型的区别:

  • 区别1:Asymmetric Pyramid Structure

在LapSRN模型中,一张低分辨率的图是逐渐地超分到高分辨率的。比如要超分8倍,那么就分成3个阶段,每个阶段执行的动作是一致的,都是首先通过Feature embedding这个模块进行特征提取,然后通过Feature Upsampling这个模块进行上采样一次,最后跟一个卷积层 $Conv_{res}$ 得到与对应维度真值之间的残差。

在LapSRN模型模型中,3个Feature embedding,3个Feature Upsampling,3个 $Conv_{res}$ 是共享参数的,它们的网络结构是一致的。

我们称上述这种结构为symmetric pyramid structure。

可是,每个超分level上完全一致的结构一定是次优的。我们直觉上认为,当特征level比较低时( $\times2$ ),Feature embedding应该具备更深的结构;当特征level比较高时( $\times8$ ),Feature embedding应该具备更浅的结构。这样做一方面可以节约计算量,另一方面有利于增加原图的receptive field,提升图片的质量

我们称上述这种结构为asymmetric pyramid structure,如下图18所示:

图18:Asymmetric pyramidal architecture

另一个Laplacian Pyramid SR 网络和ProSR的主要区别是:Lap-SRN使用得到的中间结果(intermediate reconstructed images)作为后续模块的输入,比如我想把一张图片放大8倍,那么Lap-SRN会先用特征提取分支图像重构分支把图片放大2倍,接着放大2倍之后的图片再经过相似的操作到4倍,再到8倍;而ProSR有一条主线(就是图18中的浅橘红色结构),这条主线代表的是残差信息,注意这个残差信息是不同scale factor的, 即可以是×2,×4,×8的残差信息。它靠的是各个独立的individual head(图18中下方的蓝色结构)来重构中间结果(intermediate-resolution images)。

  • 区别2:标签

这个模型与LapSRN不一样的地方除了Feature embedding深度不一致以外,训练方式也有一些差别:

在LapSRN中,我们把HR(GT)进行下采样,得到相应维度的真值,作为标签参与训练。这样,对于一个 $\times8$ 的超分网络来讲,我们就有3个标签来训练。但是这篇工作作者并没有这样做,只用了HR image作为单标签。原因是这样能够简化反向传播的过程,降低训练难度。

  • 区别3:Dense Compression Units

作者在每个Feature embedding里面使用的是Dense Compression Units(DCU)而不是原来的RDB。

原始的Dense Layer的组成是:

$$
BN-ReLU-Conv1\times1-BN-ReLU-Conv3\times3
$$

这里先去掉Batch Normalization和第一层ReLU,得到:

$$
Conv1\times1-ReLU-Conv3\times3
$$

  • 区别4:GAN的训练方法

图19:ProGAN的生成器\(Top\)与判别器\(Bottom\)的结构

如图19所示为ProGAN的Generator和Discriminator的具体结构,注意 $R_2(x)$ 指的是生成器输出的残差,注意只是残差,模型得到的结果应该是:

$$
\hat y=R_2(x)+\varphi_2(x)\tag{5}
$$

这里 $\varphi_2(x)$ 指的是LR经过2次双三次插值的结果。

那么在判别器Discriminator中,以残差 $R_2(x)$ 作为输入,利用 $AvgPool$ 进行下采样,最后Discriminator会输出一个Patch,类似于PatchGAN的操作。

这里作者解释了为什么要以残差 $R_2(x)$ 作为输入,而不是 $\hat y$ 作为输入?

答: 因为以残差 $R_2(x)$ 作为输入,使得Generator和Discriminator真正去学习那些插值后的图片和GT之间的差异。这些差异没能很好地被Upsampling层(即转置卷积)所学习到。反之,如果你是 $\hat y$ 作为输入,那么你的Generator要拟合的数据将会加上一个data-dependent baseline,学习难度更大。

除了输入的不同之外,在GAN的损失函数方面,作者使用了Least Square Loss以取代Cross Entropy Loss,所以Discriminator的损失函数可以写成:

$$
L_{D_s}^{i}=(D_s(\hat r_i^s))^2+(D_s(r_i^s)-1)^2\tag{6}
$$

Generator的损失函数可以写成:

$$
L_{R_s}^{i}=(D_s(\hat ri^s)-1)^2+\sum{k\in\left{ 2,4 \right}}^{}{||\Phi_k(\hat y_i)-\Phi_k(y_i)||^2}\tag{7}
$$

其中 $\Phi_k$ 表示VGG16的第 $k$ 个池化层,这里是Perceptual Loss。

  • 区别5:Curriculum Learning

Curriculum Learning是通过逐渐增加学习任务的难度来提高培训的策略。它通常用于序列预测任务和序列决策问题,在这些问题中可以获得训练时间的大幅加速和泛化性能的提高。

具体是先训练 $\times2$ 的超分网络,当训练好以后,如果还想训练 $\times4$ 的超分网络,就在原来的Generator的基础上加上一个Pyramid,将它的输出与原来Pyramid的输出线性组合,得到$\times4$ 的超分网络Generator的输出。

与LapSRN的简单的多尺度训练相比,这种渐进的训练策略大大缩短了总的训练时间。此外,产生了进一步的性能增益,并减轻了GAN训练中的不稳定性。

对比实验:

图20:不同方法的作用

第2行:Dense Compression Units数量的对比: 证明了DCU数量的增加可以在不影响PSNR的前提下显著降低模型的参数。

第3行:Asymmetric Pyramid Structure的对比:

这里 $D$ 就是Dense Compression Units, $S$ 就是UpSampling Layer,显然后者使用了Asymmetric Pyramid Structure,PSNR得到了提升。

第4行:Curriculum Learning的对比:

下图21为对比试验的结果,Curriculum Learning对于放大倍数比较高的任务效果更好。 对于放大倍数比较低的任务效果不好,甚至是负面的影响。

图21:Curriculum Learning的对比

与LapSRN的multi-scale training训练方式结果的对比:

我们之前提到LapSRN采用的是multi-scale training,loss取在所有的scale上面。表达式可以写作:

式中, $ \Psi_{s^{'}} $ 指的是把真值下采样 $s^{'}$ 后的结果,且有:

$$
\hat y^s=\hat r^s+\varphi_2(\hat y^{s-1})\tag{9}
$$

这里 $\varphi_2$ 是上采样操作。

结果如下图22所示,使用LapSRN的multi-scale training训练方式会使PSNR变差。

图22:multi-scale training会降低PSNR

总结

Progressive upsampling Super-resolution的基本思想主要是2点:

  • Feature embedding与UpSampling交替进行。
  • 主干网络输出的是残差,与插值结果进行相加操作得到最终的输出结果。

至于模型的训练方式,可以使用Curriculum Learning,也可以使用multi-scale training,取决于任务。

至于Feature embedding的结构,可以使用Recursive Residual Block,也可以使用Dense Compression Units。

无论模型如何设计,都要遵循上述基本思想。

参考文献:

[1] TPAMI 2018:Fast and accurate image super-resolution with deep laplacian pyramid networks (Ming-Hsuan Yang团队)

[2] CVPR 2018:A Fully Progressive Approach to Single-Image Super-Resolution

[3] TPAMI 2020:Deep Learning for Image Super-resolution: A Survey

微信公众号: 极市平台(ID: extrememart )
每天推送最新CV干货