多層感覺機隐藏層的計算

上面的圖是一個多層感覺機模型。
輸入X是四維向量,但個隐藏層是五維向量,輸出結果是三維向量。
隐藏層H的計算公式為:
$$
H = \phi(w_{1}X+b_{1})
$$
- 其中$[H]{5 \times 1}$,$[X]{4 \times 1}$, $[w_1]{5 \times 4}$,$[b_1]{5\times 1}$
- $\phi$為激活函數
上邊就是一個普通隐藏層的計算。
循環神經網絡隐狀态的計算
循環神經網絡(Recurrent neural networks, RNNs)是具有隐藏狀态的神經網絡。
隐狀态和隐藏層是不同的 ,隐藏層是多層網絡的一部分,隐藏在輸入和輸出之間的層。隐狀态是在時序序列中,後邊的内容要依賴于前邊的計算結果而進行的計算。
上圖就是帶有隐狀态的RNN的模型圖。
計算方式:
$$
\
H_{t+1} = \phi(w_{xh}X_{t+1} + w_{hh}H_{t}+b_{h})
$$
- $\phi$為激活函數
在這裡加上了一個$H_{t-1}w_{hh}$這一項,實作了在時序上延續上一步的隐狀态。計算過程就是将本部的輸入和上一步的隐狀态都考慮在内,并将其放入激活函數。
至于輸出的計算和普通的MLP沒什麼差別:
$$
O_t = w_{ho} H_t + b_o
\
O_{t+1} = w_{ho} H_{t+1} + b_o
$$
補充 隐狀态的計算化簡
$$
H_t = \phi(w_{xh}X_t + w_{hh}H_{t-1}+b_{h})
$$
這個公式可以化簡為
$$
H_t = \phi(w_{h}[X_t,H_{t-1}]+b_{h})
$$
- 其中$w_h$是将$w_{xh}$和$w_{hh}$拼接了
- $[X_t,H_{t-1}]$也是将$X_t$和$H_{t-1}$拼接了。
這個算一下矩陣計算就知道了。
假設每個輸入都是一個三維的one-hot向量,是以每個$[X_t]_{3\times 1}$
假設每個隐藏層都是一個四維向量,那麼$[H_t]_{4\times 1}$
這樣我們可以知道每個$[w_{xh}]{4\times3}$ ,$[w{hh}]{4\times 4}$,$[b_h]{4\times 1}$
import torch
from d2l import torch as d2l
X, W_xh = torch.normal(0, 1, (3, 1)), torch.normal(0, 1, (1, 4))
H, W_hh = torch.normal(0, 1, (3, 4)), torch.normal(0, 1, (4, 4))
print(torch.matmul(X, W_xh) + torch.matmul(H, W_hh))
print(torch.matmul(torch.cat((X, H), 1), torch.cat((W_xh, W_hh), 0)))
>>
tensor([[ 1.5454, -0.4014, -0.6478, -1.3016],
[-0.5885, 0.5765, 1.6251, 0.7733],
[ 0.9793, 0.1511, 1.0349, 0.4170]])