可视化强化学习代理的进度
Visualizing a Reinforcement Learning Agent's Progress
我看过很多帖子,这些帖子可视化了强化代理随着训练的进行而得到的改进。他们通常跟踪所有奖励的总和或获胜百分比的移动平均值,但我认为我从未读过他们实际上是如何做到的。我是否应该将所有会话的结果导出到 CSV 文件,然后将其可视化?当然,可视化部分不会很难,但我一直想知道他们最初是如何收集数据的。
你的问题本质上是关于收集一个情节中收到的奖励总和或评估代理的成功率。这两种方法都完全取决于程序员。
在第一种情况下,通常是通过实施一种方法来完成,该方法执行一个完整的剧集和 returns 关于剧集中发生的事情的信息。您可以 return 几种不同的统计数据,这仅与您的偏好有关 - 您想要跟踪什么。在奖励总和的情况下,您设置一个变量(即 total_reward
),初始值为 0,并在每个步骤中将观察到的奖励添加到该变量。然后你 return 在情节结束时这个变量的值。您可以在外循环中为每一集收集这些值 - 正如您提到的,在学习完成后可视化它们并不困难。
在评估 success_rate 的情况下,您可以尝试多种方法。您可以在上述方法中添加另一个信息——剧集是否成功结束(即 is_success
)。如果您为每一集都收集了这样的布尔值,则可以通过计算 'success episodes' 的百分比来汇总信息 - 每 10 集或更多集 - 然后绘制它。
这种方法的缺点是这些结果可能不准确,这是由于您在代理执行剧集时使用的探索技术。如果探索技术的影响太大,已经学习过的智能体通常无法取得成功。这就是为什么另一个选项经常用于成功率:在每给定的情节数之后,你 运行 你的代理人进入一个评估循环,你让他选择行动而不添加任何探索技术(并且你不训练代理在此过程中!)。评估循环可以由任意数量的N个这样的测试集组成(测试集越多,评估越准确),你可以通过简单地计算成功集并除以计算成功率这个数字乘 N。您保存评估的成功率并在训练期间记录它们/训练结束后将它们可视化。当然,您可以在绘制值之前计算移动平均线(不过我相信我不必在这里解释这个计算)。
就个人而言,我更经常使用第二种方法 - 但您可以清楚地看到,这种方法增加了更多的时间开销。如果您 运行 每 10 集执行一次评估循环,并且该循环由 10 个测试集组成,则您 大约 将程序执行时间加倍。因此,如果性能已经成为一个问题,并且探索技术的影响会随着时间的推移而衰减,那么您不妨使用第一个更简单的版本。
我最后的补充评论是——注意,对于总奖励,你实际上可以做同样的事情——而不是像我解释的那样使用收集的值,评估循环也是这里的一个选项。因为这些值通常非常嘈杂,并且不太希望它们精确(更多的是看到趋势),所以我从未见过有人这样做。但是尽管如此,您应该知道有很多选择,这完全取决于您需要的值的精确程度以及您可以承受的开销。
我看过很多帖子,这些帖子可视化了强化代理随着训练的进行而得到的改进。他们通常跟踪所有奖励的总和或获胜百分比的移动平均值,但我认为我从未读过他们实际上是如何做到的。我是否应该将所有会话的结果导出到 CSV 文件,然后将其可视化?当然,可视化部分不会很难,但我一直想知道他们最初是如何收集数据的。
你的问题本质上是关于收集一个情节中收到的奖励总和或评估代理的成功率。这两种方法都完全取决于程序员。
在第一种情况下,通常是通过实施一种方法来完成,该方法执行一个完整的剧集和 returns 关于剧集中发生的事情的信息。您可以 return 几种不同的统计数据,这仅与您的偏好有关 - 您想要跟踪什么。在奖励总和的情况下,您设置一个变量(即 total_reward
),初始值为 0,并在每个步骤中将观察到的奖励添加到该变量。然后你 return 在情节结束时这个变量的值。您可以在外循环中为每一集收集这些值 - 正如您提到的,在学习完成后可视化它们并不困难。
在评估 success_rate 的情况下,您可以尝试多种方法。您可以在上述方法中添加另一个信息——剧集是否成功结束(即 is_success
)。如果您为每一集都收集了这样的布尔值,则可以通过计算 'success episodes' 的百分比来汇总信息 - 每 10 集或更多集 - 然后绘制它。
这种方法的缺点是这些结果可能不准确,这是由于您在代理执行剧集时使用的探索技术。如果探索技术的影响太大,已经学习过的智能体通常无法取得成功。这就是为什么另一个选项经常用于成功率:在每给定的情节数之后,你 运行 你的代理人进入一个评估循环,你让他选择行动而不添加任何探索技术(并且你不训练代理在此过程中!)。评估循环可以由任意数量的N个这样的测试集组成(测试集越多,评估越准确),你可以通过简单地计算成功集并除以计算成功率这个数字乘 N。您保存评估的成功率并在训练期间记录它们/训练结束后将它们可视化。当然,您可以在绘制值之前计算移动平均线(不过我相信我不必在这里解释这个计算)。
就个人而言,我更经常使用第二种方法 - 但您可以清楚地看到,这种方法增加了更多的时间开销。如果您 运行 每 10 集执行一次评估循环,并且该循环由 10 个测试集组成,则您 大约 将程序执行时间加倍。因此,如果性能已经成为一个问题,并且探索技术的影响会随着时间的推移而衰减,那么您不妨使用第一个更简单的版本。
我最后的补充评论是——注意,对于总奖励,你实际上可以做同样的事情——而不是像我解释的那样使用收集的值,评估循环也是这里的一个选项。因为这些值通常非常嘈杂,并且不太希望它们精确(更多的是看到趋势),所以我从未见过有人这样做。但是尽管如此,您应该知道有很多选择,这完全取决于您需要的值的精确程度以及您可以承受的开销。