FPGA实现BP神经网络

一.激活函数

1.利用平滑插值法对神经网络的激励函数进行实现

下面将介绍BP神经网络常用的激活函数。

1.1 简单线性函数

神经元功能函数 f 连续取值,输入 x 由连接矩阵 W 加权产生输出,如图:

1.2 Sigmid函数

神经元的输出限制在[-1 :+1]之间的连续非减函数,此时称为双极性Sigmoid函数;同理,当此函数最小值向上平移1个单位长度后,神经元的输出限制在[0 :+1]之间的连续非减函数,此时成为单极性Sigmoid函数。我们生活中默认的S函数指的就是双极性Sigmoid函数。两者如图所示:


激励函数的选取与神经网络的类型有关,同一神经网络的不同层激励函数也不相同,BP 神经网络的输出层一般采用线性激活函数,而隐含层一般采用 S 型函数(Sigmoid)。可以看出双极性和单极性Sigmoid函数的大概形状都相似,本文设计的基于 FPGA 的 BP 神经网络采用了双极性 S 函数,原因如下:

  1. 双极性Sigmoid有正有负,单极性Sigmoid只有正的,对于复杂函数,大多都存在负向关系,则选用双极性 S 型函数。
  2. 在-1<x<+1 范围内,双极性 S 函数比单极性 S 函数的导函数变化快,所以对误差修正的幅度也更大,更有利于整个神经网络的快速收敛。
  3. 在收敛误差相同时,双曲正切的收敛速度比 S 型函数快,这样更容易避免达到局部最小。
  4. 在利用 Verilog 语言在 FPGA 实现激活函数时,因为双曲正切函数关于原点对称,所以只需要设计正区间内的函数,然后通过负向结果取绝对值的方式实现整个函数,更能够节省逻辑资源。

在采用 FPGA 设计神经网络的整个过程中,激活函数的实现方法至关重要,直接决定着所设计网络的整体性能。由于神经网络并行运算,需要用到大量乘法器,所以在神经网络的激励信号实现中尽可能少的使用乘法器,资源是设计激励函数合成系统的一个标准。所以根据前面介绍,FPGA 由于其自身的限制,不能直接实现非线性的双极性 S 函数。因此,只有通过间接逼近的方法对其进行实现,以下为在 FPGA 上实现非线性函数的几种常用方法:

  1. Taylor 级数法
    Taylor 级数法是一种高精度实现激励函数的方法。但是利用五阶 Taylor 级数展开对双极性 S 函数进行逼近,会占用 FPGA 的大量逻辑资源。虽然如今的 FPGA 芯片中已经集成了大量的乘法器,但 FPGA 需要进行大量的乘累加运算,所以除非对精度要求过高,一般不采用这种方式实现激励函数。
  2. 查表法
    人们最早利用 FPGA 设计神经网络时,大多采用查表法来实现激励函数。这种方法是将激励函数的输入作为存储地址,然后将其对应的值写入 RAM 和 ROM 中,当有输入时,通过查找表就能输出对应的输出值。这种利用表格建立输入输出的关系来实现激励函数的方法被称为查表法,表格的大小决定了激励函数的精度。这种方式操作简单,不需要进行复杂设计就能够在理论上逼近任意函数。但是,当精度要求过高时,查表法会耗费大量的存储资源,所以高精度网络的激活函数不适合利用查表法来实现。
  3. 分段线性逼近法
    实现激励函数过程中,可将激励函数划分为不同区间,然后利用线性函数y=ax+b对其进行拟合,并取其中间值为该区间内激励函数的逼近值。其他文章中提出利用线性函数将激励函数 sigmoid 分为 15 段进行线性拟合,而线性函数中的乘法运算通过移位的形式来实现,这种方法可以有效的节省资源,但是不能精准的保证移位操作实现的 2 的 n 次幂的线性函数能够拟合整个 S 型函数,所以误差较大,且由于分区过多,实现相对复杂。
  4. 坐标旋转数字计算方法
    CORDIC 又称为坐标旋转数字计算方法,早在 1959 年就被 Voldor 提出,然后逐渐从三角函数运算推广到复杂函数的运算,这是常用的一种硬件实现算法。CORDIC算法其实是一种利用移位和加减来消去乘除运算的迭代算法。可以有效地解决 FPGA的资源,为了提高其精度,常与查表法相结合,从而获得更高的效率。
    综上所述,以上方法各有利弊,对于硬件实现激活函数,需要综合考虑多方面因素,这就意味着逼近效果最好的方式不一定适合硬件实现。本文通过综合考虑,选择分段函数与查表法相结合的平滑插值法对双曲正切函数进行逼近。

