lstm结构图_神经网络——单层LSTM

lstm结构图_神经网络——单层LSTM_第1张图片

LSTM神经网络全称长短时记忆神经网络(Long Short-term Memory),是一种特殊的RNN(Recurrent Neural Network)。下面从一下几个部分对LSTM进行介绍。

  • LSTM–cell、gate的基本概念
  • LSTM内部结构
  • 基于Tensorflow的LSTM实现代码解析
  • LSTM推断在FPGA实现思路

1. 基本概念

1.1 cell

Cell是构成RNN神经网络的基本单元,Cell能够记忆之前输入的状态。LSTM是RNN的一种变种,解决了RNN在训练过程中梯度爆炸和梯度消失的问题。在LSTM中保持了Cell的概念,但与RNN不同的是,LSTM中Cell记忆的是两种状态:1)记忆之前输入的状态c(Tensorflow中称c-state);2)当前输出状态h(Tensorflow中称m-state)。

lstm结构图_神经网络——单层LSTM_第2张图片
cell结构图

LSTM的输入是按照时间序列分步进行输入,在每个时间步(Timestep)cell都进行状态更新。在t时刻,cell的记忆状态

表示Cell记忆t-1以及以前时刻的输入状态,
表示t-1时刻Cell的输出。于是当多个Cell逻辑连接在一起时,就组成了一个完整的LSTM推断过程,如下图。在一轮LSTM推断中,LSTM输入序列为
,Timestep=t。此时LSTM输出为
,然后输入新的序列进行下一轮的推断。

lstm结构图_神经网络——单层LSTM_第3张图片
LSTM推断过程图


1.2 门

门(Gate)是将LSTM与RNN区分开来的一个重要概念,cell更新状态靠的是门。在cell中,有三个门:遗忘门(Forget Gate),输入门(Input Gate)和输出门(Output Gate)。门的作用是控制数据范围,接下来会围绕下面三个问题对门和cell结构进行解释,1)门的输入数据是什么;2)门的输出数据是什么;3)门控制谁的数据范围。

1)门的输入数据是什么?

门的输入数据是前一个时刻cell的输出

和当前的输入

2)门的输出数据是什么?

门的输入数据乘以权值矩阵,然后经过激活函数,即为门的输出,门输出的数据范围与激活函数的类型有关。用函数表示:

是激活函数,常用sigmoid函数,
表示门的输入数据,
表示权值和偏置(与神经元中的概念是一致的)。

3)门控制谁的数据范围?

  • 遗忘门:之前的状态
    会对当前cell输出有影响,遗忘门的作用是对之前的状态进行部分遗忘。(过去不开心的事情该忘记的就忘记吧==)
  • 输入门:对当前cell的输入的数据进行控制。(选择性吸收?)
  • 输出门:对当前cell的输出的数据进行控制。(谁还不能留点小秘密..)

a8b8f9848b44148d711b017fcd5e6f6d.png
Gate结构

2. LSTM结构

LSTM是由cell构成,而cell则是由gate构成。下面来看看gate是怎么构成cell的吧!

lstm结构图_神经网络——单层LSTM_第4张图片
好吧...图是我不知道在哪copy的..懒得画了
  • forget gate:
  • input gate :
  • new cell :
  • output gate:

前一个时刻cell的输出和当前时刻序列的输入拼接作为各个门的输入,拼接后乘以不同权值矩阵(加上偏置)可以得到不同的门:遗忘门、输入门和输出门。上一时刻cell的记忆状态与遗忘门做element-wise(对应元素相乘),表示遗忘之前时刻的部分信息;输入门与new cell做element-wise,表示加入当前时刻的部分信息;经过遗忘和加入新的记忆,得到cell新的记忆状态。最后与输出门做element-wise,将cell部分信息作为cell的输出。

3. 代码实现

github上有比较好的基于tensorflow实现lstm的例子,对其中部分代码做一些说明和拓展。

lstm​github.com
lstm_cell = tf.contrib.rnn.BasicLSTMCell(n_hidden)
1) n_hidden: 表示Cell中h的维度
2) lstm_cell.weights[0]: 获取lstm内部权值, 按照i,j,f,o顺序
3) lstm_cell.weights[1]: 获取偏置

outputs, states = tf.contrib.rnn.static_rnn(lstm_cell, x, dtype=tf.float32,
                                sequence_length=seqlen)
1) outputs: 每个timestep输出一组outputs, 分别表示每个时间步Cell的输出h
2) states: 分为s-state和m-state, 分别表示最后一个时间步Cell的c和h

第一步解析:
1. c = np.array(10*[0])
2. x1 = np.array(test_data[0,0])
3. h1 = np.array(10*[0])
4. xh1 = np.append(x1,h1,axis=0)
5. concat = np.dot(xh1,lstm_kernel) + lstm_bias
6. i, j, f, o = np.split(concat,4)
7. new_c = (c*sigmoid(f + 1.0) + sigmoid(i)*mytanh(j))
8. new_h = (mytanh(new_c)*sigmoid(o))

第一步解析说明:
1-3:Cell初始状态输入
4:[x,h]
5-6:计算隔各个门,得到i,j,f,o(j是new cell)
7-8:Cell更新c,h

4. FPGA实现

加速计算一般是加速推断部分,而训练是在CPU/GPU中进行。将各个权值数据范围弄清楚,设计各个模块就比较简单了。这里记录一下主要模块,在FPGA中实现推断部分需要的计算模块:矩阵计算、存储控制、cell结构。

  • 矩阵计算:在乘法器资源充足的条件下,可以采用并行方式计算,先计算向量相乘再累加,然后进行模块例化,实现矩阵计算。
  • Cell结构:实现单个cell逻辑,激活函数采用分段非线性逼近,激活函数的处理对最终精度有很大影响。
  • 存储控制:控制矩阵计算和cell运算的数据流。

lstm结构图_神经网络——单层LSTM_第5张图片
lstm实现结构

需要注意的点:

  • 在仿真时需要弄清权值的数据范围,以及各个输入、输出和中间变量的数据范围,对进行数据定点化处理,确定数据位宽。
  • 为了降低延时,可以将数据处理速率提升至数据输入速率的n倍(需要计算每次运算需要多少个时钟)。

你可能感兴趣的:(lstm结构图,tensorflow,lstm从隐状态到预测值)