From c3d8b02c05d103ae27ed2673defc39ff2045f8e7 Mon Sep 17 00:00:00 2001
From: wizardforcel <562826179@qq.com>
Date: Mon, 21 Dec 2020 23:16:50 +0800
Subject: [PATCH] 2020-12-21 23:16:50
---
new/handson-rl-py/07.md | 31 ++++++++++++++++++-------------
1 file changed, 18 insertions(+), 13 deletions(-)
diff --git a/new/handson-rl-py/07.md b/new/handson-rl-py/07.md
index 6e65bc6b..7d110c3e 100644
--- a/new/handson-rl-py/07.md
+++ b/new/handson-rl-py/07.md
@@ -236,7 +236,7 @@ Why += -alpha * dJ_dWxh
* **向后传递**:向后传递表示从输出层向输入层的反向传播。
* **纪元**:纪元指定了神经网络看到我们整个训练数据的次数。 因此,对于所有训练样本,我们可以说一个时期等于一个向前通过和一个向后通过。
* **批处理大小**:批处理大小指定了我们在一次向前和向后一次通过中使用的训练样本数。
-* **迭代次数**:迭代次数表示通过次数,其中*一遍=一正向+一后向*。
+* **迭代次数**:迭代次数表示通过次数,其中`一遍 = 一次正向 + 一次反向`。
假设我们有 12,000 个训练样本,而我们的批次大小为 6,000。 我们将需要两个迭代来完成一个纪元。 也就是说,在第一次迭代中,我们传递了前 6,000 个样本,并执行了前向遍历和后向遍历; 在第二次迭代中,我们传递接下来的 6,000 个样本,并执行正向传递和反向传递。 经过两次迭代,我们的神经网络将看到整个 12,000 个训练样本,这使它成为一个纪元。
@@ -383,9 +383,9 @@ with tf.Session() as sess:
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y: mnist.test.labels}))
```
-# 神经网络
+# RNN
-鸟儿在 ____ 飞翔。 如果我要求您预测空白,则可能会预测*天空*。 您如何预测*天空*一词会很好地填补这一空白? 因为您阅读了整个句子并根据理解句子的上下文,预测*天空*是正确的词。 如果我们要求正常的神经网络为该空格预测正确的单词,它将无法预测正确的单词。 这是因为正常神经网络的输出仅基于当前输入。 因此,神经网络的输入将只是前一个单词*和*。 也就是说,在正常的神经网络中,每个输入都彼此独立。 因此,在我们必须记住输入序列以预测下一个序列的情况下,它将不能很好地执行。
+鸟儿在____中飞翔。 如果我要求您预测空白,则可能会预测“天空”。 您如何预测“天空”一词会很好地填补这一空白? 因为您阅读了整个句子并根据理解句子的上下文,预测“天空”是正确的词。 如果我们要求正常的神经网络为该空格预测正确的单词,它将无法预测正确的单词。 这是因为正常神经网络的输出仅基于当前输入。 因此,神经网络的输入将只是前一个单词`the`。 也就是说,在正常的神经网络中,每个输入都彼此独立。 因此,在我们必须记住输入序列以预测下一个序列的情况下,它将不能很好地执行。
我们如何使我们的网络记住整个句子以正确预测下一个单词? 这是 RNN 发挥作用的地方。 RNN 不仅基于当前输入,而且还基于先前的隐藏状态来预测输出。 您可能想知道为什么 RNN 必须基于当前输入和先前的隐藏状态来预测输出,以及为什么它不能仅使用当前输入和先前的输入而不是当前输入和先前的隐藏状态来预测输出 。 这是因为前一个输入将存储有关前一个单词的信息,而前一个隐藏状态将捕获有关整个句子的信息,也就是说,前一个隐藏状态将存储上下文。 因此,基于当前输入和先前的隐藏状态而不是仅基于当前输入和先前的输入来预测输出非常有用。
@@ -399,7 +399,7 @@ RNN 是一种特殊类型的神经网络,广泛应用于顺序数据。 换句
![](img/00213.gif)
-如您所见,根据当前输入 *x 1* ,当前隐藏状态*预测输出 *y 1* h 1* 以及先前的隐藏状态 *h 0* 。 类似地,看看如何计算输出 *y 2* 。 它采用当前输入 *x 2* 和当前隐藏状态 *h 2* 以及先前的隐藏状态 *h [ 1* 。 这就是 RNN 的工作方式; 它需要当前输入和先前的隐藏状态来预测输出。 我们可以将这些隐藏状态称为内存,因为它们保存了到目前为止已经看到的信息。
+如您所见,根据当前输入`x1`,当前隐藏状态*预测输出`y1, h[1]`以及先前的隐藏状态`h[0]`。 类似地,看看如何计算输出`y[2]`。 它采用当前输入`x[2]`和当前隐藏状态 `h[2]`以及先前的隐藏状态`h[1]`。 这就是 RNN 的工作方式; 它需要当前输入和先前的隐藏状态来预测输出。 我们可以将这些隐藏状态称为内存,因为它们保存了到目前为止已经看到的信息。
现在,我们将看到一些数学运算:
@@ -415,11 +415,11 @@ RNN 是一种特殊类型的神经网络,广泛应用于顺序数据。 换句
![](img/00215.jpeg)
-即,时的*隐藏状态 *t = tanh([向隐藏权重矩阵的输入*输入] + [向隐藏权重矩阵的隐藏*在时间 t-1 的先前隐藏状态])[* :*
+即,`时间 t 的隐藏状态 = tanh([输入到隐藏权重的矩阵 * 输入] + [隐藏权重到隐藏权重的矩阵 *时间 t-1 的先前隐藏状态])`:
![](img/00216.jpeg)
-即,在时间 t 输出的 *= Sigmoid(在时间 t 隐藏至输出权重矩阵*隐藏状态)*。
+即,`时间的 t 输出 = Sigmoid(隐藏权重到输出的矩阵 * 时间 t 的隐藏状态)`。
我们还可以将损失函数定义为交叉熵损失,如下所示:
@@ -435,7 +435,7 @@ RNN 是一种特殊类型的神经网络,广泛应用于顺序数据。 换句
![](img/00221.gif)
-在上图中, **L 1** , **L 2** 和 **L 3** 是每个时间步的损失。 现在,我们需要在每个时间步长计算相对于我们的权重矩阵`U`,`V`和`W`的损耗梯度。 就像我们之前通过对每个时间步长求和来计算总损耗一样,我们用每个时间步长的梯度之和来更新权重矩阵:
+在上图中,`L[1]`,`L[2]`和`L[3]`是每个时间步的损失。 现在,我们需要在每个时间步长计算相对于我们的权重矩阵`U`,`V`和`W`的损耗梯度。 就像我们之前通过对每个时间步长求和来计算总损耗一样,我们用每个时间步长的梯度之和来更新权重矩阵:
![](img/00222.jpeg)
@@ -447,7 +447,7 @@ RNN 是一种特殊类型的神经网络,广泛应用于顺序数据。 换句
# 长短期记忆 RNN
-RNN 非常酷,对吧? 但是我们在训练 RNN 时遇到了一个问题,即消失梯度问题。 让我们来探讨一下。 天空是 __。 RNN 可以根据所看到的信息轻松地将最后一个单词预测为*蓝色*。 但是 RNN 无法涵盖长期依赖关系。 这意味着什么? 假设 Archie 在中国生活了 20 年。 他喜欢听好音乐。 他是一个非常大的漫画迷。 他流利的 _。 现在,您将预测空白为中文。 您是如何预测的? 因为您了解 Archie 在中国生活了 20 年,所以您认为他可能会说流利的中文。 但是 RNN 不能在记忆中保留所有这些信息以说 Archie 能够说流利的中文。 由于消失的梯度问题,它无法长时间在内存中重新收集/记住信息。 我们该如何解决?
+RNN 非常酷,对吧? 但是我们在训练 RNN 时遇到了一个问题,即消失梯度问题。 让我们来探讨一下。 天空是__的。 RNN 可以根据所看到的信息轻松地将最后一个单词预测为“蓝色”。 但是 RNN 无法涵盖长期依赖关系。 这意味着什么? 假设 Archie 在中国生活了 20 年。 他喜欢听好音乐。 他是一个非常大的漫画迷。 他的__很流利。 现在,您将预测空白为中文。 您是如何预测的? 因为您了解 Archie 在中国生活了 20 年,所以您认为他可能会说流利的中文。 但是 RNN 不能在记忆中保留所有这些信息以说 Archie 能够说流利的中文。 由于消失的梯度问题,它无法长时间在内存中重新收集/记住信息。 我们该如何解决?
LSTM 来了!!!!
@@ -466,16 +466,21 @@ LSTM 单元称为内存,它们负责存储信息。 但是信息必须在存
如果查看 LSTM 单元,则顶部水平线`C[t]`被称为单元状态。 这是信息流向的地方。 LSTM 门将不断更新有关单元状态的信息。 现在,我们将看到这些门的功能:
* **忘记门**:忘记门负责确定哪些信息不应处于单元状态。 看下面的陈述:
- *哈里是一位好歌手。 他住在纽约。 Zayn 还是一位出色的歌手。*
- 一旦我们开始谈论 Zayn,网络就会了解到主题已从 Harry 更改为 Zayn,并且不再需要有关 Harry 的信息。 现在,“忘记门”将从牢房状态中删除/忘记关于哈利的信息。
+ “Harry 是一位好歌手。 他住在纽约。 Zayn 也是一位出色的歌手。”
+
+ 一旦我们开始谈论 Zayn,网络就会了解到主题已从 Harry 更改为 Zayn,并且不再需要有关 Harry 的信息。 现在,“忘记门”将从单元状态中删除/忘记关于哈利的信息。
* **输入门**:输入门负责确定应在存储器中存储哪些信息。 让我们考虑相同的示例:
- *哈利是一位出色的歌手。 他住在纽约。 Zayn 还是一位出色的歌手。*
+
+ “Harry 是一位出色的歌手。 他住在纽约。 Zayn 也是一位出色的歌手。”
+
因此,在“遗忘门”从单元状态中删除信息之后,输入门将确定存储器中必须包含哪些信息。 在此,由于通过遗忘门从单元状态中删除了关于哈利的信息,因此输入门决定用关于 Zayn 的信息来更新单元状态。
* **输出门**:该输出门负责确定一次从单元状态`t`应该显示什么信息。 现在,考虑以下句子:
- *Zayn 的首张专辑取得了巨大的成功。 恭喜 ____* 。
- 在这里,*表示祝贺*是用于形容名词的形容词。 输出层将预测`Zayn`(名词),以填补空白。
+
+ “Zayn 的首张专辑取得了巨大的成功。 恭喜____。”
+
+ 在这里,“恭喜”是用于形容名词的形容词。 输出层将预测`Zayn`(名词),以填补空白。
# 使用 LSTM RNN 生成歌曲歌词
--
GitLab