【AI x FPGA自学笔记】基于参数化FPGA的通用在线神经网络的开发与实现

通过利用FPGA的可重构性,将基于参数化软件的人工神经网络(ANN)和ANN模拟器的灵活性转移到硬件平台上。这样做,我们将使用户能够在硬件上高效地探索设计空间和原型,正如现在在软件中所能做到的那样。

先前研究:羊群抗虫线虫检测的人工神经网络FPGA实现

MLP的构建

由于多层感知器神经网络(multi layer perceptron neural network(MLP))在数据分类和数据估计方面具有很高的效率,我们使用MLP来构建网络。

为了制作表1中的人工神经网络数据,使用一些羊群的兽医数据作为神经网络的输入和输出。这些统计数据的目的是建立一个多层感知网络(图1),用于模式识别和数据分类。MLP将用于苯并咪唑(BZD)耐药线虫的鉴定。

表1:显示了在药物注射前后受测畜群中
H、T、O寄生虫存在的百分比
图1:绵羊BZD耐药线虫多层感知器的构建

对于神经网络的训练,采用一种简单的反向传播方法来达到期望的最小误差。然后将训练得到的权重和偏置因子(bias factors)用于FPGA上的硬件安装。

所有在表1中给出的38行有三个输入和一个用于训练网络的输出。这38行中,前34行数据作为训练数据,后4行作为验证数据。

采用了一个具有一个隐藏层的网络来构建一个用于识别抗苯并噻二唑类杀虫剂的线虫的结构。该网络在输入层有 3 个节点(图 1),这些节点代表在对照组中临床发现的感染性幼虫(H、T 和 O)所占的百分比——这些幼虫无需对动物进行任何治疗。在网络的输出层有一个节点,其目标值被设定为 0 以对应对苯二氮䓬类药物有抗药性的线虫,而为对应易感线虫则设定为 1。网络的隐藏层有 4 个神经元,并使用了 Sigmoid 激活函数。为了训练该网络,从表 1 中选取了 1 到 34号群的数据作为训练数据,并采用反向传播学习规则来调整网络的权重。大约 300 个周期后,学习误差已经大大下降。

通过MATLAB训练得到的权重和偏倚系数如下:

W= [ 20.8274, -25.3639 , -4.8864;

        30.6564, -118.1918, -65.5309;

        43.8998, -60.2949, 145.4259;

        106.9770, -15.0551, -20.7781];

U= [117.1778;

      142.0364;

      106.8569;

      82.6105];

这些权重和偏倚系数将在后续步骤中用于训练和设计的网络的硬件安装。在获得权重和偏差系数后,将表 1 的最后 4 行应用于网络,以验证网络的正常运行情况。

ANN的FPGA实现

我们以上一节中所介绍的网络为例,在FPGA上进行实现。

图3:在FPGA上实现网络,XLINK系列XC400

该网络在隐藏层有4个神经元,在输出层有1个神经元,每个隐藏层神经元有3个输入、3个权重因子和1个偏置因子。这些因子经过MATLAB仿真得到,现在可以认为是神经元的恒定输入。每一个隐藏层的神经元被定义为:

a_{j}=\sum ^3_{i=1}w_jx_j+u_j

为了方便地计算WX + U项,权重因子和偏差被乘以10^x倍,直到WX和U的幂相等,并且可以很容易地相加。在神经元的输出中,我们每输入10^3次乘法删除10位LSB。

在与每个隐藏神经元相关的模块中(参照图 4),我们有三个 SOP(Sum of products),其作用是获取以下结果:

a_j=\sum W_1X_1+b\\ =(W_{13}X_3+U)+(W_{12}X_2)+(W_{11}X_1)

y_1=W_{13}X_3+U被获得。它的输出是下一个神经元的输入,我们可以计算:Y_2=W_{21}X_2+Y_1

第三项也有类似的情况,Y_2是它的输入,我们可以计算:a_j=W_{11}X_1+Y_2=\sum_{i=1}W_iX_i+U,这是最后一个神经元的输出。

在每个隐藏神经元的输出路径上有一个单极sigmoid函数(single pole sigmoid function):o_j=\frac{1}{1+e^{-a_j}}

