摘要:在文章【1】中,提出并制定了一种基于C++的训练方法,以加速在FPGA中实现人工神经网络(ANN)。所提出的ANN实现方法使用一个自定义的基于C++的程序,称为神经网络设计参数提取(Neural Network Design Parameter Extraction(NNDPE))程序,该程序是使用一个名为快速人工神经网络(Fast Artificial Neural Network(FANN))的开源库开发的。所提出的基于C++的NNDPE程序减少了训练和提取ANN的设计参数所需的时间,这些参数包括层数、每层的神经元数量和权重。提取的ANN设计参数、自定义硬件算术单元和函数近似激活函数用于在Virtex-7 FPGA平台上实现线性函数的ANN硬件架构。
人工神经网络(ANN)是一种基于生物神经系统结构和功能特征的计算模型。ANN由一组互相连接的人工神经元组成,这些神经元共同并行地执行功能。互连通过通常是真实值的权重来建模。ANN可以使用高级编程语言实现,并在诸如CPU和GPU等硬件平台上执行。ANN的硬件实现提供了高速的优势,使其比个人电脑(PC)或工作站内最常见的实现更适合实时应用。
FPGA最适合用于人工神经网络(ANN)的实现,因为它保持了并行架构和配置灵活性,与ASIC相比,在执行速度上有所妥协。然而,在FPGA上实现ANN是具有挑战性的,因为ANN的硬件实现需要实现非线性激励函数、乘法器、加法器及其加权互连。而且,ANN的直接硬件实现也很困难,因为在训练期间,层数和每层中的神经元数量需要调整,直到达到所需的功能和可接受的误差。因此,软件训练后再进行硬件实现是文献中普遍采用的ANN硬件开发和实现的设计方法。
FPGA架构及其如何支持ANN实现
ANN的训练
- 使用MATLAB/Python等编程语言:更多的训练时间。
- C/C++:更高效
ANN的硬件实现
完整(Full)的ANN架构实现
- 定点运算单元:在FPGA上占用较少的切片,适合大规模实现
- 浮点运算单元:精度更高
一种用于实现ANN的Rox-ANN设计方法学使用处理单元(Processing Elements(PEs)),这些处理单元是基于精确/近似算术单元(例如加法器和乘法器)设计的,以计算神经元的部分加权和。对ANN的训练设计参数进行分析和聚类,以优化设计中所需的近似乘法器的总数量。
部分(partial)或分层(layered)的ANN架构实现
以往的文献采用多种技术以减少ANN实现的资源需求,从而使得大型人工神经网络能够以较低的成本在特定的FPGA或单个芯片上实现:
1. 基于现场可编程门阵列的人工神经网络硬件实现
采用模块化方法的数字系统架构(digital system architecture)旨在实现FPGA中的人工神经网络,这可以允许增加或减少神经元的数量以及层数。
所设计的架构使用非常高速度集成电路硬件描述语言(Very High Speed Integrated Circuits Hardware Description Language(VHDL))进行描述。神经网络的并行结构使其在某些任务的计算上具有潜在的快速性能。这一特性使得神经网络非常适合在超大规模集成电路技术中实现。神经网络(NN)的硬件实现在很大程度上依赖于单个神经元的高效实现。基于FPGA的可重构计算架构适合于神经网络的硬件实现。然而,拥有大量神经元的人工神经网络(ANN)的FPGA实现仍然是一个具有挑战性的任务。


