通过强化学习选择离原点最近的点
Choose closest point to origin with reinforcement learning
我正在尝试使用强化学习从一组给定的点中反复选择离原点最近的点,直到达到复杂(且不相关)的结束条件。 (这是我的主要问题的简化。)
一个包含可能点的二维数组被传递给强化学习算法,它会选择它认为最理想的点。
A [1, 10]
B [100, 0]
C [30, 30]
D [5, 7]
E [20, 50]
在这种情况下,D
将是真正的最佳选择。 (算法应该理想地输出 3
,从 0
到 4
的范围。)
但是,每当我训练算法时,它似乎都不会学习 "concept" 是什么,而只是选择 C
通常 [=34] =] 最好的选择,所以它应该总是选择那个。
import numpy as np
import rl.core as krl
class 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 种可能的状态!您的状态 space 需要小得多。如所写,observe
似乎正在生成可能的操作,而不是状态观察。
您建议您从 [0,4] 中选择动作,其中每个动作本质上都是代理可用点数组的索引。这个动作的定义 space 没有给代理足够的信息来区分你说的你想要的东西(较小的量级点更好),因为你只根据点的索引来行动!如果您想稍微调整公式以使其工作,您可以定义一个动作来选择一个二维点,每个维度都在 [0,99] 中。这意味着您总共有 100^2 种可能的操作,但为了保持多项选择方面,您将限制代理根据其当前状态在给定步骤(5 种可能的操作)中选择一个子集。
最后,在终止之前给出零奖励的奖励函数意味着您允许大量可能的最优策略。本质上,任何终止的策略,无论情节花费了多长时间,都是最优的!如果你想鼓励快速终止的政策,你应该在每一步用一个小的负奖励来惩罚代理人。
我正在尝试使用强化学习从一组给定的点中反复选择离原点最近的点,直到达到复杂(且不相关)的结束条件。 (这是我的主要问题的简化。)
一个包含可能点的二维数组被传递给强化学习算法,它会选择它认为最理想的点。
A [1, 10]
B [100, 0]
C [30, 30]
D [5, 7]
E [20, 50]
在这种情况下,D
将是真正的最佳选择。 (算法应该理想地输出 3
,从 0
到 4
的范围。)
但是,每当我训练算法时,它似乎都不会学习 "concept" 是什么,而只是选择 C
通常 [=34] =] 最好的选择,所以它应该总是选择那个。
import numpy as np
import rl.core as krl
class 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 种可能的状态!您的状态 space 需要小得多。如所写,
observe
似乎正在生成可能的操作,而不是状态观察。您建议您从 [0,4] 中选择动作,其中每个动作本质上都是代理可用点数组的索引。这个动作的定义 space 没有给代理足够的信息来区分你说的你想要的东西(较小的量级点更好),因为你只根据点的索引来行动!如果您想稍微调整公式以使其工作,您可以定义一个动作来选择一个二维点,每个维度都在 [0,99] 中。这意味着您总共有 100^2 种可能的操作,但为了保持多项选择方面,您将限制代理根据其当前状态在给定步骤(5 种可能的操作)中选择一个子集。
最后,在终止之前给出零奖励的奖励函数意味着您允许大量可能的最优策略。本质上,任何终止的策略,无论情节花费了多长时间,都是最优的!如果你想鼓励快速终止的政策,你应该在每一步用一个小的负奖励来惩罚代理人。