李增刚,王正彦,孙敬成
青岛大学 电子信息学院,山东 青岛 266071
人工神经网络在信息处理、人工智能、图像识别等领域广泛应用,它是由大量神经元组成的具有复杂运算和监督学习特性的系统。经过70多年专家和学者的努力,神经网络的结构、算法不断优化和完善[1]。手写数字识别是神经网络重要领域之一,软件实现神经网络用数据串行传送方式,而神经网络并行传送数据的特点,正好利用了FPAG数据并行计算和信息实时处理的优点,满足了工业控制领域对数据实时处理的要求[2]。随着FPGA技术的发展,集成和内部逻辑单元增多,例如Altera公司生产的FPGA 产品门电路数量有百万门,集成了PowerPC、Gbits高速乘法单元硬核处理器和MicroBlaze、Picoblaze、Nios 软核处理器,增强了 FPGA 芯片的处理能力[3]。文献[3]研究了用平滑插值法在FPGA 上实现BP神经网络的S型激活函数,并用深度流水线技术实现网络串并联。文献[4]介绍了在FPGA 上对tan-s函数的高精度实现,并用可重构性充分利用FPGA 逻辑资源,对结果进行仿真。文献[5]介绍了FPGA通过串口与PC机通信,实现图像卷积处理,利用并行性提升速度,同时减少带宽和资源的占用。
BP神经网络算法由前向运算、误差反向传播、权重和偏置更新构成。网络带权输入、激活值、判决输出是前向运算结果;误差、梯度、权重和偏置更新在神经网络反向运算过程[6]。BP算法的流程如图1所示。
图1 BP算法的流程示意图
网络的前向运算:训练样本x根据BP 算法计算网络隐藏层的a(2)、输出层的a(3),输出训练样本判决结果y;网络的反向运算:先计算最后1 层误差δ(3),计算梯度更新输出层偏置b(3)、权重w(3),再算前1层误差δ(2),计算梯度更新隐藏层偏置b(2)、权重w(2),把它们存入存储器里作为下次训练样本的第2、3层网络权重和偏置。
手写数字BP网络有输入层、1个隐藏层和输出层共3层,输入层有784个神经元,隐藏层有30个神经元,输出层有10 个神经元[7],数字像素数据由输入层传入,经运算传给隐藏层,最后由输出层输出判决数字0~9。神经网络第2、3层初始权重和偏置服从均值为0,方差为1的高斯分布。
BP 神经网络前向运算的第l层的带权输入与激活值、权重、偏置的关系式以第2层网络为例的展开式如下。
输入层784 个神经元上的像素数据乘以各自的权重,累乘和传给隐藏层30个神经元,加上对应的偏置得到第2层神经元的30个带权输入,作为S型激活函数自变量算出第2层激活值是第3层网络输入数据,计算方法与第2 层网络相同得到第3 层激活值,网络最后判决10 个中的最大值,输出判别数字[8],例如是第3层网络最大激活值,算法对样本的识别就是数字6。
神经网络反向运算是更新权重和偏置,并用MNIST集里测试样本验证网络识别准确率[9]。二次代价函数是找到合适权重和偏置的方法,多次迭代使第3层网络激活值接近期望值Y,最小化二次代价函数C(w,b)→0 表示BP网络训练出合适权重和偏置[10]。为提高网络训练速率,随机选取m个小批量训练样本更新网络权重和偏置,网络1 次迭代中60 000个训练样本使网络权重和偏置更新60 000/m次。权重和偏置更新公式如下:
计算网络误差是为计算梯度,更新网络权重和偏置。第3层权重更新公式及展开式(6),第3层偏置更新公式及展开式(7),η网络学习速率η=3,网络小批量训练样本数m=10 。第2 层权重梯度计算及展开式与第3 层相比只有不同,Xk是训练样本784个像素数据。
根据python代码中network库架构和BP算法原理,用Verilog 语言设计网络,训练样本和网络权值转化为S7.12 标准的定点数,其中S 表示符号位,7 表示整数位数,12表示小数位数[11]。另一方面考虑S型激活函数及导数的线性拟合,数据串并行转化,合理利用逻辑资源[12]。初始权重和偏置放在与.mif关联的读写RAM中。
BP网络MNIST库60 000个28×28的训练样本,图2是10个手写数字样本,像素灰度值范围0~255[13]。源文件1 个地址数据的高8 位和低8 位各一个样本像素,每个样本有自己标签,用Verilog 语言中的具有读写功能的$fopen 函数读取存放在文本文件中的样本像素和标签,在网络识别与训练时读取并写入样本存储器。
图2 MNIST库10个手写数字样本
BP 神经网络激活函数是Sigmoid 函数(S 型函数),表达式函数曲线如图3(a)。Verilog代码设计采用线性分割拟合S 函数曲线,分段拟合如图3(b)。表1 是S 型分段函数的浮点数表达式,网络带权输入Z和分段函数系数浮点数转定点数标准分别是S7.12与S0.12[14]。
图3 (a) S型激活函数曲线
图3 (b) S型激活函数分段曲线
表1 S型分段函数的浮点数表达式
S激活函数线性拟合的定点数Verilog代码如下:
S函数导数是,函数曲线如图4(a)。Verilog语言设计σ'(z)函数分段线性拟合曲线如图4(b)。表2是S函数导数σ'(z)的定点数分段表达式,系数定点数标准是S7.12。
图4 (a) S型激活函数导数
图4 (b) S型激活函数导数分段曲线
表2 S型导数分段函数的定点数表达式
两个训练样本为例的各层网络信号流程如图5,包括BP 网络前向判决输出和反向计算网络误差,1 次权重、偏置的更新[15],设计用的是10个训练样本。RAM_x1、RAM_x2是两个训练数据存储器,样本像素x前向运算传入第 2 层网络,z_2_1、z_2_2 是第 2 层网络 2 样本的带权输入,经过S 型函数算出第2 层网络2 样本的激活值a_2_1、a_2_2,根据反向误差公式第 2 层z_2_1、z_2_2 的导数与第 3 层网络的误差e_3_1、e_3_2和权重计算第2层网络神经元误差e_2_1、e_2_2,根据式更新偏置并存入偏置存储器RAM_b2,再根据梯度公式,它与样本像素x计算第2 层网络权重梯度g_2_1、g_2_2,根据式更新权重并存入权重存储器RAM_W2,输出层的信号流程原理和第2 层网络相同。z_3_1、z_3_2是第3层网络带权输入,e_3_1、e_3_2是2个样本第3层网络误差,Y1、Y2 是样本标签,g_3_1、g_3_2 是2 样本第3 层网络权重梯度,RAM_b3 是第3 层网络的偏置存储器,RAM_W3是第3层的权重存储器。根据第2章BP算法公式与BP网络信号的流程图设计工程。
在FPGA 平台上设计手写数字识别系统,除了BP网络算法的数学逻辑,还有3 层神经网络前向、反向运算和网络神经元权值更新的时序设计。本文采用一个计数器控制3 层网络的数据存储器RAM 和神经元误差、网络权值梯度状态[16]。
100 MHz时钟clk下计数器D计数范围0~2 455。数值0~786是第2层BP网络前向运算,787~819是第3层BP网络前向运算,第2、3层网络寄存器中带权输入导数用于误差计算,820~851是反向第3层BP网络计算误差、梯度和更新权重,884~1 668 是反向运算第2 层BP 网络误差、梯度和权重。1 770~2 454是第2组BP网络训练的小批量数据,因为RAM关联的.mif文件是第1组样本[17]。
BP 网络系统的输入端口是训练样本x1~x10、标签Y1~Y10 和时钟clk及复位rst_n,输出端口是out1~out10样本判决。图6是根据第2章BP网络算法原理,1个样本判别和权值训练的电路图,图中虚线框是反向运算训练网络的权重和偏置。W_RAM2_0~W_RAM2_29为第2层网络784个地址的权重存储器,W_RAM3_0~W_RAM3_9为第3层网络30个地址的权重存储器,X_RAM为训练样本存储器,b2_RAM为第2 层30 个地址的偏置存储器,b3_RAM为第3层10个的地址偏置存储器。
图5 以2个训练样本为例BP神经网络的前向运算及权重、偏置更新信号流程
图6 神经网络前向运算及误差反馈的电路图(1个训练样本为例)
前向运算的Verilog语言程序(以第2层网络第1个神经元带权输入为例):
存储器在地址发生器下输出样本、权重及偏置,偏置存储器b_RAM在时钟clk下串行输出,进行数据串转并(每神经元一个偏置)。第2层神经元并行激活值a(l2)转为串行与第3层神经元权重的累积和计算,最后判决第3 层并行激活值输出数字[18]。图7(a)和图7(b)是神经网络初始权重和偏置下训练样本5前向第2、3层网络的QuartusII仿真。x[1]是训练样本,a3_0~a3_9是第3层神经元的激活值,z_out32是第3个神经元带权输入,b32是第3 个神经元的偏置,y_in1 是样本标签,out1 是系统判别结果。
图7 (a) 激活值a2_0~a2_29的QuartusII仿真
图7 (b) 识别结果的QuartusII仿真
BP神经网络的偏置b2串转并Verilog程序如下(以第2层的30个神经元偏置为例):
BP神经网络的反向运算式(1)~(3)计算第3层神经元的加权平均误差(神经元的偏置梯度),更新偏置串行存入b_RAM作为系统下次迭代初始偏置。式(4)和式(7)计算神经元权重的加权平均梯度和更新权重存入W3_RAM。式(5)计算第2 层神经元误差。最后784 个时钟clk周期样本X灰度像素值乘以并行的δ(j2),计算第2层神经元权重的加权平均梯度,更新并存入W2_RAM。至此BP神经网络完成了1次小批量数据的样本判别和网络权重、偏置的训练[19]。
反向运算Verilog 语言程序(:误差计算,梯度计算,权值更新):
本文解决了BP 神经网络架构架构、MNIST 手写数字库、S 型激活函数及导数、各层网络数据状态的时序控制、数据串行与并行间转换、存储模块的设计、硬件结构图。研究手写数字BP算法,并根据network库python实现手写数字的网络架构[20]。为实现硬件系统,对算法进行相应向量转换和数据处理,用MNIST 库60 000 幅手写数字的像素数据和对应标签,在FPGA 上实现BP神经网络的判决和训练[21],在100 MHz 系统时钟计算1次迭代耗时150 ms,30次迭代4.5 s,而python2.7软件在计算机上迭代30次用时329 s,选取第30次迭代的最后1 000 个样本与标签,系统记录判别正确的样本个数为916 个,即准确率是91.6%,network 库网络架构中手写数字识别率为95.3%。图8(a)和图8(b)是网络中样本和标签在QuartusII 13.0 中第1 次迭代的仿真结果。图中y_in1~y_in10 是神经网络输入的小批量数据标签,out1~out10 是网络系统的判决,n是系统第n次小批量样本(60 000个样本数据,一次读10个,n最大为6 000),网络迭代30 次更新权重和偏置。随机取第1 次迭代n是 4 893 和 5 936 次中的 10 个训练样本,n为 4 893 有out3、out6、out8 与out9 和自己对应的标签不同,n为5 936 有out4、out5 与out10 和自己对应的标签y_in4、y_in5 与y_in10 不同,验证网络识别的准确率增加,第1次迭代识别率为69%(共30次迭代)。
图8 (a) n=4 893样本标签和识别的QuartusII仿真结果
图8 (b) n=5 936样本标签和识别的QuartusII仿真结果
通过仿真与测试分析,网络系统识别MINST数据库手写数字,并能训练网络,更新权重和偏置。利用FPGA并行计算实现了硬件速度快的优势,解决了软件训练速度慢、耗时长的问题。该系统可以应用于小型嵌入式数字实时识别,且利用BP 网络反向训练及更新权重和偏置,进一步扩展成网络,为判别其他字符图片奠定基础。另一方面FPGA 实现了浮点转定点和函数线性拟合,降低了数据在BP算法运算中的准确度,可以考虑进一步优化算法和精细划分S函数及导数拟合区间,提高网络判决精确度。