2 双极性 S 函数的平滑插值法逼近

除了上述几种的常用的方法外,学者们经过不断的研究实验又陆续提出了利用STAM 算法近似以及最佳等距线性逼近等方法,这些方法都各有利弊。FPGA 实现激励函数的关键问题就是寻找一个精度与资源的平衡,本文通过综合考虑,选择分段函数与查表法相结合的平滑插值法对双曲正切函数进行逼近。这种函数逼近法实质上就是通过一系列的线性函数来对激励函数进行拟合,然后所得系数利用查表的方式表示出来。将激励函数分为不同的区间,并运用最小二乘法对多项式进行拟合,最终用曲线、直线以及常数相结合的方式将双曲正切函数表示出来。因为双曲正切函数的正区间与负区间关于原点对称,所以为了节省资源,在取负值时,通过取绝对值带入正值区域再取反的形式获得,这种方式有效的节约了对 FPGA 资源的利用。 最小二乘法的原理推导可以自行百度。

2.1 双极性 S 函数的拟合

因为双曲正切函数关于原点对称,所以只需要拟合正区间的函数即可,文中把正区间分为[0, 1]、[1, 2]、[2, 3]、[3, 4]、[4,无穷]五段对其行逼近,根据最小二乘法原理,采用多项式拟合的方式,求出相应的系数。图 3-2 为分段函数在[0, 1]、[1, 2]、[2, 3]、[3, 4]对双曲正切函数进行分段逼近情况。

可分别求得每一段的拟合函数表达式,如下图:

2.2 双极性 S 函数硬件实现以及误差分析

可以得出基于 FPGA 的激励函数的实现步骤:首先按照对称原则,选取双曲正切函数正区间进行逼近,并划分成[0, 1]、[1, 2]、[2, 3]、[3, 4]、[4, 无穷]五段区间。然后根据最小二乘法原理,求得逼近线段 y=kx^2+b 的系数k、b;转化成相应的数据格式,以备硬件实现。最后利用硬件描述语言 Verilog 编写函数对激励函数进行实现。 通过对实现原理的分析,双曲正切激励函数的硬件实现电路如图 3-4 所示。首先,需要将所获得的 k、b 值存储在 2 个 ROM、RAM 中,计算时先要对输入 x 的值取绝对值,然后再利用查表法找出其所对应的 k、b 值,然后再通过乘法和加法运算来对激励函数进行运算,这种方法操作简单、计算速度较快且利用查表法能够节省更多的逻辑资源。

二. FPGA存储技术

如果在学习过程中,每次更新后的权值都存储在 SRAM 和 DRAM 等外部存储器中,由于其带宽限制,数据很难达到并行输入输出,使其不能直接满足计算需求,无法进行并行计算,就失去了硬件实现神经网络的意义。为了能够使神经网络网络能够达到真正的并行输入输出,寻找一种合理的存储中间数据的方式非常重要。

