一. 普通全連接神經網絡的計算過程
假設用全連接神經網絡做MNIST手寫數字分類,節點數如下:
第一層是輸入層,784個節點;
第二層是隱層,100個節點;
第三層是輸出層,10個節點。
對於這個神經網絡,我們在腦海里浮現的可能是類似這樣的畫面:
但實際上,神經網絡的計算過程,本質上是輸入向量(矩陣)在權重矩陣上的流動過程,大概就像下面這個過程:
圖中,把bias也放到權重矩陣中了,並且省略了激活函數。在反向傳播過程中,梯度矩陣和權重矩陣的大小是一致的,因為每個權重參數都需要一個梯度來更新。神經網絡的學習過程,實際上是調整權重矩陣中各個元素的大小的過程。
二. LSTM神經網絡的參數數目
lstm的計算公式是
假設input_size=150,hidden_size=64,那么
- $W_{ii}$、$W_{if}$、$W_{ig}$、$W_{io}$的大小都是64*150的矩陣,$b_{ii}$、$b_{if}$、$b_{ig}$、$b_{io}$都是長度為64的向量;
- $W_{hi}$、$W_{hf}$、$W_{hg}$、$W_{ho}$的大小都是64*64的矩陣,$b_{hi}$、$b_{hf}$、$b_{hg}$、$b_{ho}$都是長度為64的向量。
在PyTorch的torch.nn.LSTM模塊中,會把幾個向量按0方向拼接在一起:
- 把$W_{ii}$、$W_{if}$、$W_{ig}$、$W_{io}$拼接成一個大小為256*150矩陣,叫做weight_ih_l0;把$b_{ii}$、$b_{if}$、$b_{ig}$、$b_{io}$拼接成一個長度為256的向量,叫做bias_ih_l0;
- 把$W_{hi}$、$W_{hf}$、$W_{hg}$、$W_{ho}$拼接成一個大小為256*64矩陣,叫做weight_hh_l0;把$b_{hi}$、$b_{hf}$、$b_{hg}$、$b_{ho}$拼接成一個長度為256的向量,叫做bias_hh_l0.
所以總的參數數目是256*150 + 256 + 256*64 + 256 = 55296.
歸納一下就是:
假設input_size=x,hidden_size=h,那么這個LSTM模型的參數數目就是:4*h*x + 4*h + 4*h*h + 4*h = 4*h*(x+h+2)
三. LSTM神經網絡的計算過程
假設input_size=150,hidden_size=64,那么單個時間步的計算過程如下:
星號*表示逐元素相乘。
【參考資料】
LSTM的神經元個數