【Hierarchical RL】Options Framework(选项框架)

举报
不去幼儿园 发表于 2024/12/05 20:41:40 2024/12/05
【摘要】 Options Framework(选项框架)是分层强化学习中的一种经典方法,旨在通过将动作抽象化为**选项(Options)**来简化复杂任务的学习过程。基于Sutton等人提出的选项框架(Options Framework),其中选项是从一个子任务执行到完成的高层决策链。高层决策什么时候调用特定选项,低层负责具体执行选项的策略。 选项框架允许智能体在多个时间步内选择并执行较高级别的策略,而不

      📢本篇文章是博主强化学习(RL)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在👉强化学习专栏:

       【强化学习】(31)---《Options Framework(选项框架)》

Options Framework(选项框架)

目录

1. 选项框架的核心思想

2. 选项的定义

3. 选项框架的工作机制

4. 选项框架中的策略

5. 选项框架的关键公式

6. 选项框架的学习方法

[Python] Options Framework实现

实现步骤:

算法训练阶段

算法测试阶段

[Notice]  代码说明:

7. 选项框架的优点与挑战

8. 选项框架的应用场景


        Options Framework(选项框架)是分层强化学习中的一种经典方法,旨在通过将动作抽象化为**选项(Options)**来简化复杂任务的学习过程。基于 Sutton 等人提出的选项框架(Options Framework),其中选项是从一个子任务执行到完成的高层决策链。高层决策什么时候调用特定选项,低层负责具体执行选项的策略。

        选项框架允许智能体在多个时间步内选择并执行较高级别的策略,而不仅仅是在每个时间步选择单个动作。通过这种方式,智能体可以更好地解决长时间跨度的任务,并且可以复用已学习的子任务。

        上图是文献中所用的环境(和下面代码的环境不同),房间的例子是一个网格世界环境,具有随机的cell到cell的动作和房间到房间的走廊选项。 


