(12-3)Trust Region Policy Optimization (TRPO)算法:TRPO算法的变种与改进

本文介绍了TRPO算法的两种改进变种:TRPO-Clip通过策略梯度剪切简化算法提高效率,而TRPO-Penalty使用惩罚项替代KL散度约束,两者都旨在控制策略更新的幅度以提升算法性能。
摘要由CSDN通过智能技术生成

12.3  TRPO算法的变种与改进

虽然TRPO算法的原始版本在许多问题上表现出色,但是它也有一些计算上的挑战,因此研究人员提出了一些变种和改进,以提高算法的效率和性能。

12.3.1  TRPO-Clip算法

TRPO-Clip(Trust Region Policy Optimization with Clipping)算法是对原始TRPO算法的一种改进和变种。TRPO-Clip的主要改进是通过引入策略梯度剪切(clipping)来简化算法,从而提高了算法的实施效率。下面是TRPO-Clip算法的一些关键特点和步骤:

(1)目标函数:TRPO-Clip的目标是最大化期望累积奖励,即最大化策略执行的预期总奖励。目标函数通常表示为:

J(θ) = E[Σ_t A_t * ∇θ log πθ(a_t|s_t)]

其中,J(θ)是目标函数,θ是策略参数,A_t是优势函数(advantage function),πθ(a_t|s_t)是策略函数,s_t表示状态,a_t表示动作。

(2)策略梯度计算:TRPO-Clip通过计算策略梯度来确定如何更新策略参数以最大化目标函数。策略梯度的计算与原始TRPO类似,但不涉及KL散度约束。具体来说,策略梯度表示为:

∇J(θ) = E[∑_t ∇θ log πθ(a_t|s_t) * A_t]

(3)策略更新:与TRPO不同,TRPO-Clip在策略参数更新时引入了一个剪切操作。这个剪切操作用于限制策略梯度的大小,以确保策略更新的幅度在一个预定的阈值内。具体来说,策略梯度被剪切为不超过一个阈值的范围,这有助于防止策略更新变得过于剧烈。

(4)重要性采样:与TRPO一样,TRPO-Clip通常使用重要性采样来估计期望值,以进行策略梯度的更新。

总的来说,TRPO-Clip算法是一种简化的TRPO变种,通过剪切策略梯度的方式来确保策略更新的幅度受到控制,从而提高了算法的实施效率。尽管TRPO-Clip可能会在某些问题上牺牲一些性能,但它在大规模问题上表现出色,因为它更容易实施和调整。这使得它成为深度强化学习中的一种常用算法之一。

请看下面的例子,演示了TRPO-Clip算法的用法,这个例子涵盖了TRPO-Clip算法的核心的信赖区域和剪切机制等知识点。

