HER(Hindsight Experience Replay) 伪代码理解

HER 是一种用于目标条件强化学习的算法,它通过重用失败的经验来解决稀疏奖励问题。

HER 算法的核心思想是,即使在没有达到原始目标的情况下,也可以从失败的经历中学习到如何实现其他可能的目标。通过将当前经历与不同目标关联起来,算法可以更有效地利用回放缓冲区中的数据,从而提高学习效率。

伪代码:

  • 初始化一个离策略强化学习算法(如 DQN、DDPG、NAF、SDQN)和一个采样目标的策略。
  • 初始化一个回放缓冲区 R。
  • 对于每个 episode:
    • 采样一个目标 g 和一个初始状态 s0。
    • 对于每个时间步 t:
      • 根据当前的目标 g 采样一个动作 at。
      • 执行动作 at 并观察新的状态 st+1。
    • 对于每个时间步 t:
      • 使用当前的目标 g 更新奖励 rt。
      • 将转换 (st||g, at, rt, st+1||g) 存储在回放缓冲区 R 中。
    • 采样一组额外的目标 G 用于回放。
    • 对于 G 中的每个目标 g':
      • 使用 g' 更新奖励 rt。
      • 将转换 (st||g', at, rt, st+1||g') 存储在回放缓冲区 R 中。
      • (g 是当前经验中使用的原始目标,而 g' 是采样自环境的替代目标)
    • 对于 N 次迭代:
      • 从回放缓冲区 R 中采样一个批次 B。
      • 使用算法 A 和批次 B 进行一步优化。

 示例代码:

import gym
import numpy as np
from stable_baselines3 import DDPG
from stable_baselines3.common.vec_env import DummyVecEnv

class HER:
    def __init__(self, env, algorithm, n_sampled_goals=4, goal_sampler=None):
        # 初始化环境和算法
        self.env = env
        self.algorithm = algorithm
        self.n_sampled_goals = n_sampled_goals
        self.goal_sampler = goal_sampler or self.env.sample_goals
        
    def train(self, n_episodes, callback=None):
        # 使用HER对代理进行训练,指定的episode数量
        for i_episode in range(n_episodes):
            observation, _ = self.env.reset()
            done = False
            total_reward = 0
            
            while not done:
                # 根据当前观测值预测一个动作
                action = self.algorithm.predict(observation)
                
                # 在环境中执行该动作
                next_observation, reward, done, _ = self.env.step(action)
                total_reward += reward
                
                # 应用Hindsight Experience Replay
                # 采样新的目标用于回放
                goals = self.goal_sampler(i_episode)
                
                # 对于采样的每个目标,使用当前经验创建一个新的过渡
                # 即将原始奖励替换为基于新目标的奖励
                for goal in goals:
                    # 将过渡存储在算法的回放缓冲区中
                    self.algorithm.remember((observation, action, reward, next_observation, goal))
                
                observation = next_observation
            
            if callback:
                callback(i_episode, total_reward)
        
        # 使用回放缓冲区中的经验对算法进行训练
        self.algorithm.learn()

def main():
    env_id = "FetchReach-v1"
    n_episodes = 1000
    
    # 初始化环境
    env = DummyVecEnv([lambda: gym.make(env_id)])
    
    # 初始化算法
    algorithm = DDPG("MlpPolicy", env)
    
    # 初始化HER
    her = HER(env, algorithm, n_sampled_goals=4)
    
    # 使用HER训练代理
    her.train(n_episodes)

if __name__ == "__main__":
    main()

  • 51
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值