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的例子,對其中部分代碼做一些說明和拓展。
lstm?github.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连接