低功耗脉冲神经网络设计
本文提出一种位串行类脉冲神经网络硬件架构SHiNe,采用占空比编码和计数器实现乘积累加运算,结合输入限制与资源优化,在FPGA上实现了低功耗、低资源消耗的神经网络设计。实验表明其在MNIST任务中准确率超过90%,资源节省约45%,功耗降低25%,适用于嵌入式AI应用。
一种低功耗脉冲式神经网络设计
摘要
现代大规模并行图形处理单元(GPU)和机器学习(ML)框架使得神经网络的实现达到了前所未有的性能和复杂度。然而,最先进的GPU硬件平台功耗极高,而微处理器则无法满足性能需求。生物启发式脉冲神经网络(SNN)具有固有的低功耗特性。因此,我们提出了一种位串行类SNN硬件架构。通过使用计数器、比较器和索引方案,该设计有效实现了神经元中固有的乘积和运算。此外,我们尝试了多种强度降低方法以减少神经网络的资源使用。在现场可编程门阵列(FPGA)上验证的所提出的混合脉冲网络(SHiNe)被发现能够在低资源利用率下实现合理的性能,尽管在硬件吞吐量和信号表示方面存在一定的权衡。
关键词 :脉冲神经网络;位串行架构;现场可编程门阵列
1. 引言
深度学习卷积神经网络(CNNs)在先进的人工智能应用中能够实现前所未有的准确率[1]。大多数活跃的研究集中在卷积层上,因为它们占据了大部分计算成本[2]。这包括在定制芯片上用于深度学习卷积神经网络的加速器[1]、从大型设计空间中提取最优硬件实现的方法论以及优化缓冲管理和内存带宽以优化硬件资源使用[2]、使用现场可编程门阵列(FPGA)进行动态重构[3],以及降低乘积和运算的复杂性[4]。然而,全连接网络的硬件实现并未受到同等关注。
先进的神经网络架构、改进的训练方法以及现代开源神经网络和机器学习(ML)解决方案框架的广泛可用性相结合,使得设计、训练和部署性能与复杂度前所未有的人工神经网络成为可能。随着神经网络模型的改进及其准确率的提高,网络规模和计算复杂度也随之增加。
然而,目前业界主流的GPU(图形处理单元)硬件平台功耗极高。例如,最先进的英伟达Tesla V100卡功耗高达250 W,通常还需搭配高端中央处理器以支持巨大的数据流量并处理其他应用逻辑[5]。这种级别的功耗及其带来的发热量,严重阻碍了神经网络技术的更广泛采用,尤其是在自主飞行无人机、地面车辆、机器人技术和可穿戴技术等移动应用中。一些GPU芯片制造商已开始提供更高能效的版本(例如:英伟达新型Xavier芯片系列可使嵌入式模块在30 W功耗下实现每秒30万亿次操作)。尽管这种功耗降低令人欢迎,但人们仍迫切希望探索能够显著降低功耗的替代实现方法,从而大幅降低功耗,并使神经网络能够满足实时应用的需求,同时达到尺寸、重量和成本目标。
通用处理器也难以满足性能和能效要求,这有效地将研究转向了硬件加速器。文献[6]中介绍了针对各种人工神经网络模型的硬件实现(模拟、数字、混合)的全面综述。基于现场可编程门阵列的加速器因其高能效、高性能和可重构能力而受到广泛关注。[7,8]基于现场可编程门阵列的神经网络实现是一个活跃的研究领域,存在大量设计技术和硬件优化方法。
[9]中的工作描述了一种在FPGA上实现前馈多层感知机网络和反向传播学习算法的参数化架构。在[10]中的FPGA实现中,仅使用一个层通过时分复用方案来实现网络中的所有层;每个神经元采用基于查找表的方法设计,以减少硬件资源使用。[7]中的工作描述了一种在PSoC(可编程片上系统)上实现的前馈神经网络硬件协处理器。软件应用负责配置并启用该硬件。[8]中的工作探讨了随着深度神经网络复杂性的增加,FPGA是否能够优于图形处理器。
一种具有功耗优势的神经网络模型是脉冲神经网络(SNN),它在天然神经信号的仿生学基础上更进一步,使用一系列脉冲来表示神经元激活水平,从而模拟生物神经元中的动作电位电压尖峰序列[11]。这种信号传输方案使我们能够通过单根线路而非多比特(8、16、32)总线来简化神经单元之间的连接。[11]中的广泛调研列出了SNN训练与实现的各种变体及其优缺点。[12]中的工作详细描述了一种SNN的FPGA实现,其中神经元设计包括膜电位计算、权重存储器和多路复用器。[13]提出了一种以流水线方式运行的Izhikevich脉冲神经元构成的SNN;该大规模网络在Cray XD1(包含AMD处理器和各种现场可编程门阵列的阵列)上得以实现。[14]中的工作提出了一种用于SNN的定点架构,并在FPGA上进行了验证。[15]中提出了一种替代性神经元模型(VO2),其中VO2神经元被实现为一个电路。构建了一个SNN(9个输入和3个输出),测试内容为检测3x3像素灰度图像中的输入模式。
基于之前的研究工作,我们利用脉冲神经网络的某些特性来设计一种架构,在进一步优化硬件资源使用的同时,允许使用传统人工神经网络方法对我们的类脉冲神经网络设计进行训练。本文的主要贡献总结如下:一种完全可定制的类SNN神经网络硬件设计。软件应用自动生成网络中所有神经元积分的硬件代码。此外,还提供了与标准乘加神经网络版本的比较。
- 在神经元之间的信号中使用占空比编码。这有助于实现高效的布线并最小化硬件资源使用;
- 实现输入限制,即限制神经元的输入数量。该方法首先在软件中进行测试,然后在硬件架构上进行了验证;
- 流水线神经网络:每一层始终在处理数据。每个帧生成一组输出结果,其中帧定义为一层的处理时间。帧时间仅取决于硬件参数,而与数据无关;
- 一种仅需计数器、1位多路复用器和比较器的位串行神经元设计。
本论文的其余部分组织如下。第2节介绍了一些定义,并将我们的工作置于上下文中。第3节详细描述了所提出的方法。第4节展示了结果。第5节给出结论。
2. 背景
本文介绍了与人工神经网络和脉冲神经网络相关的基本定义。然后,我们描述了本工作的贡献。
2.1. 人工神经网络基础
人工神经网络(ANNs)从自然界中汲取灵感。如图1a所示,生物神经元响应正负刺激,并向其他神经元产生刺激。一个神经元对另一个神经元的刺激会跨越一个称为突触的小间隙。神经元的活动水平是神经元细胞膜两侧的电势。信号沿树突结构收集,并整合为膜电位,直到神经元达到足够高的电位以触发传出脉冲。该脉冲称为动作电位,沿轴突结构传播至与其他神经元形成突触连接的一个或多个轴突末梢[16]。

