深度学习的硬件实现与优化技术研究_林楗军


这是哈尔滨工业大学林楗军的硕士毕业论文。
与上一篇博文《基于FPGA的卷积神经网络加速器_余子健》一样,本文首先就卷积神经网络的并行性做了介绍,内容大致相同,且都是应用于卷积神经网络的前向加速过程。对于一些相同的部分,不在此赘述。

1. 卷积神经网络模型基础

首先根据文章内容继续补充一些基础。

1.1 激活函数

为了模拟生物神经元具有的被激活的特性,增强网络的表达能力,引入了连续非线性激活函数。在传统的神经网络中,最常用的激活函数是以单极性Logistic函数σ(x) 和双极性Tanh函数Tanh(x) 为代表的 Sigmoid型函数,这类激活函数能有效起到控制信号增益效果的作用。近年来,ReLU 函数 ReLU(x)由于其计算简单,导数收敛快,单侧抑制性强的特点,使其开始被广泛应用。
在这里插入图片描述
在这里插入图片描述
从输入与输出的激励关系来看,Sigmoid型函数是一类连续光滑曲线,而 Tanh 函数实际上是 Logistic 函数的一个变形,Logistic 函数是把输入的连续实值压缩到在[0,1]区间内,Tanh 函数的输出则是压缩在[-1,1]区间,ReLU 函数可以看成是一类分段线性函数,当输入变量小于0 时,输出值都是 0,当输入变量大于等于 0 时,输出等于输入。

1.2 抽样层结构

抽样层跟随在卷积层后面,对前一层特征映射图进行二度特征提取。卷积层得益于其结构特点,虽然可以显著减少神经元之间连接路径,减少网络参数,但是卷积层得到的每一个输出特征映射图的神经元总数并没有显著减少。如果卷积层后面直接加入一个全连接方式的分类器,则分类器的输入维度需要很高,容易造成过拟合的问题。为了解决这一问题,一般在卷积层后面添加一个抽样层,可以看作是一个模糊滤波器,进行数据的采样和特征的二度提取,同时也增强了网络抗扭曲能力。
常用方法有:
在这里插入图片描述

2. FPGA优化技术

在FPGA设计与优化过程中,资源面积和计算速度作为矛盾双方,两者的抉择地位是不相等的,当两者发生冲突时,应当优先保证计算速度,满足工程在较高的工作频率。考虑到卷积神经网络高密度的计算特性,需要进行相关的速度优化技术研究。

2.1 并行技术

并行技术从实现方式来划分,可以分为空间并行和时间并行。空间并行是指将计算任务分配到多个独立的计算单元进行并行化处理;时间上的并行则主要是指通过流水线技术,将计算任务分配到数据流驱动过程中的每一个细小环节中并行处理。
空间并行:
在这里插入图片描述
时间并行:
在这里插入图片描述

2.2 乒乓技术

乒乓技术是一个常被用于控制与缓冲数据流。将单通道的数据流分节拍进行双通道切换传输,使得数据得到无缝衔接的缓冲和处理。乒乓操作的核心思想就是以双缓冲器的交互运行方式将数据传输与计算时间进行重叠抵消。乒乓操作示意图如下。
在这里插入图片描述

2.3 复用技术

复用技术是指针对同一块硬件资源需要被多个电路模块使用时,为了避免资源浪费,使重用的硬件资源共享于多个电路模块,做到资源共享,面积最优。硬件实现过程中,模块复用的实现方式有很多种,如时分复用、设置状态机、调整实现方式等等。
在这里插入图片描述

2.4 分块技术

分块技术是结构化设计中的一个重要方法,也是节约硬件资源的一种重要设计策略。卷积神经网络的多层化结构,使其必然需要进行模块划分。
存储器作为系统的记忆设备,是硬件设计中不可缺少的一部分。借鉴逻辑分块的思想,采用存储单元分片设计。结合卷积神经网络权值共享的特性,可以将共享数据,如权值、同一个特征图的神经元,分片存储在同一个存储单元内,提高数据复用率,也减少数据存取时对资源的占用面积。

3. 卷积神经网络的硬件设计与实现
3.1 卷积运算模块