隐层中每个sigmoid函数的输出是输出层中单个神经元的输入,该神经元有4个输入、4个权重因子和1个偏置因子。所以在输出层的神经元中,我们有四个SOP块。如图3所示,我们可以获得:

a_5=\sum W_{JI}O_I+U_J\\ =W_{11}O_1+W_{21}O_2+W_{31}O_3+W_{41}O_4+U

因此,在这个神经元中,Y_1=W_{41}O_4+U首先由SOP1计算获得。然后将Y1作为SOP2的输入,获得Y_2=W_3O_3+Y_1。用类似的方法我们可以得到:Y_3=W_{21}O_2+Y_2。最后SOP4给出:a_5=Y_3+W_{11}O_2

SOP4的输出为单极sigmoid函数,函数为:O_5=\frac{1}{1+e^{-a_5}}

O5进入比较器,与数字98(阈值)进行比较,如果大于等于98,则将1视为网络输出,如果小于98,则将0视为输出。

图4:对输入神经元执行aj = ∑ wji oi + uj

硬件实现

硬件架构的视图。实箭头表示哪些组件总是生成。虚箭头表示根据给定参数可能会生成或可能不会生成的组件。

请注意,本研究仅限于实现具有反向传播学习算法的前馈多层感知器(MLP)。此外,像层数、神经元数量、输入输出大小、互连类型等设计参数,受到可用硬件资源的限制,这取决于所用的FPGA类型。没有通用规则。必须通过实验来推导限制。

数据表示

我们的网络具有可选择的数据宽度(data width),分为整数部分和小数部分。例如,我们的实现包括一个符号位(sign bit, S)、一个整数位(integer place, I)和三个小数位(fractional places, F):SI.FFF

由此可知,网络数据精度(data precision)为2^{-F}(在我们的例子中为0.125),F为小数位的数量,并给数据集D设定最大范围为-2^{N-1}\leq D\leq 2^{N-1}-2^{-F}(在我们的例子中为-2 ≤ D ≤ 1.875),N = 1 + I + F 为总数据宽度(在我们的例子中,I=1,F=3)。

处理部件(PE)

在将PE组件的设计简化到其基本特征时,我们得到一个具有与前一层的神经元数量相等的宽度的乘加函数(multiply accumulate function),选定的压缩函数(squashing function)实现,以及包含突触权重(synaptic weights)和输入缓冲区(input buffers)的存储元素,例如寄存器。

PE由方程(1)y_k = \varphi_k(v_k)(2)v_k = \sum_{j} w_{kj} i_{kj} + \theta_k描述:

  1. \varphi_k是是处理部件k的压缩函数,其作用是限制局部字段(local field)的值。
  2. w_{k j}是连接上层神经元 j 与神经元 k 的突触权重。
  3. \theta_k是神经元的偏差。

方程(1)是按层顺序计算的,从接收输入层输入的第一个隐藏层开始,到输出层,生成一个与一个输入向量对应的输出向量。网络的行为由其权重和偏差的值所定义。因此,在网络训练中,权重和偏差是训练的对象。训练是在每次网络的前向传递后使用反向传播算法(backpropagation algorithm)进行的。

PE的完整计算如图5所示。在图5中,MACC单元将输入与权重和偏置相乘并求和,以实现\sum_{j} w_{kj} i_{kj} + \theta_k。之后,从MACC得到的最终数量通过压缩函数\varphi(见图右上角)传递,以产生网络输出y。如图5所示,压缩函数利用查找表(lookup table (LUT))(通过“lut_en”指令),如下所述。

图5:PE组件的功能块

压缩函数(Squashing Function)

所选择的非线性压缩函数的直接实现,例如 sigmoid 函数 [参考方程 (6)\varphi(v_j) = \frac{1}{1 + e^{-\alpha v_j}}(7)\varphi(v_j) = \frac{e^{\alpha v_j} - e^{-\alpha v_j}}{e^{\alpha v_j} + e^{-\alpha v_j}}.],在硬件上存在一个问题,因为除法和指数运算都需要耗费大量的时间和硬件资源来计算。在硬件中,唯一可行的方法是对该函数进行近似 。然而,为了使训练收敛或获得准确的离线结果,必须达到最低的准确度水平。

