6.5 TensorFlow Agents 强化学习库 6.5 TensorFlow Agents 强化学习库 TensorFlow Agents (TF-Agents) 是一个用于在 TensorFlow 中实现强化学习 (RL) 的库。它提供了一套模块化的、可测试的、可扩展的组件,用于构建、训练和评估 RL 智能体。TF-Agents 的设计目标是支持各种 RL 算法和环境,并提供易于使用的 API,使研究人员和从业者能够快速原型化和实验新的 RL 方法。 6.5.1 TF-Agents 的核心组件 TF-Agents 包含以下核心组件,这些组件协同工作以构建完整的 RL 系统: 环境 (Environment):表示智能体与之交互的世界。环境接收智能体的动作,并返回观察结果和奖励。
TensorFlow Agents (TF-Agents) 是一个用于在 TensorFlow 中实现强化学习 (RL) 的库。它提供了一套模块化的、可测试的、可扩展的组件,用于构建、训练和评估 RL 智能体。TF-Agents 的设计目标是支持各种 RL 算法和环境,并提供易于使用的 API,使研究人员和从业者能够快速原型化和实验新的 RL 方法。
TF-Agents 包含以下核心组件,这些组件协同工作以构建完整的 RL 系统:
环境 (Environment):表示智能体与之交互的世界。环境接收智能体的动作,并返回观察结果和奖励。
策略 (Policy):定义智能体如何根据观察结果选择动作。策略可以是确定性的或随机性的。
智能体 (Agent):包含策略和学习算法。智能体根据环境的反馈更新其策略,以最大化累积奖励。
重放缓冲区 (Replay Buffer):存储智能体与环境交互的经验(状态、动作、奖励、下一个状态)。重放缓冲区用于训练智能体,通过从过去经验中学习来提高样本效率。
数据集 (Dataset):从重放缓冲区中采样数据,并将其提供给智能体进行训练。
指标 (Metrics):用于评估智能体的性能,例如平均奖励、成功率等。
以下是一个 Mermaid 图,展示了这些组件之间的关系:
可以使用 pip 安装 TF-Agents:
pip install tf-agents[reverb]
注意:[reverb] 部分是可选的,用于安装 Reverb,这是一个用于存储和采样经验的强大而高效的重放缓冲区。
让我们通过一个简单的 CartPole 环境来演示如何使用 TF-Agents。CartPole 是一个经典的 RL 环境,目标是保持杆子直立在一个移动的小车上。
1. 创建环境
首先,我们需要创建一个 CartPole 环境。我们可以使用 TF-Agents 提供的 tf_environment 包装器来将 OpenAI Gym 环境转换为 TF-Agents 环境。
import tensorflow as tf import tf_agents.environments as tf_env import tf_agents.networks as networks import tf_agents.agents.dqn as dqn import tf_agents.replay_buffers as rb import tf_agents.trajectories as traj import tf_agents.utils as utils from tf_agents.metrics import tf_metrics from tf_agents.eval import metric_utils from tf_agents.policies import random_tf_policy import gym # 创建 Gym 环境 env = gym.make('CartPole-v1') # 使用 TF-Agents 包装器 train_py_env = tf_env.wrap_py_environment(env) eval_py_env = tf_env.wrap_py_environment(env) train_env = tf_env.tf_py_environment(train_py_env) eval_env = tf_env.tf_py_environment(eval_py_env)
2. 创建智能体
接下来,我们需要创建一个智能体。在这个例子中,我们将使用 DQN (Deep Q-Network) 智能体。
# 定义 Q 网络 q_net = networks.Sequential( [tf.keras.layers.Dense(64, activation='relu'), tf.keras.layers.Dense(64, activation='relu'), tf.keras.layers.Dense(env.action_space.n)]) # 创建 DQN 智能体 optimizer = tf.keras.optimizers.Adam(learning_rate=1e-3) train_step_counter = tf.Variable(0) agent = dqn.DqnAgent( train_env.time_step_spec(), train_env.action_spec(), q_network=q_net, optimizer=optimizer, td_errors_loss_fn=utils.common.element_wise_squared_loss, train_step_counter=train_step_counter ) agent.initialize()
3. 创建重放缓冲区和数据集
现在,我们需要创建一个重放缓冲区来存储智能体与环境交互的经验,并创建一个数据集来从重放缓冲区中采样数据。
# 定义重放缓冲区 replay_buffer = rb.tf_uniform_replay_buffer.TFUniformReplayBuffer( data_spec=agent.collect_data_spec, batch_size=train_env.batch_size, max_length=10000) # 创建数据集 dataset = replay_buffer.as_dataset( num_parallel_calls=3, sample_batch_size=64, num_steps=2).prefetch(3) iterator = iter(dataset)
4. 定义收集策略
收集策略用于在训练过程中与环境交互并收集数据。
# 创建收集策略 collect_policy = agent.collect_policy
5. 定义训练循环
最后,我们需要定义一个训练循环来训练智能体。
# 定义训练循环 def compute_avg_return(environment, policy, num_episodes=10): total_return = 0.0 for _ in range(num_episodes): time_step = environment.reset() episode_return = 0.0 while not time_step.is_last(): action_step = policy.action(time_step) time_step = environment.step(action_step.action) episode_return += time_step.reward total_return += episode_return avg_return = total_return / num_episodes return avg_return.numpy()[0] def collect_step(environment, policy, buffer): time_step = environment.current_time_step() action_step = policy.action(time_step) next_time_step = environment.step(action_step.action) traj_ = traj.from_transition(time_step, action_step, next_time_step) # Add trajectory to the replay buffer buffer.add_batch(traj_) # 训练参数 num_iterations = 20000 collect_steps_per_iteration = 1 log_interval = 2000 eval_interval = 1000 num_eval_episodes = 10 # 训练循环 for i in range(num_iterations): # 收集数据 for _ in range(collect_steps_per_iteration): collect_step(train_env, collect_policy, replay_buffer) # 从重放缓冲区中采样数据 experience, _ = next(iterator) # 训练智能体 train_loss = agent.train(experience).loss # 打印日志 if i % log_interval == 0: print('iteration = {0}: loss = {1}'.format(i, train_loss)) # 评估智能体 if i % eval_interval == 0: avg_return = compute_avg_return(eval_env, agent.policy, num_eval_episodes) print('iteration = {0}: Average Return = {1}'.format(i, avg_return))
6. 完整代码示例
import tensorflow as tf import tf_agents.environments as tf_env import tf_agents.networks as networks import tf_agents.agents.dqn as dqn import tf_agents.replay_buffers as rb import tf_agents.trajectories as traj import tf_agents.utils as utils from tf_agents.metrics import tf_metrics from tf_agents.eval import metric_utils from tf_agents.policies import random_tf_policy import gym # 1. 创建环境 env = gym.make('CartPole-v1') train_py_env = tf_env.wrap_py_environment(env) eval_py_env = tf_env.wrap_py_environment(env) train_env = tf_env.tf_py_environment(train_py_env) eval_env = tf_env.tf_py_environment(eval_py_env) # 2. 创建智能体 q_net = networks.Sequential( [tf.keras.layers.Dense(64, activation='relu'), tf.keras.layers.Dense(64, activation='relu'), tf.keras.layers.Dense(env.action_space.n)]) optimizer = tf.keras.optimizers.Adam(learning_rate=1e-3) train_step_counter = tf.Variable(0) agent = dqn.DqnAgent( train_env.time_step_spec(), train_env.action_spec(), q_network=q_net, optimizer=optimizer, td_errors_loss_fn=utils.common.element_wise_squared_loss, train_step_counter=train_step_counter ) agent.initialize() # 3. 创建重放缓冲区和数据集 replay_buffer = rb.tf_uniform_replay_buffer.TFUniformReplayBuffer( data_spec=agent.collect_data_spec, batch_size=train_env.batch_size, max_length=10000) dataset = replay_buffer.as_dataset( num_parallel_calls=3, sample_batch_size=64, num_steps=2).prefetch(3) iterator = iter(dataset) # 4. 定义收集策略 collect_policy = agent.collect_policy # 5. 定义训练循环 def compute_avg_return(environment, policy, num_episodes=10): total_return = 0.0 for _ in range(num_episodes): time_step = environment.reset() episode_return = 0.0 while not time_step.is_last(): action_step = policy.action(time_step) time_step = environment.step(action_step.action) episode_return += time_step.reward total_return += episode_return avg_return = total_return / num_episodes return avg_return.numpy()[0] def collect_step(environment, policy, buffer): time_step = environment.current_time_step() action_step = policy.action(time_step) next_time_step = environment.step(action_step.action) traj_ = traj.from_transition(time_step, action_step, next_time_step) # Add trajectory to the replay buffer buffer.add_batch(traj_) # 训练参数 num_iterations = 20000 collect_steps_per_iteration = 1 log_interval = 2000 eval_interval = 1000 num_eval_episodes = 10 # 训练循环 for i in range(num_iterations): # 收集数据 for _ in range(collect_steps_per_iteration): collect_step(train_env, collect_policy, replay_buffer) # 从重放缓冲区中采样数据 experience, _ = next(iterator) # 训练智能体 train_loss = agent.train(experience).loss # 打印日志 if i % log_interval == 0: print('iteration = {0}: loss = {1}'.format(i, train_loss)) # 评估智能体 if i % eval_interval == 0: avg_return = compute_avg_return(eval_env, agent.policy, num_eval_episodes) print('iteration = {0}: Average Return = {1}'.format(i, avg_return))
除了基本的 RL 组件,TF-Agents 还提供了一些高级特性,例如:
多智能体支持:TF-Agents 支持训练多个智能体在同一环境中交互。
分层强化学习:TF-Agents 支持构建分层 RL 系统,其中高级智能体控制低级智能体。
模仿学习:TF-Agents 支持使用模仿学习来初始化智能体的策略,从而加速训练过程。
离线强化学习:TF-Agents 支持使用离线数据来训练智能体,无需与环境交互。
Reverb 重放缓冲区:Reverb 是一个强大的重放缓冲区,可以高效地存储和采样经验,支持优先级采样和分布式训练。
TF-Agents 允许你自定义环境和智能体,以满足特定的需求。
自定义环境
你可以通过继承 tf_agents.environments.py_environment.PyEnvironment 类来创建自定义环境。你需要实现以下方法:
_step(self, action):执行一个动作并返回下一个时间步。
_observe(self):返回当前观察结果。
_reset(self):重置环境到初始状态。
observation_spec(self):返回观察空间的规范。
action_spec(self):返回动作空间的规范。
自定义智能体
你可以通过继承 tf_agents.agents.tf_agent.TFAgent 类来创建自定义智能体。你需要实现以下方法:
_train(self, experience, weights=None):使用经验数据训练智能体。
_policy(self, time_step, policy_state=()):返回一个策略,用于根据时间步选择动作。
_collect_policy(self, time_step, policy_state=()):返回一个策略,用于在训练过程中收集数据。
TensorFlow Agents 是一个功能强大的强化学习库,它提供了一套模块化的、可扩展的组件,用于构建、训练和评估 RL 智能体。 TF-Agents 支持各种 RL 算法和环境,并提供易于使用的 API,使研究人员和从业者能够快速原型化和实验新的 RL 方法。 通过学习和实践 TF-Agents,你可以更好地理解强化学习的原理,并将其应用于解决实际问题。
希望这篇文章对你有所帮助!