图1b描绘了放电事件期间观察到的电位电压水平。它具有尖峰状形状,因此动作电位脉冲通常被称为脉冲。一旦动作电位脉冲沿轴突传播,电位会降至标称基线水平以下,并存在一个时间(不应期),在此期间神经元无法触发另一个显著的脉冲。因此,每个神经元在总体脉冲频率上都有一个最高频率限制,可将其视为其完全饱和活动水平。
一旦动作电位到达轴突末梢,信号便会传播到下一个神经元。这种机制可能是抑制性的(抑制神经元输出),也可能是兴奋性的(提高下游神经元的活动水平)。此外,在一组突触中,某个突触可能比其他突触更大/更小、更敏感/较不敏感,或重复出现多次/较少次(甚至不出现)。这会增强或减弱一个神经元的刺激冲动对下一个神经元的影响。因此,从一个神经元到另一个神经元的每个连接都具有可变增益或weight,可通过相对于基线水平的增益因子(正、负、零)进行建模。图2展示了生物神经元的一种模型,称为人工神经元,及其连接。

人工神经网络被组织成层,其中某一层中的所有神经元仅从前一层(上游层)的神经元接收输入,并且仅向后一层(下游层)的神经元提供输出。图3a展示了一个包含3层的神经网络层,图3b展示了神经元的权重、偏置、输入和输出的表示方法。注意,我们可以使用一个向量来表示从前一层中连接的神经元到某一神经元的一组输入激活值,同样也可以用向量表示这些连接各自的权重因子。这里我们用 L 表示层数,l 表示层索引,l = 1, 2, … L。对于第 l 层中的神经元 j,其膜电位记为 $ z_{lj} $,偏置记为 $ b_{lj} $,动作电位记为 $ a_{lj} $。大多数人工神经网络实现将 $ z_{lj} $ 建模为每个输入连接的信号水平 $ a_{l-1,k} $ 与来自上游层(前一层 l − 1)神经元 k 到当前层 l[17]神经元单元 j 的突触增益因子 $ w_{ljk} $ 加权后的总和。
$$
z_{lj} = \sum_k (w_{ljk} a_{l-1,k}) + b_{lj}, \quad l > 1 \tag{1}
$$
通常将第 l 层所有膜电位的计算以矩阵形式表示,如公式(2)所示。其中,$ \mathbf{z_l} $ 是包含第 l 层所有膜电位的列向量,$ \mathbf{a_{l-1}} $ 是包含输入到第 l 层所有信号的列向量,$ \mathbf{w_l} $ 是包含从第 l − 1 层到第 l 层所有突触增益因子的权重矩阵,而 $ \mathbf{b_l} $ 是包含第 l 层所有神经元偏置的列向量。图4描绘了该矩阵运算。
$$
\mathbf{z_l} = \mathbf{w_l} \mathbf{a_{l-1}} + \mathbf{b_l}, \quad l > 1 \tag{2}
$$


第L层中神经元j的动作电位强度(激活函数),记为 $ a_{lj} $,被建模为膜电位 $ z_{lj} $ 的标量函数。我们也可以将第L层的所有动作电位表示为 $ \mathbf{a_l} $,其中 $ \mathbf{a_l} = \sigma(\mathbf{z_l}) $。注意,当 $ l = 1 $ 时,$ \mathbf{a_l} $ 表示第一层的输出,即神经网络的输入。
$$
a_{lj} = \sigma(z_{lj}) = \sigma \left( \sum_k w_{ljk} a_{l-1,k} + b_{lj} \right), \quad \mathbf{a_l} = \sigma(\mathbf{w_l} \mathbf{a_{l-1}} + \mathbf{b_l}) = \sigma(\mathbf{z_l}), \quad l > 1 \tag{3}
$$
早期对所谓的感知机神经网络的研究确定,像公式(1)中的纯线性加权组合器不具备某些重要的处理能力[18],并且需要某种非线性响应。自然神经元大多对低输入信号几乎没有响应,在整体范围的某个敏感区域内响应迅速增加,然后随着输入水平进一步提高,响应水平趋于平缓或不再增加(即饱和)。人们已提出了多种函数,依据是其计算成本和系统有效性。具体示例包括带偏置的阈值阶跃函数(公式(4))、修正线性单元(ReLU)(公式(5)),以及基于双曲正切、反正切或逻辑函数的真正的S形函数(公式(6))。
$$
\sigma_{\text{step}}(z_{lj}) =
\begin{cases}
1, & \text{if } z_{lj} - \theta > 0 \
0, & \text{otherwise}
\end{cases}
\tag{4}
$$
$$
\sigma_{\text{ReLU}}(z_{lj}) = \max(0, z_{lj}) \tag{5}
$$
$$
\sigma_{\text{tanh}}(z_{lj}) = \tanh(z_{lj}), \quad \sigma_{\text{arctan}}(z_{lj}) = c \cdot \arctan(k, z_{lj}), \quad \sigma_{\text{logistic}}(z_{lj}) = \frac{1}{1 + e^{-kz_{lj}}} \tag{6}
$$
尽管从数学角度可以论证平滑S形函数(如完全可微)的优势;但在实践中,线性整流(ReLU)往往表现几乎同样良好,并且在软件和硬件中实现起来要简单得多[19],而阈值阶跃函数则缺乏足够的表达能力,导致信息丢失,不适用于许多应用。
神经元之间的动作电位可以用16位、32位、64位浮点或变长定点(低至8位或更少)等数值格式进行编码。同样,神经元之间每个类突触连接的权重大小可以从64位减少到仅几位。使用较少的位数表示数值会降低编码值的范围和精度,从而导致准确率下降。然而,这些方法减少了硬件资源使用,从而在功耗、端到端延迟、吞吐带宽、散热和系统成本等与准确率无直接关系的维度上提升了性能。
2.2. 脉冲神经网络
这些是将神经元激活编码为一系列脉冲的人工神经网络设计,并实现了一种积分-触发神经元动作模型,其中神经元单元在一段时间内接收脉冲输入,并在达到特定阈值时触发[11]。对于此类脉冲神经网络(SNNs),生物神经信号最直接的实现方式是一系列短时二进制脉冲,其频率与该神经元的整体激励水平成正比。由于给定神经元的动作电位信号中的自然电位电压尖峰通常具有相同的大小和形状,因此使用简单的短时1位数字脉冲是一种合理的简化。在生物神经元中,高层信息如何编码到脉冲事件簇/序列上尚不明确,但一些研究人员认为这不仅仅是简单的频率编码。可以设想,持续时间、间隔以及簇内脉冲密度各异的脉冲簇,或更精细的脉冲时序模式,可能在特定神经元的轴突输出中编码多维信息。然而,如本文所述,即使采用简单脉冲模式也能实现有用的应用。
通常,脉冲神经网络模型包含一个漏电衰减项,以便在输入激活率较低时抑制激活。偏置项是对漏电效应的一阶近似,至少在脉冲神经网络活动被组织成固定的同步时间帧时是如此。在异步脉冲神经网络中,每个单元在其膜电位达到阈值时独立触发,损失机制可以建模为当前膜电位 $ z_{lj} $ 的分数损失率。
脉冲神经网络(SNNs)具有一些可降低硬件复杂度的特性,但同时也带来了一些实现挑战。可优化的特性如下所列:
- 某个单元的输出可以用单根导线表示,而不是用8位或16位总线。这简化了现场可编程门阵列中的布线,并减小了寄存器和其他元件的尺寸;
- 脉冲(作为脉冲信号)可以轻松地通过加减计数器进行计数,使得积分过程变得简单直接,而无需使用多比特累加器;
- 输入连接的权重(增益因子)可以通过根据增益水平对输入脉冲进行重复采样,或在接收到每个输入脉冲后通过步进计数来实现;
- 在模拟域中,可通过使用特殊的电荷累积半导体层,利用特殊设计的晶体管以极少的有源器件更有效地实现integrate and fire行为。此外,在饱和限度内,模拟信号对适度的信号脉冲碰撞(两个信号同时到达总线)具有更强的鲁棒性。
然而,将脉冲神经网络(SNNs)应用于实际应用中仍存在一些挑战,例如:
- 许多现有的处理器、输入和输出设备均设计用于处理多位数字信号。在当前的电子元件和系统设计中,面向脉冲的编码方法并不常见,尽管存在一些占空比编码(针对固定脉冲频率的可变脉冲宽度)或脉冲率编码的实例。纯模拟域传感器是存在的,而诸如压控振荡器(VCOs)之类的组件可能成为有用的前端接口。如果脉冲神经网络(SNNs)变得更加重要,接口机制将得到改进;
- 如果脉冲用1位脉冲信号表示,当两个或多个输出同时馈入单个输入时,将被接收为单个脉冲信号,任何脉冲多重性都会丢失。对于足够大且鲁棒的网络而言,由于脉冲碰撞引起的信号丢失可能不会显著影响准确率。如果将脉冲保持较短,并且每个产生输出的单元在较长的时间窗口内以可变量延迟其输出时序,则可以最小化这种碰撞效应。该延迟可以是随机的、预配置以避免与其他单元冲突,或通过外部触发并协调以最小化冲突。或者,多个输出脉冲可以在较长时间内保持,以便接收单元可通过一系列子脉冲采样周期对每一个进行采样。然而,这些技术会引入延迟;
- 某些类型的神经网络层(例如softmax层,它从一组输出中突出一个输出(在多种可能性中选出最佳分类),并以基于似然的比例对其进行归一化)在脉冲神经网络中难以实现。虽然可以不用这些层,但脉冲神经网络的输出解释性会变得稍差;
- 也许最基本的挑战在于,脉冲神经网络(SNNs)的训练不像传统的人工神经网络那样直接。与预期结果相比,通过反向传播网络误差是一种梯度下降操作,要求误差曲面的局部斜率由于神经元内部操作的可微性而保持平滑。但是,根据脉冲神经网络的设计,可能存在提供平滑误差曲面以实现梯度下降的内部变量。或者,我们可以使用梯度下降法训练目标脉冲神经网络的人工神经网络代理,并将增益和偏置值映射到脉冲神经网络表示中,从而获得合理的整体性能。我们还注意到,存在一些专用于脉冲神经网络的训练方法,例如脉冲时间依赖可塑性(STDP),该方法会加强输入脉冲在时间上与奖励输出脉冲同时发生或接近发生的连接,同时削弱其他连接。[15]
2.3. 我们的实现
基于脉冲神经网络(SNNs)的优势与不足,我们提出一种类脉冲神经网络设计,其特点包括:(i)采用固定频率的占空比编码来表示激励水平输入,而非频率编码;(ii)通过控制电路在所有连接上进行子脉冲采样;(iii)利用具有相应编码精度的代理人工神经网络进行反向传播,以处理权重、偏置和激励水平。
我们的工作旨在设计一种神经网络(类似SNN),以优化资源使用,并能够使用传统的反向传播技术进行训练。目前已存在完全模拟的神经网络实现,可在功耗和性能方面提供高效率。此外,也有用于神经网络的定制芯片数字设计。我们更倾向于采用FPGA实现,因为其灵活性使我们能够探索各种硬件设计。我们可以使用软件应用对神经网络进行建模和训练,然后将其映射为可在FPGA中实现的硬件设计,并成功进行综合、仿真和验证。此外,尽管一些脉冲神经网络(SNNs)使用诸如脉冲时间依赖可塑性(STDP)等替代经典梯度下降反向传播的方法,但我们更倾向于使用已有大量研究基础的反向传播技术。
最后,对于我们的目标应用,我们选择了MNIST数据集中手写数字图像的分类问题[20]。这是一个知名且流行的神经网络测试应用,因为该数据集易于获取和使用;输入的测试图像尺寸适中;可能的数字类别0到9被限定在一个小而明确的集合内,从而可以设计、训练、实现并在硬件上评估相应规模较小的神经网络。然而,数字分类问题提供了一系列非平凡的挑战,包括多样的数字书写风格、不同程度的整洁性 / 清晰度、不同的大小、不同的方向等,并且需要学习泛化能力以实现鲁棒的性能[21]。
3. 方法论
硬件设计称为混合脉冲网络(SHiNe),包含SNN和ANN特性,允许使用反向传播进行训练。我们将使用图5a中所示的神经网络模型。SHiNe神经元设计如图5b所示,包括其连接和控制信号。接下来将解释该设计的细节。

