【问题标题】:Problems with implementing approximate(feature based) q learning实现近似(基于特征)q学习的问题
【发布时间】:2019-04-06 18:18:19
【问题描述】:

我是强化学习的新手。我最近了解了近似 q 学习,或基于特征的 q 学习,其中您通过特征描述状态以节省空间。我试图在一个简单的网格游戏中实现这一点。在这里,代理应该学会不进入火坑(由 f 表示),而是尽可能多地吃掉点。这是使用的网格:

...一个
.f.f
.f.f
...f

此处 A 表示代理的起始位置。现在,在实施时,我设置了两个功能。一个是 1/((到最近点的距离)^2),另一个是 (到火坑的距离) + 1。当代理进入火坑时,程序返回 -100 的奖励。如果它去到一个已经被访问过的非火坑位置(因此没有要吃的点),奖励是-50。如果它到达一个未访问的点,则奖励为 +500。在上面的网格中,无论初始权重是多少,程序都不会学习到正确的权重值。具体来说,在输出中,第一个训练会话的得分(它吃了多少个点)为 3,但对于所有其他训练会话,得分仅为 1,并且权重收敛到权重 1 的错误值 -125(到火坑的距离)和 25 权重 2(到未访问点的距离)。我的代码有什么特别的问题,还是我对近似 q 学习的理解不正确?

我尝试过使用环境给予的奖励以及初始权重。这些都没有解决问题。 这是整个程序的链接:https://repl.it/repls/WrongCheeryInterface

这是主循环中发生的事情:

while(points != NUMPOINTS){
bool playerDied = false;
if(!start){
  if(!atFirepit()){
    r = 0;
    if(visited[player.x][player.y] == 0){
      points += 1;
      r += 500;
    }else{
      r += -50;
    }
  }else{
    playerDied = true;
    r = -100;
  }
}

//Update visited
visited[player.x][player.y] = 1;

if(!start){
  //This is based off the q learning update formula
  pairPoint qAndA = getMaxQAndAction();
  double maxQValue = qAndA.q;
  double sample = r;
  if(!playerDied && points != NUMPOINTS)
    sample = r + (gamma2 * maxQValue);
  double diff = sample - qVal;
  updateWeights(player, diff);
}

// checking end game condition
if(playerDied || points == NUMPOINTS) break;

pairPoint qAndA = getMaxQAndAction();
qVal = qAndA.q;
int bestAction = qAndA.a;

//update player and q value
player.x += dx[bestAction];
player.y += dy[bestAction];

start = false;
}

我希望这两个权重仍然是正的,但其中一个是负的(那个给出到火坑的距离)。

我还希望程序能够通过超时了解到进入火坑是不好的,也不好,但不是那么糟糕,去一个未被访问的点。

【问题讨论】:

    标签: c++ machine-learning reinforcement-learning q-learning


    【解决方案1】:

    可能不是您想听到的答案,但是:

    • 您是否尝试在近似 Q 学习之前实现更简单的表格 Q 学习?在您的设置中,只需几个状态和操作,它就会完美地工作。如果您正在学习,我强烈建议您从更简单的案例开始,以便更好地理解/直观了解强化学习的工作原理。

    • 您知道使用逼近器而不是学习精确的 Q 函数的含义吗?在某些情况下,由于问题的复杂性(例如,当状态空间是连续的),您应该近似 Q 函数(或策略,取决于算法),但这可能会引入一些收敛问题。此外,在您的情况下,您正在尝试手动挑选一些特征,这通常需要对问题(即环境)和学习算法有深入的了解。

    • 你了解超参数alphagamma的含义吗?您不能随意选择它们。有时它们对于获得预期结果至关重要,但并非总是如此,这在很大程度上取决于问题和学习算法。在您的情况下,看看您权重的收敛曲线,很明显您使用的 alpha 值太高了。正如您所指出的,在第一次训练之后,您的体重保持不变。

    因此,实用的建议:

    • 在尝试更复杂的事情之前,请务必使用表格 Q 学习算法解决您的网格游戏。

    • alphagamma 和奖励的不同值进行实验。

    • 详细了解近似 RL。一本非常好上手的书(从零知识开始)是经典的萨顿和巴托的书:Reinforcement Learning: An Introduction,您可以免费获得,并于 2018 年更新。

    【讨论】:

    • 为了回答你的第一个问题,我已经为这个网格世界实现了一个 q-learning 算法。实际上,为了简单起见,在决定切换到网格世界之前,我曾尝试将近似 q 学习用于 pacman 游戏。对于您回答的第三部分,是的,我认为我对这些常数没有非常具体的理解。我会试着和他们一起玩,以及奖励,因为我怀疑我的环境可能是我一些问题的根源。感谢您的回复。
    • 好的,做得好,我认为你的方向是正确的!不要灰心,通常用 RL 解决复杂问题(例如吃豆人游戏)绝非易事。另一个问题,你用 Pacman 试过什么样的逼近器?还有精选的功能?在我看来,您的环境是在 Pacman 之前的一个很好的步骤,但在您的环境之前尝试更简单的环境可能是有用的。我猜你已经知道 OpenAI Gym (gym.openai.com),它包含一些众所周知的环境(尽管它们是用 Python 编写的)。
    • 在 pacman 中,我只有两个权重(我现在认为这是它不起作用的主要原因之一)。一个权重是到最近鬼的距离,另一个是 1/(到最近点的距离的平方)。而且我肯定会尝试使用开放式 AI 健身房,因为我觉得环境设置会更好。
    • 是的,可能是需要考虑的关键点。请注意,直观地说,您的特征(到最近点的距离和到火坑的距离)没有为代理提供足够的信息。代理应该只知道到点和火坑的距离,应该采取哪个方向?它对火坑和圆点的位置一无所知。
    • 有点跑题了,但由于您是 Stackoverflow 的新手,也许这个链接与您相关:stackoverflow.com/help/accepted-answer
    猜你喜欢
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    相关资源
    最近更新 更多