多层感知机隐藏层的计算

image.png 上面的图是一个多层感知机模型。

输入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)是具有隐藏状态的神经网络。

隐状态和隐藏层是不同的 ,隐藏层是多层网络的一部分,隐藏在输入和输出之间的层。隐状态是在时序序列中,后边的内容要依赖于前边的计算结果而进行的计算。 image.png

上图就是带有隐状态的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}$

这样$w_{xh}X_t$、$w_{hh}H_{t-1}$计算出来应该是个四维向量。

$w_{xh}$和$w_{hh}$横向拼接之后变为$[w_h]{4\times 7}$,$X_t$和$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]])