"虽然模型一定不能够反应完全真实的情况，但是在某些情况下确实是很有用。" — *George Box* 

本书按"先读后买"的原则分发。

**第六章 神经网络与深度学习**

首先，您已经知道神经网络是什么了，并且您已经知道如何构建这样的一个模型。 是的，它就是逻辑回归！事实上，逻辑回归模型，或者更确切地说是多类分类的推广，称为softmax回归模型，是神经网络中的一个标准单元。


** 6.1神经网络**

如果您了解线性回归，逻辑回归和梯度下降，理解神经网络应该不是问题。与回归或SVM模型一样，**神经网络**（NN）是一个数学函数：

$$y=f_{N N}(\mathbf{x})$$

函数$$f_{N N}$$有一个特定的形式：它是一个**嵌套函数**。您可能已经听说过神经网络**层**。

因此，对于返回标量的3层神经网络，$$f_{N N}$$看起来像这样：

$$ y=f_{N N}(\mathbf{x})=f_{3}\left(f_{2}\left(\boldsymbol{f}_{1}(\mathbf{x})\right)\right) $$

在上面的等式中，**f**1和 **f**2是以下形式的向量函数：

$$\boldsymbol{f}_{l}(\mathbf{z}) \stackrel{\text { def }}{=} \boldsymbol{g}_{l}\left(\mathbf{W}_{l} \mathbf{z}+\mathbf{b}_{l}\right)$$

其中l称为层索引，可以跨越1到任意数量的层。函数 $$\boldsymbol{g} l$$  称为**激活函数**。它是固定的, 在学习开始之前由数据分析员选择的，通常是非线性的函数。通过根据任务优化特定所以损失函数（例如*MSE*），使用熟悉的梯度下降来学习每层的参数$$\mathbf{W}_{l}$$（矩阵）和$$\mathbf{b}_{l}$$（矢量） 。比较eq. 1使用逻辑回归方程，用sigmoid函数替换$$\boldsymbol{g} l$$ ，你不会看到任何差异。函数$$f_{3}$$是回归任务的标量函数，但也可以是矢量函数，具体取决于您的问题。

你可能想知道为什么使用矩阵 $$\mathbf{W}_{l}$$  而不是矢量$$\mathbf{W}_{l}$$。原因是$$\boldsymbol{g} l$$是矢量函数。矩阵$$\mathbf{W}_{l}$$的每行$$\mathbf{w}_{l, u}$$（u表示单位）是与** z **具有相同维数的向量。

设$$a_{l, u}=\mathbf{w}_{l, u} \mathbf{z}+b_{l, u}$$  $$\boldsymbol{f}_{l}(\mathbf{z})$$的输出是向量$$
\left[g_{l}\left(a_{l, 1}\right), g_{l}\left(a_{l, 2}\right), \ldots, g_{l}\left(a_{l, s i z e_{l}}\right)\right]$$，其中$$g l$$是一些标量函数1，$$\operatorname{si} z e_{l}$$是层l中的单位数。为了使其更具体，让我们考虑一种称为**多层感知器**的神经网络架构，通常称为**香草神经网络**。

1_{\mathrm{A}}标量函数输出一个标量，即一个简单的数字，而不是一个向量。


** 6.1.1多层感知器示例**

我们仔细研究了称为**前馈神经网络**（FFNN）的神经网络的一种特定配置，更具体地说是称为**多层感知器**（MLP）的架构。
举个例子，让我们考虑一个有三层的MLP。我们的网络将二维特征向量作为输入并输出一个数字。此FFNN可以是回归或分类模型，具体取决于第三个输出层中使用的激活函数。

我们的MLP如图1所示。神经网络以图形方式表示为**单元的连接组合**逻辑组织成一个或多个**层**。每个单元由圆形或矩形表示。入站箭头表示单位的输入，并指示此输入来自何处。出站箭头表示单位的输出。