实例12-3:实现TRPO-Clip算法(源码路径:daima\12\trcl.py

实例文件trcl.py的具体实现代码如下所示:

import numpy as np
import scipy.optimize

# 定义虚拟环境(一个简化的连续动作空间问题)
class CustomEnv:
    def __init__(self):
        self.state_dim = 2
        self.action_dim = 1
        self.position = np.array([0.0, 0.0])

    def reset(self):
        self.position = np.array([0.0, 0.0])
        return self.position

    def step(self, action):
        self.position += action
        reward = -np.sum(self.position ** 2)
        return self.position, reward

# 初始化虚拟环境
env = CustomEnv()
state_dim = env.state_dim
action_dim = env.action_dim

# 初始化策略参数
theta = np.random.randn(state_dim, action_dim)

# 定义策略函数
def policy(state, theta):
    return np.dot(state, theta)

# TRPO-Clip算法的核心函数
def trpo_clip(env, theta, max_kl=0.01, max_iterations=100):
    for iteration in range(max_iterations):
        states = []
        actions = []
        rewards = []

        # 数据收集
        state = env.reset()
        for _ in range(100):
            action = policy(state, theta)
            next_state, reward = env.step(action)
            states.append(state)
            actions.append(action)
            rewards.append(reward)
            state = next_state

        # 计算优势估计和目标函数
        advantages = np.array(rewards) - np.mean(rewards)
        target_function = np.mean(rewards)

        # 计算策略梯度
        policy_grad = np.mean([state * a for state, a in zip(states, advantages)], axis=0)

        # 执行TRPO-Clip的策略更新(剪切机制)
        epsilon = 1e-8  # 或者其他适当的小值
        step = 1.0
        while step > 1e-5:
            new_theta = theta + step * policy_grad
            kl_divergence = np.mean([policy(s, new_theta) * (np.log(policy(s, new_theta) + epsilon) - np.log(policy(s, theta) + epsilon)) for s in states])
            if kl_divergence <= max_kl:
                theta = new_theta
                break
            step *= 0.5

        print(f"Iteration {iteration}: Target Function = {target_function}")

    # 输出最终学到的策略参数
    print("Final Policy Parameters:")
    print(theta)

# 运行TRPO-Clip算法
trpo_clip(env, theta)

在上述代码中,TRPO-Clip算法的关键部分是在策略更新步骤中引入了剪切(clipping)机制,以确保KL散度(KL Divergence)不会超过预定的阈值 max_kl。剪切机制通过逐步调整策略参数来实现,以确保KL散度的限制条件满足。

12.3.2  TRPO-Penalty算法

TRPO-Penalty(Trust Region Policy Optimization with Penalty)算法是对TRPO算法的一种改进和变种。TRPO-Penalty的主要改进是使用一种惩罚项来替代KL散度约束,以确保策略更新的幅度在一定范围内。这个惩罚项可以看作是对KL散度的一种近似。TRPO-Penalty算法的关键特点和步骤如下:

(1)目标函数:TRPO-Penalty的目标与TRPO相似,其目标是最大化期望累积奖励。目标函数通常表示为:

J(θ) = E[Σ_t A_t * ∇θ log πθ(a_t|s_t)]

其中,J(θ)是目标函数,θ是策略参数,A_t是优势函数(advantage function),πθ(a_t|s_t)是策略函数,s_t表示状态,a_t表示动作。

(2)策略梯度计算:TRPO-Penalty通过计算策略梯度来确定如何更新策略参数以最大化目标函数。策略梯度的计算与原始TRPO类似,但不涉及KL散度约束。策略梯度表示为:

∇J(θ) = E[∑_t ∇θ log πθ(a_t|s_t) * A_t]

(3)惩罚项:TRPO-Penalty引入了一个惩罚项,以替代KL散度约束。这个惩罚项通常表示为:

Penalty = β * KL(π_old || π_new)

其中,Penalty是惩罚项,β是一个控制惩罚强度的参数,π_old表示旧策略,π_new表示新策略。这个惩罚项的目的是限制策略更新的幅度,确保在一定范围内。

(4)约束优化问题:TRPO-Penalty的最终目标是解决一个带有惩罚项的优化问题,其中目标是最大化目标函数J(θ),同时限制惩罚项在一个可接受的范围内。这个问题可以表示为:

Maximize J(θ) - β * KL(π_old || π_new) subject to KL(π_old || π_new) ≤ δ

其中,δ是一个预定的KL散度阈值。

TRPO-Penalty通过调整β的值来平衡目标函数的最大化和KL散度的控制,从而影响策略更新的幅度。

总的来说,TRPO-Penalty算法是一种使用惩罚项来替代KL散度约束的TRPO变种,以确保策略更新的幅度受到控制,并同时最大化期望累积奖励。这个惩罚项的引入使得算法更容易实施,并且在一些问题上具有更好的性能和可扩展性。

请看下面的例子,演示了TRPO-Penalty算法的用法,这个例子涵盖了TRPO-Penalty算法的核心的信赖区域和罚项机制等知识点。

实例12-4:实现TRPO-Penalty算法(源码路径:daima\12\pen.py

实例文件pen.py的具体实现代码如下所示:

import numpy as np
import scipy.optimize

# 定义虚拟环境(一个简化的连续动作空间问题)
class CustomEnv:
    def __init__(self):
        self.state_dim = 2
        self.action_dim = 1
        self.position = np.array([0.0, 0.0])

    def reset(self):
        self.position = np.array([0.0, 0.0])
        return self.position

    def step(self, action):
        self.position += action
        reward = -np.sum(self.position ** 2)
        return self.position, reward

# 初始化虚拟环境
env = CustomEnv()
state_dim = env.state_dim
action_dim = env.action_dim

# 初始化策略参数
theta = np.random.randn(state_dim, action_dim)

# 定义策略函数
def policy(state, theta):
    return np.dot(state, theta)

# TRPO-Penalty算法的核心函数
def trpo_penalty(env, theta, penalty_coeff=0.1, max_iterations=100):
    for iteration in range(max_iterations):
        states = []
        actions = []
        rewards = []

        # 数据收集
        state = env.reset()
        for _ in range(100):
            action = policy(state, theta)
            next_state, reward = env.step(action)
            states.append(state)
            actions.append(action)
            rewards.append(reward)
            state = next_state

        # 计算优势估计和目标函数
        advantages = np.array(rewards) - np.mean(rewards)
        target_function = np.mean(rewards)

        # 计算策略梯度
        policy_grad = np.mean([state * a for state, a in zip(states, advantages)], axis=0)

        # 执行TRPO-Penalty的策略更新(罚项机制)
        new_theta = theta + policy_grad
        update_norm = np.linalg.norm(new_theta - theta)
        if update_norm <= penalty_coeff:
            theta = new_theta
        else:
            theta = theta + (penalty_coeff / update_norm) * (new_theta - theta)

        print(f"Iteration {iteration}: Target Function = {target_function}")

    # 输出最终学到的策略参数
    print("Final Policy Parameters:")
    print(theta)

#运行TRPO-Penalty算法
trpo_penalty(env, theta)

在上述代码中,TRPO-Penalty算法的关键部分是引入了罚项(penalty),以控制策略更新的幅度。如果策略更新的幅度小于等于penalty_coeff,则直接更新策略参数;否则,通过添加罚项来限制更新幅度,以确保其不会过大。

未完待续

  • 16
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农三叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值