Deepshift论文翻译
DeepShift:迈向无乘神经网络
摘要
卷积神经网络(CNN)在移动设备环境中的部署面临高计算开销与功耗资源限制这一主要技术挑战。 卷积层与全连接层由于其对乘法操作的高度依赖,在计算资源消耗方面占据主导地位。 本研究提出了一种创新性的解决方案:即引入卷积移位与全连接移位运算以替代传统乘法操作。 这一方法将显著降低运算资源消耗的同时保证推理效率的需求。 在实际应用中,在CIFAR-10测试集上实现了92.33%的分类准确率,在ImageNet基准数据集上取得了令人满意的Top-1与Top-5准确度分别为65.63%及86.33%的理想成绩。 这种基于移位运算的设计思路在VGG16架构上的零初始化训练实验中表现稳定:尽管经过系统优化后,在ImageNet测试集上的Top-5准确度仅较原始模型提升不到0.3%,但显著降低了推理时间需求:相对于未经优化的传统乘法基线模型,在推理ResNet18架构时能实现约25%的时间节省效果。 此外我们还在多个主流CNN架构上进行了验证实验以全面评估该方法的有效性与适用性:其中一项重要发现是即使采用移位运算构建的基础模型也能在一定程度上保持原有的分类性能水平同时显著降低了能耗消耗指标表现优异的表现值得进一步关注与研究
介绍
深度神经网络在移动及物联网领域得到了广泛应用。 边缘设备通常具有低能耗水平及有限预算,并受到存储空间容量的限制。 需要注意的是,在卷积神经网络(CNN)中,数据传输量在内存与计算节点之间流动会对整体能源消耗产生显著影响。 进一步而言,在设备与云端的数据交互过程中(例如模型更新这类操作),模型体积可能会对连接费用产生一定的影响。 综上所述,在移动及物联网推理场景下实现模型优化、缩减体积、提升运算效率以及降低能耗已成为研究的重点方向。
正考虑采用多种策略以满足此目标
二进制XNOR技术在处理小型数据集(包括MNIST和CIFAR10)时展现出较高的准确率,在处理复杂的数据集合时则会带来较大的失真程度;另一方面,在Imagenet数据集上应用逐位移位技术所带来的精度损失相对较小
本文提出了一种创新方法,在CNN优化领域具有重要价值。具体而言,在计算效率与资源消耗之间寻求平衡时,我们采用位移型卷积及线性运算替代传统规则乘法卷积及全连接层(亦即矩阵乘法)。这种方法在元素级操作中等价于将数值乘以2的整数次幂。为了全面评估其性能优势,在实验部分我们与四种相关研究进行了对比:INQ [18]、LogNN [13]以及LogQuant [2]均采用了类似的技术路线——通过按位移位运算与符号翻转来实现权重计算。为了区别开来,在现有研究的基础上我们提出了两种新方法:DeepShift-Q与DeepShift-PS。值得注意的是,在权重表示策略上两者的区别在于:我们的方法直接训练二进制移位值(即2的幂),而INQ、LogNN和LogQuant则基于将32位浮点权重近似为2的幂次方进行处理。据我们所知,在现有研究中这是首次实现直接训练二进制移位值的技术创新成果。
本文做出了以下贡献:
我们开发了多样的技术手段用于训练DeepShift网络。具体而言,在每一步迭代中都需要进行精确地参数更新操作(请参阅第5节)。此外,在模型优化阶段我们采用了基于深度学习框架的新颖算法以提高收敛速度和准确性。
我们对每种训练方法进行了系列实验,并观察到了显著的效果提升。结果显示,在零初始化权值或加载全部预训练权重的情况下进行MNIST、CIFAR-10和Imagenet上的DeepShift网络的微调均取得了令人满意的性能表现。这些最新成果(请参阅第4节)展示了该方法的优势所在
我们设计了一种新型GPU内核,在其基础架构上融入了位移位运算优化策略。该内核支持DeepShift ResNet18架构的有效实现,并在实验测试中展现出显著性能优势——相比未经优化的基线ResNet18 GPU内核,在第5.1节所述实验结果中可观察到该新方案实现了推理时间缩短25%。
可以在GitHub开源仓库https://github.com/mostafaelhoushi/DeepShift上访问并获取使用两种不同的方法进行训练与运行DeepShift网络的源代码。
DeepShift网络
如图1所示,在本文的核心理念中采用了将乘法运算转换为更为高效的按位移位操作与符号翻转的方式进行处理。特别地,在二进制表示形式下当输入数据x被定义为基于整数或者定点格式时

