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()