📢本篇文章是博主强化学习(RL)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在👉强化学习专栏: 【强化学习】(32)---《动态分层强化学习(DHRL)算法》
动态分层强化学习,Dynamic Hierarchical Reinforcement Learning (DHRL) 是一种自适应分层强化学习算法,其目标是根据任务和环境的复杂性动态地构建、修改和利用分层策略。DHRL 不仅仅是预定义层次结构的简单执行,而是允许代理在学习过程中根据需要动态生成和调整分层策略,从而实现更好的任务分解和高效学习。
DHRL 扩展了传统的分层强化学习(HRL),通过动态调整层次和策略,使其适应环境中的变化和不确定性。这种方法能够处理复杂任务,特别是那些需要灵活调整策略或面临多种不同子任务的情景。
上图展示了DHRL与以前基于图的HRL方法的区别。DHRL算法显式地包含了两层之间的图结构,而之前的方法只使用图来训练高级策略或获取路径点。
DHRL 的核心思想是通过动态生成和调整层次结构来处理不同的任务和状态。与传统的 HRL 不同,DHRL 并不预定义固定的层次结构,而是通过不断地优化和调整策略来实现任务的分解和动态层次生成。这使得算法更具灵活性,能够适应变化的环境。
DHRL 的分层架构与传统的 HRL 类似,但更注重动态生成和调整。DHRL 通常有两层或多层结构:
DHRL 的动态调整机制基于以下几个核心组件:
DHRL 的策略优化涉及到高层和低层的策略更新,这与标准的 Q-learning 相似,但引入了动态生成与终止条件的扩展。
高层策略
选择子任务
或直接选择底层动作。其值函数更新为:
其中:
是当前状态。
是高层选择的子任务。
是子任务执行过程中的奖励。
低层策略
负责在每个时间步内选择具体动作。当低层策略执行子任务时,Q 值更新为:
其中:
是低层执行的具体动作。
是动作执行的时间步数。
DHRL 的学习过程结合了分层强化学习的多层策略,同时动态调整和生成策略。学习过程如下:
DHRL 是一种在层次结构上进行学习的强化学习方法。它通过动态地构建和调整层级结构,从而高效地解决复杂任务。与固定的分层架构不同,DHRL 可以在训练过程中动态构建子任务和策略,适应环境的变化。
在经典的 CartPole 环境中,我们可以设计一个简单的 DHRL 算法,将问题划分为多个子任务,并在每个子任务中使用强化学习算法来求解。每个子任务会有不同的策略,父层控制何时切换子任务,动态分配任务层次。
🔥若是下面代码复现困难或者有问题,欢迎评论区留言;需要以整个项目形式的代码,请在评论区留下您的邮箱📌,以便于及时分享给您(私信难以及时回复)。
"""《DHRL算法实现》
时间:2024.10
环境:CartPole
作者:不去幼儿园
"""
import gym
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
import random
# 高层控制器网络
class ControllerNet(nn.Module):
def __init__(self, state_dim, num_subtasks):
super(ControllerNet, self).__init__()
self.fc = nn.Sequential(
nn.Linear(state_dim, 128),
nn.ReLU(),
nn.Linear(128, num_subtasks)
)
def forward(self, state):
return self.fc(state)
# 子任务策略网络
class SubtaskPolicyNet(nn.Module):
def __init__(self, state_dim, action_dim):
super(SubtaskPolicyNet, 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 Subtask:
def __init__(self, policy_net):
self.policy_net = policy_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
# 动态分层强化学习智能体
class DHRLAgent:
def __init__(self, state_dim, action_dim, num_subtasks):
self.controller = ControllerNet(state_dim, num_subtasks)
self.subtasks = [Subtask(SubtaskPolicyNet(state_dim, action_dim)) for _ in range(num_subtasks)]
self.controller_optimizer = optim.Adam(self.controller.parameters(), lr=0.001)
self.subtask_optimizers = [optim.Adam(subtask.policy_net.parameters(), lr=0.001) for subtask in self.subtasks]
self.gamma = 0.99
def select_subtask(self, state):
state_tensor = torch.FloatTensor(state).unsqueeze(0)
subtask_probs = self.controller(state_tensor)
selected_subtask = torch.argmax(subtask_probs).item()
return selected_subtask
def train_subtask(self, subtask_idx, state, action, reward, next_state, done):
optimizer = self.subtask_optimizers[subtask_idx]
subtask = self.subtasks[subtask_idx]
state_tensor = torch.FloatTensor(state).unsqueeze(0)
next_state_tensor = torch.FloatTensor(next_state).unsqueeze(0)
# 计算当前 Q 值
q_values = subtask.policy_net(state_tensor)
next_q_values = subtask.policy_net(next_state_tensor)
target_q_value = reward + (1 - done) * self.gamma * torch.max(next_q_values).item()
loss = nn.functional.mse_loss(q_values[0, action], torch.tensor(target_q_value))
optimizer.zero_grad()
loss.backward()
optimizer.step()
def train_controller(self, state, subtask_idx, reward, next_state, done):
state_tensor = torch.FloatTensor(state).unsqueeze(0)
next_state_tensor = torch.FloatTensor(next_state).unsqueeze(0)
# 计算高层控制器 Q 值
controller_q_values = self.controller(state_tensor)
next_controller_q_values = self.controller(next_state_tensor)
target_q_value = reward + (1 - done) * self.gamma * torch.max(next_controller_q_values).item()
loss = nn.functional.mse_loss(controller_q_values[0, subtask_idx], torch.tensor(target_q_value))
self.controller_optimizer.zero_grad()
loss.backward()
self.controller_optimizer.step()
# 训练函数
def train_dhrl(env, agent, num_episodes=1000):
for episode in range(num_episodes):
state, _ = env.reset()
total_reward = 0
for t in range(200): # 每个 episode 最多 200 步
subtask_idx = agent.select_subtask(state) # 选择当前子任务
action = agent.subtasks[subtask_idx].select_action(state) # 选择动作
next_state, reward, done, _, _ = env.step(action)
total_reward += reward
# 训练子任务
agent.train_subtask(subtask_idx, state, action, reward, next_state, done)
# 训练高层控制器
agent.train_controller(state, subtask_idx, reward, next_state, done)
state = next_state
if done:
break
print(f'Episode {episode}: Total Reward: {total_reward}')
# 环境设置
env = gym.make('CartPole-v1')
state_dim = env.observation_space.shape[0]
action_dim = env.action_space.n
# 实例化 DHRL 智能体并训练
num_subtasks = 2 # 两个子任务,左右移动
agent = DHRLAgent(state_dim, action_dim, num_subtasks)
# 训练智能体
train_dhrl(env, agent, num_episodes=1000)
# 测试函数
def test_dhrl(env, agent, num_episodes=5):
for episode in range(num_episodes):
state, _ = env.reset()
total_reward = 0
for t in range(200):
env.render() # 显示动画
subtask_idx = agent.select_subtask(state)
action = agent.subtasks[subtask_idx].select_action(state)
next_state, reward, done, _, _ = env.step(action)
total_reward += reward
state = next_state
if done:
break
print(f'Test Episode {episode}: Total Reward: {total_reward}')
env.close()
# 测试代理并显示动画
env = gym.make('CartPole-v1', render_mode="human")
test_dhrl(env, agent, num_episodes=5)
select_action
方法选择动作。train_dhrl
中进行训练,并调整管理器和子任务的策略。test_dhrl
中显示动画,观察 DHRL 代理在 CartPole 环境中的表现。由于博文主要为了介绍相关算法的原理和应用的方法,缺乏对于实际效果的关注,算法可能在上述环境中的效果不佳,一是算法不适配上述环境,二是算法未调参和优化,三是等等。上述代码用于了解和学习算法足够了,但若是想直接将上面代码应用于实际项目中,还需要进行修改。
DHRL 适用于复杂环境中的长时间规划任务,特别是需要灵活应对环境变化和多任务复用的场景:
参考文献:
DHRL: A Graph-Based Approach for Long-Horizon and Sparse Hierarchical Reinforcement Learning
🔥想了解更多分层强化学习的文章,请查看文章: 【RL Latest Tech】分层强化学习(Hierarchical RL)
文章若有不当和不正确之处,还望理解与指出。由于部分文字、图片等来源于互联网,无法核实真实出处,如涉及相关争议,请联系博主删除。如有错误、疑问和侵权,欢迎评论留言联系作者