更准确的近似将导致更快、更好的收敛,从而获得更准确的结果。已经有大量的研究探讨如何在硬件中有效地近似sigmoid函数,同时保持可接受的准确度和在反向传播学习中所需的连续性。为了创建一个通用设计,我们必须为sigmoid函数的近似添加一个额外的要求,即近似方法必须适用于多种sigmoid函数。

我们可以为在我们的通用设计中实现的 sigmoid 函数选择两种实现风格之一:统一查找表(uniform LUT)或带线性插值(linear interpolation,即通过假设一个函数(如对数函数)在已知值之间是一条直线来估计该函数的方法)的 LUT。

1. 统一查找表(uniform LUT):在块RAM中实现的统一LUT可以用来近似任何形状的函数。LUT通过局部字段(local field)进行寻址。地址是通过取局部字段的符号位的反转,并连接表示映射到LUT的函数的最高输入值所需的最高有效位,直到LUT的地址位数。总的来说,计算只需一个周期,并且所需的硬件仅限于保存表本身。

2. 带线性插值的查找表(LUT With Linear Interpolation):为了应对统一LUT准确度降低的问题,同时保持对各种函数的归纳,我们结合了线性插值和LUT。该解决方案有效地在统一LUT的每个点之间绘制了一条线。最终的激活函数是y=\frac{LUT(d+1)-LUT(d)}{2^{N-M}}q_e+LUT(d)。LUT(d)是由统一LUT返回的值,代表目标函数在索引d上的值;N是局部字段的位宽;M 是 LUT 地址总线的位宽;q_e是量化误差,且q_e=\varphi(v)-LUT(d)

通过将线性插值技术应用于统一查找表(LUT),可以显著减少所需LUT的大小,同时在实现一个加法器和一个乘法器的成本下保持相同的准确度。

反向传播(Backpropagation)算法

由于反向传播算法一次只针对一层执行,我们只需要一套必要的算术组件。

由于乘法器和加法器的数量,以及MACC的大小依赖于给定层及其前驱层的大小,我们必须计算并生成在给定网络设计的详细说明过程中所需的最坏情况下的算术组件数量。用于反向传播计算的算术组件集合随后被打包成BP ALU组件。

BP ALU 由每个反向传播教师(backpropagation teacher)通过一个自动生成的多路复用器(图8)访问,该多路复用器由网络控制器控制。

图8:反向传播的实现
图9:网络控制器的状态机

网络控制器

网络控制器的设计受到网络高度通用设计的强度指导,以及最初决定将功能单元和控制单元(functional and control units)分开的影响。中央控制网络的决策基于的目标是:最小化那些必须多次生成的组件的大小(size)和复杂性(complexity)。

根据生成的网络,网络控制器可以创建为在线(online)或离线(offline)网络控制器。这里,离线表示网络是预训练的,然后网络对象用于测试数据,而没有任何训练能力。这种类型的网络通常由于实现复杂性较低而在硬件实现中使用。另一方面,在线表示网络具有动态训练能力。对于不同的应用,具有不同架构的网络会根据特定的训练方法进行自我训练,例如反向传播,然后再对测试数据进行处理。这提供了一种通用的灵活性,但实现起来较为复杂。

由于在离线模式下生成了一个管道网络(pipelined network),因此需要不同的实现,在线控制器必须包含反向传播算法计算的控制。尽管如此,这两个控制器的实现方式是相同的。

网络控制器是一个Mealy状态机(见图9),基于一个计数器,该计数器指示当前迭代中经过的时钟周期数量(在在线网络的情况下)或经过的总时钟周期数量(在离线网络的情况下)。如上所述,对于在线应用,我们需要具有学习能力的网络。需要注意的是,对于反向传播学习算法,误差需要被反馈(fed back)。因此,Mealy状态机是合适的,因为它是一个有限状态转换器,根据其当前状态和输入生成输出。计数器的值必须有意义,我们必须能够预先计算达到网络的前向和反向传递中的里程碑的延迟。这些里程碑在设计的详细阐述中进行计算。基于这些里程碑,状态机输出一组使能信号以控制网络的流动。相比之下,对于离线应用,不需要训练,因此在网络控制器状态机中不需要反向传递(见图9)。

参考文献:

Development and Implementation of Parameterized FPGA-Based General Purpose Neural Networks for Online Applications (2011)

FPGA implementation of an ANN for detection of anthelmintics resistant nematodes in sheep flocks (2009)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值