当前位置: 首页 > article >正文

【SSL-RL】增强Curiosity-driven Exploration (CDE)算法的探索能力

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

       【强化学习】(46)---《增强Curiosity-driven Exploration (CDE)算法的探索能力》

增强Curiosity-driven Exploration (CDE)算法的探索能力

目录

1. 引入基于信息增益的探索机制

2. 使用随机网络预测器 (Random Network Distillation, RND)

3. 组合基于对比学习的内在奖励

4. 引入奖励动态平衡机制

5. 使用不确定性估计提升探索

[Python] 改进方法的实现示例

1. 信息增益的实现

2. 随机网络预测器 (Random Network Distillation, RND)

3. 对比学习的实现

4. 不确定性估计的实现(使用Dropout)

5. 奖励动态平衡机制的实现

6.整合改进后的CDE训练流程

[Notice]  注意事项

7.CDE改进后的实际应用实例

1. 迷宫探索任务中的应用

2. 开放世界探索中的应用(例如游戏AI)

3. 自主驾驶仿真环境中的应用

4. 机器人手臂控制任务中的应用

8.结论


        为了进一步提升Curiosity-driven Exploration (CDE)算法在强化学习任务中的性能,可以考虑通过以下几个方面的改进来优化智能体的探索行为和效率:

1. 引入基于信息增益的探索机制

        预测误差作为内在奖励的设计可能会导致预测误差在已知环境中迅速降低,从而降低探索动力。为此,可以引入信息增益的概念来动态调整内在奖励。信息增益是指智能体对环境中不同区域的探索收益,即智能体在某一区域探索后,对该区域的预测准确性提升的程度。这样一来,信息增益高的区域会被认为具有更高的探索价值,智能体会优先探索这些区域。

        实现方法:可以在每次状态-动作对上计算预测模型在该区域的学习增益,即预测模型的误差下降程度,并将其作为内在奖励的一部分。


2. 使用随机网络预测器 (Random Network Distillation, RND)

        随机网络预测器(RND)是一种增强探索的方法,其中预测器网络( f_\theta )用于预测目标网络( f_{\text{target}} ) 的输出。目标网络的权重是随机固定的,因此预测器只能通过探索来学习更准确地预测目标网络的输出。在CDE中,可以将RND生成的预测误差作为内在奖励的补充,进一步激发智能体的探索行为。

        实现方法:创建一个随机固定的目标网络( f_{\text{target}} )和一个可训练的预测器网络( f_\theta ),预测器的任务是尽量逼近目标网络的输出。每次预测误差的大小可以作为内在奖励激励智能体。


3. 组合基于对比学习的内在奖励

        对比学习是一种自监督学习方法,通过学习不同状态之间的差异,可以增强潜在表示的分辨能力。在CDE中引入对比学习,可以帮助智能体区分新奇和已知的状态。例如,智能体可以学习到当前状态与过去状态的相似性,从而避免在已知区域反复探索。

        实现方法:将不同状态的潜在表示投射到一个低维空间,定义一个对比损失,使得同一类的状态(即相似状态)聚集,不同类的状态(即新奇状态)尽可能分开。此对比损失可以作为内在奖励的补充,用于引导智能体探索更多未知区域。


4. 引入奖励动态平衡机制

        内在奖励和外在奖励的平衡对探索和开发的效果至关重要。在实际任务中,可以动态调整内在奖励和外在奖励的权重,以适应不同阶段的探索需求。例如,智能体可以在早期探索阶段赋予内在奖励更高的权重,而在后期开发阶段逐渐提升外在奖励的权重,使得智能体逐步收敛于高回报行为。

        实现方法:设置一个动态平衡系数 ( \beta(t) ),根据智能体的训练进度(如步数或回合数)逐渐调整( \beta )的值,使得内在奖励和外在奖励的比重可以随时间变化。


5. 使用不确定性估计提升探索

        不确定性估计是一种用于强化学习探索的有效手段。在CDE中引入不确定性估计,可以让智能体探索那些高不确定性的状态。方法之一是引入贝叶斯神经网络或蒙特卡洛Dropout方法来估计预测模型在特定状态上的不确定性。智能体会优先探索那些预测不确定性高的区域,从而提高探索效率。

        实现方法:在预测模型中加入Dropout层,并在推理时保持Dropout激活,通过多次预测的方差来估计预测的不确定性。将不确定性较高的状态作为内在奖励的附加因素,可以有效驱动智能体探索未见过的状态。