3.1. 设计考虑
所提出的SHiNe设计在以下考虑下工作。
3.1.1. 相邻层神经元之间的单线连接
这一特性显著简化了数字硬件实现中的布线。我们仅使用一根导线,而大多数设计则使用多比特信号。每个神经元的最大输入连接数(扇入)由 $ 2^c $ 给出,其中c是一个较小的数值(例如5)。因此,如果前一层的单元数超过 $ 2^c $,我们可能无法实现全连接层。虽然非全连接可能影响网络精度,但这种限制使得每个单元能够在合理的时间内依次采样其连接的各个单元,从而完全避免了否则需要更多硬件资源来处理的脉冲碰撞效应。
3.1.2. 神经元输入的占空比编码
在占空比编码中,信号线在a个相位期间为高电平,在 $ 2^p - a $ 个相位期间为低电平。该信号(或脉冲)的频率是恒定的,激励水平等于a。我们使用 $ 2^p $ 个相位(或步骤)进行占空比编码,其中p是一个较小的数(例如:5,可产生32种可能的激励水平)。注意,我们将激励水平(输入信号值)限制为范围 $ a \in [0, 2^p - 1] $ 内的无符号值。这些水平可能具有定点等效。
每个占空比相位定义为持续 $ 2^{w+c} $ 个高速时钟(称为时钟)周期,其中w是权重幅值的位宽。因此,一个占空比编码信号总共持续 $ 2^{w+c+p} $ 个时钟周期。图6展示了三个占空比编码信号(输入0,、输入1,、输入2)的示例,其中 $ p = 4 $,$ w = 2 $,$ c = 5 $。此处,占空比编码信号持续 $ 2^{11} $ 个周期。对于输入 0,,其激励水平为 $ a = 2 $;对于输入1,,为 $ a = 1 $;而对于输入2,,为 $ a = 14 $。

