Trang này được dịch bởi Cloud Translation API.
Switch to English

Trình điều khiển

Xem trên TensorFlow.org Chạy trong Google Colab Xem nguồn trên GitHub Tải xuống sổ tay

Giới thiệu

Mô hình phổ biến trong học củng cố là thực thi một chính sách trong môi trường cho một số bước hoặc tập cụ thể. Điều này xảy ra, ví dụ, trong quá trình thu thập dữ liệu, đánh giá và tạo video về đại lý.

Mặc dù điều này tương đối đơn giản để viết trong python, nhưng việc viết và gỡ lỗi trong TensorFlow phức tạp hơn nhiều vì nó liên quan đến các vòng lặp tf.while while, tf.condtf.control_dependencies . Do đó, chúng tôi trừu tượng hóa khái niệm vòng lặp chạy này thành một lớp được gọi là driver và cung cấp các triển khai đã được kiểm tra tốt cả bằng Python và TensorFlow.

Ngoài ra, dữ liệu mà trình điều khiển gặp phải ở mỗi bước được lưu trong một bộ dữ liệu được đặt tên có tên là Trajectory và phát tới một tập hợp các quan sát viên như bộ đệm phát lại và số liệu. Dữ liệu này bao gồm quan sát từ môi trường, hành động được đề xuất bởi chính sách, phần thưởng nhận được, loại hiện tại và bước tiếp theo, v.v.

Thiết lập

Nếu bạn chưa cài đặt tf-agent hoặc phòng tập thể dục, hãy chạy:

pip install -q tf-agents
pip install -q gym
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import tensorflow as tf


from tf_agents.environments import suite_gym
from tf_agents.environments import tf_py_environment
from tf_agents.policies import random_py_policy
from tf_agents.policies import random_tf_policy
from tf_agents.metrics import py_metrics
from tf_agents.metrics import tf_metrics
from tf_agents.drivers import py_driver
from tf_agents.drivers import dynamic_episode_driver

tf.compat.v1.enable_v2_behavior()

Trình điều khiển Python

Lớp PyDriver nhận môi trường python, chính sách python và danh sách người quan sát để cập nhật ở mỗi bước. Phương pháp chính được run() , mà bước môi trường sử dụng hành động từ chính sách cho đến khi ít nhất một trong những tiêu chí chấm dứt sau được đáp ứng: Số lượng các bước đạt max_steps hoặc số lượng tập phim đạt max_episodes .

Cách thực hiện đại khái như sau:

class PyDriver(object):

  def __init__(self, env, policy, observers, max_steps=1, max_episodes=1):
    self._env = env
    self._policy = policy
    self._observers = observers or []
    self._max_steps = max_steps or np.inf
    self._max_episodes = max_episodes or np.inf

  def run(self, time_step, policy_state=()):
    num_steps = 0
    num_episodes = 0
    while num_steps < self._max_steps and num_episodes < self._max_episodes:

      # Compute an action using the policy for the given time_step
      action_step = self._policy.action(time_step, policy_state)

      # Apply the action to the environment and get the next step
      next_time_step = self._env.step(action_step.action)

      # Package information into a trajectory
      traj = trajectory.Trajectory(
         time_step.step_type,
         time_step.observation,
         action_step.action,
         action_step.info,
         next_time_step.step_type,
         next_time_step.reward,
         next_time_step.discount)

      for observer in self._observers:
        observer(traj)

      # Update statistics to check termination
      num_episodes += np.sum(traj.is_last())
      num_steps += np.sum(~traj.is_boundary())

      time_step = next_time_step
      policy_state = action_step.state

    return time_step, policy_state

Bây giờ, chúng ta hãy xem qua ví dụ về việc chạy một chính sách ngẫu nhiên trên môi trường CartPole, lưu kết quả vào bộ đệm phát lại và tính toán một số chỉ số.