每个单元的输出是在矩形内写入的数学运算的结果。圆形单位不对输入做任何事情;他们只是将输入直接发送到输出。

每个矩形单元中都会发生以下情况。首先，单元的所有输入连接在一起以形成输入向量。然后该单元对输入向量应用线性变换，就像线性回归模型对其输入特征向量一样。最后，该单元将激活函数g应用于线性变换的结果，并获得输出值，即实数。在vanilla FFNN中，某个层的单位的输出值变为后续层的每个单元的输入值。

在图1中，激活函数$$g l$$有一个索引$$l$$，这个是单元所属层的索引。通常，图层的所有单位都使用相同的激活函数，但这不是一个规则。每图层可以有不同数量的神经元。

每个单位的参数$$\mathbf{W} l, u$$和$$b_{l, u}$$，其中u是单位的索引，l是图层的索引。每个单位的向量$$\mathbf{y} l-1
$$是定义为$$\left[y_{l-1}^{(1)}, y_{l-1}^{(2)}, y_{l-1}^{(3)}, y_{l-1}^{(4)}\right]$$。第一层中的向量** x **定义为$$\left[x^{(1)}, \ldots, x^{(D)}\right]$$

如图1所示，在多层感知器中，一层的所有输出都连接到后一层的每个输入。这种架构称为**完全连接**。神经网络可以包含**完全连接的层**。这些层是其单元接收前一层的每个单元的输出作为输入的层。


** 6.1.2前馈神经网络架构**

如果我们想要解决前面章节中讨论的回归或分类问题，神经网络的最后（最右边）层通常只包含一个单元。 如果最后一个单元的激活函数$$\text { glast }$$是线性的，则神经网络是回归模型。 如果$$\text { glast }$$是逻辑函数，则神经网络是二元分类模型。

![6-1](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/6-1.png)

图1：具有二维输入的多层感知器，两层具有四个单元，一个输出层具有一个单元。

数据分析师可以选择任何数学函数,例如$$g l, u$$，假设它是可微分的。后一个属性对于梯度下降是必不可少的，用于找到所有l和u的参数$$\mathbf{W} l, u$$和$$b_{l, u}$$的值。在函数$$f_{N} N$$中使用非线性分量的主要目的是允许神经网络逼近非线性函数。如果没有非线性，$$f_{N} N$$将是线性的，无论它有多少层。原因是$$\mathbf{W}_{l} \mathbf{z}+\mathbf{b}_{l}$$是线性函数，线性函数的线性函数也是线性函数。

激活功能的流行选择是您已经知道的逻辑功能，以及** TanH **和** ReLU **。前者是双曲正切函数，类似于逻辑函数，但范围从-1到1（未达到它们）。后者是经过整流的线性单位函数，当其输入z为负时等于零，否则为z：

$$
\tanh (z)=\frac{e^{z}-e^{-z}}{e^{z}+e^{-z}}
$$