[Python] 改进方法的实现示例

        以下是针对Curiosity-driven Exploration (CDE)算法的一些高级改进方法的实现示例,包括基于信息增益、随机网络预测器(RND)、对比学习、不确定性估计和奖励动态平衡机制的代码实现。

1. 信息增益的实现

        信息增益通过衡量预测模型在每次探索后误差下降的程度来定义。我们可以在训练预测模型后计算误差的变化,将其作为内在奖励的一部分。

# 计算信息增益作为内在奖励
def compute_information_gain(state, action, next_state, predictive_model, optimizer):
    # 训练前计算预测误差
    with torch.no_grad():
        initial_pred = predictive_model(state, action)
        initial_error = torch.mean((initial_pred - next_state) ** 2).item()
    
    # 更新预测模型
    update_predictive_model(state, action, next_state, predictive_model, optimizer)
    
    # 训练后计算预测误差
    with torch.no_grad():
        updated_pred = predictive_model(state, action)
        updated_error = torch.mean((updated_pred - next_state) ** 2).item()
    
    # 信息增益为误差的减少量
    information_gain = initial_error - updated_error
    return max(information_gain, 0)  # 保证信息增益为非负

2. 随机网络预测器 (Random Network Distillation, RND)

        RND使用固定的目标网络与可训练的预测器网络,通过预测误差提供内在奖励。目标网络权重随机初始化且不更新,预测器网络则通过学习逼近目标网络的输出。

# 定义目标网络和预测器网络
class RandomNetwork(nn.Module):
    def __init__(self, state_dim, output_dim=64):
        super(RandomNetwork, self).__init__()
        self.fc = nn.Linear(state_dim, output_dim)
        
    def forward(self, state):
        return self.fc(state)

# 预测器网络
class PredictorNetwork(nn.Module):
    def __init__(self, state_dim, output_dim=64):
        super(PredictorNetwork, self).__init__()
        self.fc = nn.Linear(state_dim, output_dim)
        
    def forward(self, state):
        return self.fc(state)

# 计算RND内在奖励
def compute_rnd_intrinsic_reward(state, target_net, predictor_net):
    target_output = target_net(state).detach()  # 固定目标网络的输出
    predictor_output = predictor_net(state)
    intrinsic_reward = torch.mean((target_output - predictor_output) ** 2).item()
    return intrinsic_reward

3. 对比学习的实现

        对比学习通过拉近相似状态表示、推开不同状态表示来区分新奇状态和已知状态。以下代码展示了如何计算对比损失,并将其作为内在奖励的一部分。

import torch.nn.functional as F

# 对比学习的内在奖励
def compute_contrastive_intrinsic_reward(anchor_state, positive_state, negative_state, encoder):
    anchor_embedding = encoder(anchor_state)
    positive_embedding = encoder(positive_state)
    negative_embedding = encoder(negative_state)

    positive_similarity = F.cosine_similarity(anchor_embedding, positive_embedding)
    negative_similarity = F.cosine_similarity(anchor_embedding, negative_embedding)

    # 对比损失:使相似状态的相似性高,使不同状态的相似性低
    contrastive_loss = torch.relu(negative_similarity - positive_similarity + 1).mean()
    return contrastive_loss.item()

4. 不确定性估计的实现(使用Dropout)

        不确定性估计可以通过在预测模型中加入Dropout层,并在推理阶段保持Dropout激活,以得到多个预测结果的方差,方差越高表示不确定性越大。

# 定义带有Dropout层的预测模型
class PredictiveModelWithDropout(nn.Module):
    def __init__(self, state_dim, action_dim):
        super(PredictiveModelWithDropout, self).__init__()
        self.fc1 = nn.Linear(state_dim + action_dim, 64)
        self.dropout = nn.Dropout(p=0.2)
        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))
        x = self.dropout(x)
        next_state_pred = self.fc2(x)
        return next_state_pred

# 计算不确定性作为内在奖励
def compute_uncertainty_intrinsic_reward(state, action, model, num_samples=10):
    preds = [model(state, action) for _ in range(num_samples)]
    preds_stack = torch.stack(preds)
    uncertainty = preds_stack.var(dim=0).mean().item()  # 方差作为不确定性
    return uncertainty