env = suite_gym.load('CartPole-v0')
policy = random_py_policy.RandomPyPolicy(time_step_spec=env.time_step_spec(), 
                                         action_spec=env.action_spec())
replay_buffer = []
metric = py_metrics.AverageReturnMetric()
observers = [replay_buffer.append, metric]
driver = py_driver.PyDriver(
    env, policy, observers, max_steps=20, max_episodes=1)

initial_time_step = env.reset()
final_time_step, _ = driver.run(initial_time_step)

print('Replay Buffer:')
for traj in replay_buffer:
  print(traj)

print('Average Return: ', metric.result())
Replay Buffer:
Trajectory(step_type=array(0, dtype=int32), observation=array([ 0.04572451,  0.02109156, -0.03040793, -0.03130549], dtype=float32), action=array(0), policy_info=(), next_step_type=array(1, dtype=int32), reward=array(1., dtype=float32), discount=array(1., dtype=float32))
Trajectory(step_type=array(1, dtype=int32), observation=array([ 0.04614634, -0.17358142, -0.03103404,  0.25163046], dtype=float32), action=array(0), policy_info=(), next_step_type=array(1, dtype=int32), reward=array(1., dtype=float32), discount=array(1., dtype=float32))
Trajectory(step_type=array(1, dtype=int32), observation=array([ 0.04267471, -0.3682468 , -0.02600143,  0.53436536], dtype=float32), action=array(0), policy_info=(), next_step_type=array(1, dtype=int32), reward=array(1., dtype=float32), discount=array(1., dtype=float32))
Trajectory(step_type=array(1, dtype=int32), observation=array([ 0.03530978, -0.56299365, -0.01531413,  0.8187433 ], dtype=float32), action=array(1), policy_info=(), next_step_type=array(1, dtype=int32), reward=array(1., dtype=float32), discount=array(1., dtype=float32))
Trajectory(step_type=array(1, dtype=int32), observation=array([ 0.0240499 , -0.36766544,  0.00106074,  0.5212832 ], dtype=float32), action=array(0), policy_info=(), next_step_type=array(1, dtype=int32), reward=array(1., dtype=float32), discount=array(1., dtype=float32))
Trajectory(step_type=array(1, dtype=int32), observation=array([ 0.0166966, -0.5628023,  0.0114864,  0.8143002], dtype=float32), action=array(1), policy_info=(), next_step_type=array(1, dtype=int32), reward=array(1., dtype=float32), discount=array(1., dtype=float32))
Trajectory(step_type=array(1, dtype=int32), observation=array([ 0.00544055, -0.36783955,  0.02777241,  0.5252522 ], dtype=float32), action=array(0), policy_info=(), next_step_type=array(1, dtype=int32), reward=array(1., dtype=float32), discount=array(1., dtype=float32))
Trajectory(step_type=array(1, dtype=int32), observation=array([-0.00191624, -0.5633411 ,  0.03827745,  0.8265555 ], dtype=float32), action=array(0), policy_info=(), next_step_type=array(1, dtype=int32), reward=array(1., dtype=float32), discount=array(1., dtype=float32))
Trajectory(step_type=array(1, dtype=int32), observation=array([-0.01318306, -0.75896496,  0.05480856,  1.1310272 ], dtype=float32), action=array(1), policy_info=(), next_step_type=array(1, dtype=int32), reward=array(1., dtype=float32), discount=array(1., dtype=float32))
Trajectory(step_type=array(1, dtype=int32), observation=array([-0.02836236, -0.5646018 ,  0.07742911,  0.85602593], dtype=float32), action=array(0), policy_info=(), next_step_type=array(1, dtype=int32), reward=array(1., dtype=float32), discount=array(1., dtype=float32))
Trajectory(step_type=array(1, dtype=int32), observation=array([-0.0396544 , -0.7606886 ,  0.09454963,  1.1720163 ], dtype=float32), action=array(0), policy_info=(), next_step_type=array(1, dtype=int32), reward=array(1., dtype=float32), discount=array(1., dtype=float32))
Trajectory(step_type=array(1, dtype=int32), observation=array([-0.05486817, -0.956904  ,  0.11798995,  1.4927809 ], dtype=float32), action=array(0), policy_info=(), next_step_type=array(1, dtype=int32), reward=array(1., dtype=float32), discount=array(1., dtype=float32))
Trajectory(step_type=array(1, dtype=int32), observation=array([-0.07400625, -1.1532475 ,  0.14784557,  1.819857  ], dtype=float32), action=array(0), policy_info=(), next_step_type=array(1, dtype=int32), reward=array(1., dtype=float32), discount=array(1., dtype=float32))
Trajectory(step_type=array(1, dtype=int32), observation=array([-0.0970712 , -1.3496711 ,  0.18424271,  2.1545868 ], dtype=float32), action=array(1), policy_info=(), next_step_type=array(2, dtype=int32), reward=array(1., dtype=float32), discount=array(0., dtype=float32))
Average Return:  14.0