位(其中

是整数)向左(或向右)的按位移位在数学上等同于乘以 2的正(或负)次幂:

为简单起见,如果

为正,我们将使用<<

隐式表示左移,如果

为负,我们将隐式表示右移。
按位移位只能等效于乘以正数,因为对于任何p的实数值,2±

0。
然而,在神经网络中的搜索空间内乘积必须等于负数值尤其是在卷积神经网络中包含正负值滤波器能够有效检测边缘因此我们需要进行符号翻转操作我们采用三元运算符该运算符具有三个元素:一个是原始的操作数另一个是其相反数第三个是零

与按位移位操作符类似的是一种叫做符号取反的操作符;这种操作具有较低的成本优势是因为它能够将数字表示为二进制形式后的数值并返回其补码形式。
我们提出了新型运算符LinearShift和Convolutional Shift,在前向传播过程中替换了传统的乘法操作,并通过按位移位操作以及符号翻转操作实现了高效的计算过程。具体而言,在权重矩阵W的应用场景下

还是卷积运算

,都将被移位矩阵

的逐元素乘积代替符号矩阵

。

在本节中, 我们将详细讲解两种训练DeepShift模型的不同方法: LinearShift运算符与ConvShift运算符. 其中, DeepShift-Q采用了一种特定策略, 而DeepShift PS则采用了另一种策略. 这两种方法均基于等式3来进行正向传播, 但在反向传播过程中存在差异, 同时, 在推导过程中也存在差异.

和

方面也有所不同。 图2总结了这两种方法。
Deepshift_Q
DeepShift-Q方法在训练时采用了与权重W相关的线性或卷积运算的标准训练方式;然而,在权值矩阵的正传与逆传过程中的每个元素都会被近似量化为最接近的幂次形式。


图1:(a)乘法运算和累加运算(MAC)是大多数神经网络的核心操作,在DeepShift架构中已被取代为基于按位移位和加减运算的设计。(b)该系统采用了原始线性运算器与其改进版移位线性运算器的对比分析。(c)通过比较原始卷积运算器与其优化版本的移位卷积运算器性能参数

图2:本文开发出了两种用于训练模型的算法:移位运算与取反操作。(a)基于深度移位的量子算法;(b)基于深度移位的相量算法。

因此,我们的LinearShift运算符的正向通过将为

,而我们的ConvShift运算符将为

。
向后传递的梯度可以表示为:

其中

该值代表输入至运算器的梯度(即损失函数L对运算体输出量C的导数)。

是输出到算子的梯度(模型的导数) 相对于操作员输入的损失)1,

是相对于操作员权重2的模型损失的导数。
由于

是W的四舍五入值,所以除W是2的幂的点外,所有点的微分

都为零。这意味着W在反向传播期间无法进行参数更新而导致无法进行学习或参数更新的问题。为此我们采用直通估算器(STE)[17]来解决这一问题。

因此,

设置为:

图2a总结了DeepShift-Q的前进和后退过程。
Deepshift_PS
另一方面,DeepShift-PS直接使用shift P和符号翻转S作为可训练参数:

请注意,符号翻转矩阵

该定义表明该变量属于三元状态而非二元状态;由于在矩阵中每个元素都有三种可能取值

其中s是矩阵S的元素,而

是

的元素。
向后传递的梯度可以表示为:

我们使用直通估计量来设置

和

