们已经学到了很多东西,所以让我们回顾一下到目前为止我们在我的强化学习系列中所涵盖的内容:
使用 MDP 的最后一步是最优策略搜索——我们今天将对此进行介绍。
到本文结束时,您将掌握以下基本知识:
- 如何评价一个动作;
- 如何实施最优策略搜索。
正如您在第三部分中回忆的那样,我们一直在描述和评估一个名叫亚当的年轻人的状态和行为。
现在,我们的代理几乎准备好帮助他做出将导致赚取尽可能多的钱的连续决策。我们开始做吧!
最优策略搜索:智能体如何选择最佳路径
既然我们了解了 MDP,我们就可以把它想象成一个代理工作的环境。为了随着时间的推移最大化奖励,这个代理需要找到一个最优策略。也就是说,它必须确定在每个状态下采取的最佳行动。
⏩最佳策略: 在每个状态下采取的最佳行动,随着时间的推移获得最大回报
为了帮助我们的代理人做到这一点,我们需要做两件事:
- 一种确定 MDP 中状态值的方法。
- 在特定状态下采取的行动的估计值。
1.贝尔曼最优方程
贝尔曼最优方程为我们提供了估计每个状态的最优值的方法,记为V(s)* 。它通过计算状态可以产生的预期回报来估计状态的价值。
这是贝尔曼最优性方程 **(状态值函数):
其中:
- P(s, a, s') 是当代理选择动作 a 时从状态s到状态s' 的转移概率。
- R(s, a, s') 是当代理选择动作 a 时从状态s到状态s' 的直接奖励。
- 𝛾 是折扣率。折扣奖励是用递归的方式写的。
您可能想知道如何将我们在上一篇文章中介绍的折扣奖励转换为递归符号。或许下面的计算过程会给你一个提示。
实际上,您可以先将所有状态值估计初始化为零。然后你用上面公式计算的结果迭代地更新它们。它将证明是收敛的。
2. Q值迭代算法
最佳状态值本身并不能告诉代理在每个状态下采取什么行动。幸运的是——受上述最佳状态值概念的启发——Bellman 为我们提供了一个类似的公式来估计状态-动作对的值,称为Q-Value。
⏩ Q-Value: a在状态 s 采取的行动的估计值 ; 表示为Q(s, a)*
根据 Q 值分数,Q 值明确告诉代理在每个状态下应该选择哪个动作。
以下是计算 Q 值的方法:
其中:
- P(s, a, s') 是当代理选择动作 a 时从状态s到状态s' 的转移概率。
- R(s, a, s') 是当代理选择动作 a 时从状态s到状态s' 的直接奖励。
- 𝛾 是折扣率。折扣奖励是用递归的方式写的。
- max a' Qk(s', a') 是最优动作a' 在状态s' 的值**
注意:此函数假设代理在选择当前状态下的动作后最佳动作。
与 Bellman Optimality EquaEquation 练习一样,您将从将所有 Q 值估计值初始化为零开始。然后你用这个公式计算的结果迭代地更新它们。
最优策略搜索的 MDP 实现
现在让我们将所学付诸行动!我们将使用上图中我们的朋友 Adam 的 MDP 来运行最优策略搜索。
首先,我们将 5 元组 (S、A、P、R、𝛾) 输入到我们的演示中以创建 MDP 环境。
- 我们使用nan来表示我们无法从之前的状态到达的状态。
- 变体动作是A。形状为(s, a) 的动作空间是一个二维数组。
- P表示从状态 s到状态s' 的转移概率,选择动作a。它的形状应该是 (s, a, s') ,一个 3 维数组。
- R表示由于动作a 从状态s转换到s' 后收到的即时奖励 。 它的形状应该是 (s, a, s') ,一个 3 维数组。
将 numpy 导入为 np
nan = np.nan
动作 = [[0, 1, 2], [0, 2], [0]]
P = np.array(
[[[1.0, 0.0, 0.0], [0.2, 0.8, 0.0], [0.5, 0.5, 0.0]],
[[0.8, 0.2, 0.0], [南, 南, 南], [0.0, 0.0, 1.0]],
[[1.0, 0.0, 0.0], [南, 南, 南], [南, 南, 南]],
])
R = np.array([
[[20., 0.0, 0.0], [0.0, 0.0, 0.0], [-10., -10., 0.0]],
[[40., 30., 0.0], [南, 南, 南], [0.0, 0.0, -10.]],
[[70., 0.0, 0.0], [南, 南, 南], [南, 南, 南]],
])
现在我们有了一个 MDP 环境!
让我们使用 Q-Value Iteration Algorithm 来获得Q(s, a),其中包含动作* a在状态s的分数 。
- 我们用 -inf来表示在状态 s 下不能采取的动作 。
- 用零初始化 Q (s, a)
- 对于每次迭代,将 Q 值公式应用于从状态 s 到状态 s' 的 每次转换,采取操作 a 并使用新结果更新 Q (s, a)
Q = np.full((3, 3), -np.inf)
for s, a in enumerate(actions):
Q[s, a] = 0.0
discount_factor = 0.99
iterations = 10
for i in range(iterations):
Q_previous = Q.copy()
for s in range(len(P)):
for a in actions[s]:
sum_v = 0
for s_next in range(len(P)):
sum_v += P[s, a, s_next] * (R[s, a, s_next] +
discount_factor * np.max(Q_previous[s_next]))
Q[s, a] = sum_v
print(Q)
这是我们得到的 Q:
这些行代表状态,而列代表动作,数字代表动作a在状态s的奖励。
Adam期待已久的结果
以下是演示告诉我们的内容:当 Adam 感到疲倦时,最好的行动方案是去睡一觉,然后去健身房锻炼,这样他会更健康,然后以最高效率去工作 。
概括
了解 MDP 是加深您对 RL 知识的必要步骤——现在您已经上路了!您应该知道如何:
- 对马尔可夫决策过程建模。构建环境并设置计算连续决策奖励的方法。
- 折扣奖励。 根据当前和未来奖励的价值评估 RL 中的一个动作。
- 实施最优策略搜索。 使用Bellman Optimality Equation 和Q-Value 迭代算法。