多层感知机隐藏层的计算
上面的图是一个多层感知机模型。
输入X是四维向量,但个隐藏层是五维向量,输出结果是三维向量。
隐藏层H的计算公式为:
$$
H = \phi(w{1}X+b{1})
$$
- 其中$[H]{5 \times 1}$,$[X]{4 \times 1}$, $[w1]{5 \times 4}$,$[b1]{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没什么区别:
$$
Ot = w{ho} H_t + bo
\
O{t+1} = w{ho} H{t+1} + b_o
$$
补充 隐状态的计算化简
$$
Ht = \phi(w{xh}Xt + w{hh}H{t-1}+b{h})
$$
这个公式可以化简为
$$
Ht = \phi(w{h}[Xt,H{t-1}]+b_{h})
$$
- 其中$wh$是将$w{xh}$和$w_{hh}$拼接了
- $[Xt,H{t-1}]$也是将$Xt$和$H{t-1}$拼接了。
这个算一下矩阵计算就知道了。
假设每个输入都是一个三维的one-hot向量,所以每个$[Xt]{3\times 1}$
假设每个隐藏层都是一个四维向量,那么$[Ht]{4\times 1}$
这样我们可以知道每个$[w{xh}]{4\times3}$ ,$[w{hh}]{4\times 4}$,$[bh]{4\times 1}$
这样$w_{xh}Xt$、$w{hh}H_{t-1}$计算出来应该是个四维向量。
$w{xh}$和$w{hh}$横向拼接之后变为$[wh]{4\times 7}$,$Xt$和$H{t-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]])