5. 奖励动态平衡机制的实现

        根据训练进度动态调整内在奖励和外在奖励的比重,使得智能体在探索和开发之间取得平衡。

# 动态调整内在奖励权重
def compute_total_reward(extrinsic_reward, intrinsic_reward, step, max_steps):
    beta = 1.0 - step / max_steps  # 随着时间推移,减少内在奖励的权重
    total_reward = extrinsic_reward + beta * intrinsic_reward
    return total_reward

6.整合改进后的CDE训练流程

        在强化学习的训练循环中,可以将这些改进后的内在奖励计算整合到CDE算法中。

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, extrinsic_reward, done, _ = env.step(action)
        next_state_tensor = torch.tensor(next_state, dtype=torch.float32).unsqueeze(0)

        # 使用改进后的内在奖励计算方法
        intrinsic_reward_rnd = compute_rnd_intrinsic_reward(state_tensor, target_network, predictor_network)
        intrinsic_reward_info_gain = compute_information_gain(state_tensor, torch.tensor([[action]]), next_state_tensor, predictive_model, predictive_optimizer)
        intrinsic_reward_uncertainty = compute_uncertainty_intrinsic_reward(state_tensor, torch.tensor([[action]]), predictive_model_with_dropout)

        # 组合不同内在奖励的总和
        intrinsic_reward = intrinsic_reward_rnd + intrinsic_reward_info_gain + intrinsic_reward_uncertainty
        
        # 动态平衡内在和外在奖励
        total_reward = compute_total_reward(extrinsic_reward, intrinsic_reward, step=episode, max_steps=num_episodes)

        # 使用总奖励更新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]]), next_state_tensor, predictive_model, predictive_optimizer)

        state = next_state
        episode_reward += extrinsic_reward

    print(f"Episode {episode + 1}: Total Reward = {episode_reward}")

        通过以上改进,CDE可以在强化学习任务中获得更强的探索能力,使智能体更加高效地发现环境的结构特征。这些改进方法通过信息增益、RND、对比学习、不确定性估计和奖励动态平衡等机制,进一步提升了CDE在稀疏奖励或无奖励环境中的探索性能。


[Notice]  注意事项

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


7.CDE改进后的实际应用实例

        以下是Curiosity-driven Exploration (CDE)算法的改进版本在不同类型的强化学习任务中的应用实例。我们将探讨这些改进如何在稀疏奖励、复杂环境结构和连续控制任务中提升探索效果。

1. 迷宫探索任务中的应用

任务概述:智能体需要在一个复杂的迷宫中找到出口,但只有在找到出口时才会获得奖励。这种稀疏奖励环境对探索策略提出了较高的要求。

改进应用

  • 信息增益:使用信息增益机制,智能体能够在迷宫探索过程中衡量哪些区域是新奇的,并优先探索这些区域。智能体在学习到迷宫的结构之后,逐渐降低对已知路径的关注。
  • RND内在奖励:RND会在初始阶段产生较高的预测误差,从而激励智能体探索整个迷宫。随着预测器网络逐步适应目标网络,智能体开始集中于仍未完全探索的区域。

效果:改进后的CDE智能体能够更快地找到迷宫的出口,减少不必要的反复探索,使得其在稀疏奖励环境中更有效率。信息增益和RND共同作用下,智能体探索效率显著提升,平均找到出口的步数减少。


2. 开放世界探索中的应用(例如游戏AI)

