要学习非常复杂的函数,通常我们会把RNN的多个层堆叠在一起,构建更深的模型。
一个标准的神经网络,首先是输入x,然后堆叠上隐藏层,隐含层中应该有激活值,比如说第一层是
a
<
1
>
a^{<1>}
a<1>,接着堆叠上下一层激活值
a
<
2
>
a^{<2>}
a<2>,可以再加一层
a
<
3
>
a^{<3>}
a<3>,然后得到预测值
y
^
\hat{y}
y^。
深层的RNN网络和这个有点像,用这个手画的网络,然后把它按时间展开就可以了,如下图是我们一直见到的标准的RNN,只是这里的符号稍微改了一下,不再用原来的
a
<
0
>
a^{<0>}
a<0>表示0时刻的激活值了,而是加上一个方括号
[
1
]
[1]
[1]来表示这是第一层,所以现在用
a
[
1
]
<
0
>
a^{[1]<0>}
a[1]<0>。
a
[
l
]
<
t
>
a^{[l]<t>}
a[l]<t>中
l
l
l表示第
l
l
l层,
t
t
t表示第
t
t
t个时间点。
然后我们把这些堆叠在上面,例如得到一个有三个隐层的新的网络,我们看一个具体的例子,看看这个值 a [ 2 ] < 3 > a^{[2]<3>} a[2]<3>是怎么算的。激活值 a [ 2 ] < 3 > a^{[2]<3>} a[2]<3>有两个输入,一个是 a [ 2 ] < 2 > a^{[2]<2>} a[2]<2>,一个是 a [ 1 ] < 3 > a^{[1]<3>} a[1]<3>,计算的时候用激活函数,作用于权重矩阵,权重矩阵就是 W a W_a Wa,因为计算的是激活值a的值,计算公式为 a [ 2 ] < 3 > = g ( W a [ 2 ] [ a [ 2 ] < 2 > , a [ 1 ] < 3 > ] + b a [ 2 ] ) a^{[2]<3>}=g(W_a^{[2]}[a^{[2]<2>},a^{[1]<3>}]+b_a^{[2]}) a[2]<3>=g(Wa[2][a[2]<2>,a[1]<3>]+ba[2])公式中的参数 W a [ 2 ] W_a^{[2]} Wa[2]和参数 b a [ 2 ] b_a^{[2]} ba[2]在这一层的计算都是一样的。相对应地第一层,也有自己的参数 W a [ 1 ] W_a^{[1]} Wa[1]和参数 b a [ 1 ] b_a^{[1]} ba[1]。
由于深层的RNN模型训练需要很多计算资源,需要很长时间。