到目前为止,我们一直专注于定义由序列输入、单个隐藏 RNN 层和输出层组成的网络。尽管在任何时间步长的输入和相应的输出之间只有一个隐藏层,但从某种意义上说这些网络很深。第一个时间步的输入会影响最后一个时间步的输出T(通常是 100 或 1000 步之后)。这些输入通过T在达到最终输出之前循环层的应用。但是,我们通常还希望保留表达给定时间步长的输入与同一时间步长的输出之间复杂关系的能力。因此,我们经常构建不仅在时间方向上而且在输入到输出方向上都很深的 RNN。这正是我们在 MLP 和深度 CNN 的开发中已经遇到的深度概念。
构建这种深度 RNN 的标准方法非常简单:我们将 RNN 堆叠在一起。给定一个长度序列T,第一个 RNN 产生一个输出序列,也是长度T. 这些依次构成下一个 RNN 层的输入。在这个简短的部分中,我们将说明这种设计模式,并提供一个简单示例来说明如何编写此类堆叠 RNN。下面,在 图 10.3.1中,我们用L隐藏层。每个隐藏状态对顺序输入进行操作并产生顺序输出。此外,每个时间步的任何 RNN 单元(图 10.3.1中的白框 )都取决于同一层在前一时间步的值和前一层在同一时间步的值。
正式地,假设我们有一个小批量输入 Xt∈Rn×d(示例数量: n,每个示例中的输入数量:d) 在时间步 t. 同时step,让hidden state的 lth隐藏层(l=1,…,L) 是 Ht(l)∈Rn×h(隐藏单元的数量:h) 和输出层变量是 Ot∈Rn×q(输出数量: q). 环境Ht(0)=Xt, 的隐藏状态lth使用激活函数的隐藏层ϕl计算如下:
权重在哪里 Wxh(l)∈Rh×h和 Whh(l)∈Rh×h, 连同偏差bh(l)∈R1×h, 是模型参数lth隐藏层。
最终输出层的计算只是根据最终的隐藏状态Lth隐藏层:
重量在哪里Whq∈Rh×q和偏见