这是我凭经验发现的,反复试验。由于调整参数将是特定于环境的,因此我将列出我的参数,以便更好地了解我发现的适用于我的案例的内容。希望对算法有更好理解的人能够参与进来:
环境:一个 2D 地图,其中代理控制模拟 PC 鼠标垫,并且必须从随机生成点导航到随机奖励点。
动作空间:离散(24)——这是从最初的实现中扁平化的,以允许在 Q* 算法中使用。
- 0-7,鼠标按键,每个按键有两种状态之一
pressed
或depressed
public ButtonPressState Left;
public ButtonPressState Middle;
public ButtonPressState Right;
public ButtonPressState Touch;
public ButtonPressState ScrollUp;
public ButtonPressState ScrollDown;
public ButtonPressState IncreaseScroll;
public ButtonPressState DecreaseScroll;
- 8-15:
Touch
在状态下移动的角度pressed
,以 45° 递增,从 0° 到 315°
public enum D8Dir
{
UP = 0, // 0°
UP_RIGHT = 1, // 45°
RIGHT = 2, // 90°
DOWN_RIGHT = 3, // 135°
DOWN = 4, // 180°
DOWN_LEFT = 5, // 225°
LEFT = 6, // 270°
UP_LEFT = 7 // 315°
}
- 16-23:速度,2^N 的指数,表示细胞每一步移动的方式。
距离归一化:反复试验使我对空间进行归一化。这也带来了允许相同的训练算法用于不同世界大小的好处,例如,在大的常见监视器尺寸上,2x3 与 3x2 与 3x3。具体来说,对于空间的高度和宽度,距离在 -1 和 1 之间进行归一化。因此,无论尺寸如何,所有点都映射到 -1 和 1 之间的 x 和 y。在高度和宽度不同的情况下,较小的将缩放为较大的尺寸。
奖励空间:在奖励方案迭代后让代理奖励利用迭代后,当代理更接近目标时给予奖励 - 更接近考虑“鸟瞰”和欧几里得距离。首先,取总奖励的“理论”最大总和为 1,并通过取智能体在给定 2D 空间中移动以获得奖励的最大距离来分配。这是二维空间的对角线。我说“理论上的”是因为除非智能体随机生成在一个角落并且奖励恰好放置在另一个角落,否则可以实现的实际总奖励较低。所以在实践中,给定情节的最大奖励是代理和奖励之间的归一化距离之和。
为了避免奖励利用,如果代理在对角线移动可用时垂直或水平移动更近,则只有 0.70% 的奖励。这是为了让代理在仅使用 sqrt(2) 鸟瞰奖励的情况下沿对角线移动的最短路径。否则,代理可能会向上移动,然后离开并收集 2 个标准化单位的奖励,而不是为对角线移动而收集的 ~=1.4142 标准化奖励单位。0.70% 保持垂直然后水平(或反之亦然)的奖励移动到 1.4,小于 ~=1.4142 对角线奖励。
最初,代理可以收集最多 1 的总奖励,然后再获得 3 额外的奖励积分以达到目标。针对这个奖励方案使用股票TensorFlow c51 DQN 代理min_q_value=-10
,使用默认值和max_q_value=10
值(我相信它们在文献中被称为 VMIN 和 VMAX),我发现学习在非常小的世界尺寸上取得了以下结果:
[5/2/2021 5:39:19 PM] Training Started
[5/2/2021 5:39:33 PM] Training Environment (1, 2): 5/2/2021 5:39:33 PM
[5/2/2021 5:40:11 PM] Mastered (1, 2) in 00:00:38.8244035 - Steps 2565 Episode 948 Average: 3.000000000000002
[5/2/2021 5:40:11 PM] Training Environment (2, 1): 5/2/2021 5:40:11 PM
[5/2/2021 5:41:01 PM] Mastered (2, 1) in 00:00:49.1426355 - Steps 5802 Episode 1242 Average: 3.000000000000002
[5/2/2021 5:41:01 PM] Training Environment (2, 2): 5/2/2021 5:41:01 PM
[5/2/2021 5:43:42 PM] Mastered (2, 2) in 00:02:41.2581146 - Steps 16573 Episode 3248 Average: 3.0551471839999977
[5/2/2021 5:43:42 PM] Training Environment (2, 3): 5/2/2021 5:43:42 PM
[5/2/2021 5:53:44 PM] Mastered (2, 3) in 00:10:01.8163250 - Steps 56732 Episode 11226 Average: 3.0981306360000063
[5/2/2021 5:53:44 PM] Training Environment (3, 2): 5/2/2021 5:53:44 PM
[5/2/2021 5:59:13 PM] Mastered (3, 2) in 00:05:29.5753945 - Steps 78612 Episode 6276 Average: 3.108986006000001
[5/2/2021 5:59:13 PM] Training Environment (3, 3): 5/2/2021 5:59:13 PM
[5/2/2021 6:22:50 PM] Mastered (3, 3) in 00:23:37.2302437 - Steps 173577 Episode 25603 Average: 3.1401708113999938
[5/2/2021 6:22:50 PM] Training Environment (4, 4): 5/2/2021 6:22:50 PM
[5/2/2021 7:10:04 PM] Mastered (4, 4) in 00:47:13.5879491 - Steps 363685 Episode 46441 Average: 3.1596743723999965
[5/2/2021 7:10:04 PM] Training Environment (5, 5): 5/2/2021 7:10:04 PM
[5/2/2021 7:20:08 PM] Mastered (5, 5) in 00:10:04.1529582 - Steps 404256 Episode 8916 Average: 3.182016046800004
[5/2/2021 7:20:08 PM] Training Environment (6, 6): 5/2/2021 7:20:08 PM
[5/3/2021 12:33:49 AM] Killed 6x6 - No Convergence: Step 1671400: Reward 1.8765 loss = 2.90894175 (00:00:02.9459997) (eps: 2.9459996999999998)
可以看出,即使对于一个简单的 6x6 世界,即使在 GTX-3080 采样 1,671,400 步超过 4 小时后,C-51 DQN 也没有收敛,所以我杀了它。
所以我修改了移动代理的总可能奖励为 0.5。这只是将旧的奖励计划分成两半(或者更确切地说是 *.5)的问题。
然后我将目标达到奖励从 3 更改为 0.5。
然后理论上的最大奖励总计为 1,因此我更改min_q_value=0
并max_q_value=1
匹配代理可能获得的奖励总和。这导致墙时间比以前更大。
我最近尝试使用min_q_value=0
并max_q_value=.5
匹配代理在收集 0.5 目标达到奖励之前可以获得的最大累积奖励(顺便说一句,这也是我环境中的终端状态)。
对于更大的空间,新的奖励归一化为快一个数量级的总计 1 个运行数量级。6x6 世界在 4624 集的 88721 中使用 88721 步总步数在 05 分钟 43 秒后“收敛”。
我仍然觉得这很慢,但显然与累积奖励范围相匹配的 q 值是一种改进。
[5/3/2021 12:49:35 AM] Training Environment (1, 2): 5/3/2021 12:49:35 AM
[5/3/2021 12:50:12 AM] Mastered (1, 2) in 00:00:36.8244207 - Steps 2424 Episode 981 Average: 0.5000000000000002
[5/3/2021 12:50:12 AM] Training Environment (2, 1): 5/3/2021 12:50:12 AM
[5/3/2021 12:50:37 AM] Mastered (2, 1) in 00:00:24.6645133 - Steps 4075 Episode 700 Average: 0.5000000000000002
[5/3/2021 12:51:52 AM] Mastered (2, 2) in 00:01:15.0585713 - Steps 8135 Episode 1419 Average: 0.5314644659999993
[5/3/2021 12:51:52 AM] Training Environment (2, 3): 5/3/2021 12:51:52 AM
[5/3/2021 12:52:39 AM] Mastered (2, 3) in 00:00:47.0126118 - Steps 11266 Episode 961 Average: 0.5455624971999997
[5/3/2021 12:52:39 AM] Training Environment (3, 2): 5/3/2021 12:52:39 AM
[5/3/2021 12:52:56 AM] Mastered (3, 2) in 00:00:17.6139995 - Steps 12447 Episode 395 Average: 0.5650996157999993
[5/3/2021 12:52:56 AM] Training Environment (3, 3): 5/3/2021 12:52:56 AM
[5/3/2021 12:55:56 AM] Mastered (3, 3) in 00:02:59.7056623 - Steps 24472 Episode 3403 Average: 0.5863068707999991
[5/3/2021 12:55:56 AM] Training Environment (4, 4): 5/3/2021 12:55:56 AM
[5/3/2021 1:00:07 AM] Mastered (4, 4) in 00:04:11.2932882 - Steps 41259 Episode 4240 Average: 0.6052226153999957
[5/3/2021 1:00:07 AM] Training Environment (5, 5): 5/3/2021 1:00:07 AM
[5/3/2021 1:06:11 AM] Mastered (5, 5) in 00:06:03.8448782 - Steps 65641 Episode 5502 Average: 0.6209708242799977
[5/3/2021 1:06:11 AM] Training Environment (6, 6): 5/3/2021 1:06:11 AM
[5/3/2021 1:11:54 AM] Mastered (6, 6) in 00:05:43.2033837 - Steps 88721 Episode 4624 Average: 0.6089312343400013
仅供参考:论文指出,过渡到终端状态是用 γt = 0 处理的。
更新:
9x9 环境在 51 分 38 秒内完成了 37,025 集的 294,897 步。max_q_value=1
在更大的世界范围内,代理可能会收集更多的运动奖励,这种情况可能会更好。在任何情况下,这些值都比教程中的默认值要好几倍。我会更多地尝试它们。
此外,调整 n 步可能会有所帮助。我的实现也可能存在使用来自较小世界大小的重播缓冲区内存的问题,因为我正在动态更改世界大小且当前未清除缓冲区。
[5/3/2021 2:03:33 AM] Mastered (9, 9) in 00:51:38.4201434 - Steps 294897 Episode 37025 Average: 0.6425936848799915