花书+吴恩达深度学习(十五)序列模型之循环神经网络 RNN

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhq9695/article/details/85164414

目录

0. 前言

1. RNN 计算图

2. RNN 前向传播

3. RNN 反向传播

4. 导师驱动过程(teacher forcing)

5. 不同序列长度的 RNN


如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔~我会非常开心的~

花书+吴恩达深度学习(十五)序列模型之循环神经网络 RNN

花书+吴恩达深度学习(十六)序列模型之双向循环网络 BRNN 和深度循环网络 Deep RNN

花书+吴恩达深度学习(十七)序列模型之长短期记忆 LSTM 和门控循环单元 GRU

0. 前言

循环神经网络 RNN(Recurrent Neural Network)是一类专门用于处理序列数据的神经网络。

标准的神经网络无法适应不同长度的输入和输出, 没有共享参数,无法泛化文本不同位置的同个词。

RNN 在几个时间步内共享参数,使得模型可以扩展到不同长度的序列样本进行泛化,不需要分别学习句子每个位置的规则。

RNN 减少参数付出的代价是优化参数困难。

用一个识别是否是人名的例子,初始定义符号如下:

  • 输入 x :“Harry Potter and Hermione Granger invented a new spell.”
  • 输出 y :“110110000”
  • x^{<t>}表示 x 中第 t 个输入,例如 x^{<1>} 表示 Harry
  • y^{<t>} 表示 y 中第 t 个输出,例如 y^{<1>} 表示 1
  • T_x 表示 x 的长度
  • T_y 表示 y 的长度
  • 当 T_x=T_y 时,\tau 也表示序列长度

对于自然语言处理(Natural Language Processing),构建一个词汇表,对于一个输入 xx 中的每一个单词都构建一个 one-hot 向量,向量长度是词汇表的长度,单词的对应位置为 1 ,其余位置为 0 。

1. RNN 计算图

对于一个输入 x ,从左至右将每一个单词依次输入到神经网络中(相当于第 t 个时刻)。

每次计算不仅输入 x^{<t>} ,还输入上一个单词 x^{<t-1>} 的激活函数值 a^{<t-1>} 。

如下图所示(图源:吴恩达深度学习):

2. RNN 前向传播

在 RNN 中,隐藏单元激活函数多采用 tanh

初始 a^{<0>}=0 。

按照深度学习花书中的符号表示(h 表示隐藏单元,o 表示输出单元):

\begin{align*} & a^{<t>}=b+Wh^{<t-1>}+Ux^{<t>} \\ & h^{<t>}=\textup{tanh}(a^{<t>}) \\ & o^{<t>}=c+Vh^{<t>} \\ & \hat{y}^{<t>}=\textup{softmax}(o^{<t>}) \end{align*}

按照吴恩达深度学习的符号表示(a 表示隐藏单元):

\begin{align*} & a^{<t>}=\textup{tanh}(W_{aa}a^{<t-1>}+W_{ax}x^{<t>}+b_a) \\ & \hat{y}^{<t>}=\textup{softmax}(W_{ya}a^{<t>}+b_y) \\ \end{align*}

对上式子进行修改可简化参数:

\begin{align*} & a^{<t>}=\textup{tanh}(W_a[a^{<t-1>}; x^{<t>}]+b_a)\\ & \hat{y}^{<t>}=\textup{softmax}(W_ya^{<t>}+b_y)\\ \end{align*}

其中,W_a 是将 W_{aa}\ W_{ax} 横向叠加在一起,[a^{<t-1>}; x^{<t>}] 是将 a^{<t-1>}\ x^{<t>} 纵向叠加在一起。例如,W_{aa}\ (n_2, n_1)a^{<t-1>}\ (n_1,1)W_{ax}\ (n_2,n_x)x^{<t>}\ (n_x,1),则 W_a\ (n_2, n_1+n_x)[a^{<t-1>}; x^{<t>}]\ (n_1+n_x,1),计算结果是相同的。

前向传播的运行时间是 O(\tau) ,且不能通过并行化来降低,因为前向传播图是固有循序的,每个时间只能一前一后计算。

前向传播中各个状态必须保存,直到它们反向传播中再次被使用,因此内存代价也是 O(\tau) 。

3. RNN 反向传播

反向传播不仅仅通过每个单词的输出路径,而且还通过每个激活函数的传递路径。

RNN 反向传播通常也称为穿越时间的反向传播 BPTT(back propagation through time)。

代价函数根据输出的情况,可以采用 logistic regression loss 或者最大对数似然

总的代价函数为各时间 t 代价函数之和。

这里使用深度学习花书上的符号表示反向传播:

\begin{align*} \frac{\partial L}{\partial o^{<t>}} &= \sum_{t=1}^\tau \frac{\partial L^{<t>}}{\partial o^{<t>}} \\ & = \sum_{t=1}^\tau \hat{y}^{<t>}-y^{<t>} \end{align*}

\begin{align*} \frac{\partial L}{\partial c} &= \sum_{t=1}^\tau \frac{\partial L^{<t>}}{\partial o^{<t>}}\cdot \frac{\partial o^{<t>}}{\partial c}\\ & = \sum_{t=1}^\tau \hat{y}^{<t>}-y^{<t>} \end{align*}

\begin{align*} \frac{\partial L}{\partial V} &= \sum_{t=1}^\tau \frac{\partial L^{<t>}}{\partial o^{<t>}}\cdot \frac{\partial o^{<t>}}{\partial V}\\ & = \sum_{t=1}^\tau (\hat{y}^{<t>}-y^{<t>})(h^{<t>})^T \end{align*}

\begin{align*} \frac{\partial L}{\partial h^{<t>}} &= \frac{\partial L^{<t>}}{\partial o^{<t>}}\cdot \frac{\partial o^{<t>}}{\partial h^{<t>}}+ \frac{\partial L^{<t+1>}}{\partial h^{<t+1>}}\cdot \frac{\partial h^{<t+1>}}{\partial h^{<t>}}\\ & = V^T(\hat{y}^{<t>}-y^{<t>})+W^T \frac{\partial L}{\partial h^{<t+1>}}\textup{diag}(1-(h^{<t+1>})^2) \end{align*}

\begin{align*} \frac{\partial L}{\partial h^{<\tau>}} &= V^T(\hat{y}^{<\tau>}-y^{<\tau>}) \end{align*}

\begin{align*} \frac{\partial L}{\partial b} &= \sum_{t=1}^\tau\frac{\partial L^{<t>}}{\partial h^{<t>}}\cdot \frac{\partial h^{<t>}}{\partial b} \\ & = \sum_{t=1}^\tau \textup{diag}(1-(h^{<t>})^2)\cdot\frac{\partial L}{\partial h^{<t>}} \end{align*}

\begin{align*} \frac{\partial L}{\partial W} &= \sum_{t=1}^\tau\frac{\partial L^{<t>}}{\partial h^{<t>}}\cdot \frac{\partial h^{<t>}}{\partial W} \\ & = \sum_{t=1}^\tau \textup{diag}(1-(h^{<t>})^2)\cdot\frac{\partial L}{\partial h^{<t>}}\cdot (h^{<t-1>})^T \end{align*}

\begin{align*} \frac{\partial L}{\partial U} &= \sum_{t=1}^\tau\frac{\partial L^{<t>}}{\partial h^{<t>}}\cdot \frac{\partial h^{<t>}}{\partial U} \\ & = \sum_{t=1}^\tau \textup{diag}(1-(h^{<t>})^2)\cdot\frac{\partial L}{\partial h^{<t>}}\cdot (x^{<t>})^T \end{align*}

4. 导师驱动过程(teacher forcing)

由上一个 t 的输出反馈到下一个 t 的输入的模型可用导师驱动过程进行训练。

训练时,无论输出 \hat{y}^{<t>} 等于多少,我们将正确的输出 y^{<t>} 反馈到 x^{<t+1>} 。

如下图所示(图源:吴恩达深度学习):

采样时(即模型部署后),真正的输出通常是未知的,我们用模型输出近似正确的输出。

每一次输入不是 y^{<t>} ,而是上一次输出 \hat{y}^{<t>} ,模型就可以根据上一个单词预测下一个单词。

如下图所示(图源:吴恩达深度学习):

满足 P(y^{<1>},y^{<2>},y^{<3>})=P(y^{<1>})P(y^{<2>}\mid y^{<1>})P(y^{<3>}\mid y^{<2>},y^{<1>}) 。

如果模型仍存在外界的输入,则可将正确的输出 y^{<t>} 反馈到隐藏单元。

如下图所示(图源:深度学习):

5. 不同序列长度的 RNN

根据输入序列和输出序列的长度,可以分为如下几种:

one to one,即 T_x=1\ T_y=1(图源:吴恩达深度学习):

one to many,即 T_x=1\ T_y>1(图源:吴恩达深度学习):

还有一种设计模式,是将 x 作为每个时刻的额外输入,而不是第一个时刻(图源:深度学习):

这类 RNN 适用于很多任务,例如单个图像作为模型的输入,产生描述图像的词序列。

many to one,即 T_x>1\ T_y=1(图源:吴恩达深度学习):

many to many(相等),即 T_x>1\ T_y>1\ T_x=T_y(图源:吴恩达深度学习):

还有一种设计模式,是由输出反馈至下一个隐藏单元,而不是隐藏单元至隐藏单元(图源:深度学习):

这种 RNN 并没有那么强大,输出 o 是允许传播到未来的唯一信息,它要求输出单元捕捉用于预测未来的关于过去的所有信息,因为输出单元明确训练成匹配训练集的目标,它们不太能捕获关于过去输入历史的必要信息,除非它非常高维且内容丰富。

many to many(不相等),即 T_x>1\ T_y>1\ T_x\neq T_y(图源:深度学习):

将输入序列映射到不一定等长的输出序列,如语音识别、机器翻译等。

编码器(encoder)RNN 处理输入序列,输出上下文 C 。

解码器(decoder)RNN 以固定长度的向量为条件产生输出序列。

此架构的一个明显不足是 C 的维度太小难以适当概括长序列,可让 C 成为可变长度序列。


如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔~我会非常开心的~

猜你喜欢

转载自blog.csdn.net/zhq9695/article/details/85164414