PyTorch强化学习——基于策略迭代的强化学习算法

186 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第23天,点击查看活动详情

基于策略迭代的强化学习算法

基于策略迭代的强化学习算法可以细分为两个部分:策略评估和策略改进。算法从一个随机策略开始,并且在每次迭代中,首先根据 Bellman 期望方程计算出给定策略的策略值;然后,根据 Bellman 最优方程,从所得的策略值中提取改进的策略,算法会迭代评估策略并不断改进策略,直到策略不再改变为止。接下来,我们实现基于策略迭代的强化学习算法,并将其用于解决 FrozenLake 环境。

使用PyTorch实现基于策略迭代的强化学习算法

在本节中,我们使用 PyTorch 实现基于策略迭代的强化学习算法解决 FrozenLake问题。 首先,导入所需库并创建 FrozenLake 环境的实例,并定义折扣因子和收敛阈值:

import torch
import gym
env = gym.make('FrozenLake-v0')

gamma = 0.99
threshold = 0.0001

接下来,定义 policy_evaluation 函数用于计算给定策略的值函数,这与我们在策略评估一节中所执行的操作相似,但是我们需要将 gym 环境作为输入。

在策略评估中,根据 Bellman 期望方程计算给定策略的值函数,直到收敛为止:

V(s):=sT(s,a,s)[R(s,a,s)+γV(s)]V(s):=\sum_{s'}T(s,a,s')[R(s,a,s')+\gamma V(s')]

其中,a=π(s)a =π(s) 是在状态 ss 下根据策略 ππ 采取的动作。

def policy_evaluation(env, policy, gamma, threshold):
    """
    Perform policy evaluation
    env: Gym 环境
    policy: 包含动作及其在每个状态下的执行概率的策略矩阵
    gamma: 折扣因子
    threshold: 当所有状态的值函数都小于阈值使,评估过程终止
    return: 给定策略下所有可能状态的值函数
    """
    n_state = policy.shape[0]
    V = torch.zeros(n_state)
    while True:
        V_temp = torch.zeros(n_state)
        for state in range(n_state):
            action = policy[state].item()
            for trans_prob, new_state, reward, _ in env.env.P[state][action]:
                V_temp[state] += trans_prob * (reward + gamma * V[new_state])
        max_delta = torch.max(torch.abs(V - V_temp))
        V = V_temp.clone()
        if max_delta <= threshold:
            break
return V

在策略改进中,基于 Bellman 最优方程,使用生成的收敛策略值 V(s)V(s) 更新策略:

π(s):=argmaxasT(s,a,s)[R(s,a,s)+γV(s)]\pi(s):=argmax_a\sum_{s'}T(s,a,s')[R(s,a,s')+\gamma V(s')]

接下来,我们实现基于策略的强化学习算法的第二个主要部分,即策略改进。此函数中基于 Bellman 最优方程,从给定的策略值中提取策略:

def policy_improvement(env, V, gamma):
    """
    Obtain an improved policy based on the values
    env: Gym 环境
    V: 策略值
    gamma: 折扣因子
    return: 策略
    """
    n_state = env.observation_space.n
    n_action = env.action_space.n
    policy = torch.zeros(n_state)
    for state in range(n_state):
        v_actions = torch.zeros(n_action)
        for action in range(n_action):
            for trans_prob, new_state, reward, _ in env.env.P[state][action]:
                v_actions[action] += trans_prob * (reward + gamma * V[new_state])
        policy[state] = torch.argmax(v_actions)
    return policy

实现了基于策略迭代的强化学习算法的两个主要部分后,继续实现基于策略迭代的强化学习算法。基于策略迭代的强化学习算法在每次迭代中都结合了策略评估和策略改进。重复执行策略评估和策略改进函数,直到策略收敛为止。收敛时的策略及其值函数就是最优策略和最优值函数。因此,在 policy_iteration 函数中需要执行以下操作:

  • 初始化随机策略
  • 使用策略评估算法计算策略值
  • 根据策略值获得改进的策略
  • 如果新策略与旧策略不同,它将更新策略并继续迭代;否则,终止迭代过程并返回策略值和策略
def policy_iteration(env, gamma, threshold):
    """
    Solve a given environment with policy iteration algorithm
    env: Gym 环境
    gamma: 折扣因子
    threshold: 当所有状态的值函数都小于阈值使,评估过程终止
    return: 给定环境的最优策略值和最优策略
    """
    n_state = env.observation_space.n
    n_action = env.action_space.n
    policy = torch.randint(high=n_action, size=(n_state,)).float()
    while True:
        V = policy_evaluation(env, policy, gamma, threshold)
        policy_improved = policy_improvement(env, V, gamma)
        if torch.equal(policy_improved, policy):
            return V, policy_improved
        policy = policy_improved

使用已定义的环境、折扣系数和收敛阈值调用 policy_iteration 函数:

V_optimal, optimal_policy = policy_iteration(env, gamma, threshold)

最后,打印得到的最佳策略值和最佳策略:

print('Optimal values:\n{}'.format(V_optimal))
print('Optimal policy:\n{}'.format(optimal_policy))

结果如下所示,可以看到,结果与我们使用基于值迭代的强化学习算法得到的结果完全相同:

tensor([0.5404, 0.4966, 0.4681, 0.4541, 0.5569, 0.0000, 0.3572, 0.0000, 0.5905,
        0.6421, 0.6144, 0.0000, 0.0000, 0.7410, 0.8625, 0.0000])
Optimal policy:
tensor([0., 3., 3., 3., 0., 0., 0., 0., 3., 1., 0., 0., 0., 2., 1., 0.])

相关链接

PyTorch强化学习——基于值迭代的强化学习算法