📢本篇文章是博主强化学习(RL)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在👉强化学习专栏: 【强化学习】(31)---《Options Framework(选项框架)》
Options Framework(选项框架)是分层强化学习中的一种经典方法,旨在通过将动作抽象化为**选项(Options)**来简化复杂任务的学习过程。基于 Sutton 等人提出的选项框架(Options Framework),其中选项是从一个子任务执行到完成的高层决策链。高层决策什么时候调用特定选项,低层负责具体执行选项的策略。
选项框架允许智能体在多个时间步内选择并执行较高级别的策略,而不仅仅是在每个时间步选择单个动作。通过这种方式,智能体可以更好地解决长时间跨度的任务,并且可以复用已学习的子任务。
上图是文献中所用的环境(和下面代码的环境不同),房间的例子是一个网格世界环境,具有随机的cell到cell的动作和房间到房间的走廊选项。
选项框架的核心思想是将动作抽象为选项,每个选项可以在多个时间步内控制代理的行为。每个选项由以下三个元素定义:
):选项内部的策略,定义了当选项被激活时在每个时间步中执行的具体动作。
):一个概率函数,定义了选项在每个时间步结束时是否终止。
通过这种分层结构,选项可以看作是一个高层次的操作,它包含了在多个时间步内执行的动作序列。这为复杂任务的分解和任务复用提供了可能。
在选项框架中,**选项(Option)**是一个包含了多个步骤的决策单位。具体来说,选项可以通过以下三元组来定义:
其中:
:表示初始条件,定义在哪些状态下可以激活该选项。
:是选项的内部策略,它决定了在执行选项时,代理在每个时间步采取的具体动作。
:终止条件,表示选项在某个状态下结束的概率,即该选项是否会继续执行。
选项框架的工作机制包括选项的选择、执行以及终止:
选择并执行具体的动作,直到该选项被终止。
确定是否在当前状态结束。如果选项结束,代理将返回到元策略,选择下一个选项。如果选项没有结束,代理继续使用选项的内部策略。
在选项框架中,强化学习的策略分为两个层次:
元策略和选项策略通常使用不同的学习算法。例如,元策略可以通过Q-learning学习,而选项策略可以通过Actor-Critic方法来优化。
选项框架中的值函数可以通过拓展标准强化学习的值函数来定义。选项的 Q 值函数表示为:
其中:
是当前状态。
是选择的选项。
是在时间步
执行动作后的即时奖励。
是折扣因子。
选项框架中的Bellman方程为:
其中,
表示选项执行的时间步数,
是选项结束后的状态,
是下一个选项。
选项框架的学习主要包括以下两部分:
分层强化学习的 Options Framework 是一种增强型方法,通过将动作空间划分为“选项”(options),从而在强化学习过程中实现分层控制。下面是一个简单的 Options Framework 实现,应用于经典的 CartPole 环境。
🔥若是下面代码复现困难或者有问题,欢迎评论区留言;需要以整个项目形式的代码,请在评论区留下您的邮箱📌,以便于及时分享给您(私信难以及时回复)。
只进行训练逻辑,无动画显示。
"""《Options Framework实现项目》
时间:2024.10
环境:CartPole
作者:不去幼儿园
"""
import gym
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
import time
# 环境设置
env = gym.make('CartPole-v1')
state_dim = env.observation_space.shape[0]
action_dim = env.action_space.n
# 高层策略网络
class ManagerNet(nn.Module):
def __init__(self, state_dim, option_dim):
super(ManagerNet, self).__init__()
self.fc = nn.Sequential(
nn.Linear(state_dim, 128),
nn.ReLU(),
nn.Linear(128, option_dim)
)
def forward(self, state):
return self.fc(state)
# 选项策略网络
class OptionNet(nn.Module):
def __init__(self, state_dim, action_dim):
super(OptionNet, self).__init__()
self.fc = nn.Sequential(
nn.Linear(state_dim, 128),
nn.ReLU(),
nn.Linear(128, action_dim)
)
def forward(self, state):
return self.fc(state)
# 选项类定义
class Option:
def __init__(self, policy_net, termination_net):
self.policy_net = policy_net
self.termination_net = termination_net
def select_action(self, state):
state = torch.FloatTensor(state).unsqueeze(0)
action_probs = self.policy_net(state)
action = torch.argmax(action_probs).item()
return action
def should_terminate(self, state):
state = torch.FloatTensor(state).unsqueeze(0)
termination_prob = self.termination_net(state)
return termination_prob.item() > 0.5
# 初始化管理器和选项
option_dim = 2 # 两个选项,分别对应左右
options = [Option(OptionNet(state_dim, action_dim), OptionNet(state_dim, 1)) for _ in range(option_dim)]
manager_net = ManagerNet(state_dim, option_dim)
manager_optimizer = optim.Adam(manager_net.parameters(), lr=0.001)
# 训练
def train_options_framework(env, num_episodes=1000):
for episode in range(num_episodes):
state, _ = env.reset()
total_reward = 0
option = np.random.choice(len(options)) # 随机选择一个选项
for t in range(200): # 每个episode最多执行200步
# 选择高层选项
state_tensor = torch.FloatTensor(state).unsqueeze(0)
option_probs = manager_net(state_tensor)
option = torch.argmax(option_probs).item()
# 执行选项的策略
action = options[option].select_action(state)
next_state, reward, done, _, _ = env.step(action)
total_reward += reward
# 检查选项终止条件
if options[option].should_terminate(next_state) or done:
option = np.random.choice(len(options)) # 重新选择选项
state = next_state
if done:
break
print(f'Episode {episode}: Total Reward: {total_reward}')
# 开始训练
print("Starting training...")
train_options_framework(env, num_episodes=100)
通过调用 env.render()
显示动画,并在测试时使用模型进行推理
# 测试函数(带动画显示)
def test_options_framework_with_render(env, num_episodes=5):
for episode in range(num_episodes):
state, _ = env.reset()
total_reward = 0
option = np.random.choice(len(options)) # 随机选择一个选项
for t in range(200): # 每个episode最多执行200步
env.render() # 显示动画
# 选择高层选项
state_tensor = torch.FloatTensor(state).unsqueeze(0)
option_probs = manager_net(state_tensor)
option = torch.argmax(option_probs).item()
# 执行选项的策略
action = options[option].select_action(state)
next_state, reward, done, _, _ = env.step(action)
total_reward += reward
# 检查选项终止条件
if options[option].should_terminate(next_state) or done:
option = np.random.choice(len(options)) # 重新选择选项
state = next_state
if done:
break
print(f'Test Episode {episode}: Total Reward: {total_reward}')
time.sleep(0.01) # 控制动画播放速度
env.close() # 关闭环境
# 测试阶段(显示动画)
print("Starting testing with render...")
env = gym.make('CartPole-v1', render_mode="human")
test_options_framework_with_render(env, num_episodes=5)
select_action
)和终止条件(should_terminate
)。由于博文主要为了介绍相关算法的原理和应用的方法,缺乏对于实际效果的关注,算法可能在上述环境中的效果不佳,一是算法不适配上述环境,二是算法未调参和优化,三是等等。上述代码用于了解和学习算法足够了,但若是想直接将上面代码应用于实际项目中,还需要进行修改。
选项框架广泛应用于需要长时间规划和任务分解的场景,包括:
Options Framework 是由 Richard S. Sutton 等人在以下论文中提出的:
🔥想了解更多分层强化学习的文章,请查看文章: 【RL Latest Tech】分层强化学习(Hierarchical RL)
文章若有不当和不正确之处,还望理解与指出。由于部分文字、图片等来源于互联网,无法核实真实出处,如涉及相关争议,请联系博主删除。如有错误、疑问和侵权,欢迎评论留言联系作者
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有