lstm结构图_神经网络——单层LSTM
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)。
cell结构图LSTM的输入是按照时间序列分步进行输入,在每个时间步(Timestep)cell都进行状态更新。在t时刻,cell的记忆状态
表示Cell记忆t-1以及以前时刻的输入状态, 表示t-1时刻Cell的输出。于是当多个Cell逻辑连接在一起时,就组成了一个完整的LSTM推断过程,如下图。在一轮LSTM推断中,LSTM输入序列为 ,Timestep=t。此时LSTM输出为 ,然后输入新的序列进行下一轮的推断。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的输出的数据进行控制。(谁还不能留点小秘密..)
2. LSTM结构
LSTM是由cell构成,而cell则是由gate构成。下面来看看gate是怎么构成cell的吧!
好吧...图是我不知道在哪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的例子,对其中部分代码做一些说明和拓展。
lstmgithub.comlstm_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,h4. FPGA实现
加速计算一般是加速推断部分,而训练是在CPU/GPU中进行。将各个权值数据范围弄清楚,设计各个模块就比较简单了。这里记录一下主要模块,在FPGA中实现推断部分需要的计算模块:矩阵计算、存储控制、cell结构。
- 矩阵计算:在乘法器资源充足的条件下,可以采用并行方式计算,先计算向量相乘再累加,然后进行模块例化,实现矩阵计算。
- Cell结构:实现单个cell逻辑,激活函数采用分段非线性逼近,激活函数的处理对最终精度有很大影响。
- 存储控制:控制矩阵计算和cell运算的数据流。
需要注意的点:
- 在仿真时需要弄清权值的数据范围,以及各个输入、输出和中间变量的数据范围,对进行数据定点化处理,确定数据位宽。
- 为了降低延时,可以将数据处理速率提升至数据输入速率的n倍(需要计算每次运算需要多少个时钟)。
总结
以上是生活随笔为你收集整理的lstm结构图_神经网络——单层LSTM的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 图综合练习--拓扑排序_03 数据结构与
- 下一篇: mac 更换默认蓝牙适配器_Win7连接