3.1.3. 权重(连接增益)
它们定义为对占空比编码的输入信号进行采样的次数(使用clock信号);每次采样都会增加SHiNe单元的膜电位 $ z_{lj} $。权重可以为负,我们使用符号‐幅值表示,其中+ 1位用于符号位编码se p位 . ‐位 乘法累加器g幅值可以取 $ 2^w $ 个不同的值 ,是一个很小的数(e.g.: 3)。我们使用定点表示来表示权重。我们用[n ]表示具有 n位和小数位的定点格式。然后,我们对幅值采用无符号定点格式[ ] ,使得权重的范围为 $ [-(1 - 2^{-w}), 1 - 2^{-w}] $ ,步长为 $ 2^{-w} $。例如, 对于 $ w = 3 $,权重范围是 $ [-0.875,0.875] $ ,步长为0.125。这意味着信号仅经过一个神经元时会因小于一的最大增益而减弱。然而,神经网络包含大量倾向于合并其效应的单元,且某些单元可能会完全饱和。在硬件实现中,权重值是固定的常量。它们基于监督学习过程中获得的结果。
3.1.4. 偏置
偏置项以定点格式 $ [w+1, w-1] $ 中的有符号(二进制补码)值表示。这导致范围为 $ [-2,2 - 2^{-w+1}] $。在实验中发现,这一稍宽的范围比与权重相关的范围效果更好。
3.1.5. 膜电位计算($ z_{lj} $)
这是通过一个加减型有符号(二进制补码)计数器实现的,其位数为 $ p + c + w + 1 $ 位。该位数可避免溢出,即使每个输入单元具有最大可能增益。该计数器包含在每个SHiNe神经元中,并以高速时钟(clock)的速度运行。
中央时序控制电路生成索引信号,以在权重、连接以及整体激励占空比的每个可能步骤的每一层上使能采样。该电路还生成控制信号,用于触发单元输出新的激励水平,并复位回其基线(偏置)。
3.1.6. 输出激活函数
选择ReLU(修正线性单元)作为每个神经元的激活函数。这在神经元输出中引入了非线性。由于整流使得神经元的输出值为非负,因此传递到下一层神经元的激励信号可以仅用1位通过占空比编码来表示。否则,将需要一条用于符号的额外导线,从而增加处理这两条导线和更复杂的电路的复杂性。
3.2. 实现细节
图5a展示了一个全连接网络,该网络由多个层组成,每层包含若干神经元。图5b展示了一个神经元的硬件架构。注意其中的不同组件:每个连接的突触电路(蓝色框,最多 $ 2^c $ 个),以及“积分、整流和触发电路”。用于在全连接网络中正确处理占空比编码输入信号的控制信号由中央时序控制电路生成,其详细结构如图7所示。该电路向神经网络中的每个神经元生成信号。请注意,时钟信号是之前提到的高速时钟。
3.2.1. 中央时序控制电路
该电路由一个具有 $ p + c + w + 1 $ 位的无符号计数器和相关联的寄存器组成。计数器输出位聚类为若干组,作为权重的索引信号连接 ,和占空比-cy如图7所示的相位。中央时序控制电路生成:(i) 权重_步骤索引,用于逐个遍历每个可能的权重幅值;(ii) 连接_选择索引,用于指示我们应该采样的输入信号 $ \text{input}_i $ ;以及(iii) 阶段_步骤索引,用于指示当前处于占空比编码输入信号的哪一个阶段(共 $ 2^p $ 个阶段)。最高有效位(MSB)启用特殊的触发和复位信号,并短暂触发计数复位,以便下一个完整的时序帧可以重新开始。计数器输出在下降时钟沿被捕获,以确保生成的索引值在下一个上升沿事件到来时已准备就绪。

3.2.2. SHiNe神经元—各连接权重的乘法效应
尽管神经元有效地实现了权重与输入信号值的乘积,中央时序电路生成所有所需的同步信号。
该神经元包含一个“每个连接电路的突触”,如图8所示。输入信号称为 $ \text{input}_i $。相关的常数权重称为 $ \text{weight}_i $。得到的输出信号称为 $ \text{weighted_input}_i $。相关的权重符号($ \text{weight_sign}_i $)被直接传递。该电路的工作方式如下:如果权重大于 $ \text{weight_step} $ index,则允许输入信号通过至输出;如果权重小于或等于 $ \text{weight_step} $ index,则输出被设为‘0’。

收集信号 $ \text{weighted_input}_i $ 被输入至积分、整流和触发电路,如图5b所示。
信号 $ \text{weight_sign}_i, \text{weighted_input}_i (i = 0, …, 2^c - 1) $ 的集合被传递给积分、整流和触发电路(也称为突触后处理)。该电路进行采样(在快速时钟率)下,对每个 $ \text{weighted_input}_i $ 信号进行采样,并累加信号为高电平的次数(这称为积分)。信号为高时,将其累加为一个计数值(使用有符号(二进制补码)的上/下计数器)。使用;向上或向下计数取决于 $ \text{weight_sign}_i $。
对于 $ w = 2, c = 5, p = 4 $,图9展示了两个输入的乘法效应信号在图6中: $ \text{input}_0 = 2 $ (信号在16个相位中有2个相位为高)与 $ \text{weight}_0 = 2 $,以及 $ \text{input}_1 = 1 $ 与 $ \text{weight}_1 = 1 $。注意,对于每一层L,$ \text{weighted_input}_0 $ 持续2个时钟周期(共4个时钟周期)a p 的映射权重_步骤(0到3)以及前两个占空比相位($ \text{input}_0 = 2 $)。加减计数器将饱和 this 信号4次(仅当 $ \text{conn_sel} = 0 $ 时,参见阴影部分),从而实现乘积 $ 2 \times 2 = 4 $。同样,每次循环中权重_步骤的最后3个时钟周期(共4个)以及仅用于第一个占空比阶段($ \text{input}_1 = 1 $)。加减计数器将对该信号采样3次(仅当 $ \text{conn_sel} = 1 $ 时,参见阴影部分),实现乘积 $ 1 \times 3 = 3 $。

3.2.3. SHiNe神经元——“积分、整流与触发”电路
积分过程包括收集来自每个输入突触的加权信号。这是通过使用中央时序控制电路中的连接选择($ \text{conn_sel} $)索引,作为多路复用器的选择信号,分别用于加权输入信号脉冲和加权符号。所选的当前采样连接的信号被送入一个有符号(二进制补码)加减计数器,该计数器保存积分膜电位(‘0’:递增计数,‘1’:递减计数)。注意,在前一帧结束时(帧: $ 2^p $ 相位或 $ 2^{p+c+w} $ 个时钟周期),中央时序与控制电路发出的复位信号会将计数器重置为有符号($ w+1 $)位神经元偏置值(在监督学习中定义)。生成膜电位 $ z $ 的该积分电路如图10顶部所示。