。要评估,

,我们使用以下推导,将符号运算的梯度视为 直通估算器

:

因此,权重的梯度设置为:

图2b总结了DeepShift-PS的前进和后退过程。
实现
以实现前进与后退为目标的研究者们参考文献[6]中的方法,在PyTorch中实现了两个自定义操作的前向传播与反向传播:LinearShift与ConvShift两种运算模块。在应用前向传播之前,在确保运算精确度的前提下需对LinearShift与ConvShift运算符的所有输入数据以及对应的偏置参数进行定点格式化处理。
为初始化权重,我们在DeepShift-Q中对

Additionally, the initialization process is carried out using Kamming initialization in DeepShift-PS, where uniform random distribution is employed to initialize P and S.
在DeepShift-PS中,对L2归一化进行了稍微修改,使其发生在

上,而不是在S上的P上发生,即添加的正则项为

而不是

。
基准测试结果
我们已在三个典型的数据集上完成了训练与推理性能的研究:MNIST [8]、CIFAR-10 [7]以及Imagenet [3]中的样本均获得良好收敛效果的基础上
原始版本:使用标准卷积和线性运算符评估原始体系结构,
DeepShift版本:
a: 进行完整的训练过程:基于随机权重初始化,并将所有的卷积和全连接层转换为对应的移位层;经过上述转换后进行模型训练;采用Deepshift-Q和DeepShift-PS两种方法重新初始化模型。
基于起始基准模型的训练:首先选择一个使用32位浮点精度预训练的基准模型作为起始点,并对其中所有的卷积和线性运算符执行相应的转换以适应低精度计算。随后应用公式4对权重进行转换,并采用Deepshift-Q或DeepShift-PS等特定算法来进行最终的模型 training.
就验证准确性结果而言,在已有记录中我们已注意到DeepShift-PS推荐使用的是Rectified Adam(RAdam)[12]这一方法;而与之相比,在常规的32位浮点训练中推荐使用的则是随机梯度下降法(SGD)。
就验证准确性结果而言,在已有记录中我们已注意到DeepShift-PS推荐使用的是Rectified Adam(RAdam)[12]这一方法;而与之相比,在常规的32位浮点训练中推荐使用的则是随机梯度下降法(SGD)。
MNIST数据集
在MNIST数据集上训练和测试了两个简单的模型:
表1:MNIST数据集上的DeepShift准确性结果

简单FC是一种基于全连接层的简洁模型,该模型由三层线性组件构成,输出维度分别为512, 512及10;其中随机断开概率为0.2的丢弃组件被放置于相邻两组件之间;各中间组件之后均接有ReLU激活函数
浅化卷积神经网络(CNN)架构包含两个卷积层和两个全连接层。这两个卷积层分别采用了64及128个输出通道,并采用5×5尺寸的滤波器以及步长为1的设计。在每个卷积操作后附加一个大小为3×3窗口并施加ReLU激活函数的最大池化模块。
线性层的输出特征尺寸分别为500和10。
该模型的参数设置包括学习速率为 0.01、动量系数为 0.0 以及批量大小设为 64。
训练过程见图3。
验证集的准确率见表1
CIFRA10数据集
在采用DeepShit-PS方法的情况下
使用SGD的ResNet18基线模型达到的最佳准确度是94.86%,使用RAdam的准确度是94.06%。
对于从预训练模型开始的训练,学习率为1×10−4,历元数为15。
该训练图展示了在4中的情况;表2则详细展示了用于评估各种场景麻醉验证集的数据结果。
表2:CIFAR10数据集的DeepShift准确性结果

Imagenet数据集
对于Imagenet,从零开始训练ResNet18和VGG16,其动量为0.9,重量衰减为