Trình điều khiển TensorFlow

Chúng tôi cũng có các trình điều khiển trong TensorFlow có chức năng tương tự như trình điều khiển Python, nhưng sử dụng môi trường TF, chính sách TF, trình quan sát TF, v.v. Chúng tôi hiện có 2 trình điều khiển TensorFlow: DynamicStepDriver , kết thúc sau một số bước môi trường (hợp lệ) nhất định và DynamicEpisodeDriver , kết thúc sau một số tập nhất định. Chúng ta hãy xem một ví dụ về DynamicEp Chap đang hoạt động.

env = suite_gym.load('CartPole-v0')
tf_env = tf_py_environment.TFPyEnvironment(env)

tf_policy = random_tf_policy.RandomTFPolicy(action_spec=tf_env.action_spec(),
                                            time_step_spec=tf_env.time_step_spec())


num_episodes = tf_metrics.NumberOfEpisodes()
env_steps = tf_metrics.EnvironmentSteps()
observers = [num_episodes, env_steps]
driver = dynamic_episode_driver.DynamicEpisodeDriver(
    tf_env, tf_policy, observers, num_episodes=2)

# Initial driver.run will reset the environment and initialize the policy.
final_time_step, policy_state = driver.run()

print('final_time_step', final_time_step)
print('Number of Steps: ', env_steps.result().numpy())
print('Number of Episodes: ', num_episodes.result().numpy())
final_time_step TimeStep(step_type=<tf.Tensor: shape=(1,), dtype=int32, numpy=array([0], dtype=int32)>, reward=<tf.Tensor: shape=(1,), dtype=float32, numpy=array([0.], dtype=float32)>, discount=<tf.Tensor: shape=(1,), dtype=float32, numpy=array([1.], dtype=float32)>, observation=<tf.Tensor: shape=(1, 4), dtype=float32, numpy=
array([[ 0.04983833,  0.00221694, -0.04754572,  0.03050179]],
      dtype=float32)>)
Number of Steps:  46
Number of Episodes:  2

# Continue running from previous state
final_time_step, _ = driver.run(final_time_step, policy_state)

print('final_time_step', final_time_step)
print('Number of Steps: ', env_steps.result().numpy())
print('Number of Episodes: ', num_episodes.result().numpy())
final_time_step TimeStep(step_type=<tf.Tensor: shape=(1,), dtype=int32, numpy=array([0], dtype=int32)>, reward=<tf.Tensor: shape=(1,), dtype=float32, numpy=array([0.], dtype=float32)>, discount=<tf.Tensor: shape=(1,), dtype=float32, numpy=array([1.], dtype=float32)>, observation=<tf.Tensor: shape=(1, 4), dtype=float32, numpy=
array([[-0.01266267, -0.01962714, -0.03140591, -0.04742253]],
      dtype=float32)>)
Number of Steps:  82
Number of Episodes:  4