提交 b6e08a46 编写于 作者: W wizardforcel

2021-01-05 23:13:44

上级 fc3175ee
......@@ -101,17 +101,17 @@ RNN 可以分为*多对一*,*一对多*,*多对多*(同步)和*多对多
* 基于当前输入![](img/2040af3e-d1dc-44dc-92dc-a3f919bd1eaa.png)和通过![](img/562308e5-cbaa-4ff7-9b79-bd683a4011bd.png)的先前隐藏状态![](img/383bc003-23ee-43db-9fa1-59937dbe7657.png)计算时间步长`t`和![](img/54984d48-521b-41b9-9685-b73dce04345f.png)的隐藏状态,其中`a`是激活状态 功能。 RNN 中隐藏层的激活函数的典型选择包括 tanh 和 ReLU。
* 同样,![](img/70c19fab-defe-4e68-909f-f6211104a2c7.png)取决于![](img/c9869f70-3cd8-4f6e-93bc-550caa70f200.png),依此类推。 ![](img/024ed476-77bb-45bd-9b60-8608e00ad27e.png)也依赖于![](img/c9307527-4369-491f-a419-a486f8f49795.png),按照惯例,该![](img/c9307527-4369-491f-a419-a486f8f49795.png)设置为全零。
* 由于对时间步长具有这种依赖性,因此可以将隐藏状态视为网络的内存,从以前的时间步长中捕获信息。
* 将时间步长`t`的输出计算为![](img/450661ff-68a5-4ba1-a496-4311c409ad7e.png),其中 g 是激活函数。 根据执行的任务,它可以是用于二进制分类的 Sigmoid函数,用于多类分类的 softmax 函数以及用于回归的简单线性函数。
* 将时间步长`t`的输出计算为![](img/450661ff-68a5-4ba1-a496-4311c409ad7e.png),其中`g`是激活函数。 根据执行的任务,它可以是用于二进制分类的 Sigmoid函数,用于多类分类的 softmax 函数以及用于回归的简单线性函数。
与传统的神经网络类似,所有的权重`U``V``W`均使用反向传播算法进行训练。 但是不同之处在于,在当前时间`t`上,我们需要计算除当前时间之外的所有先前`t`-1 个时间步的损耗。 这是因为权重由所有时间步共享,并且一个时间步的输出间接依赖于所有先前的时间步,例如权重的梯度。 例如,如果要计算时间步`t = 5`的梯度,则需要向后传播前四个时间步,并对五个时间步的梯度求和。 这种特殊的反向传播算法称为**时间上的反向传播(BPTT)**
与传统的神经网络类似,所有的权重`U``V``W`均使用反向传播算法进行训练。 但是不同之处在于,在当前时间`t`上,我们需要计算除当前时间之外的所有先前`t-1`个时间步的损耗。 这是因为权重由所有时间步共享,并且一个时间步的输出间接依赖于所有先前的时间步,例如权重的梯度。 例如,如果要计算时间步`t = 5`的梯度,则需要向后传播前四个时间步,并对五个时间步的梯度求和。 这种特殊的反向传播算法称为**时间上的反向传播(BPTT)**
从理论上讲,RNN 可以从输入序列的开头捕获信息,从而增强了时间序列或序列建模的预测能力。 但是,由于梯度梯度消失,原始 RNN 并非如此。 我们将在后面对此进行详细说明,并将了解专门设计用于解决此问题的其他架构,例如 LSTM 和 GRU。 但是现在,让我们假设原始 RNN 在许多情况下都能正常工作,并且获得了一些实践经验,因为它们是任何 RNN 的基本组成部分。
# 用于文本生成的 Vanilla RNN
# 用于文本生成的原始 RNN
如前所述,RNN 通常在 NLP 域中用作语言模型,它在单词序列上分配概率分布,例如机器翻译,PoS 标记和语音识别。 我们将使用一种相当有趣的语言来对问题文本生成进行建模,其中 RNN 模型用于学习指定域的文本序列,然后在所需域中生成全新且合理的文本序列。
基于 RNN 的文本生成器可以接受任何输入文本,例如《哈利波特》等小说,莎士比亚的诗歌以及《星球大战》的电影剧本,并可以生成自己的《哈利波特》,莎士比亚的诗歌和《星球大战》电影剧本。 如果对模型进行了很好的训练,那么人工文本应该是合理的,并且阅读起来应与原始文本相似。 在本部分中,我们将以《战争与和平》和俄罗斯作家 Leo Tolstoy 的小说为例。 随意使用您喜欢的任何书籍进行训练。 我们建议从没有版权保护的书中下载文本数据。 古腾堡计划( [www.gutenberg.org](http://www.gutenberg.org) )是一个很好的资源,拥有超过 5.7 万本版权已过期的免费优秀书籍。
基于 RNN 的文本生成器可以接受任何输入文本,例如《哈利波特》等小说,莎士比亚的诗歌以及《星球大战》的电影剧本,并可以生成自己的《哈利波特》,莎士比亚的诗歌和《星球大战》电影剧本。 如果对模型进行了很好的训练,那么人工文本应该是合理的,并且阅读起来应与原始文本相似。 在本部分中,我们将以《战争与和平》和俄罗斯作家列夫·托尔斯泰的小说为例。 随意使用您喜欢的任何书籍进行训练。 我们建议从没有版权保护的书中下载文本数据。 古腾堡计划( [www.gutenberg.org](http://www.gutenberg.org) )是一个很好的资源,拥有超过 5.7 万本版权已过期的免费优秀书籍。
首先,我们需要直接从[这里](https://cs.stanford.edu/people/karpathy/char-rnn/warpeace_input.txt)下载《战争与和平》的`.txt`文件。 或者,我们可以从 [Gutenberg 项目](http://www.gutenberg.org/ebooks/2600)下载该文件,但是我们将需要进行一些清理,例如,从文件以及目录中删除开头部分`Project Gutenberg EBook`,以及结尾的`End of the Project`
......@@ -433,7 +433,7 @@ LSTM 的架构的神奇之处在于:在普通循环单元的顶部,增加了
* ![](img/d2eddb1c-c3ef-49c6-810f-28dc26e845eb.png)**存储单元**,它从输入序列的最开始就存储上下文。
* `f`表示**遗忘门**,它控制来自前一存储状态![](img/ae610622-83d8-4566-a185-a21c8466adb2.png)的多少信息可以向前传递。 与遗忘门相关的权重包括`W[f]`,它与先前的隐藏状态`S[t-1]`连接,和`u[f]`,它与当前输入`x[t]`连接。
* `i`代表**输入门**,它确定当前输入可以通过多少信息。 权重![](img/8cd433d7-2c2f-4642-a2e8-7ddf1183a5dc.png)和![](img/148eead3-586f-48da-aa64-d1a420cf60a2.png)分别将其与先前的隐藏状态和当前输入相连。
* **tanh** 只是隐藏状态的激活函数,并且基于当前输入![](img/a1163f30-f030-4a68-bef6-f1dc1e0af040.png)和先前的隐藏状态![](img/c3fdb075-55bf-414d-87a6-7ab49d707585.png)及其相应的权重![](img/385579ed-f3c0-4acd-9235-470929e0ad56.png)和![](img/55810aa2-f8f7-4e8f-a33a-ed7b829e01c1.png)进行计算。 它与原始 RNN 中的“ a”完全相同。
* **tanh** 只是隐藏状态的激活函数,并且基于当前输入![](img/a1163f30-f030-4a68-bef6-f1dc1e0af040.png)和先前的隐藏状态![](img/c3fdb075-55bf-414d-87a6-7ab49d707585.png)及其相应的权重![](img/385579ed-f3c0-4acd-9235-470929e0ad56.png)和![](img/55810aa2-f8f7-4e8f-a33a-ed7b829e01c1.png)进行计算。 它与原始 RNN 中的`a`完全相同。
* `o`用作**输出门**,它定义了将内部存储器中的多少信息用作整个循环单元的输出。 同样,![](img/6f080896-cb2d-48a6-8b99-1f850b583c7f.png)和![](img/9c6a729e-ea1c-44e8-b39d-4a42a525aa43.png)是关联的权重。
因此,这些组件之间的关系可以概括如下:
......@@ -570,7 +570,7 @@ Epoch 251/300
* `p`代表**更新门**,它确定可以从前一个内存中传递多少信息。 将权重![](img/9b065883-35f9-4d94-877e-cd880c60465d.png)和![](img/b6998aa5-8213-474f-a37e-b7289e045be0.png)分别连接到先前的存储状态和当前输入,将时间`t`的更新门`p`的输出计算为![](img/db52d7e2-4126-479e-b98e-70cdada21c9a.png)
* **tanh** 是隐藏状态的激活函数,并基于当前输入![](img/654ee17e-32b3-4327-b956-ff22ebd8ef7b.png)和先前存储状态的重置进行计算。 给定它们的相应权重![](img/d5bc4167-0b59-4e20-9a17-fff19fd23de5.png)和![](img/747037b6-52b8-420d-b26f-50c3cc5b641a.png),将当前存储器`c'`在时间步`t`的输出计算为![](img/f44dabd4-8d26-47eb-b5ae-a4e899b10a11.png)
* 最后,在时间步`t`的隐藏状态![](img/4aa12099-9314-411a-a919-5af2beae170e.png)被更新为![](img/d105d076-6e63-4124-aa61-3318d267a0f0.png)。 同样,`p`决定用于更新当前内存的先前内存的比例–越接近`1`,则保留的内存就越多; 距离`0`越近,发生的当前存储器越多。
* 有趣的是,如果`p`是全零向量,而 r 是全一向量(例如我们没有明确保留任何先前的内存),则该网络只是一个普通的 RNN。
* 有趣的是,如果`p`是全零向量,而`r`是全一向量(例如我们没有明确保留任何先前的内存),则该网络只是一个普通的 RNN。
总体而言,GRU 与 LSTM 非常相似。 它们都使用光栅机制进行长期建模,并且与门相关的参数通过 BPTT 进行训练。 但是,有一些区别值得注意:
......@@ -586,7 +586,7 @@ Epoch 251/300
# GRU RNN 用于股价预测
预测股票会使许多人感兴趣。 多年以来,已经开发出了大量使用机器学习技术预测股票价格的方法。 例如,在《Python 机器学习示例的》的“第 7 章”中,线性回归,随机森林和支持向量机被用于预测股票价格。 在像这样的传统机器学习解决方案中,功能工程可能是最费力的阶段。 这是手动创建特定于域的特征或信号的过程,这些特征或信号对于定向预测比原始输入更为重要。 典型的发明功能包括 x 天移动平均线,一段时间内的波动率和 x 天回报率。 相反,基于 RNN 的深度学习解决方案不涉及以手工为特色的手工制作,而是自己找出及时或顺序的关系。 我们将通过使用 GRU RNN 预测**道琼斯工业平均指数****DJIA**)来展示循环架构的强大功能。**
预测股票会使许多人感兴趣。 多年以来,已经开发出了大量使用机器学习技术预测股票价格的方法。 例如,在《Python 机器学习示例的》的“第 7 章”中,线性回归,随机森林和支持向量机被用于预测股票价格。 在像这样的传统机器学习解决方案中,功能工程可能是最费力的阶段。 这是手动创建特定于域的特征或信号的过程,这些特征或信号对于定向预测比原始输入更为重要。 典型的发明功能包括`x`天移动平均线,一段时间内的波动率和`x`天回报率。 相反,基于 RNN 的深度学习解决方案不涉及以手工为特色的手工制作,而是自己找出及时或顺序的关系。 我们将通过使用 GRU RNN 预测**道琼斯工业平均指数****DJIA**)来展示循环架构的强大功能。
尽管我们强调了深度学习的优势,但我们并未断言深度学习方法优于传统的机器学习方法。 在机器学习中,没有一种适合所有的。
......@@ -620,7 +620,7 @@ DJIA 由 30 只大型和重要股票(例如 Apple,IBM,GE 和 Goldman Sachs
接下来,我们需要从原始时间序列构造顺序输入,以便提供 RNN 模型,这与我们在文本生成中所做的类似。 回想一下,在“多对一”架构中,该模型采用一个序列,并经过序列中的所有时间步长后产生一个输出。 在我们的案例中,我们可以将过去`T`天的价格序列提供给 RNN 模型,并输出第二天的价格。
将价格时间序列表示为`x[1]``x[2]`。 。 。 。,`x[n]`(N = 4276),并以`T`= 5 为例。 通过这样做,我们可以创建训练样本,如下所示:
将价格时间序列表示为`x[1]``x[2]`,...,`x[n]``N = 4276`),并以`T = 5`为例。 通过这样做,我们可以创建训练样本,如下所示:
| **输入** | **输出** |
| `{x[1], x[2], x[3], x[4], x[5]}` | `x[6]` |
......@@ -657,7 +657,7 @@ DJIA 由 30 只大型和重要股票(例如 Apple,IBM,GE 和 Goldman Sachs
>>> Y_test = Y[train_n:]
```
我们现在可以开始对训练数据进行建模吗? 当然不需要-需要数据缩放或预处理。 从上图可以看出,测试数据与训练数据不成比例,更不用说将来的数据了。 回归模型无法预测超出范围的值。 为了解决这个问题,我们通常使用 min-max scale ![](img/59f9afb3-b83d-4d93-9481-eb6595fafe7d.png)将数据缩放到给定范围,例如 0 到 1。 但是,没有可靠的方法来预测股票的![](img/c83a79f1-f415-4cce-9ff7-dfb8ea639122.png)(或![](img/07311e70-4ece-4170-8c85-d492a7815b82.png))。 这与已知最小值和最大值(例如,图像预测中的 0 和 255)的情况不同。 为了解决这个问题,我们将每个窗口内的价格标准化。 我们只需将时间窗口中的每个价格除以最近的已知价格即可。 再次使用前面的`T = 5`示例,我们可以如下预处理训练样本:
我们现在可以开始对训练数据进行建模吗? 当然不需要-需要数据缩放或预处理。 从上图可以看出,测试数据与训练数据不成比例,更不用说将来的数据了。 回归模型无法预测超出范围的值。 为了解决这个问题,我们通常使用最大最小缩放 ![](img/59f9afb3-b83d-4d93-9481-eb6595fafe7d.png)将数据缩放到给定范围,例如 0 到 1。 但是,没有可靠的方法来预测股票的![](img/c83a79f1-f415-4cce-9ff7-dfb8ea639122.png)(或![](img/07311e70-4ece-4170-8c85-d492a7815b82.png))。 这与已知最小值和最大值(例如,图像预测中的 0 和 255)的情况不同。 为了解决这个问题,我们将每个窗口内的价格标准化。 我们只需将时间窗口中的每个价格除以最近的已知价格即可。 再次使用前面的`T = 5`示例,我们可以如下预处理训练样本:
| **输入** | **输出** |
| ![](img/56e83be1-8079-4a8a-881c-0882cd25ba4b.png) | ![](img/a0ac7583-e8c0-4766-a2a4-a27c2dd2dceb.png) |
......@@ -763,11 +763,11 @@ Starting TensorBoard b'41' on port 6006 (You can navigate to http://192.168.0.12
如果转到`http://192.168.0.12:6006`,您将能够查看一段时间内的训练损失和验证损失。
平滑= 0(无指数平滑)时的训练损失:
平滑 0(无指数平滑)时的训练损失:
![](img/998f6430-6107-49c0-aff4-785f88dc76cc.png)
平滑= 0(无指数平滑)时的验证损失:
平滑 0(无指数平滑)时的验证损失:
![](img/9d8559d1-fce4-4b80-b99c-89e2f4084a9d.png)
......@@ -827,7 +827,7 @@ He said, "Machine __ combines computer science and statistics."
# 双向 RNN 用于情感分类
Keras 包含来自 IMDb( [www.imdb.com](http://www.imdb.com)的 50,000 条电影评论的数据集,并用情感极性(`1`为正,`0`为负)标记。 评论已经过预处理,每个词都由字典中的相应索引表示。 字典中的单词将根据整个数据集中的频率进行排序。 例如,编码为`4`的单词是数据中第 4 个最常见的单词。 您可以猜测`1`代表`the``2`代表`and`,并且最高索引用于停用词。
Keras 包含来自 [IMDb](http://www.imdb.com) 的 50,000 条电影评论的数据集,并用情感极性(`1`为正,`0`为负)标记。 评论已经过预处理,每个词都由字典中的相应索引表示。 字典中的单词将根据整个数据集中的频率进行排序。 例如,编码为`4`的单词是数据中第 4 个最常见的单词。 您可以猜测`1`代表`the``2`代表`and`,并且最高索引用于停用词。
可以通过以下代码获得单词索引字典:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册