目录
如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔~我会非常开心的~
0. 前言
循环神经网络 RNN(Recurrent Neural Network)是一类专门用于处理序列数据的神经网络。
标准的神经网络无法适应不同长度的输入和输出, 没有共享参数,无法泛化文本不同位置的同个词。
RNN 在几个时间步内共享参数,使得模型可以扩展到不同长度的序列样本进行泛化,不需要分别学习句子每个位置的规则。
RNN 减少参数付出的代价是优化参数困难。
用一个识别是否是人名的例子,初始定义符号如下:
- 输入 :“Harry Potter and Hermione Granger invented a new spell.”
- 输出 :“110110000”
- 表示 中第 个输入,例如 表示 Harry
- 表示 中第 个输出,例如 表示 1
- 表示 的长度
- 表示 的长度
- 当 时, 也表示序列长度
对于自然语言处理(Natural Language Processing),构建一个词汇表,对于一个输入 , 中的每一个单词都构建一个 one-hot 向量,向量长度是词汇表的长度,单词的对应位置为 1 ,其余位置为 0 。
1. RNN 计算图
对于一个输入 ,从左至右将每一个单词依次输入到神经网络中(相当于第 个时刻)。
每次计算不仅输入 ,还输入上一个单词 的激活函数值 。
如下图所示(图源:吴恩达深度学习):
2. RNN 前向传播
在 RNN 中,隐藏单元激活函数多采用 tanh 。
初始 。
按照深度学习花书中的符号表示( 表示隐藏单元, 表示输出单元):
按照吴恩达深度学习的符号表示( 表示隐藏单元):
对上式子进行修改可简化参数:
其中, 是将 横向叠加在一起, 是将 纵向叠加在一起。例如,,,,,则 ,,计算结果是相同的。
前向传播的运行时间是 ,且不能通过并行化来降低,因为前向传播图是固有循序的,每个时间只能一前一后计算。
前向传播中各个状态必须保存,直到它们反向传播中再次被使用,因此内存代价也是 。
3. RNN 反向传播
反向传播不仅仅通过每个单词的输出路径,而且还通过每个激活函数的传递路径。
RNN 反向传播通常也称为穿越时间的反向传播 BPTT(back propagation through time)。
代价函数根据输出的情况,可以采用 logistic regression loss 或者最大对数似然。
总的代价函数为各时间 代价函数之和。
这里使用深度学习花书上的符号表示反向传播:
4. 导师驱动过程(teacher forcing)
由上一个 的输出反馈到下一个 的输入的模型可用导师驱动过程进行训练。
训练时,无论输出 等于多少,我们将正确的输出 反馈到 。
如下图所示(图源:吴恩达深度学习):
采样时(即模型部署后),真正的输出通常是未知的,我们用模型输出近似正确的输出。
每一次输入不是 ,而是上一次输出 ,模型就可以根据上一个单词预测下一个单词。
如下图所示(图源:吴恩达深度学习):
满足 。
如果模型仍存在外界的输入,则可将正确的输出 反馈到隐藏单元。
如下图所示(图源:深度学习):
5. 不同序列长度的 RNN
根据输入序列和输出序列的长度,可以分为如下几种:
one to one,即 (图源:吴恩达深度学习):
one to many,即 (图源:吴恩达深度学习):
还有一种设计模式,是将 作为每个时刻的额外输入,而不是第一个时刻(图源:深度学习):
这类 RNN 适用于很多任务,例如单个图像作为模型的输入,产生描述图像的词序列。
many to one,即 (图源:吴恩达深度学习):
many to many(相等),即 (图源:吴恩达深度学习):
还有一种设计模式,是由输出反馈至下一个隐藏单元,而不是隐藏单元至隐藏单元(图源:深度学习):
这种 RNN 并没有那么强大,输出 是允许传播到未来的唯一信息,它要求输出单元捕捉用于预测未来的关于过去的所有信息,因为输出单元明确训练成匹配训练集的目标,它们不太能捕获关于过去输入历史的必要信息,除非它非常高维且内容丰富。
many to many(不相等),即 (图源:深度学习):
将输入序列映射到不一定等长的输出序列,如语音识别、机器翻译等。
编码器(encoder)RNN 处理输入序列,输出上下文 。
解码器(decoder)RNN 以固定长度的向量为条件产生输出序列。
此架构的一个明显不足是 的维度太小难以适当概括长序列,可让 成为可变长度序列。
如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔~我会非常开心的~