膜电位(激活函数前的值)是 $ c $ 项的和,其中每一项是权重与输入的乘积,权重具有 $ w+1 $ (权重幅值和符号)位,输入具有 $ p $ 位。因此,所需的总位数为 $ p + w + \lceil \log_2 c \rceil + 1 $ 位。对于计数器,其表现为一个有符号整数。使用权重的定点表示时,是一个带有 $ p + w + \lceil \log_2 c \rceil + 1 $ 总位数和 $ w $ 小数位的有符号定点数。
接下来,我们需要对这个值进行整流(ReLU)并生成占空比编码输出。这是通过图10底部所示的电路实现的。
为了防止信号位宽增长过快,通常在定点运算中截断小数位。在我们的SHiNe设计中,占空比编码输入被定义为无符号整数。因此,我们需要舍去 $ w $ 小数位以获得整数值。这种重新缩放操作(除以 $ 2^w $)得到一个整数值 $ z_t $,其具有 $ p + \lceil \log_2 c \rceil + 1 $ 位。
为了将激活函数(ReLU)应用于重新缩放的值 $ z_t $,一种常见的方法是使用 $ z_t $ 的符号(其最高有效位)。如果 $ z_t < 0 $,则整流值为0。如果 $ z_t \geq 0 $,则整流值等于 $ z_t $。之后,我们需要将整流值编码为占空比编码输出。
SHiNe设计采用了一种更简单的方法,将整流与占空比编码输出生成结合在一个步骤中。在图10中,当 $ z_t $ 准备被捕获时,触发控制信号被激活,$ z_t $ 被锁存到寄存器中。整流和占空比编码通过一个比较器实现,该比较器将带符号的重新缩放电位 $ z_t $ 与仅正的 $ \text{phase_step} $ 进行比较。如果锁存的 $ z_t $ 为负,则其值始终低于当前的 $ \text{phase_step} $,导致输出始终为
0。另一方面,如果电位为正且大于当前的 $ \text{phase_step} $,则输出为1。一旦当前的 $ \text{phase_step} $ 等于或超过锁存的电位,输出即降为0。
以一个SHiNe神经元为例,其 $ w = 2 $,$ p = 4 $,$ c = 4 $。此处,权重的范围为 $[-0.75,0.75]$,输入信号的范围为 $[0, 2^4 - 1]$。输入数据由 $[2, 5, 1, 7]$ 给出。权重由 $[-0.5,0.75,-0.25,0.5]$ 给出。则电位 $ z $ 为 $(-2 \times 0.5 + 5 \times 0.75 - 1 \times 0.25 + 7 \times 0.5) = 7.75$。加减计数器将该值视为 $7.75 \times 2^w = 31$。对 $ w $ 位进行位截断相当于 $31 / 2^w = 7$ 的整数除法。应用ReLU后,结果为7。
如果权重是 $[0.5, -0.75, 0.25, -0.5]$,则电位 $ z $ 为 $-7.75$。经过位丢弃后,我们得到 $-7$。应用ReLU后,得到7。图11显示了一些示例:$-7, 7, 13$。

理论上,整流后的最终无符号值需要 $ p + \lceil \log_2 c \rceil $ 位。这意味着占空比编码输出信号需要 $ 2^{p + \lceil \log_2 c \rceil} $ 相位。然而,作为一项设计考虑,我们将所有占空比编码信号限制为 $ 2^p $ 相位。因此,如果最终的无符号值所需的位数超过 $ p $ 位,我们的比较器将饱和该值,即把输出值设为 $ 2^p - 1 $。
3.3. 硬件处理时间
层在一个帧内处理一个占空比编码输入。因此,在我们的SHiNe设计中,网络层的处理时间为 $ 2^{w+c+p} $ 个时钟周期,即采样所有外部占空比编码相位、连接扇入以及连接权重的有效位宽所需的周期数。图12描绘了不同值下的时钟周期数,其中 $ w $、$ c $、$ p $。
积分函数发生在一个帧内(占空比编码信号的持续时间),并在该帧结束时完成,此时已完成对所有 $ \text{weighted_input}_i $ 信号的采样。在此积分过程结束时,$ \text{fire} $ 信号会触发电路将结果作为占空比编码输出进行转发,模拟生物动作电位沿轴突传播的过程。因此,对于一层而言,占空比编码输出的生成发生在积分帧之后的下一帧,以便下一层能够处理这些输出。

因此,前一帧的输出生成与当前帧的积分过程重叠,形成了一种流水线效应。在这种效应中,每个网络层都会为输入处理增加一帧的初始延迟,而读出最终输出还需要额外的一帧。图13展示了图5a中神经网络的这种流水线效应。如果我们每一帧都持续输入一组新的输入,则该神经网络每帧都会产生一个新的输出。该硬件设计的吞吐量由公式(7)给出。
$$
\text{Network Throughput} = \frac{(# \text{ of outputs of layer } L) \times (# \text{ of bytes per output})}{2^{w+c+p} \text{ clock cycles}} \tag{7}
$$

图14展示了该时序模式的一个示例(在综合电路的FPGA仿真中)。我们有一个三层网络,最后一层包含10个神经元,因此结果出现在第3帧相对于特定输入的输入过程的帧。根据其编码值,单层中所有神经元的占空比编码输出同时上升至‘1’,但在不同时刻下降至‘0’在帧内。对于执行分类任务的神经网络,我们需要查看哪个单元在输出层中,具有最大占空比的神经元用于确定“正确”的输出(即识别结果)

3.4. 训练方法和软件工具
神经网络的准确率性能与其神经元单元的排列结构以及神经元单元参数(如偏置和连接权重)的具体取值密切相关。某些网络架构在某些应用中表现良好,而在其他应用中则不尽如人意,因此设计者应为特定应用选择最合适的架构。另一方面,除最简单的示例外,神经元偏置和连接权重的取值无法通过人工计算获得。因此,通常采用各种训练方法(机器学习)来确定在整个配置好的网络架构中可用的一组神经元参数。这些方法可以从一个未训练网络开始,该网络可能被初始化为默认值或随机值,并通过一系列训练示例逐步调整,以达到一组更优的、能够实现所需结果的参数值。一些方法被认为是无监督的,其调整方向基于问题领域推断出的奖惩因子(例如在虚拟世界中撞到物体、输掉游戏等),或基于与范例的一般相似性(人类在类似情况下会怎么做),或与某些有用的内部度量相关联(将观测结果聚类为不同类型的能力)。另一些方法则属于有监督学习,即对于每个给定输入都有一个明确的正确答案,而其他答案则被视为错误。这被称为标注数据,其中输入的正确类别被标识出来,或数据输入中显著项的位置被定义,或其他形式的正确答案被明确定义。然而,提供足够数量和多样性的标注数据并不总是可行或实际的,特别是当提供标注数据的成本过高时,因此无监督方法在研究社区中引起了关注。但由于监督学习具有明确的对错答案,准确率的概念更加明确且易于量化。此外,监督学习达到可用水平所需的计算速度通常也更快。在本工作中,我们采用了监督学习,因为它更容易应用,并且基于我们先前的经验。
已开发了一种用于神经网络训练和测试的软件应用(使用C语言)。该应用可以加载MNIST数据集,能够训练和评估可配置的网络层数量、网络层大小以及网络神经元类型。它还可以为硬件代码的顶层文件生成硬件描述代码。该软件应用在附录A中进行了详细说明。
3.5. 电路综合与仿真
我们使用Xilinx Vivado 2016.3开发工具对每个设计进行综合、仿真和功耗估算。目标器件为 ZYBO开发板上的Zynq XC7Z010‐1CLGC400C。因此,高速时钟设置为125兆赫(8纳秒)。
3.5.1. 细节
SHiNe架构在寄存器传输级(RTL)采用VHDL进行描述。如C语言软件应用的命令行选项中所提示(附录A),卷积神经网络可生成实现已配置并训练的网络的顶层硬件文件的VDHL描述。所有 VHDL代码行均从控制台输出打印到文本文件(.vhd文件)中。
自动生成的VHDL代码具有清晰的结构。首先是一些针对IEEE库和主顶层组件定义的样板语句,这些语句根据网络配置文件的名称进行定制。接着是通用控制和神经元组件语句,以及用于训练后的权重、偏置和轴突的一系列常量和信号。然后是控制电路和每个神经元的实例化,这些神经元按层进行分组,每个神经元的输入、权重和偏置连接均绑定到相应的常量或顶层电路信号。我们当前对该功能的实现仅限于两个激活层,这两个层位于初始输入层和一个最大池化下采样层之后。
采用类似的方法来生成一种定点实现(称为FXP_N),该实现用于神经网络,并使用更传统的乘加(MAC)点积类型计算[22]。这种单个神经元的通用架构如图15所示。由于权重和偏置是常量,乘法器也是常量。但这仍然需要为单个神经元消耗相对较多的硬件资源。这使得可以进行硬件资源使用比较,相关内容将在结果部分详细说明。
用于实现训练后的SHiNe实例的VHDL代码组织如下:
- SHiNe_neuron.vhd :此代码描述了一个神经元,假定存在一定的时序和控制输入、一组输入线路、输入权重(符号和幅度)以及一个有符号偏置值。所有这些输入在高层模块实例化后从该模块传入。多个参数的位宽以通用方式定义。一旦触发输入到达,新版本输出信号被准备,然后复位将神经元重置为其带偏置的初始值;
- ShiNe_ctrl.vhd :这是生成一组多比特的中央时序与控制电路索引信号,以及一些额外的触发信号,包括采样、触发和复位。它包含一个复位输入,以便在上电时将控制索引复位,从而允许处理一帧数据;
- top_{net name}_net.vhd :由卷积神经网络自动生成。这是神经网络的顶层电路。它实例化了控制电路,该控制电路根据控制索引的特定位宽进行配置,并根据网络配置文件将一组神经元组织成层。训练权重和偏置被设置为常量值,并输入到每个神经元实例中。如果某个连接不需要,因为前一层的单元数少于允许的最大连接数,则未使用的神经元输入被 tied 到‘0’;
- tb_{net name}_net.vhd :这是用于仿真的测试平台。它将输入图像(二值或灰度)提供给电路,以便在仿真期间获取输出线。例如,在手写数字识别中,每个可识别的数字对应一条输出线。
我们将使用一组优选的硬件参数:$ w = 3 $(权重);$ c = 5 $,它允许每个神经元最多有32个输入连接;以及 $ p = 5 $,它定义了32种不同的激励输入电平。
3.5.2. 仿真
对多个MNIST训练与测试图像示例进行了行为级仿真,其中输入数据通过运行cnn处理灰度图像或二值图像(使用-imN选项打印图像的二值阈值版本)获得。输入数据被放置在测试平台文件中,以提供给顶层电路的图像输入。例如,tb_thrift_net.vhd文件中包含一组超过40幅的测试用例图像;测试所有这些图像是一项繁琐的工作(从MNIST数据集加载测试数据、仿真以及输出结果的获取和验证),该过程可以实现自动化。
仿真时间设置为允许处理多帧。在几帧之后修改输入图像,以确保产生不同的结果。对于优选的位宽参数,每帧需要总共 $ 2^{w+c+p} = 8192 $ 个快速时钟周期或 $ 8192 \times 8 \, \text{ns} = 65.536 \, \mu\text{s} $。对于两个激活层,需要两个处理帧,外加一个额外帧用于读取结果。第二个输入可以在第二帧开始时输入,并通过流水线在第四帧中出现。在我们的测试中,通常在同一输入上保持两帧,然后再进入新的输入测试用例,这导致约5帧(327.68 μs)的仿真时间跨度。
4. 结果
研究人员提出了多种方法来设计和测试高效的人工神经网络设计。本文探讨了一些已知的选项,选取了那些预测在脉冲型神经网络中表现良好的方法,并评估了整体网络性能。
4.1. 神经网络权衡评估
位宽受限的神经网络会受到量化噪声的影响,这是由于截断或向上/向下舍入所引入的误差所致。对于我们的激活输出,我们执行位丢弃操作。每一位最多会引入1位的误差(截断时为0.0到1.0位,舍入时为−0.5到+0.5位)。
我们将使用一个简化模型来描述量化噪声。利用公式(1),并忽略任何训练偏置,可以说对于每个神经元 $ j $,其膜电位 $ z_{lj} $ 与输入和权重的总和成正比。由于每个乘数都存在量化误差,因此可以将结果乘积的分数方差建模为:
$$
\left( \frac{\sigma_{z_{lj}}}{2^b} \right)^2 = \left( \frac{\sigma_{a_{l-1,k}}}{2^b} \right)^2 + \left( \frac{\sigma_{w_{ljk}}}{2^b} \right)^2 = \frac{1}{12(2^{2b})} + \frac{1}{12(2^{2b})} \tag{8}
$$
其中 $ 2^b $ 是在给定位数 $ b $ 下的量化级数,我们假设权重和输入激活的量化级数相同。公式(8)最右侧的结果源于以下事实:由于量化误差在范围为1的区间上均匀分布,因此方差 $ \sigma^2_{a_{l-1,k}} $ 和 $ \sigma^2_{w_{ljk}} $ 均等于1/12。
在神经网络中,第 $ l $ 层的膜电位 $ z_{lj} $ 是前一层神经网络激活信号 $ a_{l-1,j} $ 的函数。假设激活输出 $ a_{l-1,k} $ 的方差近似于膜电位 $ z_{l-1,k} $ 的方差,我们可以将 $ (\sigma_{a_{l-1,k}} / 2^b)^2 $ 替换为 $ (\sigma_{a_{l-2,k}} / 2^b)^2 + (\sigma_{w_{l-1,jk}} / 2^b)^2 $。递归应用此方法,可将量化项合并,得到 $ L $ 个这样的项。然后,我们可以加上输入量化的分数方差,我们假设其规模(以位宽计)与权重因子相近,从而产生 $ L+1 $ 倍的权重量化项。因此,在经过 $ L $ 层之后,总体信噪比估计为:
$$
\left( \frac{\sigma_{z_{Lj}}}{2^b} \right)^2 = (L+1) \left( \frac{\sigma_{w_{Ljk}}}{2^b} \right)^2 = (L+1) \left( \frac{1}{12(2^{2b})} \right) \tag{9}
$$
为了进行网络精度预测,我们可以使用 $ Q(1-F) $,其中 $ F $ 是总体分数信噪比,即公式(9)中的分数方差的平方根。这得到公式(10),其中 $ Q $ 是在无量化噪声情况下的最大预期精度。
$$
\text{Accuracy} = Q(1-F) = Q \left( 1 - \frac{\sigma_{z_{Lj}}}{2^b} \right) = Q \left( 1 - \sqrt{ \frac{L+1}{12 \cdot 2^{2b}} } \right) \tag{10}
$$
4.1.1. 小型神经网络实验
在我们的实验中,我们为MNIST手写数字数据集定义了一个小型神经网络,该网络具有 $ 28 \times 28 $ 个输入单元,紧接着进行 $ 2 \times 2 $ 最大池化,以生成一个下采样的图像(即最大池化层)。从硬件视角来看,该最大池化层即为输入层,随后全连接到包含16个神经元的内部(隐藏)层,最后全连接到10神经元输出层。训练和性能评估使用完整的双精度浮点连接权重和激活信号完成。然后,cnn应用程序采用不同级别的量化运行,以估计低比特宽度整数实现的性能。每一级量化均从包含10,000张图像的测试集中抽取包含1000个样本的测试轮次,并重复20次,以确定平均值和变化估计,从而生成图16中的曲线。结果令人鼓舞,因为即使在较低的位数下,这个小型网络仍能实现远超90%召回率(正确分类占所有测试的输入测试样本的比例),如表1和图16所示。
表1. 小型浅层网络中的低比特宽度召回准确率
| 每个连接的位数 | 平均准确率(%) |
|---|---|
| 0 | 26.67 |
| 1 | 70.42 |
| 2 | 86.17 |
| 3 | 89.94 |
| 4 | 93.17 |
| 6 | 94.57 |
| 8 | 94.54 |
| 64 | 94.60 |
图16显示,对于非常低的位宽,准确率显著下降,但也表明在此小型网络中,连接权重、偏置值和激活水平使用超过6位并无实际益处。这一发现有助于减少硬件资源。
4.1.2. 输入限制以减少硬件资源
如果我们限制某一层神经元到下一层神经元的允许连接数量,则可以进一步减少硬件资源。我们将这种方法称为‘输入限制’,该术语源于在硬件电路板上移除那些在特定设计经过调试和充分验证后似乎没有带来额外价值的电子元件的做法。然而,在机器学习社区中,剪枝这一术语更为人熟知。这种连接限制也可以理解为扇入(类似于数字门能够直接支持的输入线路数量的限制)。减少扇入有助于通过大幅减少布线信号来最小化电路规模。在SHiNe设计中,更少的连接意味着迭代这些连接所需的时钟周期更少,因此将每个神经元允许的连接数减半,也使采样和计数输入信号脉冲所需的总时间减少一半。
我们使用卷积神经网络测试了几种节流水平,采用-thrift{n}命令行选项,该选项对权重幅值进行严格排序,并将小于第n大权重幅值的所有权重替换为零。在每一节流水平下,准确率评估重复进行了20次,以获得更可靠的平均值和方差。我们预期输入限制能提升网络性能;这会使剩余的连接变得更加重要,并对精细调优更加敏感。网络在连接扇入限制条件下重新训练,并在表2和图17所示的限制下重新测试性能。注意在大多数情况下,相同节流水平下准确率有适度提升,最高可达约7%(平均提高2.8%),且处于相同的扇入限制下。
表2. 正常训练与节俭训练下的精简型召回率百分比。
| 扇入 | 正常训练(%) | 节俭训练(%) |
|---|---|---|
| 1 | 11.78 | 9.67 |
| 2 | 20.69 | 27.01 |
| 4 | 37.61 | 36.33 |
| 8 | 54.28 | 60.79 |
| 16 | 80.79 | 85.50 |
| 32 | 88.78 | 92.65 |
| 64 | 92.51 | 92.54 |
| 128 | 93.24 | — |
| 256 | 93.12 | — |
图17中输入限制曲线的整体形状与降低连接权重位宽所形成的模式一致。注意,扇入限制为32个连接时,其准确率基本与更高连接性水平相当。然而,当扇入限制为16时,性能出现适度下降;而每个神经元仅限8个连接时,性能被限制在约60%的准确率,这一水平在大多数应用中可能过低而无法使用。为了更好地理解输入限制的影响和潜力,我们生成了图18中的连接权重直方图。在隐藏层中,我们看到低值权重占主导地位。在传统网络训练下,直方图更加分散且具有长尾。在使用cnn程序重新训练后,精简后的网络连接的直方图显示出相对较少的小权重值,除了归零(精简掉的)连接之外。但在输出层中情况并非如此,其中权重分布相对均匀。然而,在输入限制后,数值会轻微下降。
这种成本效益分析使我们得出结论:应使用3位连接权重($ w = 3 $),并将激活信号精简到扇入限制为32($ c = 5 $)。这将在SHiNe设计中提供良好的准确率和性能,同时相比全连接网络以及采用浮点或甚至字节宽度的定点信号路径的网络,硬件成本要低得多。
4.2. 硬件精度(或网络性能)评估
SHiNe设计采用VHDL实现,结合了手动编码和由cnn应用程序生成的机器生成的顶层电路模型。我们未实现能够使用完整MNIST数据集对综合后的VHDL设计进行测试的自动化测试框架,但我们使用cnn打印出手写数字图像的兼容VHDL的二进制表示,这些表示可粘贴到SHiNe测试平台文件中以生成所需的输入信号。
请注意,我们的测试用例在不同网络的所有神经元中均采用以下硬件参数:$ w = 3 $, $ c = 5 $, 以及 $ p = 5 $。硬件测试采用14x14像素的输入层(下采样层),包含16、32或64个神经元的隐藏层,以及包含10个神经元的输出层(用于手写数字识别)。这些网络列于表3中。注意,初始的使用最大池化单元的下采样不属于我们的硬件设计部分。
表3. SHiNe设计:用于测试的3个网络层。
| 网络 Name | 输入层 | 隐藏层 | 输出层 |
|---|---|---|---|
| 1 | SHiNe_f16_m10_net | 196 | 16 |
| 2 | SHiNe_f32_m10_net | 196 | 32 |
| 3 | SHiNe_f64_m10_net | 196 | 64 |
进行了许多使用二值图像(阈值灰度图像)的测试。我们还对5位灰度图像进行了测试,其中输入图像的高亮度区域对应高占空比波形,而低亮度区域对应低占空比波形。这有助于网络正确识别边缘分类情况,而仅使用二值版本的输入则无法实现。请注意,这些测试平台中的输入信号连同时钟和复位信号一起输入到“全连接”(但精简的)层的顶层电路。
对于二值图像,仿真会读取这些硬编码数据,并为每个值为1的像素启动一个脉冲,为每个值为0的像素不产生脉冲。这些值在占空比编码的所有子帧中保持不变。注意,这些值仍以5位信号编码,其中‘0’对应0,‘1’对应31)。图19展示了一个二值图像示例,同时显示了相应的VHDL常量初始化语句。
通过将软件卷积神经网络实现与SHiNe设计进行对比,对43张测试图像逐一输入测试平台 VHDL文件并进行仿真,从而完成硬件验证。通过仿真结果判断神经网络输出是否正确(即是否生成了最长占空比信号)。由于输出存在大的量化步长,可能出现“平局”情况,即多个神经元(每个代表不同的分类数字)产生相同的输出值。在包含43张图像的测试套件中,表4列出了SHiNe设计(网络1)相对于对应的卷积神经网络C语言仿真在正确分类上的结果。
表4。SHiNe设计—网络1准确率评估:相对于卷积神经网络软件实现的通过、平局和失败次数。
| Pass | Tie | Fail | 总计 |
|---|---|---|---|
| 统计 | 39 | 1 | 3 |
| SHiNe (vhdl)% | 90.70% | 2.33% | 6.98% |
| C‐Sim % | 91.97% 对于灰度输入图像 | — | — |
| C‐Sim % | 89.60% 对于二值阈值输入图像 | — | — |
可以看出,使用二值阈值的C‐Sim结果约为89.6%,而SHiNe设计得分约为90.7%。这两个数值之间的差异在统计学上并不显著。
4.3. 硬件处理时间
关于SHiNe设计的处理速度,即使采用我们设定的较低参数值 $ w = 3 $、$ c = 5 $、$ p = 5 $(8个权重级别、32连接扇入、32个占空比级别),每帧总周期数仍相对较高(8192)。该硬件设计较为简单,可能使其能够以高速运行。在我们的设置中,时钟频率为125兆赫, resulting in $ 8192 \times 8 \, \text{ns} = 65.536 \, \mu\text{s} $ 每帧。由于采用流水线实现,每个输出帧均可产生一个新的结果。
与大规模和/或深层网络相比,该处理时间非常快,但会慢于高度优化的DSP型MAC(乘加)操作。我们注意到,用于比较的定点网络实现(FXP_N)每个处理帧所需的处理周期更少。然而,由于涉及的操作原因,其工作频率可能不如我们的SHiNe设计高。
4.4. 硬件资源
以6选1查找表(LUT)和触发器(FFs)表示的硬件资源需求是从综合结果中提取的。针对不同规模的网络重复进行了网络建模与综合,以便将与网络规模无关的基线FPGA综合和部署中的公共部分剔除。请记住,目标器件为Zynq XC7Z010‐1CLGC400C。表5展示了SHiNe神经元版本以及具有相同位宽和通用约束的定点数学神经元版本的资源开销。
表5. 简单定点设计与我们的SHiNe设计的资源需求对比。
| 神经元 | FXP_N LUTs | FXP_N FFs | SHiNe LUTs | SHiNe FFs | 节省(%) |
|---|---|---|---|---|---|
| 1 | 1635 | 720 | 814 | 646 | 50.1% |
| 2 | 1955 | 930 | 1091 | 824 | 44.1% |
| 3 | 2402 | 1260 | 1335 | 1003 | 44.2% |
硬件资源使用的上升趋势呈现出轻微的下降速率。我们推测,现场可编程门阵列的布线复杂性最终将主导资源需求,导致更大电路的斜率再次增加。
Table5显示,与标准神经网络实现相比,组合硬件资源大幅减少(−45%)。在触发器方面,减少幅度较小(−10%)。
硬件资源的大幅减少主要归因于两个因素:(i)神经元实现:每个SHiNe神经元包含一个计数器和一组比较器,而标准神经元实现(图15)则包含一个乘加累加器(即使仅需常数乘法器)和多比特多路复用器;(ii)神经网络:SHiNe网络比标准神经网络显著更简单,因为它每个信号仅需一位。我们的SHiNe设计将硬件复杂度从布线转移到逻辑上。然而,即使在逻辑层面上,每个神经元的架构也比标准神经元更简单(图15)。
4.5. 硬件功耗
在FPGA上,芯片上功耗是器件静态功耗、设计静态功耗和动态功耗的总和。设计静态功耗是已使用资源的函数。动态功耗在电路运行时消耗。器件静态功耗取决于环境、器件系列和尺寸(出于实际目的,假设其为常数)。例如,Zynq XC7Z010在 25 °C下的器件静态功耗为92毫瓦。对于 XC7Z045这样的较大芯片,在 25 °C下的器件静态功耗为201毫瓦。
我们利用Vivado功耗分析工具来估算我们设计的功耗。这些估算值在表6中列出。我们提供了总功耗和设计功耗(设计静态功耗与动态功耗之和)。请注意,SHiNe设计相对于FXP_N的功耗节省了约25%。
表6。定点设计与我们的SHiNe设计的功耗(毫瓦)。基于Zynq XC7Z010 PSoC的结果,其中器件静态功耗在 25 °C时为92毫瓦。
| 神经网络 | 网络神经元 | FXP_N 设计功耗 | FXP_N 总功耗 | SHiNe 设计功耗 | SHiNe 总功耗 | 设计功耗的% | SHiNe的节能 |
|---|---|---|---|---|---|---|---|
| 1 | 16+10=26 | 90 | 182 | 69 | 161 | 23.3% | — |
| 2 | 32+10=42 | 79 | 171 | 60 | 152 | 24.1% | — |
| 3 | 64+10=74 | 66 | 158 | 50 | 142 | 24.2% | — |
4.6. 功耗——与其他实现的比较
表7列出了各种实现的功耗。在不同平台之间进行公平比较具有挑战性。首先,我们必须确保神经网络的规模与本文提出的相当规模。我们尝试了这一点,但我们注意到,在大多数研究中,神经网络包含了卷积层。
对于FPGA,一些研究报道了神经网络特定电路的功耗,而另一些则包含了外部接口、内存或测试板的功耗。此外,FPGA中的器件静态功耗使得不同器件和系列之间的比较非常困难。
在CPU和GPU实现方面,需要注意的是,所报告的分别是计算机和GPU卡的功耗,而不考虑负载情况。总之,表7有助于全面了解神经网络实现方案的整体情况。
表7. 神经网络的现场可编程门阵列、中央处理器和图形处理器实现的功耗比较。
| Work | 平台 | 功耗 | 细节 |
|---|---|---|---|
| [23] | ASIC | 18.3毫瓦 | 40纳米CMOS技术 卷积神经网络,定点 |
| Ours | FPGA | 161毫瓦 | 设计的估计功耗 人工神经网络(SHiNe_f64),196 × 196图像 |
| [24] | FPGA | 4000毫瓦 | 设备功耗:Zynq XC7Z045 Zynq (ARM‐Cortex+ FPGA)+内存 卷积神经网络,定点,500 × 350图像 |
| [25] | FPGA | 15 W | 定制板的功耗:Virtex‐4 SX35 FPGA+ QDR‐SRAM。CNN 500 × 500图像 |
| [26] | FPGA | 7.3W | XC7Z045器件的功耗 二值化神经网络(BNN) |
| [25] | CPU | 90 W | 酷睿2双核处理器 CNN |
| [27] | CPU | 95 W | Core i7 860 处理器 CNN |
| [28] | GPU | 133 瓦 | Tesla C2075 图形处理器 ANN |
| [29] | GPU | 240 瓦 | K40 图形处理器 CNN |
| [27] | GPU | 216 瓦 | GeForce GTX 275 GPU CNN |
正如预期,FPGA设计的功耗远低于GPU或CPU实现。然而我们注意到,专用集成电路设计的功耗甚至可以低于FPGA。即使考虑卷积层和更大的图像,我们的设计在功耗上仍低于可比较的FPGA设计[24]。
5. 结论
提出了一种用于脉冲神经网络(SNN)的位串行硬件优化实现。该方法包括:(i) 采用占空比编码方法对信号进行编码,(ii) 通过对信号占空比进行重复采样以计算权重乘积,并使用计数器对乘积累加结果求和,从而避免使用专用的乘法累加硬件,(iii) 将非线性的ReLU操作与比较器结合,用于生成占空比编码的输出。通过减小连接权重、偏置和激活信号的有效位宽,以及对幅值较小的连接进行输入限制(剪枝),进一步实现了简化。该方法命名为SHiNe,可使硬件实现在MNIST数据集上达到合理的准确率(>90%),非常接近C语言神经网络软件应用的结果。与同样经过强度降低和精简的定点乘法累加(MAC)方法相比,SHiNe设计显著降低了FPGA资源利用率(约减少35%),因而功耗更低。
我们的设计针对嵌入式应用,特别是包含可重构结构和微处理器[22]的可重构嵌入式系统。由于每个神经元单元的输入采样具有固有的串行特性,这种位串行设计适用于位宽较小的信号,在本工作中已证明能够达到合理的准确率。对于较大的位宽,该设计需要更多的时钟周期。然而,该架构的位串行特性允许实现高速时钟频率,总体处理时间仍然足以应对许多现实世界的问题。尽管SHiNe设计已通过FPGA实现进行了验证,但该设计也可应用于专用集成电路(ASIC),以实现非常高的时钟频率。
作者贡献: 概念化、方法论、软件、硬件设计、验证和初稿撰写,M.L.;监督、写作—审阅和修改,D.L.
资金支持:
更多推荐


所有评论(0)