我正在研究并尝试实施Q-Learning示例。到目前为止,我已经能够通过将代码分开并弄清楚它是如何工作来缓慢地遵循代码,但是我偶然发现了一个小小的片段,我无法弄清楚它为什么存在。 ..
action = np.argmax(q_learning_table[state,:] + np.random.randn(1, 4))
从我收集的内容中,正在从Q-Learning表中选择一个动作,但仅从矩阵中的特定行中选择,无论值state
是什么。我不明白为什么需要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
而不是3
(9
的位置)。那么,为什么我仍然会看到3
。添加100
的目的是什么?
答案 0 :(得分:2)
Q学习培训阶段的目标是创建一个表示最优策略的Q表,即准确预测给定状态下每个潜在行动的累积奖励的表。
在培训期间,有必要引入随机动作,以鼓励学习者探索可用的状态空间并获得新的体验。如果没有这种随机性,学习者将很快收敛到次优的策略,因为它会根据有限的经验不断选择相同的行为。
在您的示例中,np.random.randn()
调用会引入此随机性。它会根据标准正态分布增加噪音。然后np.argmax()
调用返回数组中最大值的索引,在这种情况下,是添加了噪声的每个潜在操作的最大奖励。
答案 1 :(得分:0)
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
,它会将数组视为1d。使用轴,它按行或列查找:
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
答案 2 :(得分:0)
为了鼓励探索,它最有可能是随机噪音。这样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