【SSL-RL】自监督强化学习: 好奇心驱动探索 (CDE)算法

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

【强化学习】(45)---《自监督强化学习: 好奇心驱动探索 (CDE)算法》

自监督强化学习: 好奇心驱动探索 (CDE)算法

目录

[1. 引言](#1. 引言)

[2. CDE算法的核心思想](#2. CDE算法的核心思想)

[2.1 内在奖励的设计](#2.1 内在奖励的设计)

[2.2 预测模型](#2.2 预测模型)

[2.3 总损失函数](#2.3 总损失函数)

[3. CDE算法的工作流程](#3. CDE算法的工作流程)

[3.1 数据收集与预测模型训练](#3.1 数据收集与预测模型训练)

[3.2 内在奖励计算](#3.2 内在奖励计算)

[3.3 策略优化](#3.3 策略优化)

[[Python] CDE算法的实现示例](#[Python] CDE算法的实现示例)

[[Experiment] CDE算法的应用实例](#[Experiment] CDE算法的应用实例)

[[Notice] 代码解析](#[Notice] 代码解析)

[4. CDE的优势与挑战](#4. CDE的优势与挑战)

[5. 结论](#5. 结论)


1. 引言

好奇心驱动探索,Curiosity-driven Exploration (CDE)算法 是一种用于自监督强化学习的算法,旨在通过激发智能体的"好奇心"来引导其探索未知环境。好奇心驱动的探索机制主要基于智能体对环境的预测误差:当智能体遇到无法准确预测的情境时,会将其视为一个具有"新奇性"的事件,从而被激励去探索该区域。CDE适用于稀疏奖励或无奖励的环境,通过自监督的方式增强智能体的探索能力,使其能够自主地发现和学习新的环境结构和行为模式。

CDE的目标是通过设计一种"内在奖励"(intrinsic reward)来补充或替代外在奖励,以帮助智能体在稀疏奖励环境中仍然保持探索动机。


2. CDE算法的核心思想

CDE的核心思想是构建一种基于"好奇心"的内在奖励机制。当智能体难以预测某个情境的结果时,其预测误差会增加,这时CDE会生成一个内在奖励,以激励智能体去探索这些"好奇"事件。CDE的主要思路可以分为以下几个要素:

  • 预测误差:CDE通过预测模型来估计智能体在给定状态和动作下的下一个状态。预测误差的大小作为衡量"新奇性"的标准。
  • 内在奖励:CDE将预测误差作为内在奖励,奖励智能体去探索那些带有较大预测误差的情境。
  • 探索与开发的平衡:CDE不仅追求高预测误差的情境,也利用策略学习收敛于具有高回报的行为。

2.1 内在奖励的设计

在CDE中,内在奖励的计算方式为:

其中,是环境真实的下一个状态,是智能体的预测模型生成的下一状态。预测误差 越大,表明智能体对该情境的理解不足,因此其"好奇心"也更强,从而给予更大的内在奖励。

2.2 预测模型

CDE使用一个预测模型(通常是神经网络)来估计智能体在当前状态和动作 下的下一个状态 。预测模型的输入是状态-动作对 ,输出是对下一个状态的预测

该预测模型可以用以下公式表示:

其中,是预测模型的参数。通过对预测误差进行反向传播,CDE可以更新模型,使其在探索过程中逐步提升预测能力。

2.3 总损失函数

CDE的总损失函数包含外在奖励(如果有)和内在奖励。总回报可以表示为:

其中,是外在奖励,是内在奖励, 是超参数,用于平衡内在奖励和外在奖励的影响。

在稀疏奖励环境中,的值大部分时间为0,因此将成为主要的驱动力。通过最大化包含内在奖励的总回报,CDE能够引导智能体在没有外部奖励的情况下进行有效的探索。


3. CDE算法的工作流程

3.1 数据收集与预测模型训练

在与环境交互的过程中,智能体收集状态-动作-下一状态三元组,并将其用于训练预测模型。通过最小化预测误差,智能体能够提高对环境的建模能力。

3.2 内在奖励计算

在每一步交互中,CDE根据预测模型计算下一状态的预测误差,将其作为内在奖励。这种内在奖励会被添加到智能体的策略更新中,驱动其进一步探索那些预测误差较大的区域。

3.3 策略优化

使用基于内在奖励和外在奖励的总回报,CDE通过常规的强化学习方法(如DQN、PPO等)优化智能体的策略。内在奖励的引入使得智能体在探索未见过的状态时更有动力,因而能够在没有明确奖励的情况下探索环境。


[Python] CDE算法的实现示例

以下是一个简化的CDE实现示例,通过一个预测模型和内在奖励机制,展示如何在稀疏奖励环境中实现好奇心驱动的探索。

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

python 复制代码
"""《 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}")

[Experiment] CDE算法的应用实例

Curiosity-driven Exploration (CDE) 算法在稀疏奖励或无奖励的复杂环境中有广泛的应用。例如,在迷宫探索、机器人导航和游戏AI中,智能体可能不会经常接收到外在奖励。这种情况下,CDE通过内在奖励机制引导智能体自主探索未知区域,从而提高探索效率。

应用流程

以下是CDE结合深度Q网络(DQN)在迷宫探索任务中的应用流程:

  1. 环境初始化:创建强化学习环境,例如一个复杂的迷宫,其中智能体只有在到达目标时才会获得外在奖励。
  2. CDE模型初始化:创建预测模型,用于预测智能体在当前状态和动作下的下一状态,并计算内在奖励。
  3. 强化学习模型初始化:例如使用DQN,将CDE生成的内在奖励和外在奖励相结合,用于更新Q值。
  4. 训练循环
    • 内在奖励计算:每次与环境交互后,通过预测模型计算下一状态的预测误差,生成内在奖励。
    • 总奖励计算:结合内在奖励和外在奖励,得到总奖励。
    • 策略更新:使用总奖励,通过Q-learning更新DQN模型。
    • 预测模型更新:根据预测误差优化预测模型,使其更准确地预测智能体的下一状态。
python 复制代码
# 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()

实例训练:

python 复制代码
# 训练循环
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}")

[Notice] 代码解析

  • 预测模型:通过预测模型计算内在奖励,使用状态-动作对作为输入,预测下一个状态,并计算预测误差。
  • 内在奖励计算:内在奖励由预测误差计算得出,并与外在奖励相结合形成总奖励,驱动智能体的探索行为。
  • 策略更新:基于总奖励,DQN智能体更新其Q网络,从而学习到更优的策略。
  • 预测模型更新:在每次迭代中,预测模型通过反向传播更新,使得内在奖励能够更准确地反映新奇性。

通过引入Curiosity-driven Exploration (CDE),智能体可以在稀疏奖励环境中自主探索,保持学习动机。CDE利用内在奖励补充外在奖励,使得强化学习在缺乏明确奖励信号的环境中也能高效地工作。这种基于好奇心的探索机制不仅提升了智能体的学习能力,也使其更具适应性和鲁棒性。

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


4. CDE的优势与挑战

优势

  1. 适用于稀疏奖励环境:CDE通过内在奖励激励智能体去探索具有高预测误差的情境,因此即便外在奖励稀疏或缺失,CDE依然能够驱动智能体进行探索。
  2. 自动发现新奇情境:基于预测误差的内在奖励机制使得智能体可以自动发现环境中的新奇情况,而不需要外部监督。
  3. 提升学习效率:通过引导智能体关注不确定性高的情境,CDE能够在复杂环境中加速智能体的学习过程。

挑战

  1. 预测模型的误差积累:在复杂的动态环境中,预测模型的误差可能积累,导致智能体错误地评估内在奖励,从而影响探索的有效性。
  2. 超参数调优:内在奖励和外在奖励的平衡系数 ( \beta ) 需要根据具体任务进行调优,以确保探索和开发之间的平衡。
  3. 计算资源需求:训练预测模型以及计算内在奖励会增加计算开销,特别是在高维观测环境中。

5. 结论

Curiosity-driven Exploration (CDE)是一种强化学习中探索未知环境的有效方法,通过内在奖励机制激励智能体去探索预测误差较大的情境。CDE的引入能够帮助智能体在稀疏奖励或无奖励的环境中仍然保持高效的学习和探索能力。然而,CDE的实现需要根据具体任务和环境进行调优,特别是在预测模型的设计和内在奖励的计算上需要仔细考虑。

更多自监督强化学习文章,请前往:【自监督强化学习】专栏


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

相关推荐
靴子学长20 分钟前
基于字节大模型的论文翻译(含免费源码)
人工智能·深度学习·nlp
梧桐树04291 小时前
python常用内建模块:collections
python
AI_NEW_COME1 小时前
知识库管理系统可扩展性深度测评
人工智能
Dream_Snowar1 小时前
速通Python 第三节
开发语言·python
海棠AI实验室2 小时前
AI的进阶之路:从机器学习到深度学习的演变(一)
人工智能·深度学习·机器学习
hunteritself2 小时前
AI Weekly『12月16-22日』:OpenAI公布o3,谷歌发布首个推理模型,GitHub Copilot免费版上线!
人工智能·gpt·chatgpt·github·openai·copilot
XH华2 小时前
初识C语言之二维数组(下)
c语言·算法
Data跳动2 小时前
Spark内存都消耗在哪里了?
大数据·分布式·spark
南宫生2 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
不想当程序猿_2 小时前
【蓝桥杯每日一题】求和——前缀和
算法·前缀和·蓝桥杯