所采用的损失函数是分类交叉熵损失函数,在本研究中设置历元数量为90个周期,并基于零初始化的方式进行参数优化。通过实验结果可以看出,在零初始化条件下对ResNet18模型进行训练时能够达到的最佳精度较全精度模型在Top-5精度方面降低了约4%,而在Top-1准确度方面则低于3%。与现有的相关工作相比,在ResNet18上的Top-5准确度上 DeepShift-PS方法表现更为出色;然而,在针对VGG16网络的研究中这一优势并未显现出来。
当前采用的是DeepShift PS算法对VGG16网络进行参数优化,并已与现有工作进行了对比研究。
对于基于预训练模型的训练任务, 我们评估了ResNet18、ResNet50、AlexNet、VGG16以及GoogleNet等模型. 通过观察实验结果, 我们发现GoogleNet所获得的准确率优于原始模型. 此外, 我们还进行了与现有研究中采用二进制幂数表示法处理权重的工作对比实验.
效率分析
整数或定点格式的二进制乘法由多个按位移位,与和组成。
浮点(FP)乘法涉及多个步骤, 如加指数并归一化等操作。 在CPU周期中, 以32位Intel Atom指令处理器为例, 整数与浮点运算指令分别占用5至6个时钟周期的时间段, 相反的是按位移位指令仅需1个时钟周期的时间段。([4])研究表明, 对于16位架构来说, 按到位移器的平均功耗与乘法器面积相比至少提升9.7倍及1.45倍: 具体数值为22.05纳瓦到54.83纳瓦与1.32纳瓦到2.27纳瓦之间变化范围;晶体管数量则分别为87千至29万与前者的仅为约2千至6千之间变化。([1])因此,在取代传统的乘法运算时
表3:Imagenet数据集上应用DeepShift算法后的准确率对比实验结果表,请注意此处应为表格标题而非正文内容




图4:从头开始的CIFAR10培训
bit-wise运算可以降低能量消耗。
C++编译器通常会识别将整数乘以2的幂(在编译阶段固定)的情况,并将其替换成bit-wise移位操作。
我们的贡献在于,在训练神经网络的过程中引入bit-wise移位操作的同时实现了较高的准确率。
DeepShift还利用较少的位表示权重以达成模型存储压缩。基于32位定点激活的方法下所支持的移位值范围为-32至+32。即使某些训练产生的移位超出上述范围, 在数学上它们等效于乘以零。此外, 对于那些未被预期影响的操作, 即使外部观察者可能认为它们不起作用, 我们的方法仍能产生显著的效果

,因此 P <0,因为P =

。 因此,我们只需要支持0到-32的移位值,这需要5位。
加上符号翻转操作所需的位,我们总共需要6位。
除了在潜在的自定义硬件加速器上节省空间和功耗之外之外之外之外之外之外之外之外之外之外之外之外之外之外之外之外之内存优化方面我们主要的优势还在于通过减少位数来降低模型的内存占用并且我们还增加了传输时的能源节省权重特别是在GPU或CPU的不同内存层之间([15])。这对于移动设备与物联网设备来说是非常必要的因为这些设备中的内存占用量甚至超过了浮点运算能力通常成为性能瓶颈尤其是在无人驾驶飞行器等极端计算环境中节能至关重要无论使用的计算平台是低端CPU GPU还是FPGA。此外按位移位运算符被认为是内存密集型计算的理想选择因为它们相比乘法运算所需的面积与能量消耗更低([15])。
GPU实施
尽管[9]、[16]和[5]开发出了多种自定义硬件设计方案,并在此基础上展示了其创新性与有效性。我们成功开发了该GPU核心,并可在Imagenet数据集上,在1490秒内完成基于逐位移位的ResNet18模型的推理任务(基准模型)。
据我们所知,这是第一篇使用按位移位实现CUDA内核卷积的论文。
值得注意的是,在性能对比中我们采用了自定义乘法型卷积内核作为基准标准,在实际应用中发现该方案相较于NVIDIA cuDNN优化型内核在运算效率上有所欠缺。为了进一步提升运算效率可能需要对我们的按位移位型CUDA专用加速器进行优化工作,并将其与NVIDIA cuDNN型基于乘法运算的设计方案展开对比分析研究,在具体实施过程中建议采用融合卷积的方式以期达到更好的性能匹配效果。

