Energy-efficient Amortized Inference with Cascaded Deep Classifiers论文笔记
0. 概述
深度神经网络在许多AI任务中取得了卓越的成功, 但是通常会造成高的计算量和能量耗费, 对于某些能量有约束的应用, 例如移动传感器等.
我们提出了一种新的框架来, 该框架能够同时优化预测准确度以及能量耗费, 利用该框架来解决以上这个问题. 虽然该方法在测试阶段会有部分耗费和准确度的交换. 在该框架中, 每一个数据实例被推入到一个级联的深度神经网络, 伴随着增长着的大小, 接着一个选择模块用来进而确定什么时候一个足够精确度的分类器能被用到这个数据实例上.
神经网络的级联和选择模块端到端共同进行训练, 使用增强算法来优化交换计算成本和预测准确性. 该方法能够同时提高准确度和效率, 通过学习去分配简单的实例来加速分类器到达足够的准确度, 进而节省结算成本和能量耗费, 同时分配复杂实例给更深的和更强力的分类器来保证令人满意的准确性.
在大量不同数据集的实验下, 使用级联的ResNet分类器, 我们证明我们的方法比标准的训练好的ResNets要表现出色, 并且只需要少于20%和50%的FLOPs耗费在CIFAR-10/100数据集上, 和66%的ImageNet的数据集上.
FLOPS 为每秒的浮点运算次数(float-point operations per second)
1. 介绍
在这篇文章中, 我们关注于测试阶段的关于图像分类器的能量-效率推断, 传统的方法通常基于为了速度直接降低准确率, 举个例子, 通过减少或者压缩训练好的复杂的神经网络, 以准确率的损失作为代价.
注意到, 准确度和代价可以被同时提高, 并且并不需要去降低其中任意一者, 这是由于虽然更深更为复杂的神经网络通常有更高的全准确度, 这些图片的很大一部分可以使用更小的更为简单的网络被准确地区分出来, 而更大的神经网络只是在解决复杂图片上是必要的. 因此, 该文章的方法用不同的复杂度联合训练整体的神经网络, 和选择模块一起, 选择模块能够自适应地分配每一张图像到能够足以生成高质量的Label的最小的的神经网络.
不想传统的学习方法去利用一个恒定的计算误差, 该文的方法是学习去预测准确和快速. 通过训练和使用决策模块, 我们的框架给出一种高效的摊还策略, 这可以在测试阶段大量的减少计算和资源消耗, 甚至可以提升预测的性能.
从技术层面上来说, 该文设计神经分类器的训练和选择模块到一个联合的优化中, 该优化为训练准确度和一个期望的计算代价作为约束(参考FLOPs代价), 该文设计一个决策模块为一个优化停止过程(optimal stopping process), 该过程可以顺序测试大小不断增大的级联的神经分类器(并且增强预测的准确性), 并且对于给定的图片停止优化准确性和复杂度的交换的分类器. 联合训练是表现在端到端的, 使用强化算法来优化一个在计算代价(FLOPs)和预测准确性之间的交换作为一个反馈信号.
在CIFAR和ImageNet的分类数据集上进行测试, 使用一个级联的ResNet分类器, 正如所期望的, 在CIFAR数据集上, 大多数的图片都被分配到了更小的网络, 这些小的网络足以成功进行预测, 当然存在复杂的图片被分配到了更大和更强力的网络. 几乎一半的图片被分配到了更小的网络在ImageNet上面.
2. 相关工作
现存有很多方法来提升深度神经网络的能量效率, 大多数这样的工作关注于简化神经网络结构并且(或)数值方面提高基础卷积操作, MobileNet使用深度可分离卷积来建立一个轻量权重的神经网络, ShuffleNet使用点长集合卷积和通道的洗牌操作来建立一个高效的结构, 其他的技术包括连接的修剪(Han, Mao 2015)和瓶颈结构(Iandola et al. 2016), 在静态的技术之外还有, 比如动态容量网络(Dynamic Capacity Network), 自适应地分配容量针对输入数据的不同部分, 通过使用一个低和一个高容量的子网络, 螺旋自适应计算时间网络(Spatially Adaptive Computation Time Networks), 针对图像的区域动态调整执行层的数目. 任意时神经网络(Anytime Neural Networks)能够生成任意时的预测通过最小化一个精巧的带权值的误差和. 其他的考虑了级联分类器在目标检测中快速地拒绝更进一步, 如果能够简单判断的情况下. 条件计算(Conditional computation)和自适应计算提出来了调整计算的数量通过使用一种选择数据的策略, 许多这样的静态和动态的技术被用于标准的深度结构之中, 比如ResNet和Inception, 通常伴随着准确性的误差.和这些静态和动态的方法不同, 该文的方法明确地公式化测试时效率作为一个摊还约束的顺序决策问题, 使得期望的计算误差, 比如说FLOPs, 能够被大幅度地减少, 通过自适应分配训练样本给他们最好的分类器来提高准确性.
3. 方法
3.1 级联分类器的能量约束推理
分类器, 比如神经网络, 通常伴随着深度和结构的复杂度的提高是更加准确的, 然而, 复杂网络的更高的计算和资源的代价会很快变高, 特别是实时的推理在应用于移动设备的时候. 如果我们有一个级联的分类器, 它们大小不同, 选择一个更小的分类器是可能的. 进而对于输入的数据足够强力的分类器来既实现效率又实现准确性. 这引出了一个主要的问题:
给定一个级联的神经分类器, 它们有不同的准确性和效率, 如何去通过一个有效的选择技术来联合训练它们, 进而分配每一个数据实例到分类器中, 该分类器最适合交换准确性和代价
特别地, 假设我们有K个分类器和不同的资源代价, 资源代价被假设为和分类器的预测容量相关联, 并且可能就是预测容量. 举个例子:
FLOPs的一个规范化的值或者神经网络分类器中层的数目, 给定一个输入, 我们记是真正的样本标签, 是分类器预测的Label, 此外, 我们记是一个随机化的策略, 它决定着分配输入给分类器的概率, 我们的目标是联合训练所有的分类器以及策略来在约束之下最小化期望的误差函数, 使得期望的资源代价应该不能够大于一个期望的代价, 即:
上式中, 是分配给x的随机的分类器ID, 更进一步, 我们能够重新定义约束的优化变为一个处罚代价函数的非约束的优化
其中控制着在预测误差函数和资源代价之间的交换, 当这两种形式是二元等价的 情况下有一个显式的一对一的映射在budget约束和处罚参数, 将会使用这个惩罚形式在文章的实验中.
3.2 通过优化停止进行能量效率推断
这里主要是选择模块的设计, 需要两个要求:
- 能够访问并且有效地利用分类器的信息来做一些推理性的决策
- 必须是计算高效的, 举个例子, 至少防止暴力地去估计所有的个分类器并且选择最大置信的一个.
该文解决了这一个挑战, 通过制定变为一个步的最优停止过程(optimal stopping process), 对于每一个时间步, 介绍了一个停止策略模块, 当我们决定停止第个分类器并且使用它作为对于输入最后的预测器, 使用了和分类器相关联的特征, 并且输出一个停止概率, 否则, 将会移动到一个更深的分类器并且重复相同的步骤, 直到它到达最深的一个.
利用这种方法, 选择第个分类器的全概率为:
假设我们最后在第个分类器时停止, agent将会收到一个反馈, 该反馈包含两个部分:
- 使用该已选择的分类器的所预测的损失函数, 即, 其中
- 从第一个分类开始累计的资源消耗, 即.
实际上, 我们也包括累计的停止策略对于相应的的计算代价, 重要的是, 一旦我们在个分类器处停止, 我们便不再运行比更加"昂贵"的分类器了, 这极大地节省了计算资源.
在此之上, 我们定义反馈的信号:
重述一遍, 我们的决策模块被设计成Markov决策过程, 包含以下部分:
- 观测:
停止的概率为, 在步依赖于特征, 这个特征应该可以表达第个分类器, 在本文中, 我们简单地使用输出概率作为观测在每一个时间步, 即, - 动作:
基于当前分类器的输出概率, 我们的停止策略模块决定在当前时间步以概率, 如果它最终在步停止, 我们使用当前模型来预测Label, 即, - 反馈:
在最终在某个分类器停止, agent将会收到一个反馈信号, 信号正如上述表述, 包括一个负的损失函数来进行预测, 以及从第一个时间步的累积的能量耗费, 在本文中, 我们使用规范化的FLOPs计数作为耗费.
假设停止概率是和分类器被参数化为, 我们的最终目标是去找到最优的来最大化期望的返回, 通过展开这个通过整个的策略的条件分布:
3.3 利用强化学习
为了解决最优停止问题, 使用为人熟知的强化算法((Williams 1992), 通过利用当前的参数和策略梯度的导数来推出每一个独立的sample, 按以下形式:
更进一步, 引入一个baseline----, 用这个baseline去减少所估计的策略梯度的变化, 变为以下的梯度估计:
是用来在训练数据的mini-batch上来最小化梯度估计器的变化
整理一下当前的内容
现在我们知道了整个模型的大致架构, 流程是这样的:
- 首先是图片的输入, 传到当前的分类器, 并且得到结果
- 接着将结果(这里所指的结果应该是Label probability, 也就是每一个标签的概率, 参考softmax)传到Agent
- Agent负责分析是否在当前分类器停止, 通过某种策略模块
- 如果不停止, 则向下一个分类器传图片
- 如果停止, 则利用当前分类器作为预测方法, 和真实的Label进行比对得到反馈(Reword), 反馈包括使用当前分类来预测的误差以及从第一个分类器开始累积的资源消耗
什么时候停止则引出了决策模块的设计, 决策模块被设计成去最大化一个期望, 这个期望由概率乘上一个反馈, 由于反馈是一个负数, 如果期望越大, 那么误差越小, 资源代价越小.
引出一个估计梯度来对期望进行优化, 这里借用了Williams的强化学习算法, 故需要补充.
关于Williams的强化学习算法
这里简单介绍一下, 具有以下形式的学习算法统称强化算法
其中是学习率, 是强化的baseline, , 被称为的特性资格(characteristic eligibility), 是一个概率质量函数
质量函数的数学定义为, 假设是一个定义在可数样本空间上的离散随机变量 ,则其概率质量函数 为
3.4 利用ResNet来构造级联分类器
该文所使用的ResNet架构为:
- 开始的两层是一个卷积层和一个池化层, 步幅stride是4, 对于一些小图片, 比如说CIFAR-10和CIFAR-100来说, 可以只用一个卷积层, stride是1
- 接着是一系列的块的堆叠, 对于每一个块, 都有不同的单元数目, 并且每一个残差单元使用残差学习, 形式为其中叫做跳接流, 为残差函数, 该文所使用的残差函数为标准残差, 在小输入场景和不怎么深的网络下经常被使用, 它包括两个3x3的卷积层, 输入和输出的通道(channel)是一样的, 最后, 末尾的单元将会传到一个全局的平均池化层和一个全连接层用于获得分类的概率, 对于每一个卷积层, 使用的是一个batch normalization layer和一个RelU的非线性单元. 在每一块后, 特征图的大小将会减半, 并且滤波器将会加倍, 遵循的是Very Deep Network的设计(Simonyan 2014), 这样保证每一个单元有相同计算代价.
4 实现和实验设置
4.1 数据集
数据集使用的是CIFAR-10/100以及ImgaeNet的32x32, 这三个数据集都是RGB的彩色图片, CIFAR-10和CIFAR-100都有50000张训练图片和10000张测试图片, 相应的对应10类和100类, ImageNet32x32是ImageNet的降采样, 包含1000个类别和相同数量的图片(1200万的训练图片和50000张测试图片)
4.2 神经分类器的说明
为了构造一个级联的神经网络分类器, 我们使用ResNet架构的标准的设计来建立一个ResNet的序列, 对于深度是指数式的增长, 在级联之中, 每一个ResNet都是由一个3x3的卷积层开始, 16个滤波器, 接着是3个残差单元的块, 每一个单元包含2个3x3的卷积层, 第二和第三个单元滤波器的数量都会加倍, 特征图的大小对于第一个单元来说会减半.
每一个块设置的单元数目设置为1,3,5,9,18来建立一个ResNet的序列, 相应地对应8, 20, 32, 56, 110层
如上图所示, 一共有三个块, 第一个块肯定是2个卷积层, 第二和第三块的卷积层数目就对应着CIFAR里面的Unit Number
比如[1,1,1]就对应着一个块里面有三层卷积层, 故总的层数为2+3*2=8
关于Imgae32x32的数据集, 使用宽度乘子, 借用Wide-ResNet(Zagoruyko and Komodakis 2016)来增加每一个独立的分类器的容量, 通过更改其滤波器的个数来实现, 这里设置宽度乘子分别为1, 1.5, 2, 3, 4, 卷积层的数目为40, 使得ResNet分类器的容量或者说是FLOPs以近乎指数进行增长, 注意到这样的设置更适应于高度差异性的ImageNet.
这里我们的设计保证级联的神经网络的深度(因此决定复杂度)指数增长, 这就使得我们不用浪费重要的计算资源在测试更小的网络上面, 更具体一点, 假设网络分类器的计算资源消耗是, 其中, 我们可以计算出当停止在第k个分类器的时候总共的代价为, 即上界是和的乘积, 就相当于你直接选了第个分类器.
4.3 策略模块说明
这个停止决策模块使用3个全连接的层构造起来, 针对CIFAR-10和CIFAR-100数据集, 使用64个隐藏神经元
对于Image32x32数据集使用256个神经元, 每一个全连接层都使用ReLU的非线性单元(除了最后一层), 最后, 全连接层跟着softmax输出停止概率
这个模块的输入就是Label的概率, 也就是分类器分类结果的概率向量, 这个停止决策模块的计算消耗几乎微不足道, 0.01M的FLOPs, 我们注意到一些其他的特征, 比如首层的卷积滤波会增加停止策略模块的大量的计算消耗, 并且分类准确率很低.
4.4 其他的训练细节
在训练阶段, 我们在三个数据集接受标准的数据增大过程:
- 在图片的外侧填充4个零
- 随机裁剪32x32图片
- 随机从左到右翻转
对于所有的实验, 针对策略优化使用随机梯度下降(SGD), 动量设置为0.9, 学习率和mini-batch的大小和原始的ResNet设置成一样的, 决策模块的学习率设置成0.05, 在训练数据下通过内部交叉验证在每两步之间应用一个0.9的因子.