在简单的RNN情况下,网络接受输入序列x个并生成输出序列年虽然是一个隐藏的序列小时存储网络的动态状态,以便在时间步i:x(i)∊ℝM(M),h(i)∊ℝN个,y(i)∊ℝP(P)M/N/P维的实值向量分别对应于输入值、隐藏值和输出值。RNN更改其状态并根据状态方程省略输出:
- h(t)=tanh(WX小时*[x(t);h(t-1)]),其中WX小时线性地图:ℝM+N↦ ℝN个,*矩阵乘法和;串联操作。具体来说,为了获得h(t),将x(t)与h(t-1)串联起来,可以在W之间应用矩阵乘法X小时(形状(M+N,N))和级联向量(形状M+N),并且在结果向量(形状N)的每个元素上使用tanh非线性。
- y(t)=乙状结肠(W希*h(t)),其中W希线性地图:ℝN个↦ ℝP(P)具体来说,在W之间应用矩阵乘法希(形状N,P)和h(t)(形状N),以获得P维输出向量,并在其上应用sigmoid函数。
换句话说,在时间t获得输出需要迭代上述i=0,1,。。。,t.因此,隐藏状态充当系统的有限内存,允许上下文相关的计算(即h(t)完全取决于计算历史和当前输入,y(t)也是如此)。
在选通RNN(GRU或LSTM)的情况下,由于选通机制基本上允许在输入和内存之间进行选择,但核心概念保持不变,因此状态方程变得有些难以遵循。
数字示例
让我们以你为例;我们有M=4,N=3,P=4,所以WX小时形状为(7,3)和W希形状(3,4)。我们当然不知道两个W矩阵的值,因此我们无法重现相同的结果;不过,我们仍然可以遵循这个过程。
- 在时间步t<0时,我们得到h(t)=[0,0,0]。
- 在时间步t=0时,我们收到输入x(0)=[1,0,0,0]。将x(0)与h(0)串联-),我们得到[x(t);h(t-1)]=[1,0,0…,0](我们调用这个向量u来简化符号)。我们采用u*WX小时(即将7维向量与7乘3矩阵相乘),得到向量v=[v1,v2,v三],其中v我= Σj个u个j个W公司吉=u1W公司1个+u个2W公司第2页+ ... + u个7W公司第7页最后,我们将tanh应用于v,得到h(0)=[tanh(v1),坦桑尼亚(v2),丹宁(v三)]=[0.3,-0.1,0.9]。从h(0)也可以通过同样的过程得到y(0);用W乘以h(0)希(即带有3×4矩阵的三维向量),得到向量s=[s1,秒2,秒三,秒4],在s上应用sigmoid,得到σ(s)=y(0)。
- 在时间步t=1时,我们收到输入x(1)=[0,1,0,0]。我们将x(1)与h(0)串联,得到一个新的u=[0,1,0,0,0.3,-0.1,0.9]。u再次乘以WX小时,然后再次对结果应用tanh,得到h(1)=[1,0.3,1]。类似地,h(1)乘以W希,给出了一个新的s向量,我们在其上应用sigmoid来获得σ(s)=y(1)。
- 这个过程一直持续到输入序列结束,从而结束计算。
注:我忽略了上述等式中的偏差项,因为它们不影响核心概念,并且使符号无法遵循