卷积运算模块是整个卷积神经网络前向通路的核心运算模块,不仅具有高密度的运算操作,而且具有高频率的运算重复性,因此,该模块的运行效率也会极大地影响整个卷积神经网络硬件加速性能的效果,是本文的重点设计对象。

  • Z型卷积运算模块
    采用单数据流驱动的方式,3×3大小卷积核为例,详细说明Z型卷积运算模块的设计结构,其结构示意图如下。
    在这里插入图片描述
    注意,上面设计的卷积模块针对的是单输入特征图*单卷积核。
    观察上图,首先左侧部分是数据传输部分,右侧则是卷积运算部分。由于采用单数据流方式,输入特征图和卷积核都将呈Z字形扫描到缓冲FIFO中。在卷积计算时,卷积核的权值需要同时用到,所以在卷积核的缓冲FIFO后面有一个串并转换器得到所有的权值。
    卷积计算时,每行的3个乘法器和3个加法器构成了一个一维的卷积器。为了实现二维卷积窗口的卷积运算,需要将相邻的两个一维卷积器相连。由于输入特征映射图的神经元是按逐行扫描的方式输入,需要将相邻两行的神经元进行数据匹配,因此在前2个一维卷积器后面各添加一个深度为N−3的移位寄存器,作为相邻两个一位卷积器的数据通路,并且用于缓存计算的中间结果,进行数据匹配。这一小点稍难理解,有兴趣的读者请自己画一个实例,一算便知
    3D-Z型多输入多输出并行运算模块:
    在这里插入图片描述
  • 树型卷积运算模块
    从Z型卷积运算模块的单数据流驱动,逐行扫描的输入方式出发,进一步开发运算模块的运算效率,将单数据流的数据驱动方式拓展成多数据流的数据驱动,提出一种树型卷积运算模块结构。
    在这里插入图片描述
    这种树形卷积运算模块也更好理解一些,跟上一篇《基于FPGA的卷积神经网络加速器_余子健》中介绍“卷积窗口内部并行”思路相同。
    树型结构需要将输入神经元和卷积核参数按行分组,按组进行分块存储,以多数据流驱动的方式将数据并行传递到运算部分,Z型卷积运算结构并不适合这种多数据流驱动的方式;在卷积运算阵列中,树型结构采用分布式并行乘法结构得到乘法结果,乘法结果再传输到加法树中进行累加操作,得到输出结果,加法树每一层加法器之间添加流水线式寄存器,构成流水线式加法树结构。
    在这里插入图片描述
3.2 抽样运算模块

抽样层与卷积层运算窗口移动的步进值不同,卷积层为了获取更精细、更充分的特征,会充分利用每一个,每一组的有效数据,因此卷积窗口的步进值一般为 1;而抽样层则是为了降低特征维度和特征映射图的分辨率,不希望或减少数据的重叠部分,因此一般抽样窗口的步进值与抽样窗口的尺寸保持一致。
采用地址索引的策略来跳跃式索引存储器内的输入数据,以代替原先逐行扫描的顺序驱动方式。
抽样运算模块在FPGA中实现的RTL图如下所示。
在这里插入图片描述
抽样运算模块的功能仿真图:
在这里插入图片描述
抽样运算模块运行,首先通过逻辑控制电路,对地址存储器内预先存储的地址addr1 ~ addr4进行读取,将读取的地址作为地址信号传递给存储输入神经元的输入存储器,读取对应位置上的输入数据pixel1 ~ pixel4,其次将输入数据进行有效位截取,得到与原始输入数据位宽一致的 16bit 数据,保持在寄存器rega ~ regb,然后将位截取后的数据进入四输入比较器,选取最大值,最后将比较的最大值保存到输出存储器中保存。
抽样运算模块同样可以延续卷积运算模块的设计思路,采用分片存储,多数据流驱动的方法进行设计。若采用将 2×2的抽样窗口,那么输入神经元需要分片存储在4个存储单元内,抽样窗口相同位置上的输入神经元存储在同一个存储单元内,并行读取四个存储器的数据,进行卷积窗口的下采样操作。

3.3 激活函数模块

本文以ReLU函数作为卷积神经网络的激活函数,采用分段线性拟合的方法在FPGA上实现,对激活函数模块进行设计。
从ReLU函数的数学表达式,很显然可以看出,输入信号大于0 和小于0时,输出表达式不同,因此可以把ReLU函数分成两段拟合,一段是输入神经元为负值信号,另一段是输入神经元是非负值信号。这是两段简单的线性函数,在FPGA上非常容易实现。激活函数模块的RTL图如下。
在这里插入图片描述
函数实现部分由一个比较器和一个D触发器组成。输入缓存器输入待处理的神经元数据,然后将输入数据与0值比较,当输入数据小于0,则D触发器的输入端置0,输出信号也为 0,当输入数据大于等于0,则 D触发器的输入端为输入数据值保持不变。

4. 实验验证与分析

本文采用“FPGA+CPU”的异构体系作为本次实验验证平台。异构系统的框图如下。
在这里插入图片描述

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值