1. 选项框架的核心思想

        选项框架的核心思想是将动作抽象为选项,每个选项可以在多个时间步内控制代理的行为。每个选项由以下三个元素定义:

  • 初始条件(Initiation Set, I):选项能够被执行的状态集合,即哪些状态可以启动该选项。
  • 策略(Policy,(\pi_o):选项内部的策略,定义了当选项被激活时在每个时间步中执行的具体动作。
  • 终止条件(Termination Condition, (\beta_o):一个概率函数,定义了选项在每个时间步结束时是否终止。

        通过这种分层结构,选项可以看作是一个高层次的操作,它包含了在多个时间步内执行的动作序列。这为复杂任务的分解和任务复用提供了可能。


2. 选项的定义

        在选项框架中,**选项(Option)**是一个包含了多个步骤的决策单位。具体来说,选项可以通过以下三元组来定义:

[ o = (\mathcal{I}_o, \pi_o, \beta_o) ]

其中:

  • (\mathcal{I}_o):表示初始条件,定义在哪些状态下可以激活该选项。
  • (\pi_o):是选项的内部策略,它决定了在执行选项时,代理在每个时间步采取的具体动作。
  • (\beta_o):终止条件,表示选项在某个状态下结束的概率,即该选项是否会继续执行。

3. 选项框架的工作机制

        选项框架的工作机制包括选项的选择、执行以及终止:

  1. 选项选择:在每个时间步,代理可以选择执行一个选项。选项的选择策略可以基于高层策略(也称为元策略)。
  2. 选项执行:一旦选项被选择,代理将根据该选项的内部策略(\pi_o)选择并执行具体的动作,直到该选项被终止。
  3. 选项终止:选项根据其终止条件(\beta_o)确定是否在当前状态结束。如果选项结束,代理将返回到元策略,选择下一个选项。如果选项没有结束,代理继续使用选项的内部策略。

4. 选项框架中的策略

        在选项框架中,强化学习的策略分为两个层次:

  • 元策略(Meta-Policy):负责在不同的状态下选择合适的选项。元策略的作用是高层次的决策,它将复杂任务分解为一系列的子任务(选项)。
  • 选项策略(Option Policy, (\pi_o)):在选项被激活时,选项策略负责在每个时间步内选择具体的动作,直到选项终止。

        元策略和选项策略通常使用不同的学习算法。例如,元策略可以通过Q-learning学习,而选项策略可以通过Actor-Critic方法来优化。


5. 选项框架的关键公式

        选项框架中的值函数可以通过拓展标准强化学习的值函数来定义。选项的 Q 值函数表示为:

[ Q(s, o) = \mathbb{E}\left[\sum_{t=0}^{\tau} \gamma^t r(s_t, a_t) | s_0 = s, o_0 = o \right] ]

其中:

  • (s)是当前状态。
  • (o)是选择的选项。
  • (r(s_t, a_t))是在时间步(t)执行动作后的即时奖励。
  • (\gamma) 是折扣因子。

        选项框架中的Bellman方程为:

[ Q(s, o) = \mathbb{E}[r(s, o) + \gamma^{\tau} \max_{o'} Q(s', o')] ]

其中,(\tau)表示选项执行的时间步数,(s') 是选项结束后的状态,(o') 是下一个选项。


6. 选项框架的学习方法

选项框架的学习主要包括以下两部分:

  1. 学习元策略:元策略的学习通常通过 Q-learning 或其他强化学习算法来完成,目标是最大化长时间跨度内的累积奖励。元策略学习的是如何选择最优的选项。
  2. 学习选项策略:每个选项的内部策略通过子任务的奖励信号来学习。可以使用 Q-learning、Actor-Critic 或其他强化学习算法来更新每个选项的策略。

[Python] Options Framework实现

        分层强化学习的 Options Framework 是一种增强型方法,通过将动作空间划分为“选项”(options),从而在强化学习过程中实现分层控制。下面是一个简单的 Options Framework 实现,应用于经典的 CartPole 环境。

实现步骤:

  1. 创建选项:我们将定义一组选项(例如:向左、向右等),每个选项包含自己的策略和终止条件。
  2. 管理器:高层策略选择器,用于在当前状态下选择一个选项。
  3. 执行选项:一旦选定选项,就在其策略指导下进行一段时间的控制,直到满足选项的终止条件或达到最大时间步。
  4. 强化学习算法:选项和管理器都可以通过 Q-learning 或 Actor-Critic 等强化学习算法进行训练。

        🔥若是下面代码复现困难或者有问题,欢迎评论区留言;需要以整个项目形式的代码,请在评论区留下您的邮箱📌,以便于及时分享给您(私信难以及时回复)。

算法训练阶段

 只进行训练逻辑,无动画显示。

"""《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)

[Notice]  代码说明:

  1. ManagerNet:高层策略网络,用于在当前状态下选择一个选项。
  2. OptionNet:每个选项的策略网络,用于选择动作。
  3. Option类:定义了选项的策略(select_action)和终止条件(should_terminate)。
  4. 训练逻辑:在每个episode中,管理器会选择一个选项,然后选项控制动作,直到它的终止条件触发或episode结束。

        由于博文主要为了介绍相关算法的原理应用的方法,缺乏对于实际效果的关注,算法可能在上述环境中的效果不佳,一是算法不适配上述环境,二是算法未调参和优化,三是等等。上述代码用于了解和学习算法足够了,但若是想直接将上面代码应用于实际项目中,还需要进行修改。


7. 选项框架的优点与挑战

(1) 优点

  • 处理长时间跨度任务:选项允许代理跨多个时间步执行策略,使其特别适合处理需要长时间规划的任务。
  • 任务分解与复用:选项框架可以将复杂任务分解为可复用的子任务,减少了学习的难度,并提高了任务完成效率。
  • 灵活性:选项框架允许在分层结构中灵活地定义不同时间尺度的子任务,适用于多种任务场景。

(2) 挑战

  • 选项设计:如何设计有效的选项(包括初始条件、策略和终止条件)是一个关键问题。如果选项设计不合理,可能导致低效或无效的学习过程。
  • 选项的自动化发现:在一些复杂任务中,如何自动发现并学习有用的选项仍然是一个具有挑战性的问题。

8. 选项框架的应用场景

选项框架广泛应用于需要长时间规划和任务分解的场景,包括:

  • 机器人控制:例如,机器人导航和机械臂操作可以通过将任务分解为选项来解决复杂的操作问题。
  • 策略游戏:选项框架可以用于分解复杂的游戏策略,例如在棋类游戏或实时策略游戏中分解长期规划。
  • 多步骤规划任务:例如物流、资源分配、路径规划等任务,选项框架可以帮助代理通过分解和复用子任务来实现复杂目标。

 相关文献:

Options Framework 是由 Richard S. Sutton 等人在以下论文中提出的:

Sutton, Richard S., Precup, Doina, and Singh, Satinder. "Between MDPs and semi-MDPs: A framework for temporal abstraction in reinforcement learning." Artificial Intelligence 112.1-2 (1999): 181-211.

 🔥想了解更多分层强化学习的文章,请查看文章:

【RL Latest Tech】分层强化学习(Hierarchical RL)


     文章若有不当和不正确之处,还望理解与指出。由于部分文字、图片等来源于互联网,无法核实真实出处,如涉及相关争议,请联系博主删除。如有错误、疑问和侵权,欢迎评论留言联系作者,或者添加VX:Rainbook_2,联系作者。✨

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。