作者:欧阳火凡 | 来源:互联网 | 2023-08-14 12:32
在深度学习的路上,从头开始了解一下各项技术。本人是DL小白,连续记录我自己看的一些东西,大家可以互相交流。
本文参考:本文参考吴恩达老师的Coursera深度学习课程,很棒的课,推荐
本文默认你已经大致了解深度学习的简单概念,如果需要更简单的例子,可以参考吴恩达老师的入门课程:
http://study.163.com/courses-search?keyword=%E5%90%B4%E6%81%A9%E8%BE%BE#/?ot=5
转载请注明出处,其他的随你便咯
一、前言
循环神经网络(Recurrent Neural Network,RNN)是一类用于处理序列数据的神经网络。我们在深度学习的学习过程中,会碰到很多序列类型的问题,这时候普通的的神经网络在处理这类问题的时候不适用,所以提出了这种特别的神经网络,在自然语言处理情形下,很有优势。
二、序列模型
我们在深度学习的领域,经常能碰到如下的一些问题:
- 语音识别:将输入的语音信号直接输出相应的语音文本信息。无论是语音信号还是文本信息均是序列数据。
- 音乐生成:生成音乐乐谱。只有输出的音乐乐谱是序列数据,输入可以是空或者一个整数。
- 情感分类:将输入的评论句子转换为相应的等级或评分。输入是一个序列,输出则是一个单独的类别。
- DNA序列分析:找到输入的DNA序列的蛋白质表达的子序列。
- 机器翻译:两种不同语言之间的想换转换。输入和输出均为序列数据。
- 视频行为识别:识别输入的视频帧序列中的人物行为。
- 命名实体识别:从输入的句子中识别实体的名字。
在这些问题中,我们的输入值和输出值,并不是固定长度,也可能需要根据的上下文来判断。我们先给出一个普通神经网络模型:
首先给出数学符号定义:
- 输入x:如“Harry Potter and Herminone Granger invented a new spell.”(以序列作为一个输入),x表示输入x中的第t个符号。
- 输出y:如“1 1 0 1 1 0 0 0 0”(人名识别定位),同样,用y表示输出y中的第t个符号。
- Tx用来表示输入x的长度;
- Ty用来表示输出y的长度;
- x(i)表示第i个样本的第t个符号,其余同理。
- 利用单词字典编码来表示每一个输入的符号:如one-hot编码等,实现输入x和输出y之间的映射关系。
在上图表示的神经网络中,我们发现主要存在下面俩个问题:
- 输入和输出数据在不同的样本中可能有不同的长度;
- 在不同文本中每一个位置学习的特征值不能共享,也就是说权重的最优值在每个样本都不固定。
为了改变上述问题,所以提出了循环神经网络(RNN)。
三、循环神经网络
在RNN中,我们通过延迟输出和传递时间步来解决上述两个问题。在每一个时间步中,RNN会传递一个**值到下一个时间步中,用于下一个时间步的计算。下面给出RNN的图示:
如上图,每个X都输入进一个NN,同时输出一个Yhat和一个a。Yhat是基于这个输入X对应的输出值,a是目标节点之前需要记忆的数据的集合。RNN是从左到右扫描数据的,同时共享每个时间步的参数。右侧是RNN的简写方式。
这是需要注意的是,在零时刻a<0>,需要初始化一个**值输入。通常输入零向量,也可以用随机数的方法来输入。
在图中红字所示的Wax、Waa和Way是权重,这三个参数在每个时间步***享(参数相同):
Wax是从输入值X到隐层a的连接权重;
Waa是从a隐层到隐层a的连接权重;
Wya是从隐层a到输出层Yhat的连接权重。
PS.上述RNN还有一个问题,每个预测值Yhat只包含了在它之前的信息,而没有使用后面的信息,这个问题可以用BRNN(双向循环神经网络)或SLTM来解决,后文会提到。
RNN的前向传播
我们给出一个RNN的结构图:
接下来是前向传播的步骤:
- 构造初始**向量:a<0> = 0(向量);
-
- 我们通常用tanh作为**函数,有时也可以用ReLU;
-
- 如果是二分类问题,可以用sigmoid**函数,如果是多分类问题,可以用softmax**函数;
Note:我们可以利用矩阵的乘法,将Waa和Wax拼为Wa;将a和x拼在一起,这将就可以简化我们的前向传播公式:
如上简化之后,RNN的前向传播公式为:
RNN的反向传播
我们在进行RNN的反向传播计算时候,也是使用梯度下降法来更新RNN的参数,我们定义其损失函数为:
在RNN中,反向传播称为穿越时间的反向传播,因为需要通过时间步来传递。
不同类型的RNN
多对多(Tx = Ty):
在输入和输出的长度相同时,是上面例子的结构,如下图所示:
多对多(Tx != Ty):
在输入和输出长度不同时候,会有如下结构:
多对一:
比如在情感分类模型中,我们对一段语言文本进行情感判断。输入值是一个序列,而输出值只有一个值:
一对多:
比如在音乐生成模型中,我们输入一个音乐的类型,输出为一段音乐序列: