【问题标题】:What does arithmetic do inside np.argmax?算术在 np.argmax 中做了什么?
【发布时间】:2018-05-10 17:58:24
【问题描述】:

我正在研究并尝试实施一个 Q-Learning 示例。到目前为止,我已经能够通过将代码分解并弄清楚它是如何工作的来慢慢地遵循代码,但是我偶然发现了一个小小的 sn-p,我无法弄清楚它为什么存在......

action = np.argmax(q_learning_table[state,:] + np.random.randn(1, 4))

据我所知,无论state 是什么值,都从 Q-Learning 表中选择了一个动作,但仅从矩阵中的特定行中选择。我不明白为什么需要np.random.randn(1, 4)

在本地,我做了以下尝试来理解它:

A = np.matrix([[0, 0, 5, 0], [4, 0, 0, 0], [0, 0, 0, 9])
a = np.argmax(A[2,:] + 100)
print(a)

我的理解是我应该看到结果103 而不是39 的位置)。那么,为什么我仍然看到3。加100的目的是什么?

【问题讨论】:

  • 如果将 same 值添加到每个元素,则不会改变最大值的位置,但randn(1, 4) 不只是一个值。

标签: python numpy artificial-intelligence reinforcement-learning


【解决方案1】:

Q-learning 训练阶段的目标是创建一个表示最优策略的 Q 表,即准确预测给定状态下每个潜在动作的累积奖励的表。

在训练过程中,需要引入随机动作,这样会鼓励学习者去探索可用的状态空间,获得新的经验。如果没有这种随机性,学习器将很快收敛到次优策略,因为它会根据有限的经验不断选择相同的动作。

在您的示例中,np.random.randn() 调用引入了这种随机性。它根据标准正态分布添加噪声。 np.argmax() 调用然后返回数组中最大值的索引,在这种情况下,每个潜在动作的最大奖励加上噪声。

【讨论】:

  • 嗯,我明白了。但是,为什么它需要np.argmax 而不是np.max
  • 我们想要最大值的索引(np.argmax),而不是值本身(np.max)。对于每个状态,我们要选择代表最大 Q 值的动作,因此将采取的动作是 np.argmax 返回的索引。
  • 好的,明白了。有道理。
  • 很高兴有帮助。如果您认为我的回答对您有用,请考虑接受。谢谢。
【解决方案2】:

这很可能是为了鼓励探索而产生的随机噪音。这样 QL 就不会固守一个随机的好解决方案,而是试图找到一个可能更好的解决方案。

此外,np.argmax(x) 返回数组中最大元素的索引。不是价值。那是np.max(x)

# Largest value is at index 2
np.argmax([1,3,9,4,5,6,3]) -> 2

# Largest value is 9
np.max([1,3,9,4,5,6,3]) -> 9

【讨论】:

    【解决方案3】:
    In [12]: A = np.array([[0, 0, 5, 0], [4, 0, 0, 0], [0, 0, 0, 9]])
    In [13]: A
    Out[13]: 
    array([[0, 0, 5, 0],
           [4, 0, 0, 0],
           [0, 0, 0, 9]])
    

    argmax 返回数组中最大项的索引:

    In [14]: np.argmax(A)
    Out[14]: 11
    In [15]: A.ravel()
    Out[15]: array([0, 0, 5, 0, 4, 0, 0, 0, 0, 0, 0, 9])
    

    如果没有axis,它会将数组视为一维数组。使用轴,它按行或列查看:

    In [16]: np.argmax(A, axis=0)
    Out[16]: array([1, 0, 0, 2], dtype=int32)
    In [17]: np.argmax(A, axis=1)
    Out[17]: array([2, 0, 3], dtype=int32)
    

    添加一个值 100 或随机数组会更改 argmax 看到的数组中的值。简单地添加一个标量不会改变最大值的位置。添加随机数组可以改变位置。

    np.argmax(q_learning_table[state,:] + np.random.randn(1, 4))
    

    arr = q_learning_table[state,:] + np.random.randn(1, 4)
    np.argmax(arr)
    

    也就是说,Python 先计算参数,然后将结果传递给argmax。数学不是在argmax 内部完成的。它甚至在 argmax 运行之前完成。

    A添加一个随机数组可以改变max的位置:

    In [24]: A + np.random.randint(0,20, A.shape)
    Out[24]: 
    array([[ 2,  2, 10,  3],
           [ 7,  9, 13,  6],
           [ 3, 14, 10, 13]])
    In [25]: np.argmax(_)
    Out[25]: 9
    

    【讨论】:

      猜你喜欢
      • 2012-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-20
      • 2016-07-22
      • 2013-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多