【AI x FPGA自学笔记】一种加速FPGA实现人工神经网络(ANN)的有效设计方法

摘要:在文章【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的训练

  1. 使用MATLAB/Python等编程语言:更多的训练时间。
  2. C/C++:更高效

ANN的硬件实现

完整(Full)的ANN架构实现

  • 定点运算单元:在FPGA上占用较少的切片,适合大规模实现
  • 浮点运算单元:精度更高

减少FPGA上ANN架构硬件实现的资源利用率的技术:

一种用于实现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实现仍然是一个具有挑战性的任务。

三个神经元组成的一层
ANN设计

完全并行网络(fully parallel network)速度快,但灵活性差。因为在完全并行网络中,每个神经元的乘法器数量必须等于与该神经元的连接数量。由于所有的乘积必须相加,因此全加器的数量等于与前一层连接的数量减去一。例如,在一个3-1网络中,输出神经元必须有3个乘法器和2个全加器。因此,每一层都必须设计不同的神经元架构。因为乘法器是神经元结构中使用资源最多的元素,完全并行网络的第二个缺点是门资源的使用。右图显示了一个单层人工神经网络,具有三个输入节点和一个输出节点。

2. 经济神经网络(Economic Neural Network)的可重构硬件设计方法

一种空间利用率高且高度准确的ANN实现,该方法通过对一些称为隐藏层的层进行新颖的双重使用,将ANN中的层数减少了近一半。

3. 自动调制识别:一种FPGA实现

基于FPGA实现的CNN使用剪枝来减少参数数量,从而通过去除权重微不足道的全连接神经元(fully connected neurons)来降低所提供模型的计算复杂性。

4. 用FPGA实现多维卡尔曼滤波,用于目标跟踪和运动检测

一种多维卡尔曼滤波器(Multi Dimensional Kalman Filter(MDKF))算法,用于对象跟踪和运动检测。这些算法针对FPGA和图形处理单元(GPU)等硬件平台进行了定制,以实现嵌入式应用的设计要求。

5. 用于车牌自动识别系统(automatic number plate recognition system (ANPRs))的现场可编程门阵列实时光学字符识别(optical character recognition (OCR))

一种基于人工神经网络的ANPR OCR算法及其高效的结构。所提出的架构已经成功实现,并使用配备4M Gates Xilinx Virtex-4 LX40的Mentor Graphics RC240现场可编程门阵列(FPGA)开发板进行了测试。

而在本文中,提出并制定了一种基于C++的训练方法,以加速FPGA中实现ANN。所提出的 ANN 实现方法使用了一种名为 FANN 的基于C++的库,以减少训练和权重提取时间,从而缩短 ANN 硬件架构的实现时间。然而,非线性激活函数指数的直接硬件实现计算效率高,但消耗更多资源和电力。因此,本文引入了一种分段函数近似方法,用于在每个神经元中实现非线性激活函数,该方法在计算速度和计算效率上都表现良好。

ANN-FPGA实现方法

所提议的设计方法论分为两个阶段:

  1. 第一阶段,人工神经网络(ANN)被训练以提取权重。
  2. 第二阶段,在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。

  1. NNDPE-1程序用于训练和测试所提议的ANN,并生成一个文件,称为ANN.net文件,该文件包含神经网络设置详情、层数、神经元数量、缩放参数、激活函数详情、权重等信息。
  2. NNDPE-2程序用于提取设计参数。表1显示了为实现线性函数的ANN提取的权重和其他信息,这可以在相应的FPGA上进行硬件实现时使用。
表1:从ANN.net文件中提取的设计参数,以便在FPGA中使用ANN实现线性函数。

使用NNDPE程序训练ANN并提取权重所需的时间与其他语言基础的ANN训练相比要少。因此,所提出的基于C++的方法论减少了整体开发时间,加快了ANN在FPGA上的实现。

硬件实现

要在FPGA上实现神经网络,我们必须实现每个神经元,这实际上就是加法器和乘法器的实现。图1显示了在FPGA中使用人工神经网络实现的线性函数中的单个神经元架构。

图1:接受一个输入的单个神经元的功能块图(由两个乘法器、一个加法器和一个基于查找表的激活函数组成)。

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

图2:线性执行的1-2-1前馈神经网络(Feedforward Neural Network)结构功能的FPGA实现。

存储(memory)模块

权重、输入数据、缩放参数、反缩放参数和激活陡度值从NNDPE-2程序生成的ANN.net文件中读取,并使用Verilog代码的文件写入选项存储到相应的存储器中。使用多个存储器来存储这些参数,以方便它们的并行访问,从而进一步提高神经网络的处理速度,以支持实时实现。

乘法(multiplier)模块和加法(adder)模块

每个神经元计算一个加权和,如图1所示,两个乘法器和一个加法器执行此计算。实现64位浮点乘法器,提供高精度。每个乘法器接受缩放输入和对应的权重,产生一个输出。加法模块接受两个乘法器的输出,并产生一个输出。使用64位加法器来加权输入并将输出发送到激活函数模块。

激活函数(activation function)模块

S型对称激活函数(Sigmoid symmetric activation function)是通过分段逼近实现的,如公式中所示。

g(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}}

在ANN实现中,S型对称激活函数𝑔用于将加权缩放的输入映射到隐藏层神经元的输出。S型对称激活函数使用分段函数近似表示,因为在硬件中直接实现激活函数的指数计算效率低下。

上述所有四个模块都是使用Verilog编码的。所有神经元都已实现并连接,以实现人工神经网络的线性功能。同样,采用所提出的方法也可以在FPGA上实现人工神经网络解调器(demodulator)。所呈现的ANN-FPGA实现方法是通用和可扩展的。

参考文献:

  1. An efficient design methodology to speed up the FPGA implementation of artificial neural networks(2023)

  2. Hardware Implementation of Artificial Neural Network Using Field Programmable Gate Array (2013)

  3. Reconfigurable Hardware Design Approach for Economic Neural Network (2022)

  4. Automatic Modulation Recognition: An FPGA Implementation (2022)

  5. FPGA implementation of multi-dimensional Kalman filter for object tracking and motion detection

  6. Real-time optical character recognition on field programmable gate array for automatic number plate recognition system

  7. An On-Chip Fully Connected Neural Network Training Hardware Accelerator Based on Brain Float Point and Sparsity Awareness

  8. Software-Hardware Co-Design for Energy-Efficient Continuous Health Monitoring via Task-Aware Compression

  9. An Exploration of State-of-the-Art Automation Frameworks for FPGA-Based DNN Acceleration

  10. Eyeriss: An Energy-Efficient Reconfigurable Accelerator for Deep Convolutional Neural Networks

  11. An FPGA-Based Energy-Efficient Reconfigurable Convolutional Neural Network Accelerator for Object Recognition Applications

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值