基于FPGA的卷积神经网络加速器_余子健

文章目录

        • 1. 神经网络计算模型
        • 2. 卷积计算并行性分析
          • 2.1 卷积窗口内部并行
          • 2.2 相同特征图卷积窗口间并行实现分析
          • 2.3 不同输入特征图卷积窗口并行
          • 2.4 不同输出特征图并行
        • 3. 激活函数的实现
        • 4. 基于FPGA的加速器设计
          • 4.1 整体结构
          • 4.2 卷积计算单元

这是浙大余子健的研究生毕业论文,也是我阅读的第一篇文献。

1. 神经网络计算模型

基于FPGA的卷积神经网络加速器_余子健_第1张图片

上图为典型的卷积神经网络的结构。在图中C层代表的是卷积层,S层是子采样层,F代表全连接层。C层与S层是交替出现的。卷积层即特征提取层,子采样层可以二次平均和局部提取。卷积层是FPGA要加速的重点
基于FPGA的卷积神经网络加速器_余子健_第2张图片

上图是一个典型的卷积层,N个输入特征图,M个输出特征图,将会有N*M个卷积核 (Kernals)。这点我觉得很重要:不同的输入特征图,卷积核一定不同;不同的输出特征图,卷积核也一定不同。
具体的卷积和子采样计算过程不赘述。

2. 卷积计算并行性分析

这一部分是整个论文的核心。在该部分的讨论中,所有的并行情况都单独考虑,不设计多个组合的情况。

2.1 卷积窗口内部并行

即某一个卷积窗口的卷积计算的并行。通常在实现时会加入流水线技术,并行度为N时在单周期可完成N次乘累加。
基于FPGA的卷积神经网络加速器_余子健_第3张图片

一个小错误:上图中最左上角的X(n, 0)应该是X(n, 3)。
以第一行(行n)为例来说明该流水线是如何工作的,在第一个时钟周期,执行X(n, 0)*W00;第二个时钟周期,X(n, 1)*W01,并加上X(n, 0)*W00的计算结果, 此外,第一级流水线还会计算X(n, 1)*W00,即下一个卷积窗口的第一个计算值;第三个时钟周期,第三级流水线执行X(n, 2)*W02 + X(n, 1)*W01 + X(n, 0)*W00,第一级流水线执行X(n, 2)*W00,第二级流水线执行X(n, 1)*W00 + X(n, 2)*W01。以此类推。

2.2 相同特征图卷积窗口间并行实现分析

相同特征图内不同卷积窗口的并行,易理解如下图。
基于FPGA的卷积神经网络加速器_余子健_第4张图片

基于FPGA的卷积神经网络加速器_余子健_第5张图片
2.3 不同输入特征图卷积窗口并行
基于FPGA的卷积神经网络加速器_余子健_第6张图片

如上图所示为不同输入特征图的同一卷积窗口的并行,原理很好理解。

2.4 不同输出特征图并行
基于FPGA的卷积神经网络加速器_余子健_第7张图片

原理与不同输入特征图的并行基本相同。
到这里为止,四种由小到大,由细到粗的并行结构就结束了,这四种并行结构可以进行组合,在数据带宽和运行效率之间做出平衡。

3. 激活函数的实现

神经元的缴活函数实现是一个重要的环节,其导数的变化范围影响网络的收敛速度和学习速度。常用的激活函数有sigmoid,双曲正切等。激活函数的数字电路实现方式主要有以下方式:

  1. 泰勒级数展开
    可通过求激活函数的五阶泰勒级数来实现。这种方法精度损失小,占用很少存储器空间,但需要比较多的计算单元,并且通用性差。
  2. 简单的查找表
    通过传统的查找表方式将所有结果保存在存储器中来实现。这种方法具有较高的灵活性,精度可任意调整,消耗运算资源少,但随着精度要求的提升,存储器资源的负担也指数增长。例如一个16位输入,16位输出的查找表,其消耗的存储器大小为128KB。
  3. 分段线性逼近
    分段线化(PWL)逼近的基本思想是用一系列折线来逼近激活函数。在实现的时候,可将分段函数的断点存入查找表,断点间的区间用线化函数来得到中间值。这种方式占用存储器资源少于查找表,消耗计算单元也小于泰勒展开。
    PWL实现方式如下:在函数f(x)上选择一个线性区,并设定最大允许误差。比较线性区原函数与线性函数之间的误差,直至到达最大误差时,从该点开始一个新的线性区。重复上述操作直至函数定义域内所有区域均已遍历。
  4. CORDIC算法
    CORDIC算法本质是利用一组常数的角度基底去逼近任意一个旋转角度,通过多次迭代可得到任意分辨率输入数据的结果,消耗一定的运算资源,适合精度要求较高的实现场合。

4. 基于FPGA的加速器设计

4.1 整体结构
基于FPGA的卷积神经网络加速器_余子健_第8张图片

加速器的整体结构如上图所示。注意,要加速的过程是前向预测过程,反向训练以得到参数的过程是在主机上完成的。 主机把权值和图像以及指令传给FPGA,FPGA计算结束后将结果传回主机。

4.2 卷积计算单元

卷积运算是本次设计的优化重点,其实现决定了CNN计算单元的整体结构。由于CNN是一个前向传播结构,层间运算具有独立性且各层运算具有高度相似性,因此可通过复用单层运算资源来实现完整的CNN神经网络计算,在实现过程中只需实现单层的卷积计算结构。
基于FPGA的卷积神经网络加速器_余子健_第9张图片

上图是计算过程。在该实例中,有4副输入特征图,4副输出特征图,核的大小为3*3,上图中分左边阶段和右边阶段。采用并行性组合的方式,输出特征图之间的并行度为2,即同时计算两个输出特征图;输入特征图之间的并行度为2,即同时计算两个输入特征图;同一输入特征图不同卷积窗口的并行度为2,即同时计算两个卷积窗口。
如右阶段所示,把两输出特征图的计算完成后,接着计算剩下两副输出特征图的结果。

你可能感兴趣的:(FPGA与神经网络加速)