【问题标题】:The huge amount of states in q-learning calculationq-learning 计算中的大量状态
【发布时间】:2019-06-19 17:06:01
【问题描述】:

我通过 q-learning 实现了一个 3x3 OX 游戏(它在 AI vs AI 和 AI vs Human 中完美运行),但我无法更进一步进行 4x4 OX 游戏,因为它会占用我所有的 PC 内存并且崩溃。

这是我目前的问题: Access violation in huge array?

在我的理解中,一个 3x3 OX 游戏总共有 3(空格、白色、黑色)^ 9 = 19683 种可能的状态。 (相同图案不同角度仍算)

对于 4x4 OX 游戏,总状态为 3 ^ 16 = 43,046,721

对于常规围棋游戏,15x15 棋盘,总状态为 3 ^ 225 ~ 2.5 x 10^107

第一季度。我想知道我的计算是否正确。 (对于 4x4 OX 游戏,我需要一个 3^16 数组?)

第二季度。由于我需要计算每个Q值(对于每个状态,每个动作),我需要这么多的数组,是预期的吗?有什么办法避免吗?

【问题讨论】:

  • @foreknownas_463035818 也许你应该从这些 cmets 中做出正确的答案;)
  • 4x4 实际上是 3^16,而不是 4^16。
  • 如果电路板足够大,您最终将达到任何预定义的限制。你的目标板是什么?希望不是 19x19..
  • 首先需要解决4x4数组大小问题,目标是15x15或者19x19。我有一个工作站资源(XEON cpu + 64GB),但似乎仍然很难解决这类问题。
  • 那么我们已经远远超过了int 的大小。有maybe a way 来减少编号(对于 N=9,它给出 6045,而不是 6046),但对于板 N=19,它 still requires 的最大值为 894*10^168(约 568 位)的数量。

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


【解决方案1】:

考虑对称性。实际可能的配置数量远小于 3x3 板上的 9^3。例如,基本上只有 3 种不同的配置,板上只有一个 x

轮换

有许多板配置都应该导致您的 AI 做出相同的决定,因为它们具有相同的模对称性。例如:

x - -    - - x    - - -    - - -  
- - -    - - -    - - -    - - - 
- - -    - - -    - - x    x - - 

这些都是相同的配置。如果你单独对待它们,你会浪费训练时间。

镜像

不仅有旋转对称,还可以在不改变实际情况的情况下对板进行镜像。以下内容基本相同:

0 - x    x - 0    - - -    - - -  
- - -    - - -    - - -    - - - 
- - -    - - -    0 - x    x - 0

排除“不可能发生”的配置

接下来考虑当一个玩家获胜时游戏结束。例如,您有 3^3 个配置,它们都看起来像这样

x 0 ?
x 0 ?    // cannot happen
x 0 ?

他们永远不会出现在正常的比赛中。您不必为它们预留空间,因为它们根本不可能发生。

排除更多“不可能发生”

此外,您还大大高估了9^3 的配置空间大小,因为玩家轮流交替进行。例如,您无法达到这样的配置:

x x -
x - -    // cannot happen
- - - 

如何获得所有需要的配置?

简而言之,这就是我解决问题的方法:

  • 为您的电路板定义 operator<
  • 使用< 关系,您可以为每组“相似”配置选择一个代表(例如,< 的代表比该集中的所有其他配置)
  • 编写一个函数,为给定的配置返回代表配置
  • 蛮力迭代所有可能的动作(只有可能的动作!,即只让玩家交替轮流直到游戏获胜)。这样做的时候你
    • 计算您遇到的每个配置的代表
    • 记住所有具有代表性的配置(请注意,由于对称性,它们会出现多次)

您现在拥有所有配置模对称的列表。在实际游戏中,您只需将棋盘转换为其代表,然后移动即可。如果您记得如何将其旋转/镜像回来,您可以在之后转换回实际配置。

这是相当蛮力的。我的数学有点生疏,否则我会尝试直接获取代表名单。但是,对于每种尺寸的电路板,您只需执行一次。

【讨论】:

    【解决方案2】:

    如果您跳过重新发明轮子,以下是解决此问题的方法:

    该模型是一个卷积神经网络,使用以下变体进行训练 Q-learning,其输入是原始像素,其输出是一个值 估计未来奖励的函数。我们将我们的方法应用于七个 Atari 来自街机学习环境的 2600 款游戏,无需调整 架构或学习算法。

    https://arxiv.org/pdf/1312.5602v1.pdf

    我们可以用一个神经网络来表示我们的 Q 函数,这需要 状态(四个游戏画面)和动作作为输入和输出 对应的 Q 值。或者我们可以只使用游戏屏幕 作为每个可能动作的输入和输出 Q 值。这个 方法的优点是,如果我们想要执行 Q 值 更新或选择 Q 值最高的动作,我们只需要做一个 前向通过网络并具有所有动作的所有 Q 值 立即可用。

    https://neuro.cs.ut.ee/demystifying-deep-reinforcement-learning/

    【讨论】:

      【解决方案3】:

      我有一个枚举方案,但它需要一个整数数组。如果您可以将整数数组压缩为单个 Q 值(并返回),那么这可能会起作用。

      先到 N,棋盘上的棋子数。

      然后是 ceil(N/2) 项的数组,即 X 块。每个数字都是从前 X 块(或棋盘开始)中的空白有效空间的计数。重要提示:如果空格会导致游戏结束,则该空格无效。这就是连续 5 个结束规则帮助我们减少域的地方。

      然后是 floor(N/2) 个元素的数组,即 O 块。与 X 数组相同的逻辑。

      所以对于这个板和 3 件规则:

      XX.
      X.O
      ..O
      

      我们有以下数组:

      N: 5
      X:0(从棋盘开始),0(从前一个X),0(右上角对X无效,因为它会结束游戏)
      O:2(从棋盘开始,减去前面的所有 X),2(从前面的 O)

      这就是数组 [5, 0, 0, 0, 2, 2]。给定这个数组,我们可以重新创建上面的板。小数字的出现比大数字的出现概率更大。在 19x19 棋盘的常规游戏中,棋子大部分会组合在一起,因此下一行会有很多零、一、二,用偶尔的“大”数字分隔。

      您现在必须使用小数多于大数的事实来压缩此数组。通用压缩算法可能会有所帮助,但一些 specialized 可能会有所帮助。

      我对 q-learning 一无所知,但这一切都要求 q-value 可以具有可变大小。如果您必须为 q 值设置恒定大小,那么该大小将不得不考虑最坏的电路板,并且该大小可能太大,以至于首先破坏了进行此枚举/压缩的目的。

      我们使用从左到右和从上到下的方法来枚举碎片,但我们也可以使用一些螺旋式方法,这可能会产生更好的小数比。我们只需要选择螺旋中心的最佳起点。但这可能会使算法复杂化,最终会浪费更多的 CPU 时间。

      另外,我们并不需要数组中的第一个数字,N。数组的长度给出了这个信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-23
        • 2023-04-07
        • 1970-01-01
        • 2015-02-04
        • 1970-01-01
        相关资源
        最近更新 更多