FPGA实现BP神经网络-原理相关推荐

  1. 深度学习(神经网络) —— BP神经网络原理推导及python实现

    深度学习(神经网络) -- BP神经网络原理推导及python实现 摘要 (一)BP神经网络简介 1.神经网络权值调整的一般形式为: 2.BP神经网络中关于学习信号的求取方法: (二)BP神经网络原理 ...

  2. BP神经网络原理简单介绍以及公式推导(矩阵形式和分量形式)

    BP神经网络原理简单介绍以及公式推导 标签(空格分隔): 神经网络 \def\net(#1){net^{(#1)}} \def\Y(#1){Y^{(#1)}} \def\part(#1){\parti ...

  3. bp神经网络原理 实现过程,BP神经网络的实现包括

    1.BP神经网络原理 人工神经网络有很多模型,但是日前应用最广.基本思想最直观.最容易被理解的是多层前馈神经网络及误差逆传播学习算法(Error Back-Prooaeation),简称为BP网络. ...

  4. BP神经网络原理及Matlab实现(Back Propagation Neural Networks,BPNN)

    BP神经网络原理及matlab实现 一.简介 1.BP 神经网络的信息处理方式的特点 2.BP神经网络的主要功能 二.神经网络的训练 1.神经网络拓扑结构(隐含层)的确定 2.网络的初始连接权值 3. ...

  5. BP神经网络原理分析及c++代码实现(下)

    本部分主要是BP神经网络的C++代码部分,在这里简单的介绍下代码的头文件,具体代码的实现以及测试数据,请在csdn资源里下载:http://download.csdn.net/detail/hjkhj ...

  6. BP神经网络原理及其应用,bp神经网络的工作原理

    1.BP神经网络的工作原理 人工神经网络就是模拟人思维的第二种方式.这是一个非线性动力学系统,其特色在于信息的分布式存储和并行协同处理.虽然单个神经元的结构极其简单,功能有限,但大量神经元构成的网络系 ...

  7. BP神经网络原理与异或实例分析

    文章目录 BP神经网络原理介绍 一.BP神经网络算法原理是什么? 二.激活函数 1.激活函数作用 三.BP神经网络异或实例分析 1.问题: 2.分析: 3.代码 总结 BP神经网络原理介绍 BP神经网 ...

  8. BP神经网络原理及实现

    BP神经网络原理 经典的BP神经网络通常由三层组成: 输入层, 隐含层与输出层.通常输入层神经元的个数与特征数相关,输出层的个数与类别数相同, 隐含层的层数与神经元数均可以自定义. 每个神经元代表对数 ...

  9. bp神经网络原理 实现过程,BP神经网络的基本思想

    BP神经网络原理 人工神经网络有很多模型,但是日前应用最广.基本思想最直观.最容易被理解的是多层前馈神经网络及误差逆传播学习算法(ErrorBack-Prooaeation),简称为BP网络. 在19 ...

  10. BP神经网络原理(附实验程序)

    1. 人工神经网络 1.1 原理 人工神经网络(Artificial Neural Networks,ANN)也简称为神经网络(NN),它是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数 ...

最新文章

  1. DOS 循环 FOR
  2. 每日一皮:“快准恨”的程序员叠衣法,还不快学起来?
  3. java opentsdb 链接 池_如何使用tCollector通过Java在OpenTSDB中添加数据
  4. Keil插件推荐及使用教程
  5. RocketMQ-Spring 毕业两周年,为什么能成为 Spring 生态中最受欢迎的 messaging 实现?
  6. Escape The Maze (easy version) 多源最短路,bfs(1700)
  7. integer加1_利用Abaqus UEL开发自定义单元1
  8. Windows Phone 7 系统主题颜色RGB和Hex值
  9. Springboot05整合FastJson优化输出
  10. 面试java常问的问题_java面试官常问的问题
  11. 2021-2025年中国制药行业MR报告软件行业市场供需与战略研究报告
  12. Linux环境安装Redis高可用及配置主从复制、哨兵模式、分布式集群模式
  13. Qt中配置OpenCV
  14. IObit Uninstaller Pro 10.0.2.20 便携版 — 卸载工具
  15. 学生网页作业网站设计——中华美德(6页) HTML+CSS+JavaScript web大作业 静态网页
  16. 抢占氢能产业发展风口,上海重塑能源集团股份有限公司助推行业发展
  17. Web前端-html页面-01(锚点、表单、个人简历)
  18. input只能输入数字0-9(不含小数点)
  19. 从头开始 制作办公系统_使用swiftui从头开始通过数据获取制作watchos应用
  20. 订单漏单问题分析及解决方案

热门文章

  1. 2018华为软件精英挑战赛个人总结
  2. 海康摄像头SDK跨平台通用解决方案
  3. labview与C数据类型的对应关系
  4. 福建师范计算机应用基础作业,福建师范大学《计算机应用基础》在线作业一答案.docx...
  5. 长岭县机器人项目_长岭县专业编制项目立项申请报告
  6. python pandas中文手册-Pandas速查手册中文版(转)
  7. 软考数据库系统工程师笔记
  8. 学习笔记(03):2020软考数据库系统工程师-基础知识培训视频-计算机系统--安全性可靠性与性能评测(一)...
  9. XML转换JSON格式
  10. MicroPython学习笔记(二)操作GPIO和TIMER实现数码管动态显示