1

最近我一直在解决强化学习的问题(我在该领域非常新)。问题很简单。我们有一个大小为 NxN 的矩阵,所有元素都为零。目标是让代理将所有值更改为 1。我可以看到代理正在学习,但无论我做什么,我的输出图中都有很多噪音,我看不到收敛!另一方面,超参数的微小变化可能会破坏我的学习过程!从学习到不学习!

例如,我使用了 5x5 矩阵。探索/开发权衡的 epsilon 函数如下:

egreedy = 0.9
egreedy_final = 0.02
egreedy_decay = 5000

def calculate_epsilon(steps_done):
epsilon = egreedy_final + (egreedy - egreedy_final) * \
          math.exp(-1 * steps_done / egreedy_decay)

return epsilon

epsilon 函数降低了每个时间步(不是插曲)中的随机性。我设置了 5000 集,每集有 50 个时间步长。此外,我正在使用目标网络的经验回放,每个隐藏层。这些是我的超参数:

learning_rate = 0.01
num_episodes = 5000
gamma = 0.8
max_time_steps = 50


hidden_layer1 = 64

replay_mem_size = 1000000
batch_size = 32

update_target_frequency = 5000

egreedy = 0.9
egreedy_final = 0.02
egreedy_decay = 5000

这是每集奖励相对于集数的总和: 在此处输入图像描述

可见有学习但有两个问题。首先,代理每集可以获得的最大奖励是 25,但在这里我们可以看到它获得的最大奖励是 20。

通过将每集的探索次数更改为 100(像素数的 4 倍),我得到了 25,但我仍然没有看到任何收敛并且解决方案不稳定: 在此处输入图像描述

当我试图增加剧集的数量时,我没有看到任何更好的结果。似乎真正影响结果的一件事是每集的探索次数。但它不遵循线性传递。例如,如果我有一个 3x3 矩阵(9 个像素),则每集 18 个时间步就足够了(即 2x 个像素)。对于 5x5,100 个时间步有效(我也放了 200,但结果没有太大变化),但我的实际问题要复杂得多!无论是目标配置还是大小(最小 20x20 矩阵),它都非常耗时,因为在每个时间步骤中,都会在后台运行复杂的模拟!因此,考虑到我有时间,仅仅玩弄该问题的参数对我来说几乎是不可能的!

有没有一种通用的方法来优化超参数,而不必一遍又一遍地检查所有内容?比如有什么食谱吗?为什么我在这里看不到收敛?(我已经使用了更多的剧集,但我仍然有问题!)我该如何解决这个收敛问题?

非常感谢!如果您需要有关我的代码的更多信息,我也可以将其放在这里!

4

0 回答 0