多层感知机隐藏层的计算

上面的图是一个多层感知机模型。
输入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]])