📢本篇文章是博主强化学习(RL)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在👉强化学习专栏: 【强化学习】(45)---《自监督强化学习: 好奇心驱动探索 (CDE)算法》
好奇心驱动探索,Curiosity-driven Exploration (CDE)算法 是一种用于自监督强化学习的算法,旨在通过激发智能体的“好奇心”来引导其探索未知环境。好奇心驱动的探索机制主要基于智能体对环境的预测误差:当智能体遇到无法准确预测的情境时,会将其视为一个具有“新奇性”的事件,从而被激励去探索该区域。CDE适用于稀疏奖励或无奖励的环境,通过自监督的方式增强智能体的探索能力,使其能够自主地发现和学习新的环境结构和行为模式。
CDE的目标是通过设计一种“内在奖励”(intrinsic reward)来补充或替代外在奖励,以帮助智能体在稀疏奖励环境中仍然保持探索动机。
CDE的核心思想是构建一种基于“好奇心”的内在奖励机制。当智能体难以预测某个情境的结果时,其预测误差会增加,这时CDE会生成一个内在奖励,以激励智能体去探索这些“好奇”事件。CDE的主要思路可以分为以下几个要素:
在CDE中,内在奖励的计算方式为:
其中,
是环境真实的下一个状态,
是智能体的预测模型生成的下一状态。预测误差
越大,表明智能体对该情境的理解不足,因此其“好奇心”也更强,从而给予更大的内在奖励。
CDE使用一个预测模型(通常是神经网络)来估计智能体在当前状态
和动作
下的下一个状态
。预测模型的输入是状态-动作对
,输出是对下一个状态的预测
。
该预测模型可以用以下公式表示:
其中,
是预测模型的参数。通过对预测误差进行反向传播,CDE可以更新模型,使其在探索过程中逐步提升预测能力。
CDE的总损失函数包含外在奖励(如果有)和内在奖励。总回报可以表示为:
其中,
是外在奖励,
是内在奖励,
是超参数,用于平衡内在奖励和外在奖励的影响。
在稀疏奖励环境中,
的值大部分时间为0,因此
将成为主要的驱动力。通过最大化包含内在奖励的总回报
,CDE能够引导智能体在没有外部奖励的情况下进行有效的探索。
在与环境交互的过程中,智能体收集状态-动作-下一状态三元组
,并将其用于训练预测模型。通过最小化预测误差,智能体能够提高对环境的建模能力。
在每一步交互中,CDE根据预测模型计算下一状态的预测误差,将其作为内在奖励
。这种内在奖励会被添加到智能体的策略更新中,驱动其进一步探索那些预测误差较大的区域。
使用基于内在奖励和外在奖励的总回报
,CDE通过常规的强化学习方法(如DQN、PPO等)优化智能体的策略。内在奖励的引入使得智能体在探索未见过的状态时更有动力,因而能够在没有明确奖励的情况下探索环境。
以下是一个简化的CDE实现示例,通过一个预测模型和内在奖励机制,展示如何在稀疏奖励环境中实现好奇心驱动的探索。
🔥若是下面代码复现困难或者有问题,欢迎评论区留言;需要以整个项目形式的代码,请在评论区留下您的邮箱📌,以便于及时分享给您(私信难以及时回复)。
"""《 CDE算法的实现示例》
时间:2024.11
作者:不去幼儿园
"""
import torch
import torch.nn as nn
import torch.optim as optim
# 定义预测模型
class PredictiveModel(nn.Module):
def __init__(self, state_dim, action_dim):
super(PredictiveModel, self).__init__()
self.fc1 = nn.Linear(state_dim + action_dim, 64)
self.fc2 = nn.Linear(64, state_dim)
self.relu = nn.ReLU()
def forward(self, state, action):
x = torch.cat([state, action], dim=1)
x = self.relu(self.fc1(x))
next_state_pred = self.fc2(x)
return next_state_pred
# 计算内在奖励
def compute_intrinsic_reward(state, action, next_state, model):
next_state_pred = model(state, action)
intrinsic_reward = torch.mean((next_state_pred - next_state) ** 2).item()
return intrinsic_reward
# 更新预测模型
def update_predictive_model(state, action, next_state, model, optimizer):
next_state_pred = model(state, action)
loss = torch.mean((next_state_pred - next_state) ** 2)
optimizer.zero_grad()
loss.backward()
optimizer.step()
return loss.item()
# 示例用法
state_dim = 16
action_dim = 4
predictive_model = PredictiveModel(state_dim, action_dim)
optimizer = optim.Adam(predictive_model.parameters(), lr=1e-3)
# 假设有批量数据
state = torch.randn(64, state_dim)
action = torch.randn(64, action_dim)
next_state = torch.randn(64, state_dim)
# 计算内在奖励
intrinsic_reward = compute_intrinsic_reward(state, action, next_state, predictive_model)
print(f"Intrinsic Reward: {intrinsic_reward}")
# 更新预测模型
loss = update_predictive_model(state, action, next_state, predictive_model, optimizer)
print(f"Predictive Model Loss: {loss}")
Curiosity-driven Exploration (CDE) 算法在稀疏奖励或无奖励的复杂环境中有广泛的应用。例如,在迷宫探索、机器人导航和游戏AI中,智能体可能不会经常接收到外在奖励。这种情况下,CDE通过内在奖励机制引导智能体自主探索未知区域,从而提高探索效率。
以下是CDE结合深度Q网络(DQN)在迷宫探索任务中的应用流程:
# DQN智能体定义
class DQNAgent:
def __init__(self, state_dim, action_dim, lr=1e-3):
self.q_network = nn.Sequential(
nn.Linear(state_dim, 64),
nn.ReLU(),
nn.Linear(64, action_dim)
)
self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)
def select_action(self, state):
with torch.no_grad():
q_values = self.q_network(state)
action = q_values.argmax().item()
return action
def update(self, states, actions, rewards, next_states, dones):
q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()
with torch.no_grad():
max_next_q_values = self.q_network(next_states).max(1)[0]
target_q_values = rewards + (0.99 * max_next_q_values * (1 - dones))
loss = torch.mean((q_values - target_q_values) ** 2)
self.optimizer.zero_grad()
loss.backward()
self.optimizer.step()
实例训练:
# 训练循环
predictive_model = PredictiveModel(state_dim, action_dim)
dqn_agent = DQNAgent(state_dim=state_dim, action_dim=env.action_space.n)
predictive_optimizer = optim.Adam(predictive_model.parameters(), lr=1e-3)
for episode in range(num_episodes):
state = env.reset()
done = False
episode_reward = 0
while not done:
state_tensor = torch.tensor(state, dtype=torch.float32).unsqueeze(0)
# 选择动作
action = dqn_agent.select_action(state_tensor)
next_state, reward, done, _ = env.step(action)
# 计算内在奖励
next_state_tensor = torch.tensor(next_state, dtype=torch.float32).unsqueeze(0)
intrinsic_reward = compute_intrinsic_reward(state_tensor, torch.tensor([[action]], dtype=torch.float32), next_state_tensor, predictive_model)
# 计算总奖励
total_reward = reward + beta * intrinsic_reward
# 更新DQN智能体
dqn_agent.update(state_tensor, torch.tensor([action]), torch.tensor([total_reward]), next_state_tensor, torch.tensor([done]))
# 更新预测模型
update_predictive_model(state_tensor, torch.tensor([[action]], dtype=torch.float32), next_state_tensor, predictive_model, predictive_optimizer)
state = next_state
episode_reward += reward
print(f"Episode {episode + 1}: Total Reward = {episode_reward}")
通过引入Curiosity-driven Exploration (CDE),智能体可以在稀疏奖励环境中自主探索,保持学习动机。CDE利用内在奖励补充外在奖励,使得强化学习在缺乏明确奖励信号的环境中也能高效地工作。这种基于好奇心的探索机制不仅提升了智能体的学习能力,也使其更具适应性和鲁棒性。
由于博文主要为了介绍相关算法的原理和应用的方法,缺乏对于实际效果的关注,算法可能在上述环境中的效果不佳或者无法运行,一是算法不适配上述环境,二是算法未调参和优化,三是没有呈现完整的代码,四是等等。上述代码用于了解和学习算法足够了,但若是想直接将上面代码应用于实际项目中,还需要进行修改。
Curiosity-driven Exploration (CDE)是一种强化学习中探索未知环境的有效方法,通过内在奖励机制激励智能体去探索预测误差较大的情境。CDE的引入能够帮助智能体在稀疏奖励或无奖励的环境中仍然保持高效的学习和探索能力。然而,CDE的实现需要根据具体任务和环境进行调优,特别是在预测模型的设计和内在奖励的计算上需要仔细考虑。
更多自监督强化学习文章,请前往:【自监督强化学习】专栏
文章若有不当和不正确之处,还望理解与指出。由于部分文字、图片等来源于互联网,无法核实真实出处,如涉及相关争议,请联系博主删除。如有错误、疑问和侵权,欢迎评论留言联系作者