图5:从零开始的Imagenet培训
使用ReLu,调整拼接因子并在运行时执行CUDA内核的JIT(即时)编译。
在开发按位移位卷积核心时会遇到的主要困难包括:GPU指令集未针对小宽度参数进行优化;这些小宽度参数涉及到位移操作以及符号传递。编码过程中必须通过掩码操作及补充偏置来获取所需6个偏移量及1个符号量;然而这会产生较大的开销;此外还依赖于if-else条件来决定累加过程中的加减操作以及符号决定了左移还是右移动的方向;这种if-else条件可能导致指令执行停滞并且成为硬件指令流水线中的瓶颈;相比之下在代码中解决这些延迟比基于乘法实现的方式更为关键并且限制了核心的速度;核心的具体实现可以在我们的GitHub存储库中找到
相关工作
[18]开发了一种增量网络量化方法(INQ),用于约束预训练全精度深度神经网络(DNN)的权重参数在0和2的幂次范围之内。 该方法通过将权重分两组迭代优化来实现,在定量化处理一组的同时,另一组则通过反向优化过程进行微调调整以维持精度平衡。
该研究[13]提出了一种将神经网络中的权重与激活值统一表示为二进制指数的方法。然而这种方法依赖于人工经验调参而非自动优化过程。研究表明该方法通过指数运算实现了对网络参数及其激活值的有效量化处理,并且这一技术目前主要应用于基于CIFAR-10数据集构建的基础模型阶段。值得注意的是该方法并未详细阐述符号翻转的学习机制,在文献[9]中也提出了针对该量化策略的一种硬件加速架构设计的同时文献[9]中也提出了针对该量化策略的一种硬件加速架构设计。
据我们所知,DeepShift是第一种使用2的幂从零开始训练模型的方法。
结论与未来工作
我们开发了DeepShift神经网络模型,并通过按位运算与移位操作取代传统的乘法运算实现前向传播。该模型可能显著减少推理阶段与训练过程中的计算时长、能耗以及内存占用。我们的实验结果表明,在ImageNet及其他基准数据集上采用DeepShift架构的模型达到了与当前最先进的方法相当的准确率。
尽管应对神经网络加速的方法(如Binarized Neural Networks)在小规模数据集(如MNIST和CIFAR-10)上表现尚可,在大规模数据集(如ImageNet)上却面临显著性能下降的问题;然而通过引入DeepShift网络该方法得以应用于ImageNet。
而且已实现了基于逐项异或机制实现卷积计算的GPU内核作为概念验证方案。致力于构建具有针对性的小端宽度数据格式优化能力的GPU指令集架构,并可理解为:当遇到负数偏移时可理解为逆方向移动的操作指令应相应调整方向即可提升基于偏移到达率与推理效率的整体水平。进一步而言在给定整数序列与偏移到达序列的前提下通过设计相应的向量级并行运算指令可使得DeepShift能够在CPU环境下实现更高效率地处理相关操作。
对于未来的工作安排中我们推荐大家从零开始系统性地构建训练模型框架其中所有的激活层以及权重参数都被设计成以2为底数的指数形式类似于文献[13]仅作为理论推导工具这一设定有助于简化后续分析过程同样的我们计划开发一种基于按位移位卷积的新架构用于CPU平台并将其与现有的GPU卷积内核结合实现高效运算这一系列优化措施将涵盖激活函数选择平铺策略以及 Just-In-Time 编译等现有技术
致谢
致以诚挚的谢意给Ahmed Eltantawi,并且他为我们的CUDA内核开发做出了宝贵的贡献。我们向Sara Elker dawi表示衷心的感谢,在我们的对话中她提供了非常有帮助的意见。此外,我们也要特别鸣谢PyTorch团队分享了他们的样本代码以及预先训练好的模型二进制文件,在Imagenet数据集上实现了各模型性能指标的真实复现。
