持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情
前言
在《马尔科夫决策过程》中,我们实现了一个马尔科夫决策过程 (Markov Decision Process
, MDP
),并使用逆矩阵法计算了最优策略的值函数。我们也了解了逆矩阵法在状态数 较大时,求解逆 矩阵的时间开销较大。在本节中,我们将学习一种更为简单的方便,称为策略评估 (policy evaluation
)。
策略评估
策略评估是一种迭代算法。它以任意策略值开始,然后根据 Bellman
期望方程式迭代更新值函数,直到收敛为止。在每次迭代中,状态 的策略值 都会得到更新:
其中, 表示使用策略 在状态 时采取行动 的概率, 是通过采取行动 从状态 转换到状态s'的概率, 是通过采取动作 在状态 中获得的奖励。
有两种方法可以终止迭代更新过程。一种是通过设置固定的迭代次数,例如 1000
或 10000
等,但这种方法可能难以保证一定收敛。另一种方法则通过指定阈值,例如 0.0001
或 0.00001
等,并且仅在所有状态的值函数变化低于指定阈值的时才会终止更新过程。
使用PyTorch实现策略评估
本节中,我们分别使用最佳策略和随机策略对 study-sleep-code
过程进行策略评估。
首先,导入所需库并定义过渡矩阵、奖励函数、折扣因子以及用于确定何时停止评估过程的阈值:
import torch
T = torch.tensor([[[0.8, 0.1, 0.1],
[0.1, 0.6, 0.3]],
[[0.7, 0.2, 0.1],
[0.1, 0.8, 0.1]],
[[0.6, 0.2, 0.2],
[0.1, 0.4, 0.5]]]
)
R = torch.tensor([1.0, 0, -1.0])
gamma = 0.5
threshold = 0.0001
定义最佳策略,即在所有状态下均选择动作 :
policy_optimal = torch.tensor([[1.0, 0.0],
[1.0, 0.0],
[1.0, 0.0]])
定义策略评估函数,该函数接受策略、转移矩阵、奖励函数,折扣因子以及阈值作为参数,计算并返回值函数。在策略评估函数需要执行以下操作:
- 将策略值初始化为全零张量
- 根据
Bellman
期望公式更新值 - 计算所有状态下值函数的最大变化
- 如果最大变化大于阈值,继续更新值函数;否则,终止评估过程并返回值函数
def policy_evaluation(policy, trans_matrix, rewards, gamma, threshold):
"""
Perform policy evaluation
policy: 包含动作及其在每个状态下的执行概率的策略矩阵
trans_matrix: 转换矩阵
rewards: 每个状态的奖励
gamma: 折扣因子
threshold: 当所有状态的值函数都小于阈值使,评估过程终止
return: 给定策略下所有可能状态的值函数
"""
n_state = policy.shape[0]
V = torch.zeros(n_state)
while True:
V_temp = torch.zeros(n_state)
for state, actions in enumerate(policy):
for action, action_prob in enumerate(actions):
V_temp[state] += action_prob * (R[state] + gamma * torch.dot(trans_matrix[state, action], V))
max_delta = torch.max(torch.abs(V - V_temp))
V = V_temp.clone()
if max_delta <= threshold:
break
return V
根据定义的最佳策略以及其他变量执行函数 policy_evaluation
:
V = policy_evaluation(policy_optimal, T, R, gamma, threshold)
# 打印执行结果
print("The value function under the optimal policy is:\n{}".format(V))
打印出的执行结果如下所示,可以看到计算出的值函数结果几乎与我们使用逆矩阵法得到的结果相同:
tensor([ 1.6786, 0.6260, -0.4821])
由于策略评估使用迭代近似,因此其结果可能与使用精确计算的逆矩阵法的结果不完全相同。实际上,我们通常并不需要获取完全精确的值函数。同时,它可以解决维数诅咒问题,能够将计算扩展到具有成千上万个状态的环境中。因此,我们通常更倾向于使用策略评估法。
需要注意的是,策略评估用于预测我们将从给定策略中获得多少奖励,而不是用于智能体的控制问题。
接下来,我们使用随机策略,即以相同的概率选择动作,利用随机策略和其他预定义的变量作为参数执行函数 policy_evaluation
:
policy_random = torch.tensor([[0.5, 0.5],
[0.5, 0.5],
[0.5, 0.5]])
V = policy_evaluation(policy_random, T, R, gamma, threshold)
print("The value function under the random policy is:\n{}".format(V))
运行结果如下所示:
tensor([ 1.2348, 0.2691, -0.9013])