深度学习五:循环神经网络

为什么需要RNN

循环神经网络(Recurrent Neural Network,RNN)是一种用于处理序列数据的神经网络模型。与传统的前馈神经网络不同,RNN具有循环连接,使其可以处理具有时间相关性的数据。

对于全连接层,它能处理的只是一个个输入,前一个输入和后一个输入时完全没有关系的,但是某些地方任务需要能够更好的处理序列的信息,即是前面的输入和后面的输入是有关系的。这个时候我们就希望神经网络是有记忆的,那怎么办呢,就把之前得到的特征传进来就可以了是吧,的确是的。

RNN结构

来看一个简单的循环神经网络,有一个输入层、一个隐藏层和一个输出层组成:

image-20240310160524514

如果说我们把w去掉,那么它就是一个普普通通的线性层了吗,非常正确,它就相当于加了一个w,那么w是一个什么东西呢?要记住前面的特征,所以他应该含有前面的特征向量,所以w就包含了前面的特征信息。展开来看就是下面的图:

image-20240310161219245

我们可以清晰看到,上一个时刻隐藏层会把自己的数据加到当前的输入上,然后通过一个激活函数。我们把上面的图展开,循环神经网络可以画成下面的这个样子:

image-20240310161918177

image-20240323133916223

image-20240323133956310

image-20240310182935444

image-20240323134011056

双向RNN

我们有个问题,我的RNN的方向目前来看是从前往后的,但是有些后面的序列对前面的影响很重要,我们是不是可以添加一个循环神经网络,然后正向反向都得到一个特征序列,然后把两个RNN的隐藏层都拿出来给一个输出层,得到最后的y。

image-20240310183802038

image-20240323134027002

image-20240310184039591

image-20240323134048529

image-20240310184147588

image-20240323134104689

image-20240310184516241

正向计算和反向计算不共享权重,也就是说U和U’、W和W’以及V和V’都是不同的权重矩阵。

循环神经网络的训练算法:BPTT

BPTT算法是针对循环层的训练算法,它的基本原理和BP算法是一样的,也包含同样的三个步骤:

  1. 前向计算每个神经元的输出值;
  2. 反向计算每个神经元的误差项δj值,它是误差函数E对神经元j的加权输入netj的偏导数;
  3. 计算每个权重的梯度。

最后再用随机梯度下降算法更新权重。

循环层如下图所示:

image-20240310192058975

前向计算:

image-20240310192116811

注意上面的s~t~、x~t~和s~t-1~都是向量;而U和V是矩阵,用大写字母表示。我们假设输入向量x的维度是m,输出向量s的维度是n,则矩阵U的维度是n*m,矩阵W的维度是n*m,下面是式子展开成矩阵的样子,看起来更加直观一些:

image-20240310192502573

误差项计算

image-20240323134151356

image-20240310193513377

同样的,上式第二项可以写为:

image-20240310193548473

其中diag[a]表示的是根据向量a创建一个对角矩阵,即:

image-20240310193620123

最后,将两项合在一起,可得:

image-20240310193647008

上式描述了将$vartheta$沿时间往前传递一个时刻的规律,有了这个规律,我们就可以求得任意时刻k的误差项$vartheta_k$:

image-20240310193820156

将误差项反向传递到上一层网络,就是和全连接层是一样的。循环层的加权输入net^l^与上一层的加权输入net^l-1^的关系如下:

image-20240310194020204

推不下去了!!!

LSTM

  • image-20240323134212495

image-20240323134237579

image-20240323134307679

这是一个复杂的流程,但在横向上,它可以被分割为C的传递和h的传递两条路径;在纵向上,它可以被分为如图所示的三个不同的路径:

1. 帮助循环网络选择吸纳多少新信息的输入门

2. 帮助循环网络选择遗忘多少历史信息的遗忘门

3. 帮助循环网络选择出对当前时间步的预测来说最重要的信息、并将该信息输出给当前时间步的输出门

让我们分别来看一下三个门是如何工作的。

image-20240323134332897

image-20240323134345390

image-20240323134406041

image-20240323134419495

image-20240323134432955

image-20240323134447400

image-20240323134502224

RNN为什么容易梯度爆炸和梯度消失

梯度消失和梯度爆炸是RNN在反向传播过程中常见的问题,RNN的反向传播是通过时间的反向传播”(Backpropagation Through Time,BPTT),其运行流程与一般的反向传播大有不同。在之前的课程中我们提到,在不同类型NLP任务会有不同的输出层结构、会有不同的标签输出方式。例如,在对词语/样本进行预测的任务中(情感分类、词性标注、时间序列等任务),RNN会在每个时间步都输出词语对应的相应预测标签;但是,在对句子进行预测的任务中(例如,生成式任务、seq2seq的任务、或以句子为单位进行标注、分类的任务),RNN很可能只会在最后一个时间步输出句子相对应的预测标签。输出标签的方式不同,反向传播的流程自然会有所区别。

image-20240323134521527

image-20240323134546344

image-20240323134612675

image-20240323134636589

image-20240323134657224

image-20240323134730656

image-20240323134800629

image-20240323134828118

在深度神经网络中,在应用链式法则后,我们也会面临复合函数梯度连乘的问题,但由于普通神经网络中并不存在“权值共享”的现象,因此每个偏导数的表达式求解出的值大多是不一致的,在连乘的时候有的偏导数值较大、有的偏导数值较小,相比之下就不那么容易发生梯度爆炸或梯度消失问题的问题。

LSTM怎么解决梯度消失问题

你或许很早就听说过,LSTM能够很好地解决RNN的梯度消失/梯度爆炸问题,甚至你可能人为LSTM是为了解决梯度消失和梯度爆炸而诞生的,但我们在进行深度原理研究的过程中却发现并非如此。让我们来简单梳理一下LSTM的数学流程——

image-20240323134846142

LSTM在反向传播中的梯度求解链路可以被可视化为

image-20240323134928438

image-20240323134940555

GRU结构

前向计算公式

image-20240310212003420

原理图

image-20240310212014995

以后再看,累了

Share

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Post comment

 ©2025 [忧郁小王子的乌托邦] - 稳定运行: