我正在尝试使用强化学习从一组给定的点中反复选择最接近原点的点,直到达到一个复杂的(且不相关的)结束条件。(这是我主要问题的简化版。)
一个包含可能点的二维数组被传递给强化学习算法,该算法会选择它认为最理想的点。
A [1, 10]B [100, 0]C [30, 30]D [5, 7]E [20, 50]
在这种情况下,D
将是真正的最佳选择。(算法理想情况下应输出3
,范围从0
到4
。)
然而,每当我训练算法时,它似乎并没有学会“概念”,而是仅仅学会了选择,比如说,C
通常是最好的选择,所以它总是选择那个。
import numpy as npimport rl.core as krlclass FindOriginEnv(krl.Env): def observe(self): return np.array([ [np.random.randint(100), np.random.randint(100)] for _ in range(5) ]) def step(self, action): observation = self.observe() done = np.random.rand() < 0.01 # eventually reward = 1 if done else 0 return observation, reward, done, {} # ...
我应该如何修改我的算法,使其真正学会它试图实现的目标?
- 观察形状?
- 奖励函数?
- 动作选择?
欢迎提供Keras代码,但不是必需的;纯粹的算法解释也将非常有帮助。
回答:
根据你的描述勾勒出MDP,有几个问题需要注意:
-
你的观察函数似乎返回了5个点,这意味着一个状态可以是[0,99]范围内10个整数的任何配置。这将有100^10种可能的状态!你的状态空间需要小得多。目前,
observe
似乎是在生成可能的动作,而不是状态观察。 -
你建议从[0,4]中选择动作,其中每个动作本质上是指向可供代理选择的点数组的索引。这种动作空间的定义不足以让代理区分你希望它做到的(较小幅度的点更好),因为你仅根据点的索引来行动!如果你想稍微调整一下这个公式以使其工作,你可以定义一个动作为选择一个二维点,每个维度在[0,99]范围内。这意味着你将有100^2种可能的动作,但为了保持多项选择的特性,你将限制代理在给定步骤中从其当前状态的子集中选择(5个可能的动作)。
-
最后,奖励函数在终止前给出零奖励,这意味着你允许大量可能的最优策略。本质上,任何终止的策略,无论这一集花了多长时间,都是最优的!如果你想鼓励快速终止的策略,你应该在每个步骤给代理一个小的负面奖励。