考虑我们输入的是一个序列信息,而序列信息的特性是不定长度,除了我们将模型输入层拉长到非常长去覆盖所有可能的长度,我们还可以使用循环神经网络(Recurrent Neural Network, RNN)来处理这种序列信息。
RNN 是一种特殊的神经网络,它的特点是在网络中引入了循环结构,使得网络可以保持一定的记忆。在 RNN 中,我们可以将隐藏层的输出
上图是 RNN 模型的示意图。左侧是简略图,右侧则为其展开后的结构。
我们关注其中任意一个时间步
其先接受输入
对于第一个时间步,由于其没有上一个时间步的
用数学公式表示,RNN 在时间步
其中
$$ \begin{aligned} h_t &= \tanh(W^T_{hh}h_{t-1}+W^T_{hx}x_{t})\ \hat{y}t &= W{hy}h_t \end{aligned} $$
需要注意的是,RNN 的参数
RNN 的训练过程与普通的神经网络类似,我们可以使用梯度下降法来更新参数。但是由于 RNN 的循环结构,我们需要使用反向传播算法的变种——BPTT(Backpropagation Through Time)来计算梯度。
每一个时刻
而由于 RNN 的循环结构,在反向传播过程中,对于
如果梯度很多都
如果梯度很多都
- 更换激活函数,如 ReLU
- 魔法权重初始化
- 使用 LSTM 或 GRU 等更复杂的结构(后续会介绍)
对于更换激活函数,我们可以使用 ReLU 来代替 tanh 函数,这样可以减缓梯度消失的问题。因为梯度消失是由于 tanh 函数的性质导致的,当输入很大或很小时,梯度会接近于 0。而 ReLU 函数在输入大于 0 时梯度为 1,可以减缓梯度消失的问题。
而权重初始化则是经验行为,使用单位矩阵作为初始权重,并令所有的bias为0,可以减缓梯度消失的问题。