本节将介绍循环神经⽹络。它并⾮刚性地记忆所有固定⻓度的序列,而是通过隐藏状态来储存之前时间步的信息。⾸先我们回忆⼀下前⾯介绍过的多层感知机,然后描述如何添加隐藏状态来将它变成循环神经⽹络。
先考虑一个单层的多层感知机: 复习一遍隐藏层的输出、输出层的输出。 隐藏层的输出: H = ϕ ( X W x h + b h ) H=\phi (XW_{xh}+b_h) H=ϕ(XWxh+bh)
其中, W x h W_{xh} Wxh表示输入层 x x x和隐藏层 h h h之间的权重参数, b h b_h bh为隐藏层h的偏差参数。 输出层的输出: O = H W h q + b q O=HW_{hq} + b_q O=HWhq+bq
其中 q q q表示输出个数(例如分类问题的类别数)
可以看到,隐藏层 H H H的输出只由输入 x x x得到。
首先说明:隐藏状态是一个变量——隐藏变量的别称。
前面章节说到,语言模型的一段文本,可以看做一段时间序列。这段文本中的每个词为 w t w_t wt,其中 t t t称为时间步。(相当于在原有的最基本的神经网络基础上增加了一个维度——时间维度)。下面我们就考虑这种数据存在时间相关性的情况。
假设 X t ∈ R n × d X_t \in R^{n × d} Xt∈Rn×d是序列中时间步 t t t的小批量输入, H t ∈ R n × h H_t \in R^{n × h} Ht∈Rn×h是该时间步的隐藏层变量( t t t表示时间步。 n n n表示小批量样本数。 d d d表示输入个数,及特征个数)。由于加入了时间的维度,所以每个时间步都会有一个 H H H: H 1 , H 2 , H 3 , . . . , H t − 1 , H t , H t + 1 . . . , H T H_1,H_2,H_3,...,H_{t-1},H_t,H_{t+1}...,H_T H1,H2,H3,...,Ht−1,Ht,Ht+1...,HT。
循环神经网络的做法与多层感知机的不同之处在于:隐藏层 H t H_t Ht的输出由当前时间步的输入 X t X_t Xt和上一时间步的隐藏层变量 H t − 1 H_{t-1} Ht−1得到。具体公式如下: H t = ϕ ( X t W x h + H t − 1 W h h + b h ) H_t=\phi (X_tW_{xh} + H_{t-1}W_{hh}+b_h) Ht=ϕ(XtWxh+Ht−1Whh+bh)
与多层感知机的不同,除了输入输出增加了代表当前时间步的下标 t t t之外,还增加了一项 H t − 1 W h h H_{t-1}W_{hh} Ht−1Whh。(通俗地理解,就是:文本可以看成我们平时说的话。而我们平时说话都是有逻辑的,每个字前前后后都是相关联的,反映到这个公式上,就是隐藏变量在不同时间步上的相关性。)
该公式的图示如下: