📜  时间反向传播——RNN

📅  最后修改于: 2022-05-13 01:58:09.147000             🧑  作者: Mango

时间反向传播——RNN

介绍:
循环神经网络是那些处理顺序数据的网络。他们不仅使用当前输入预测输出,而且还考虑了之前发生的输入。换句话说,当前输出取决于当前输出以及存储元件(它考虑了过去的输入)。
为了训练这样的网络,我们使用了很好的旧反向传播,但略有不同。我们不会在特定时间“t”独立训练系统。我们在特定时间“t”以及在时间“t”之前发生的所有事情(如 t-1、t-2、t-3)对其进行训练。

考虑以下 RNN 表示:

RNN架构

S1、S2、S3分别是t1、t2、t3时刻的隐藏状态或记忆单元, Ws是与之相关的权重矩阵。
X1、X2、X3分别是时间t1、t2、t3的输入, Wx是与之相关的权重矩阵。
Y1、Y2、Y 3 分别是时间t1、t2、t3的输出, Wy是与之相关的权重矩阵。
对于任何时间 t,我们有以下两个方程:

     \begin{equation*} S_{t} = g_{1}(W_{x}x_{t} + W_{s}S_{t-1})                     \end{equation*} \begin{equation*}                     Y_{t} = g_{2}(W_{Y}S_{t})                         \end{equation*}



其中 g1 和 g2 是激活函数。
现在让我们在时间 t = 3 执行反向传播。
设误差函数为:

     \begin{equation*} E_{t} = (d_{t} - Y_{t})^{2} \end{equation*}

,所以在 t = 3 时,

     \begin{equation*}  E_{3} = (d_{3} - Y_{3})^{2}                         \end{equation*}

*我们在这里使用平方误差,其中d3是时间t = 3时的期望输出。
为了执行反向传播,我们必须调整与输入、内存单元和输出相关的权重。
调整 Wy
为了更好地理解,让我们考虑以下表示:

调整 Wy

公式:

     \begin{equation*} \frac{\partial E_{3}}{\partial W_{y}} = \frac{\partial E_{3}}{\partial Y_{3}} . \frac{\partial Y_{3}}{\partial W_{Y}} \end{equation*}

解释:
E3Y3的函数。因此,我们区分E3 和Y3
Y3WY的函数。因此,我们区分Y3 和WY



调整 Ws
为了更好地理解,让我们考虑以下表示:

调整 Ws


公式:

     \begin{equation*}      \frac{\partial E_{3}}{\partial W_{S}} = (\frac{\partial E_{3}}{\partial Y_{3}} . \frac{\partial Y_{3}}{\partial S_{3}} . \frac{\partial S_{3}}{\partial W_{S}})     +   \end{equation*}

     \begin{equation*}     (\frac{\partial E_{3}}{\partial Y_{3}} . \frac{\partial Y_{3}}{\partial S_{3}} . \frac{\partial S_{3}}{\partial S_{2}} . \frac{\partial S_{2}}{\partial W_{S}})      +  \end{equation*}

     \begin{equation*}      (\frac{\partial E_{3}}{\partial Y_{3}} . \frac{\partial Y_{3}}{\partial S_{3}} . \frac{\partial S_{3}}{\partial S_{2}} . \frac{\partial S_{2}}{\partial S_{1}} . \frac{\partial S_{1}}{\partial W_{S}})   \end{equation*}

解释:
E3Y3的函数。因此,我们区分E3 和Y3
Y3S3的函数。因此,我们区分Y3 与S3
S3WS的函数。因此,我们将S3 与WS 区分开来。
但我们不能就此止步;我们还必须考虑到以前的时间步骤。因此,我们在考虑权重矩阵WS 的情况下,针对存储单元S2S1区分(部分)误差函数。
我们必须记住,一个记忆单元,比如说 S t是它之前的记忆单元 S t-1的函数。
因此,我们将S3S2S2S1 相区分。
通常,我们可以将这个公式表示为:

     \begin{equation*}  \frac{\partial E_{N}}{\partial W_{S}} = \sum_{i=1}^{N} \frac{\partial E_{N}}{\partial Y_{N}} . \frac{\partial Y_{N}}{\partial S_{i}} . \frac{\partial S_{i}}{\partial W_{S}}  \end{equation*}

调整 WX:
为了更好地理解,让我们考虑以下表示:

调整 Wx


公式:

     \begin{equation*}      \frac{\partial E_{3}}{\partial W_{X}} = (\frac{\partial E_{3}}{\partial Y_{3}} . \frac{\partial Y_{3}}{\partial S_{3}} . \frac{\partial S_{3}}{\partial W_{X}})     +   \end{equation*}

     \begin{equation*}     (\frac{\partial E_{3}}{\partial Y_{3}} . \frac{\partial Y_{3}}{\partial S_{3}} . \frac{\partial S_{3}}{\partial S_{2}} . \frac{\partial S_{2}}{\partial W_{X}})      +   \end{equation*}

     \begin{equation*}      (\frac{\partial E_{3}}{\partial Y_{3}} . \frac{\partial Y_{3}}{\partial S_{3}} . \frac{\partial S_{3}}{\partial S_{2}} . \frac{\partial S_{2}}{\partial S_{1}} . \frac{\partial S_{1}}{\partial W_{X}})   \end{equation*}

解释:
E3Y3的函数。因此,我们区分E3 和Y3
Y3S3的函数。因此,我们区分Y3 与S3
S3WX的函数。因此,我们将S3 与WX 区分开来。
我们不能就此止步;我们还必须考虑到以前的时间步骤。因此,我们在考虑权重矩阵 WX 的情况下,针对存储单元S2S1区分(部分)误差函数。
通常,我们可以将这个公式表示为:

     \begin{equation*}  \frac{\partial E_{N}}{\partial W_{S}} = \sum_{i=1}^{N} \frac{\partial E_{N}}{\partial Y_{N}} . \frac{\partial Y_{N}}{\partial S_{i}} . \frac{\partial S_{i}}{\partial W_{X}}  \end{equation*}

限制:
这种通过时间反向传播 (BPTT) 的方法最多可用于有限数量的时间步长,例如 8 或 10。如果我们进一步反向传播,梯度\delta变得太小。这个问题被称为“消失梯度”问题。问题是信息的贡献随着时间的推移呈几何衰减。因此,如果时间步数大于 10(假设),该信息将被有效地丢弃。

超越 RNN:
这个问题的著名解决方案之一是使用所谓的长短期记忆(简称 LSTM)单元而不是传统的 RNN 单元。但是这里可能会出现另一个问题,称为梯度爆炸问题,其中梯度无法控制地增长。
解决方案:可以使用一种称为梯度裁剪的流行方法,其中在每个时间步中,我们可以检查梯度是否\delta > 阈值。如果是,则对其进行标准化。