任务概述:在开放世界的游戏环境中(如Minecraft或No Man's Sky),智能体需要探索不同区域以收集资源或完成任务。环境的奖励非常稀疏,只有在特定地点才有任务触发点。

改进应用

  • 对比学习:对比学习在此任务中尤为重要,可以让智能体避免在已知区域反复探索。例如,通过对比学习,智能体能够将不同的区域映射到潜在空间中,并优先探索未知区域。
  • 不确定性估计:利用不确定性估计方法,智能体可以优先前往预测不确定性较高的区域,增加在探索新地形或未知物体时的探索动力。

效果:改进后的CDE智能体不仅能够更快发现稀有资源和关键地点,还能减少在已探索区域的无效停留。不确定性估计让智能体在探索未知区域时表现得更加自信,提高了在开放世界游戏环境中的探索表现。


3. 自主驾驶仿真环境中的应用

任务概述:在自主驾驶仿真任务中,智能体需要通过探索不同的道路条件和交通状况来提高其驾驶技能。外部奖励可能仅在成功避开障碍物或保持在车道内时提供。

改进应用

  • 奖励动态平衡:在驾驶学习的初始阶段,提高内在奖励权重,激励智能体探索不同的车速、转弯角度和环境情况。在后期学习阶段逐步减少内在奖励的权重,以鼓励智能体专注于学习稳定的驾驶行为。
  • 信息增益和RND:信息增益使得智能体对新遇到的交通情景表现出更高的探索动机,而RND则在早期训练阶段帮助智能体构建对交通规则的基础理解。

效果:引入奖励动态平衡后,CDE算法在驾驶学习初期表现出更强的探索动力,逐步接触不同的交通情景。到达后期,智能体开始关注学习稳定和安全的驾驶技能。信息增益和RND共同作用使得智能体能迅速适应不同的路况和交通规则,学习效果明显加速。


4. 机器人手臂控制任务中的应用

任务概述:在机器人手臂控制任务中,智能体需要通过探索不同的控制策略来完成抓取物体等操作。这种任务通常是一个高维连续控制任务,环境中很少有外在奖励。

改进应用

  • 不确定性估计:使用不确定性估计帮助机器人在未知的抓取策略或未见过的物体上表现出更高的探索动机,逐步优化抓取动作。
  • 动态平衡奖励:在学习初期,增加内在奖励的权重以推动探索,后期逐步减弱内在奖励以优化抓取成功率和效率。

效果:改进后的CDE在机器人手臂控制任务中表现出更好的抓取成功率。利用不确定性估计,智能体能够优先探索不同形状和大小的物体,提高了抓取动作的通用性和适应性。动态平衡奖励机制让智能体在学习初期探索不同的抓取策略,在后期则更专注于优化效率。


8.结论

        通过以上改进,Curiosity-driven Exploration (CDE)算法可以在更多类型的环境中表现出更强的探索能力。每一种改进方法都可以帮助CDE在不同任务和场景中提升性能,从而更好地应对稀疏奖励或无奖励环境下的探索任务。改进后的CDE不仅可以提升智能体的探索效率,还能在更广泛的场景中展现出鲁棒性和适应性。

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


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


http://www.kler.cn/a/407290.html

相关文章:

  • LeetCode题解:28.找出字符串中第一个匹配项的下标【Python题解超详细,滑动窗口法、内置 find 函数、KMP算法】,知识拓展, KMP算法
  • Linux上安装单机版Kibana6.8.1
  • C++ STL - vector/list讲解及迭代器失效
  • 2024 APMCM亚太数学建模C题 - 宠物行业及相关产业的发展分析和策略 完整参考论文(2)
  • HBase Java基础操作
  • ElasticSearch学习篇17_《检索技术核心20讲》最邻近检索-局部敏感哈希、乘积量化PQ思路
  • [Java进阶] 反射机制及其应用场景
  • windows10 | mathtype导致word中ctrl+v不能用
  • 数据结构与算法——1120——时间空间效率问题求边界值
  • 【神经网络基础】
  • js判断一个对象身上是否有某个属性
  • 位运算算法
  • 5分钟轻松搭建Immich图片管理软件并实现公网远程传输照片
  • 嵌入式硬件实战基础篇(三)-四层板PCB设计-步进电机驱动(TMC2208/TMC2209)
  • Vim 命令、操作、文件操作示例
  • 40分钟学 Go 语言高并发:Context包与并发控制
  • React和Next.js的相关内容
  • Gate学习(4) 指令学习1
  • Python BeautifulSoup 常用语句详解
  • MySql四种事务隔离级别以及使用什么隔离级别可以解决幻读
  • 游戏引擎学习第20天
  • Android中的依赖注入(DI)框架Hilt
  • 【案例】泛微.齐业成助力北京中远大昌汽车实现数电票全流程管理
  • 关于相机选型的一些参数说明
  • 从ES的JVM配置起步思考JVM常见参数优化
  • Git 多仓库提交用户信息动态设置