在微控制器芯片实现神经网络的方法

来源:期刊VIP网所属分类:检验医学发布时间:2020-12-17浏览:

  摘 要: 针对微控制器芯片尚未存在使用神经网络处理时序信号的现状,提出一种可以在微控制器上进行神经网络训练、预测时序信号的方法。 该方法不基于操作系统运行神经网络程序,无法由操作系统进行栈区空间大小的调整以及内存的分配问题,为了解决这个问题,更改了初始化栈区空间的大小,增加了外部扩展SDRAM芯片,使之达到适合神经网络程序运行的大小。在微控制器芯片实现神经网络的方法包括定义了实现神经网络需要的矩阵运算,使用C语言编写并封装LSTM循环神经网络前向传播函数,反向传播函数,以及LSTM循环神经网络的权重更新函数。调用封装好的LSTM循环神经网络函数进行实验,以时序信号sin x函数为例,预测信号变化。故使用该方法,可不依赖操作系统在微控制器芯片建立神经网络,具备了稳定、实时可靠的优点。

  关键词: 微控制器芯片; 神经网络; LSTM; 栈区空间; 内存分配; 时序信号处理

医学神经论文

  0 引 言

  在2018年中国国际嵌入式大会上,何积丰院士提出,人工智能存在向嵌入式系统迁移的趋势[1]。在嵌入式系统上玩转人工智能,是这个智能化时代前沿的研究。目前嵌入式系统人工智能主要使用Cortex?A系列微处理器芯片,A系列微处理器芯片主要面向手機、平板电脑等民用商品,属于消费类电子,实现人工智能需要依赖操作系统,不具备稳定性,不适合应用在军事、工业、信号处理等领域。Cortex?C系列微控制器芯片是单一功能的、更加专业的芯片,具备低功耗、低成本、实时、稳定可靠的特性,被广泛应用在军事、工业、信号处理等方面,但目前还未发现在微控制器芯片上建立神经网络,做人工智能的研究。

  循环神经网络算法是神经网络算法的一种,常用来学习、识别、预测时序信号,若能在Cortex?C系列微控制器芯片上搭建循环神经网络,只需要输入信号,用理想输出作为监督学习,多次训练后,即可进行信号智能处理、信号智能识别、信号智能预测等工作。使用Cortex?C系列微控制器芯片搭建循环神经网络,处理时序信号,更加智能、稳定可靠。搭建循环神经网络需要进行一系列矩阵运算,Cortex?M系列微控制器芯片已经具备DSP指令,所有的DSP指令都可在一个机器周期内完成,提高了矩阵运算速度。本文结合当前的研究现状提出一种针对Cortex?M系列微控制器芯片建立的循环神经网络方法,使用循环神经网络对时序信号进行学习,并预测未来的信号。

  1 LSTM循环神经网络

  对于时间信号的预测,常常使用循环神经网络(Recurrent Neural Network),简称RNN神经网络。一个简单的RNN神经网络可以表示为图1a)的形式。图1a)中,[x]表示输入向量;[O]表示输出向量;[U]表示输入层到隐含层的权重矩阵;[V]表示隐含层到输出层的权重矩阵;[S]表示隐含层的值;[W]表示隐含层的值到下一个时刻隐含层的值的权重矩阵[2]。

  为了更好地理解RNN神经网络,将图1a)按时间展开,如图1b)所示。其中,[xt-1],[xt],[xt+1]分别表示在t-1,t,t+1时刻的输入向量;[Ot-1],[Ot],[Ot+1]分别表示在t-1,t,t+1时刻的输出向量;[St-1],[St],[St+1]表示在t-1,t,t+1时刻的隐含层的值;[V]表示隐含层到输出层的权重矩阵;[W]表示隐含层的值到下一个时刻隐含层的值的权重矩阵。从图中可以看出,前向传播公式为:

  由式(1)可以看出,当前隐含层的值[St]不仅与当前时刻的输入相关,并且与之前隐含层的值相关,而输出[Ot]是[VSt]的函数,所以输出[Ot]受历史输入影响,这就是RNN可以处理时间序列的原因[3]。

  RNN神经网络在处理长时间的信号序列时会产生梯度消失或梯度爆炸,为了克服这个缺点,将RNN进行改进,在RNN的基础上,加入长期状态C,用来保存长期状态,从而达到解决RNN梯度消失和梯度爆炸的缺陷,改进后的RNN神经网络被称作LSTM(Long Short?Term Memory)神经网络[4]。LSTM中主要使用3个门,分别是遗忘门、输入门、输出门以及即时状态来控制长期状态。遗忘门负责决定之前的长期状态对当前的长期状态影响程度;输入门与即时状态共同负责决定当前输入对长期状态的影响程度;输出门决定当前长期状态对输出的影响程度[5]。LSTM神经元如图2所示。

  前向传播过程需要计算遗忘门输出[ft],输入门输出[it],即时状态输出[C′t]以及输出门输出[Ot]。长期状态[Ct]由遗忘门输出[ft]、输入门输出[Ot]、即时状态输出[C′t]和上一时刻的长期状态[Ct-1]共同决定。

  2 实现LSTM循环神经网络

  Cortex?M系列芯片具有稳定可靠、实时、低成本、低功耗的优点,被广泛应在工业控制、军事、信号处理等领域。由于Cortex?M系列微控制器芯片在建立神经网络时,不能由操作系统自动分配内存以及栈区空间,为了确保神经网络程序能够正常运行,需要人为扩展内存及扩大栈区空间。

  Cortex?M系列芯片一直被定位在低性能端,但是仍然比许多传统处理器性能强大很多,例如Cortex?M7处理器,最高时钟频率可以达到400 MHz。Cortex?M7处理器是针对数据处理密集的高性能处理器,具备面向数字信号处理(DSP)的指令集,支持双精度浮点运算,并且具备扩展存储器的功能,使用搭载Cortex?M7处理器的芯片,实现机器学习、人工智能,具备低功耗、低成本、稳定可靠的优点。

  选择以搭载Cortex?M7处理器的STM32F767IGT6芯片为例实现LSTM循环神经网络,STM32F7使用Cortex?M7内核,在数字信号处理上增加了DSP指令集,大大提升了芯片的计算速度。ARM公司提供了DSP算法的库(CMSIS_DSP),具备了部分矩阵运算的功能,减少了开发的时间以及难度,并使运算速度有了进一步的提升[6]。

  2.1 ARM芯片中的矩阵运算

  在STM32上实现LSTM,要解决矩阵、向量运算的问题。进行矩阵、向量运算,需要的内存空间比较大,所以需要对芯片进行内存扩展。LSTM的权重矩阵需要进行存储,权重矩阵的维数直接关系到神经网络的学习能力,通过内存扩展可以确保权重矩阵维数满足需求,不会使神经网络的学习能力过低。在实现LSTM的过程中,用到很多矩阵运算和向量运算,使用ARM公司提供的CMSIS_DSP库中的矩阵处理函数,可以解决部分矩阵运算,提高运算速度。CMSIS_DSP库中,用结构体arm_matrix_instance_f32表示矩阵,结构体的元素numRows表示矩阵的行,numCols表示矩阵的列,pData指向矩阵数组,矩阵元素为32位无符号float类型,可以满足数据精度要求。

  用arm_matrix_instance_f32结构体定义结构体数组,用来存放张量(由数组构成的数组),使用张量,来存储历史时刻门的输出值[7]。

  CMSIS_DSP库中有矩阵的基本运算,如矩阵的加法、转置、乘法等,在LSTM神经网络算法中需要用到对矩阵元素的操作,例如矩阵按元素相乘,可以选择使用for循环遍历整个矩阵的方式访问到每一个矩阵元素。

  定义生成随机矩阵的函数,输入值为要生成矩阵的行NumRows,列NumCols,以及这个矩阵是否被作为偏置矩阵使用。若生成权重矩阵,则使用C语言中的随机数函数rand(),遍历矩阵赋值随机数;若生成偏置矩阵,则将矩阵所有元素初始化为0。

  无论是前向传播还是反向传播时,都会用到矩阵按元素相乘,但CMSIS_DSP库中并没有矩阵按元素相乘的函数,所以需要定义。定义矩阵按元素相乘的函数为mul2,它有两个输入,即两个按元素相乘的矩阵,先判断这2个矩阵的维数是否相同。因为按元素相乘,要求2个矩阵必须维数一样,才能进行运算。使用for遍历矩阵中的每一个值,让2个矩阵对应位置上的元素进行相乘,并返回相乘后的新矩阵。此时新矩阵的维数应该和输入矩阵的维数相同。

  使用两个矩阵按元素相乘函数mul2,去构造3个矩阵按元素相乘的函数mul3。mul3有3个输入,首先经前2个输入送到mul2中进行按元素相乘,再将结果与第3个输入放到mul2中进行计算,这样可以获得连续3个矩阵按元素相乘,同理可以获得mul4,mul5。

  推荐阅读:《中华神经医学杂志》是中国科学技术协会主管,中华医学会主办,南方医科大学珠江医院承办的国家级神经医学专业学术期刊。

期刊VIP网,您身边的高端学术顾问

文章名称: 在微控制器芯片实现神经网络的方法

文章地址: http://www.qikanvip.com/jyyx/54698.html