$$
r e l u(z)=\left\{\begin{array}{ll}{0} & {\text { if } z<0} \\ {z} & {\text { otherwise }}\end{array}\right.
$$

如上所述，表达式 $$\mathbf{W}_{l} \mathbf{z}+\mathbf{b}$$ 中的$$\mathbf{W}_{l}$$ 是矩阵，而 $$\mathbf{b}_{l}$$是向量。那看起来不同于线性回归的$$\mathbf{w} \mathbf{z}+b$$。在矩阵 $$\mathbf{W}_{l}$$中，每行u对应于矢量参数$$\mathbf{W} l, u$$。向量的维数$$\mathbf{W} l, u$$等于l-1层的单位数。

操作$$\mathbf{W}_{l} \mathbf{Z}$$导致向量$$\mathbf{a}_{l} \stackrel{\text { def }}{=}\left[\mathbf{w}_{l, 1} \mathbf{z}, \mathbf{w}_{l, 2} \mathbf{z}, \dots, \mathbf{w}_{l, s i z e_{l}} \mathbf{z}\right]$$。 然后
$$\mathbf{a}_{l}+\mathbf{b}_{l}$$的和给出了sizel维向量cl。最终，函数$$\boldsymbol{g}_{l}\left(\mathbf{c}_{l}\right)$$产生了向量$$\mathbf{y}_{l} \stackrel{\text { def }}{=}\left[y_{l}^{(1)}, y_{l}^{(2)}, \ldots, y_{l}^{\left(s i z e_{l}\right)}\right]$$作为输出。


** 6.2深度学习** 

**深度学习**指的是训练具有两个以上非输出层的神经网络。在过去，随着层数的增加，训练这样的网络变得更加困难。两个最大的挑战被称为**爆炸梯度**和**梯度弥散**的问题，因为梯度下降用于训练网络参数。

虽然通过应用诸如**梯度削减**和L1或L2正则化的简单技术更容易处理梯度爆炸的问题，但是梯度消失的问题在数十年内仍然难以处理。

什么是消失梯度，为什么会出现？为了更新神经网络中的参数值，通常使用称为**反向传播**的算法。反向传播是使用链规则计算神经网络梯度的有效算法。在第4章中，我们已经看到链规则如何用于计算复函数的偏导数。在梯度下降期间，神经网络的参数在每次训练迭代中接收与成本函数相对于当前参数的偏导数成比例的更新。问题在于，在某些情况下，梯度将非常小，有效地防止某些参数改变其值。在最坏的情况下，这可能完全阻止神经网络进一步训练。

传统的激活函数，例如我上面提到的双曲正切函数，具有范围（0,1）中的梯度，反向传播通过链规则计算梯度。这具有将这些小数中的n乘以计算较早的渐变的效果（最左边）n层网络中的层，意味着梯度随n呈指数下降。这导致早期层的训练非常缓慢，如果有的话。

然而，神经网络学习算法的现代实现允许您有效地训练非常深的神经网络（多达数百层）。这是由于几个改进结合在一起，包括ReLU，LSTM（和其他门控单元;我们在下面考虑它们），以及**残余神经网络**中使用的**跳过连接**等技术，以及梯度下降算法的高级修改。

因此，今天，由于梯度消失和爆炸的问题在很大程度上得到了解决（或其效果减弱），“深度学习”一词指的是使用现代算法和数学工具包训练神经网络，而与神经的深度无关。在实践中，许多业务问题可以通过在输入和输出层之间具有2-3层的神经网络来解决。这些层是既不输入也不输出通常称为**隐藏层**。 

** 6.2.1卷积神经网络**
您可能已经注意到，当您使网络变大时，MLP可以增加的参数数量会非常快。更具体地说，当您添加一个图层时，添加$$\left(s i z e_{l-1}+1\right) \cdot s i z e_{l}$$参数（我们的矩阵$$\mathbf{W}_{l}$$加上向量$$\mathbf{D}_{\boldsymbol{l}}$$）。这意味着如果您将另一个1000单位图层添加到现有神经网络，那么您可以向模型添加超过100万个附加参数。优化这些大型模型是一个非常计算密集的问题。

当我们的训练样例是图像时，输入是非常高维的。如果您想学习使用MLP对图像进行分类，优化问题可能会变得棘手。**卷积神经网络**（CNN）是一种特殊类型的FFNN，它可以显着减少具有许多单元的深度神经网络中的参数数量，同时不会损失模型的质量。 CNN已经在图像和文本处理中找到了应用，它们击败了许多先前建立的基准。

因为CNN是在考虑图像处理的情况下发明的，所以我在图像分类示例中对它们进行了解释。

您可能已经注意到，在图像中，彼此接近的像素通常表示相同类型的信息：天空，水，树叶，毛皮，砖块等。规则的例外是边缘：图像的两个不同对象彼此“接触”的部分。


如果我们可以训练神经网络识别相同信息的区域以及边缘，则该知识将允许神经网络预测图像中表示的对象。例如，如果神经网络检测到多个皮肤区域和边缘看起来像椭圆形的一部分，内部有皮肤般的色调，外部有蓝色调，那么很可能它是天空背景上的一张脸。
如果我们的目标是在图片上检测人物，神经网络很可能成功预测这张照片中的人物。


考虑到图像中最重要的信息是局部的，我们可以使用移动窗口方法将图像分割成方形补丁。然后我们可以一次训练多个较小的回归模型，每个小回归模型接收一个方形补丁作为输入。每个小型回归模型的目标是学习检测输入补丁中的特定类型的模式。每个小型回归模型的目标是学习检测输入补丁中的特定类型的模式。例如，一个小的回归模型将学会探测天空;另一个将检测草，第三个将检测建筑物的边缘，等等。

在CNN中，一个小的回归模型看起来像图1中的模型，但它只有第1层，没有第2层和第3层。要检测某些模式，小回归模型必须学习矩阵的参数**F**（对于“滤波器”）大小为p×p，其中p是贴片的大小。为了检测某些模式，小回归模型必须学习大小为p×p的矩阵**F**（对于“滤波器”）的参数，其中p是补丁的大小。为简单起见，假设输入图像是黑白的，1代表黑色，0代表白色像素。还假设我们的补丁是3乘3像素（p = 3）。然后一些补丁看起来像下面的矩阵 **P**（对于“补丁”）：还假设我们的补丁是3乘3像素（p = 3）。 然后一些补丁看起来像下面的矩阵**P**（对于“补丁”）：
$$
\mathbf{P}=\left[\begin{array}{lll}{0} & {1} & {0} \\ {1} & {1} & {1} \\ {0} & {1} & {0}\end{array}\right]
$$
上面的补丁代表一个看起来像十字架的图案。将检测这种模式（并且只有它们）的小回归模型需要学习3乘3参数矩阵**F**，其中与输入补丁中的1s相对应的位置处的参数将是正数，而参数在 对应于0的位置将接近零。如果我们计算矩阵的**卷积**P**和**F**，我们得到的值越高，**F**越接近**P**。
为了说明两个矩阵的卷积，假设** F **看起来像这样：
$$
\mathbf{F}=\left[\begin{array}{lll}{0} & {2} & {3} \\ {2} & {4} & {1} \\ {0} & {3} & {0}\end{array}\right]
$$
然后，仅为具有相同行数和列数的矩阵定义卷积运算符。对于我们的** P **和** F **矩阵，它的计算方法如下图所示：

![6-2](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/6-2.png)

图2：两个矩阵之间的卷积。
 如果我们的输入补丁** P **有不同的模式，例如字母L，

$$
\mathbf{P}=\left[\begin{array}{lll}{1} & {0} & {0} \\ {1} & {0} & {0} \\ {1} & {1} & {1}\end{array}\right]
$$

然后使用** F **进行卷积会得到较低的结果：5。因此，您可以看到补丁“看起来”越像滤波器，卷积运算的值就越高。
为方便起见，还有一个偏置参数b与每个滤波器** F **相关联，它被添加到a的结果中在应用非线性（激活函数）之前进行卷积。

CNN的一层由多个卷积滤波器组成（每个都有自己的偏置参数），就像香草FFNN中的一个层由多个单元组成一样。第一个（最左边）图层的每个滤镜在输入图像上从左到右，从上到下滑动 - 或*卷曲*  - 
并且在每次迭代时计算卷积。

图3给出了该过程的图示，其中示出了一个滤波器在图像上卷积的6个步骤。

滤波器矩阵（每层中每个滤波器一个）和偏差值是可训练参数，使用梯度下降和反向传播进行优化。

非线性应用于卷积和偏差项的总和。通常，ReLU激活功能用于所有隐藏层。输出层的激活功能取决于任务。
由于我们可以在每个层l中具有sizel滤波器，因此卷积层l的输出将由sizel矩阵组成，每个滤波器一个。


![6-3](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/6-3.png)

图3：在图像上卷积的滤波器。


如果CNN在另一个卷积层之后具有一个卷积层，则后续层l + 1将前一层l的输出视为sizel图像矩阵的集合。这样的集合称为**卷**。该集合的大小称为卷的深度。层l+1的每个滤波器卷绕整个卷。卷的一个卷的卷积只是卷所包含的各个矩阵的相应补丁的卷积之和。

![6-4](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/6-4.png)

图4：由三个矩阵组成的体积的卷积。

An example of a convolution of a patch of a volume consisting of depth 3 is shown in Figure 4. 

图4显示了由深度为3组成的体积的卷积的一个例子。

卷积的值-3, 计算公式为（-2·3 + 3·1 + 5·4 + -1· 1）+（ -2·2 + 3·（ -1）+ 5·（-3）+  -1·1）+（-2·1 + 3·（-1）+ 5·2 + -1·（-1））+（-2）

在计算机视觉中，CNN通常将音量作为输入，因为图像通常由三个通道表示：R，G和B，每个通道是单色图像。


卷积的两个重要特性是** stride **和** padding **。步幅是移动窗口的步长。在图3中，步幅是1，即滤波器一次向右滑动到底部一个单元。在图5中，您可以看到带有步幅2的卷积的部分示例。当步幅更大时，您可以看到输出矩阵更小。

填充允许获得更大的输出矩阵;它是在您将图像与滤镜卷积之前围绕图像（或体积）的其他单元格的正方形宽度。通过填充添加的单元格通常包含零。在图3中，填充为0，因此不会向图像添加其他单元格。另一方面，在图6中，步幅是2并且填充是1，因此将额外单元的宽度为1的正方形添加到图像中。
你可以看到输出填充越大，矩阵越大。

![6-5](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/6-5.png)
图5：步幅2的卷积。

![6-6](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/6-6.png)
图6：步幅2和填充1的卷积。

带有填充2的图像示例如图7所示。填充有助于使用较大的滤波器，因为它允许它们更好地“扫描”图像的边界。
![6-7](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/6-7.png)
图7：带填充的图像2。

如果不提供** pooling **这一CNN中经常使用的技术，本节将不完整。池的工作方式与卷积非常相似，作为使用移动窗口方法应用的过滤器。但是，池化层不是将可训练的过滤器应用于输入矩阵或体积，而是应用固定的算子，通常是最大值或平均值。与卷积类似，池化具有超参数：过滤器的大小和步幅。
图8中显示了具有大小为2和步幅2的过滤器的最大池的示例。

通常，池化层跟随卷积层，它将卷积输出作为输入。将池应用于卷时，卷中的每个矩阵将独立于其他矩阵进行处理。因此，应用于体积的合并层的输出是与输入相同深度的体积。

如您所见，池化仅具有超参数，并且没有要学习的参数。通常，在实践中使用尺寸为2或3和步幅2的过滤器。最大池化比平均值更受欢迎，并且通常会产生更好的结果。

通常，池化有助于提高模型的准确性。它还通过减少神经网络的参数数量来提高训练速度。 （如图8所示，过滤器大小为2且步幅为2时，参数数量减少到25％，即4个参数而不是16个。）

![6-8](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/6-8.png)
图8：使用大小为2和步幅为2的过滤器进行池化。

** 6.2.2递归神经网络**

递归神经网络（RNN）用于标记，分类或生成序列。 序列是矩阵，其每一行是特征向量，并且行的顺序很重要。 标记序列是为了预测序列中每个特征向量的类。 对序列进行分类是为了预测整个序列的类。 生成序列是输出与输入序列有某种相关的另一个序列（可能不同长度）。

RNN经常用于文本处理，因为句子和文本自然是单词/标点符号或字符序列的序列。 出于同样的原因，递归神经网络也用于语音处理。

递归神经网络不是前馈：它包含循环。 该想法是复发层1的每个单元u具有实值状态$$h_{l, u}$$。 状态可以被视为单位的记忆。 在RNN中，每层中的每个单元u接收两个输入：来自前一层l-1的状态向量和来自前一时间步骤的同一层1的状态向量。

为了说明这个想法，让我们考虑一下RNN的第一个和第二个复发层。 第一（最左边）层接收特征向量作为输入。 第二层接收第一层的输出作为输入。

这种情况在图9中示意性地描绘。如上所述，每个训练示例是矩阵，其中每行是特征向量。 为简单起见，让我们说明这个矩阵$$
\mathbf{X}=\left[\mathbf{x}^{1}, \mathbf{x}^{2}, \ldots, \mathbf{x}^{t-1}, \mathbf{x}^{t}, \mathbf{x}^{t+1}, \ldots, \mathbf{x}^{l e n g t h x}\right]$$，其中$$\text { length } \mathbf{x}$$是输入序列的长度。 如果我们的输入示例X是文本句子，则每个t = 1的特征向量$$x^{t}$$, . . . , $$\text { length } \mathbf{x}$$表示位置t的句子中的单词。

![6-9](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/6-9.png)
图9：RNN的前两层。
输入特征向量是二维的;每层有两个单元。

如图9所示，在RNN中，来自输入示例的特征向量被“读取”神经网络按时间顺序依次排列。索引t表示时间步长。为了在每个层l的每个单位u中的每个时间步t更新状态$$h_{l, u}^{t}$$，我们首先计算输入特征向量与来自先前时间步t-1的该相同层的状态向量$$\mathbf{h}_{l, u}^{t-1}$$的线性组合。
使用以下计算两个向量的线性组合两个参数矢量$$\mathbf{W} l, u$$，$$\mathbf{u}_{l}, u$$和参数$$b_{l, u}$$。然后通过将激活函数g1应用于线性组合的结果来获得$$h_{l, u}^{t}$$的值。一个典型的选择函数g1是tanh。输出$$\mathbf{y}_{l}^{t}$$通常是针对整个l层进行一次计算的向量。为了获得$$\mathbf{y}_{l}^{t}$$，我们使用激活函数g2，它将一个向量作为输入并返回一个同一维度的不同向量。函数g2应用于线性组合使用参数矩阵$$\mathbf{V}_{l}$$和参数向量l，u计算的状态向量值$$h_{l, u}^{t}$$。在分类中，g2的典型选择是softmax函数：

$$
\boldsymbol{\sigma}(\mathbf{z}) \stackrel{\text { def }}{=}\left[\sigma^{(1)}, \ldots, \sigma^{(D)}\right], \text { where } \sigma^{(j)} \stackrel{\text { def }}{=} \frac{\exp \left(z^{(j)}\right)}{\sum_{k=1}^{D} \exp \left(z^{(k)}\right)}
$$

softmax函数是S形函数到多维输出的推广。对于所有j，它具有$$\sum_{j=1}^{D} \sigma^{(j)}=1$$且$$\sigma^{(j)}>0$$的特性。

维数的维数由数据分析员选择，使得矩阵V1乘以向量hlt导致具有与向量cl相同维度的向量。 此选择取决于训练数据中输出标签y的维度。 （到目前为止，我们只看到了一维标签，但我们将在后面的章节中看到标签也可以是多维的。）

使用具有反向传播的梯度下降从训练数据计算$$\mathbf{w}_{l, u}, \mathbf{u}_{l, u}, b_{l, u}, \mathbf{V}_{l, u}$$和$$\mathbf{c}_{l, u}$$的值。 为了训练RNN模型，使用称为反向传播的特殊版本的反向传播。

tanh和softmax都存在消失的梯度问题。即使我们的RNN只有一个或两个复发层，由于输入的顺序性，反向传播必须随着时间的推移“展开”网络。从梯度计算的角度来看，实际上这意味着输入序列越长，展开的网络就越深。

RNN的另一个问题是处理长期依赖性。随着输入序列的长度增加，从序列开始的特征向量倾向于“被遗忘”，因为用作网络存储器的每个单元的状态受到最近读取的特征向量的显着影响。因此，在文本或语音处理中，长句中的远程单词之间的因果关系可能丢失。

在实践中使用的最有效的递归神经网络模型是门控RNN。这些包括长期短期记忆（LSTM）网络和基于门控循环单位（GRU）的网络。

在RNN中使用门控单元的美妙之处在于，此类网络可以将信息存储在其单元中以供将来使用，就像计算机内存中的位一样。 与实际存储器的不同之处在于，存储在每个单元中的信息的读取，写入和擦除由具有范围（0,1）中的值的激活函数控制。 经训练的神经网络可以“读取”特征向量的输入序列，并在某个早期时间步骤t确定以保持关于特征向量的特定信息。 关于先前特征向量的信息稍后可以由模型用于处理来自输入序列的末尾附近的特征向量。 例如，如果输入文本以单词she开头，则语言处理RNN模型可以决定存储关于性别的信息以正确地解释他们在句子中稍后看到的单词。

单位决定要存储哪些信息，何时允许读取，写入和删除。 这些决定是从数据中学习出来的，并通过门的概念来实现。 有几种门控单元的架构。 一个简单但有效的称为最小门控GRU，由一个存储单元和一个忘记门组成。

让我们看一下RNN第一层（将特征向量序列作为输入）的示例中的GRU单元的数学运算。

层l中的最小门控GRU单元u取两个输入：来自同一层中所有单元的存储单元值的向量前一个时间步长$$\mathbf{h}_{l}^{t-1}$$和一个特征向量$$\mathbf{x}^{t}$$。 然后使用这两个向量如下（以下序列中的所有操作都在一个接一个的单元中执行）：
$$
\begin{aligned} \tilde{h}_{l, u}^{t} & \leftarrow g_{1}\left(\mathbf{w}_{l, u} \mathbf{x}^{t}+\mathbf{u}_{l, u} \mathbf{h}_{l}^{t-1}+b_{l, u}\right) \\ \Gamma_{l, u}^{t} & \leftarrow g_{2}\left(\mathbf{m}_{l, u} \mathbf{x}^{t}+\mathbf{o}_{l, u} \mathbf{h}^{t-1}+a_{l, u}\right) \\ h_{l, u}^{t} & \leftarrow \Gamma_{l, u}^{t} \tilde{h}_{l}^{t}+\left(1-\Gamma_{l, u}^{t}\right) h_{l}^{t-1} \\ \mathbf{h}_{l}^{t} & \leftarrow\left[h_{l, 1}^{t}, \ldots, h_{l, s i z e_{l}}^{t}\right] \\ \mathbf{y}_{l}^{t} & \leftarrow \boldsymbol{g}_{3}\left(\mathbf{V}_{l} \mathbf{h}_{l}^{t}+\mathbf{c}_{l, u}\right) \end{aligned}
$$

其中g1是tanh激活函数，g2称为门函数，实现为sigmoid函数，取值范围为（0,1）。 如果门$$\Gamma_{l, u}$$接近0，则存储器单元保持其来自前一时间步$$h_{l}^{t-1}$$的值。 另一方面，如果门$$h_{l}^{t-1}$$接近1，则存储器单元的值被新值$$\tilde{h}_{l, u}^{t}$$覆盖（参见从顶部开始的第三个分配）。 就像在标准RNN中一样，g3通常是softmax。

门控单元接受输入并存储一段时间。 这个相当于将标识函数（f（x）= x）应用于输入。 因为身份函数的导数是常数，当一个网络具有门控单位通过时间反向传播训练，梯度不会消失。

RNN的其他重要扩展包括双向RNN，具有关注的RNN和序列到序列RNN模型。 特别是后者经常用于构建神经机器翻译模型和用于文本到文本转换的其他模型。 RNN的推广是递归神经网络。