完全并行网络(fully parallel network)速度快,但灵活性差。因为在完全并行网络中,每个神经元的乘法器数量必须等于与该神经元的连接数量。由于所有的乘积必须相加,因此全加器的数量等于与前一层连接的数量减去一。例如,在一个3-1网络中,输出神经元必须有3个乘法器和2个全加器。因此,每一层都必须设计不同的神经元架构。因为乘法器是神经元结构中使用资源最多的元素,完全并行网络的第二个缺点是门资源的使用。右图显示了一个单层人工神经网络,具有三个输入节点和一个输出节点。
2. 经济神经网络(Economic Neural Network)的可重构硬件设计方法
一种空间利用率高且高度准确的ANN实现,该方法通过对一些称为隐藏层的层进行新颖的双重使用,将ANN中的层数减少了近一半。
基于FPGA实现的CNN使用剪枝来减少参数数量,从而通过去除权重微不足道的全连接神经元(fully connected neurons)来降低所提供模型的计算复杂性。
一种多维卡尔曼滤波器(Multi Dimensional Kalman Filter(MDKF))算法,用于对象跟踪和运动检测。这些算法针对FPGA和图形处理单元(GPU)等硬件平台进行了定制,以实现嵌入式应用的设计要求。
一种基于人工神经网络的ANPR OCR算法及其高效的结构。所提出的架构已经成功实现,并使用配备4M Gates Xilinx Virtex-4 LX40的Mentor Graphics RC240现场可编程门阵列(FPGA)开发板进行了测试。
而在本文中,提出并制定了一种基于C++的训练方法,以加速FPGA中实现ANN。所提出的 ANN 实现方法使用了一种名为 FANN 的基于C++的库,以减少训练和权重提取时间,从而缩短 ANN 硬件架构的实现时间。然而,非线性激活函数指数的直接硬件实现计算效率高,但消耗更多资源和电力。因此,本文引入了一种分段函数近似方法,用于在每个神经元中实现非线性激活函数,该方法在计算速度和计算效率上都表现良好。
ANN-FPGA实现方法
所提议的设计方法论分为两个阶段:
- 第一阶段,人工神经网络(ANN)被训练以提取权重。
- 第二阶段,在FPGA上实现ANN。
在第一阶段,通过一个名为神经网络设计参数提取(Neural Network Design Parameters Extraction (NNDPE))的自定义程序提取神经网络的权重,该程序是使用FANN库开发的。所提议的设计方法论使用三种神经网络架构进行了验证。第一个神经网络用于实现线性函数(linear function),第二个神经网络用于使用单层实现幅度(Amplitude(AM))解调,第三个神经网络用于使用多层实现AM解调。
步骤1:通过固定的层数和每层神经元数量,初始化给定函数的神经网络架构。
步骤2:训练神经网络。
步骤2.1:在每次迭代中计算均方根误差(Root Mean Square Error(RMSE))。
步骤2.2:如果RMSE可接受,则停止训练,否则重复步骤2。
步骤2.3:一旦RMSE可接受,就停止训练。
步骤2.4:提取权重。
步骤3:利用提取的权重进行神经网络的FPGA实现。
步骤3.1:单神经元实现。
步骤3.1.1:实现乘法器、加法器和激活函数。
步骤3.1.2:使用实现的加法器和乘法器计算乘积之和。
步骤 3.1.3:对使用实现的激活函数的乘积和应用激活函数。
步骤 3.1.4:对多个神经元重复步骤 3.1.1 到 3.1.3。
步骤 3.2:在输出层应用激活函数,并在 FPGA 中获取输出。
神经网络的数据集、训练、测试和设计参数提取
NNDPE程序用于训练、测试和提取所提出的ANN的设计参数。NNDPE程序是使用FANN库开发的,分为两个部分,即NNDPE-1和NNDPE-2。
- NNDPE-1程序用于训练和测试所提议的ANN,并生成一个文件,称为ANN.net文件,该文件包含神经网络设置详情、层数、神经元数量、缩放参数、激活函数详情、权重等信息。
- NNDPE-2程序用于提取设计参数。表1显示了为实现线性函数的ANN提取的权重和其他信息,这可以在相应的FPGA上进行硬件实现时使用。

使用NNDPE程序训练ANN并提取权重所需的时间与其他语言基础的ANN训练相比要少。因此,所提出的基于C++的方法论减少了整体开发时间,加快了ANN在FPGA上的实现。
硬件实现
要在FPGA上实现神经网络,我们必须实现每个神经元,这实际上就是加法器和乘法器的实现。图1显示了在FPGA中使用人工神经网络实现的线性函数中的单个神经元架构。

从图1可以看出,每个神经元由四个模块组成,包括存储(memory)模块、乘法(multiplier)模块、加法(adder)模块和激活函数(activation function)模块。这四个模块在FPGA上实现,通过它们,单个神经元也用Verilog实现。实现的神经元根据图2所示的线性函数神经网络架构被实例化和连接。

存储(memory)模块
权重、输入数据、缩放参数、反缩放参数和激活陡度值从NNDPE-2程序生成的ANN.net文件中读取,并使用Verilog代码的文件写入选项存储到相应的存储器中。使用多个存储器来存储这些参数,以方便它们的并行访问,从而进一步提高神经网络的处理速度,以支持实时实现。
乘法(multiplier)模块和加法(adder)模块
每个神经元计算一个加权和,如图1所示,两个乘法器和一个加法器执行此计算。实现64位浮点乘法器,提供高精度。每个乘法器接受缩放输入和对应的权重,产生一个输出。加法模块接受两个乘法器的输出,并产生一个输出。使用64位加法器来加权输入并将输出发送到激活函数模块。
激活函数(activation function)模块
S型对称激活函数(Sigmoid symmetric activation function)是通过分段逼近实现的,如公式中所示。
在ANN实现中,S型对称激活函数𝑔用于将加权缩放的输入映射到隐藏层神经元的输出。S型对称激活函数使用分段函数近似表示,因为在硬件中直接实现激活函数的指数计算效率低下。
上述所有四个模块都是使用Verilog编码的。所有神经元都已实现并连接,以实现人工神经网络的线性功能。同样,采用所提出的方法也可以在FPGA上实现人工神经网络解调器(demodulator)。所呈现的ANN-FPGA实现方法是通用和可扩展的。
参考文献:
-
Hardware Implementation of Artificial Neural Network Using Field Programmable Gate Array (2013)
-
Reconfigurable Hardware Design Approach for Economic Neural Network (2022)
-
Automatic Modulation Recognition: An FPGA Implementation (2022)
-
FPGA implementation of multi-dimensional Kalman filter for object tracking and motion detection
-
An Exploration of State-of-the-Art Automation Frameworks for FPGA-Based DNN Acceleration
-
Eyeriss: An Energy-Efficient Reconfigurable Accelerator for Deep Convolutional Neural Networks