@ -218,7 +218,7 @@ import random
- ** 计算平均累积奖励**,经过多次模拟。我们每 5000 次迭代打印一次进度,并计算这段时间内累积奖励的平均值。这意味着如果我们得到超过 195 分——我们可以认为问题已经解决,甚至比要求的质量更高。
- ** 计算平均累积奖励**,经过多次模拟。我们每 5000 次迭代打印一次进度,并计算这段时间内累积奖励的平均值。这意味着如果我们得到超过 195 分——我们可以认为问题已经解决,甚至比要求的质量更高。
- ** 计算最大平均累积结果**, `Qmax`, 我们将存储与该结果对应的Q-Table。当你运行训练时, 你会注意到有时平均累积结果开始下降, 我们希望保留与训练期间观察到的最佳模型相对应的 Q-Table 值。
- ** 计算最大平均累积结果**, `Qmax`,我们将存储与该结果对应的 Q-Table。当你运行训练时, 你会注意到有时平均累积结果开始下降, 我们希望保留与训练期间观察到的最佳模型相对应的 Q-Table 值。
1. 在 `rewards` 向量处收集每次模拟的所有累积奖励,用于进一步绘图。(代码块 11)
1. 在 `rewards` 向量处收集每次模拟的所有累积奖励,用于进一步绘图。(代码块 11)
@ -265,13 +265,13 @@ import random
- ** 接近我们的目标**。我们非常接近实现在连续 100 多次模拟运行中获得 195 个累积奖励的目标,或者我们可能真的实现了!即使我们得到更小的数字,我们仍然不知道,因为我们平均超过 5000 次运行,而在正式标准中只需要 100 次运行。
- ** 接近我们的目标**。我们非常接近实现在连续 100 多次模拟运行中获得 195 个累积奖励的目标,或者我们可能真的实现了!即使我们得到更小的数字,我们仍然不知道,因为我们平均超过 5000 次运行,而在正式标准中只需要 100 次运行。
- ** 奖励开始下降**。有时奖励开始下降,这意味着我们可以"破坏" Q-Table 中已经学习到的值,这些值会使情况变得更糟。
- ** 奖励开始下降**。有时奖励开始下降,这意味着我们可以“破坏” Q-Table 中已经学习到的值,这些值会使情况变得更糟。
如果我们绘制训练进度图,则这种观察会更加清晰可见。
如果我们绘制训练进度图,则这种观察会更加清晰可见。
## 绘制训练进度
## 绘制训练进度
在训练期间,我们将每次迭代的累积奖励值收集到`rewards`向量中。以下是我们根据迭代次数绘制它时的样子:
在训练期间,我们将每次迭代的累积奖励值收集到 `rewards` 向量中。以下是我们根据迭代次数绘制它时的样子:
```python
```python
plt.plot(reawrd)
plt.plot(reawrd)
@ -279,7 +279,7 @@ plt.plot(reawrd)


从这张图中,无法说明任何事情,因为由于随机训练过程的性 质,训练课程的长度差异很大。为了更好地理解这个图,我们可以计算一系列实验的 **running average** ,假设为 100。这可以使用 `np.convolve` 方便地完成:(代码块 12)
从这张图中,无法说明任何事情,因为由于随机训练过程的性质,训练课程的长度差异很大。为了更好地理解这个图,我们可以计算一系列实验的 **running average** ,假设为 100。这可以使用 `np.convolve` 方便地完成:(代码块 12)
```python
```python
def running_average(x,window):
def running_average(x,window):
@ -296,9 +296,9 @@ plt.plot(running_average(rewards,100))
- ** 对于学习率**, `alpha`,我们可以从接近 1 的值开始,然后不断减小参数。随着时间的推移,我们将在 Q-Table 中获得良好的概率值,因此我们应该稍微调整它们,而不是用新值完全覆盖。
- ** 对于学习率**, `alpha`,我们可以从接近 1 的值开始,然后不断减小参数。随着时间的推移,我们将在 Q-Table 中获得良好的概率值,因此我们应该稍微调整它们,而不是用新值完全覆盖。
- ** 增加epsilon**。我们可能希望缓慢增加`epsilon`,以便探索更少,开发更多。从`epsilon`的较低值开始,然后上升到接近 1 可能是有意义的。
- ** 增加 epsilon**。我们可能希望缓慢增加 `epsilon` ,以便探索更少,开发更多。从 `epsilon` 的较低值开始,然后上升到接近 1 可能是有意义的。
> ** 任务 1**: 玩转超参数值, 看看是否可以获得更高的累积奖励。你超过195了吗?
> ** 任务 1**:玩转超参数值,看看是否可以获得更高的累积奖励。你超过 195 了吗?
> ** 任务 2**:要正式解决问题,你需要在 100 次连续运行中获得 195 的平均奖励。在培训期间衡量并确保你已经正式解决了问题!
> ** 任务 2**:要正式解决问题,你需要在 100 次连续运行中获得 195 的平均奖励。在培训期间衡量并确保你已经正式解决了问题!
@ -326,7 +326,7 @@ env.close()
## 🚀挑战
## 🚀挑战
> ** 任务 3**:在这里,我们使用的是 Q-Table 的最终副本,它可能不是最好的。请记住,我们已将性能最佳的 Q-Table 存储到 `Qbest` 变量中!通过将`Qbest`复制到`Q`来尝试使用性能最佳的 Q-Table 的相同示例,看看你是否注意到差异。
> ** 任务 3**:在这里,我们使用的是 Q-Table 的最终副本,它可能不是最好的。请记住,我们已将性能最佳的 Q-Table 存储到 `Qbest` 变量中!通过将 `Qbest` 复制到 `Q` 来尝试使用性能最佳的 Q-Table 的相同示例,看看你是否注意到差异。
> ** 任务 4**:这里我们不是在每一步选择最佳动作,而是用相应的概率分布进行采样。始终选择具有最高 Q-Table 值的最佳动作是否更有意义?这可以通过使用 `np.argmax` 函数找出对应于较高 Q-Table 值的动作编号来完成。实施这个策略,看看它是否能改善平衡。
> ** 任务 4**:这里我们不是在每一步选择最佳动作,而是用相应的概率分布进行采样。始终选择具有最高 Q-Table 值的最佳动作是否更有意义?这可以通过使用 `np.argmax` 函数找出对应于较高 Q-Table 值的动作编号来完成。实施这个策略,看看它是否能改善平衡。