Lưu ngày! Google I / O hoạt động trở lại từ ngày 18 đến 20 tháng 5 Đăng ký ngay
Trang này được dịch bởi Cloud Translation API.
Switch to English

SAC minitaur với API người học-diễn viên

Bản quyền 2021 Các tác giả TF-Agents.

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

Giới thiệu

Ví dụ này cho thấy cách đào tạo một đặc vụ Phê bình Diễn viên mềm trên môi trường Minitaur .

Nếu bạn đã làm việc qua DQN Colab, điều này sẽ cảm thấy rất quen thuộc. Những thay đổi đáng chú ý bao gồm:

  • Thay đổi tác nhân từ DQN sang SAC.
  • Đào tạo trên Minitaur, một môi trường phức tạp hơn nhiều so với CartPole. Môi trường Minitaur nhằm đào tạo một robot bốn chân tiến về phía trước.
  • Sử dụng API TF-Agents Actor-Learner cho Học tập củng cố phân tán.

API hỗ trợ cả thu thập dữ liệu phân tán bằng cách sử dụng bộ đệm phát lại trải nghiệm và vùng chứa biến (máy chủ tham số) và đào tạo phân tán trên nhiều thiết bị. API được thiết kế rất đơn giản và theo mô-đun. Chúng tôi sử dụng Reverb cho cả bộ đệm phát lại và vùng chứa biến và API TF DistributionStrategy để đào tạo phân tán về GPU và TPU.

Nếu bạn chưa cài đặt các phần phụ thuộc sau, hãy chạy:

sudo apt-get install -y xvfb ffmpeg
pip install -q 'imageio==2.4.0'
pip install -q matplotlib
pip install -q tf-agents[reverb]
pip install -q pybullet

Thiết lập

Đầu tiên, chúng tôi sẽ nhập các công cụ khác nhau mà chúng tôi cần.

import base64
import imageio
import IPython
import matplotlib.pyplot as plt
import os
import reverb
import tempfile
import PIL.Image

import tensorflow as tf

from tf_agents.agents.ddpg import critic_network
from tf_agents.agents.sac import sac_agent
from tf_agents.agents.sac import tanh_normal_projection_network
from tf_agents.environments import suite_pybullet
from tf_agents.metrics import py_metrics
from tf_agents.networks import actor_distribution_network
from tf_agents.policies import greedy_policy
from tf_agents.policies import py_tf_eager_policy
from tf_agents.policies import random_py_policy
from tf_agents.replay_buffers import reverb_replay_buffer
from tf_agents.replay_buffers import reverb_utils
from tf_agents.train import actor
from tf_agents.train import learner
from tf_agents.train import triggers
from tf_agents.train.utils import spec_utils
from tf_agents.train.utils import strategy_utils
from tf_agents.train.utils import train_utils

tempdir = tempfile.gettempdir()

Siêu tham số

env_name = "MinitaurBulletEnv-v0" # @param {type:"string"}

# Use "num_iterations = 1e6" for better results (2 hrs)
# 1e5 is just so this doesn't take too long (1 hr)
num_iterations = 100000 # @param {type:"integer"}

initial_collect_steps = 10000 # @param {type:"integer"}
collect_steps_per_iteration = 1 # @param {type:"integer"}
replay_buffer_capacity = 10000 # @param {type:"integer"}

batch_size = 256 # @param {type:"integer"}

critic_learning_rate = 3e-4 # @param {type:"number"}
actor_learning_rate = 3e-4 # @param {type:"number"}
alpha_learning_rate = 3e-4 # @param {type:"number"}
target_update_tau = 0.005 # @param {type:"number"}
target_update_period = 1 # @param {type:"number"}
gamma = 0.99 # @param {type:"number"}
reward_scale_factor = 1.0 # @param {type:"number"}

actor_fc_layer_params = (256, 256)
critic_joint_fc_layer_params = (256, 256)

log_interval = 5000 # @param {type:"integer"}

num_eval_episodes = 20 # @param {type:"integer"}
eval_interval = 10000 # @param {type:"integer"}

policy_save_interval = 5000 # @param {type:"integer"}

Môi trường

Các môi trường trong RL đại diện cho nhiệm vụ hoặc vấn đề mà chúng tôi đang cố gắng giải quyết. Có thể dễ dàng tạo môi trường tiêu chuẩn trong TF-Agents bằng cách sử dụng suites . Chúng tôi có các suites khác nhau để tải môi trường từ các nguồn như OpenAI Gym, Atari, DM Control, v.v., được đặt tên môi trường chuỗi.

Bây giờ hãy tải môi trường Minituar từ bộ Pybullet.

env = suite_pybullet.load(env_name)
env.reset()
PIL.Image.fromarray(env.render())
current_dir=/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/pybullet_envs/bullet
urdf_root=/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/pybullet_data
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/gym/logger.py:30: UserWarning: WARN: Box bound precision lowered by casting to float32
  warnings.warn(colorize('%s: %s'%('WARN', msg % args), 'yellow'))

png

Trong môi trường này, mục tiêu của đặc vụ là đào tạo một chính sách sẽ điều khiển robot Minitaur và khiến nó tiến nhanh nhất có thể. Các tập kéo dài 1000 bước và phần thu về sẽ là tổng phần thưởng trong suốt tập.

Hãy xem thông tin mà môi trường cung cấp như một observation mà chính sách sẽ sử dụng để tạo ra actions .

print('Observation Spec:')
print(env.time_step_spec().observation)
print('Action Spec:')
print(env.action_spec())
Observation Spec:
BoundedArraySpec(shape=(28,), dtype=dtype('float32'), name='observation', minimum=[  -3.1515927   -3.1515927   -3.1515927   -3.1515927   -3.1515927
   -3.1515927   -3.1515927   -3.1515927 -167.72488   -167.72488
 -167.72488   -167.72488   -167.72488   -167.72488   -167.72488
 -167.72488     -5.71        -5.71        -5.71        -5.71
   -5.71        -5.71        -5.71        -5.71        -1.01
   -1.01        -1.01        -1.01     ], maximum=[  3.1515927   3.1515927   3.1515927   3.1515927   3.1515927   3.1515927
   3.1515927   3.1515927 167.72488   167.72488   167.72488   167.72488
 167.72488   167.72488   167.72488   167.72488     5.71        5.71
   5.71        5.71        5.71        5.71        5.71        5.71
   1.01        1.01        1.01        1.01     ])
Action Spec:
BoundedArraySpec(shape=(8,), dtype=dtype('float32'), name='action', minimum=-1.0, maximum=1.0)

Như chúng ta có thể thấy, việc quan sát khá phức tạp. Chúng tôi nhận được 28 giá trị đại diện cho góc, vận tốc và mômen cho tất cả các động cơ. Đổi lại, môi trường mong đợi 8 giá trị cho các hành động giữa [-1, 1] . Đây là những góc vận động mong muốn.

Thông thường chúng tôi tạo ra hai môi trường: một để thu thập dữ liệu trong quá trình đào tạo và một để đánh giá. Các môi trường được viết bằng python thuần túy và sử dụng các mảng numpy mà API Actor Learner trực tiếp sử dụng.

collect_env = suite_pybullet.load(env_name)
eval_env = suite_pybullet.load(env_name)
urdf_root=/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/pybullet_data
urdf_root=/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/pybullet_data

Chiến lược phân phối

Chúng tôi sử dụng API DistributionStrategy để cho phép chạy tính toán bước đào tạo trên nhiều thiết bị, chẳng hạn như nhiều GPU hoặc TPU bằng cách sử dụng song song dữ liệu. Bước tàu:

  • Nhận một loạt dữ liệu đào tạo
  • Tách nó trên các thiết bị
  • Tính toán bước tiến
  • Tổng hợp và tính toán MEAN của tổn thất
  • Tính toán bước lùi và thực hiện cập nhật biến gradient

Với API TF-Agents Learner và API DistributionStrategy, khá dễ dàng để chuyển đổi giữa việc chạy bước đào tạo trên GPU (sử dụng MirroredStrategy) sang TPU (sử dụng TPUStrategy) mà không cần thay đổi bất kỳ logic đào tạo nào bên dưới.

Kích hoạt GPU

Nếu bạn muốn thử chạy trên GPU, trước tiên bạn cần bật GPU cho máy tính xách tay:

  • Điều hướng đến Chỉnh sửa → Cài đặt Notebook
  • Chọn GPU từ trình đơn thả xuống Trình tăng tốc phần cứng

Chọn một chiến lược

Sử dụng strategy_utils để tạo ra một chiến lược. Dưới mui xe, truyền tham số:

use_gpu = True

strategy = strategy_utils.get_strategy(tpu=False, use_gpu=use_gpu)
INFO:tensorflow:Using MirroredStrategy with devices ('/job:localhost/replica:0/task:0/device:GPU:0',)
INFO:tensorflow:Using MirroredStrategy with devices ('/job:localhost/replica:0/task:0/device:GPU:0',)

Tất cả các biến và Tác nhân cần được tạo trong strategy.scope() , như bạn sẽ thấy bên dưới.

Đặc vụ

Để tạo một SAC Agent, trước tiên chúng ta cần tạo các mạng mà nó sẽ đào tạo. SAC là một đại lý phê bình diễn viên, vì vậy chúng tôi sẽ cần hai mạng lưới.

Nhà phê bình sẽ cung cấp cho chúng ta các ước lượng giá trị cho Q(s,a) . Nghĩa là, nó sẽ nhận dưới dạng đầu vào một quan sát và một hành động, đồng thời nó sẽ cung cấp cho chúng tôi ước tính về mức độ tốt của hành động đó đối với trạng thái đã cho.

observation_spec, action_spec, time_step_spec = (
      spec_utils.get_tensor_specs(collect_env))

with strategy.scope():
  critic_net = critic_network.CriticNetwork(
        (observation_spec, action_spec),
        observation_fc_layer_params=None,
        action_fc_layer_params=None,
        joint_fc_layer_params=critic_joint_fc_layer_params,
        kernel_initializer='glorot_uniform',
        last_kernel_initializer='glorot_uniform')

Chúng tôi sẽ sử dụng nhà phê bình này để đào tạo một mạng lưới actor sẽ cho phép chúng tôi tạo ra các hành động khi quan sát.

ActorNetwork sẽ dự đoán các tham số cho một phân phối MultivariateNormalDiag tanh ActorNetwork . Phân phối này sau đó sẽ được lấy mẫu, điều kiện hóa quan sát hiện tại, bất cứ khi nào chúng ta cần tạo ra các hành động.

with strategy.scope():
  actor_net = actor_distribution_network.ActorDistributionNetwork(
      observation_spec,
      action_spec,
      fc_layer_params=actor_fc_layer_params,
      continuous_projection_net=(
          tanh_normal_projection_network.TanhNormalProjectionNetwork))

Với những mạng này, chúng ta có thể khởi tạo đại lý ngay bây giờ.

with strategy.scope():
  train_step = train_utils.create_train_step()

  tf_agent = sac_agent.SacAgent(
        time_step_spec,
        action_spec,
        actor_network=actor_net,
        critic_network=critic_net,
        actor_optimizer=tf.compat.v1.train.AdamOptimizer(
            learning_rate=actor_learning_rate),
        critic_optimizer=tf.compat.v1.train.AdamOptimizer(
            learning_rate=critic_learning_rate),
        alpha_optimizer=tf.compat.v1.train.AdamOptimizer(
            learning_rate=alpha_learning_rate),
        target_update_tau=target_update_tau,
        target_update_period=target_update_period,
        td_errors_loss_fn=tf.math.squared_difference,
        gamma=gamma,
        reward_scale_factor=reward_scale_factor,
        train_step_counter=train_step)

  tf_agent.initialize()

Replay Buffer

Để theo dõi dữ liệu được thu thập từ môi trường, chúng tôi sẽ sử dụng Reverb , một hệ thống phát lại hiệu quả, có thể mở rộng và dễ sử dụng của Deepmind. Nó lưu trữ dữ liệu kinh nghiệm được thu thập bởi các Diễn viên và được Người học sử dụng trong quá trình đào tạo.

Trong hướng dẫn này, điều này ít quan trọng hơn max_size - nhưng trong cài đặt phân tán với thu thập và đào tạo không đồng bộ, bạn có thể muốn thử nghiệm với rate_limiters.SampleToInsertRatio , sử dụng sample_per_insert trong khoảng từ 2 đến 1000. Ví dụ:

rate_limiter=reverb.rate_limiters.SampleToInsertRatio(samples_per_insert=3.0, min_size_to_sample=3, error_buffer=3.0))
table_name = 'uniform_table'
table = reverb.Table(
    table_name,
    max_size=replay_buffer_capacity,
    sampler=reverb.selectors.Uniform(),
    remover=reverb.selectors.Fifo(),
    rate_limiter=reverb.rate_limiters.MinSize(1))

reverb_server = reverb.Server([table])

Bộ đệm phát lại được xây dựng bằng cách sử dụng các thông số kỹ thuật mô tả các tensors sẽ được lưu trữ, có thể nhận được từ tác nhân bằng cách sử dụng tf_agent.collect_data_spec .

Vì SAC Agent cần cả quan sát hiện tại và quan sát tiếp theo để tính toán tổn thất, chúng tôi đặt sequence_length=2 .

reverb_replay = reverb_replay_buffer.ReverbReplayBuffer(
    tf_agent.collect_data_spec,
    sequence_length=2,
    table_name=table_name,
    local_server=reverb_server)

Bây giờ chúng ta tạo tập dữ liệu TensorFlow từ bộ đệm phát lại Reverb. Chúng tôi sẽ chuyển điều này cho Người học để lấy mẫu kinh nghiệm để đào tạo.

dataset = reverb_replay.as_dataset(
      sample_batch_size=batch_size, num_steps=2).prefetch(50)
experience_dataset_fn = lambda: dataset

Chính sách

Trong TF-Agents, các chính sách đại diện cho khái niệm tiêu chuẩn về chính sách trong RL: cho một time_step tạo ra một hành động hoặc một phân phối qua các hành động. Phương thức chính là policy_step = policy.step(time_step) trong đó policy_step là một tuple PolicyStep(action, state, info) có tên PolicyStep(action, state, info) . policy_step.actionaction được áp dụng cho môi trường, state đại diện cho trạng thái về các chính sách trạng thái (RNN) và info có thể chứa thông tin bổ trợ như xác suất nhật ký của các hành động.

Đại lý có hai chính sách:

  • agent.policy - Chính sách chính được sử dụng để đánh giá và triển khai.
  • agent.collect_policy - Chính sách thứ hai được sử dụng để thu thập dữ liệu.
tf_eval_policy = tf_agent.policy
eval_policy = py_tf_eager_policy.PyTFEagerPolicy(
  tf_eval_policy, use_tf_function=True)
tf_collect_policy = tf_agent.collect_policy
collect_policy = py_tf_eager_policy.PyTFEagerPolicy(
  tf_collect_policy, use_tf_function=True)

Các chính sách có thể được tạo độc lập với các đại lý. Ví dụ: sử dụng tf_agents.policies.random_py_policy để tạo một chính sách sẽ chọn ngẫu nhiên một hành động cho mỗi time_step.

random_policy = random_py_policy.RandomPyPolicy(
  collect_env.time_step_spec(), collect_env.action_spec())

Diễn viên

Tác nhân quản lý các tương tác giữa chính sách và môi trường.

  • Các thành phần Actor chứa một thể hiện của môi trường (như py_environment ) và một bản sao của các biến chính sách.
  • Mỗi nhân viên Actor chạy một chuỗi các bước thu thập dữ liệu với các giá trị cục bộ của các biến chính sách.
  • Cập nhật biến được thực hiện một cách rõ ràng bằng cách sử dụng cá thể ứng dụng khách vùng chứa biến trong tập lệnh đào tạo trước khi gọi actor.run() .
  • Kinh nghiệm quan sát được ghi vào bộ đệm phát lại trong mỗi bước thu thập dữ liệu.

Khi các Diễn viên chạy các bước thu thập dữ liệu, chúng chuyển các quỹ đạo của (trạng thái, hành động, phần thưởng) cho người quan sát, người này lưu trữ và ghi chúng vào hệ thống phát lại Reverb.

Chúng tôi đang lưu trữ quỹ đạo cho các khung [(t0, t1) (t1, t2) (t2, t3), ...] bởi vì stride_length=1 .

rb_observer = reverb_utils.ReverbAddTrajectoryObserver(
  reverb_replay.py_client,
  table_name,
  sequence_length=2,
  stride_length=1)

Chúng tôi tạo một Actor với chính sách ngẫu nhiên và thu thập kinh nghiệm để tạo ra bộ đệm phát lại.

initial_collect_actor = actor.Actor(
  collect_env,
  random_policy,
  train_step,
  steps_per_run=initial_collect_steps,
  observers=[rb_observer])
initial_collect_actor.run()

Khởi tạo một Diễn viên với chính sách thu thập để thu thập thêm kinh nghiệm trong quá trình đào tạo.

env_step_metric = py_metrics.EnvironmentSteps()
collect_actor = actor.Actor(
  collect_env,
  collect_policy,
  train_step,
  steps_per_run=1,
  metrics=actor.collect_metrics(10),
  summary_dir=os.path.join(tempdir, learner.TRAIN_DIR),
  observers=[rb_observer, env_step_metric])

Tạo một Tác nhân sẽ được sử dụng để đánh giá chính sách trong quá trình đào tạo. Chúng tôi chuyển vào actor.eval_metrics(num_eval_episodes) để ghi lại các chỉ số sau này.

eval_actor = actor.Actor(
  eval_env,
  eval_policy,
  train_step,
  episodes_per_run=num_eval_episodes,
  metrics=actor.eval_metrics(num_eval_episodes),
  summary_dir=os.path.join(tempdir, 'eval'),
)

Người học

Thành phần Người học chứa tác nhân và thực hiện cập nhật bước gradient cho các biến chính sách bằng cách sử dụng dữ liệu trải nghiệm từ bộ đệm phát lại. Sau một hoặc nhiều bước huấn luyện, Người học có thể đẩy một tập giá trị biến mới vào vùng chứa biến.

saved_model_dir = os.path.join(tempdir, learner.POLICY_SAVED_MODEL_DIR)

# Triggers to save the agent's policy checkpoints.
learning_triggers = [
    triggers.PolicySavedModelTrigger(
        saved_model_dir,
        tf_agent,
        train_step,
        interval=policy_save_interval),
    triggers.StepPerSecondLogTrigger(train_step, interval=1000),
]

agent_learner = learner.Learner(
  tempdir,
  train_step,
  tf_agent,
  experience_dataset_fn,
  triggers=learning_triggers)
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/ops/linalg/linear_operator_diag.py:175: calling LinearOperator.__init__ (from tensorflow.python.ops.linalg.linear_operator) with graph_parents is deprecated and will be removed in a future version.
Instructions for updating:
Do not pass `graph_parents`.  They will  no longer be used.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/ops/linalg/linear_operator_diag.py:175: calling LinearOperator.__init__ (from tensorflow.python.ops.linalg.linear_operator) with graph_parents is deprecated and will be removed in a future version.
Instructions for updating:
Do not pass `graph_parents`.  They will  no longer be used.
WARNING:absl:WARNING: Could not serialize policy.distribution() for policy "<tf_agents.policies.actor_policy.ActorPolicy object at 0x7f1dff58ef60>". Calling saved_model.distribution() will raise the following assertion error: Unable to make a CompositeTensor for "<tensorflow.python.ops.linalg.linear_operator_diag.LinearOperatorDiag object at 0x7f1dff33efd0>" of type `<class 'tensorflow.python.ops.linalg.linear_operator_diag.LinearOperatorDiag'>`. Email `tfprobability@tensorflow.org` or file an issue on github if you would benefit from this working. (Unable to serialize: No encoder for object [Tensor("ActorDistributionNetwork/TanhNormalProjectionNetwork/Exp:0", shape=(None, 8), dtype=float32)] of type [<class 'tensorflow.python.framework.ops.Tensor'>].)
WARNING:absl:WARNING: Could not serialize policy.distribution() for policy "<tf_agents.policies.actor_policy.ActorPolicy object at 0x7f1dff58ef60>". Calling saved_model.distribution() will raise the following assertion error: Unable to make a CompositeTensor for "<tensorflow.python.ops.linalg.linear_operator_diag.LinearOperatorDiag object at 0x7f1dff217cc0>" of type `<class 'tensorflow.python.ops.linalg.linear_operator_diag.LinearOperatorDiag'>`. Email `tfprobability@tensorflow.org` or file an issue on github if you would benefit from this working. (Unable to serialize: No encoder for object [Tensor("ActorDistributionNetwork/TanhNormalProjectionNetwork/Exp:0", shape=(None, 8), dtype=float32)] of type [<class 'tensorflow.python.framework.ops.Tensor'>].)
WARNING:absl:WARNING: Could not serialize policy.distribution() for policy "<tf_agents.policies.actor_policy.ActorPolicy object at 0x7f1dff58ef60>". Calling saved_model.distribution() will raise the following assertion error: Unable to make a CompositeTensor for "<tensorflow.python.ops.linalg.linear_operator_diag.LinearOperatorDiag object at 0x7f1dff139e80>" of type `<class 'tensorflow.python.ops.linalg.linear_operator_diag.LinearOperatorDiag'>`. Email `tfprobability@tensorflow.org` or file an issue on github if you would benefit from this working. (Unable to serialize: No encoder for object [Tensor("ActorDistributionNetwork/TanhNormalProjectionNetwork/Exp:0", shape=(None, 8), dtype=float32)] of type [<class 'tensorflow.python.framework.ops.Tensor'>].)
WARNING:absl:WARNING: Could not serialize policy.distribution() for policy "<tf_agents.policies.actor_policy.ActorPolicy object at 0x7f1dff58ef60>". Calling saved_model.distribution() will raise the following assertion error: Unable to make a CompositeTensor for "<tensorflow.python.ops.linalg.linear_operator_diag.LinearOperatorDiag object at 0x7f1d8b16ea90>" of type `<class 'tensorflow.python.ops.linalg.linear_operator_diag.LinearOperatorDiag'>`. Email `tfprobability@tensorflow.org` or file an issue on github if you would benefit from this working. (Unable to serialize: No encoder for object [Tensor("ActorDistributionNetwork/TanhNormalProjectionNetwork/Exp:0", shape=(None, 8), dtype=float32)] of type [<class 'tensorflow.python.framework.ops.Tensor'>].)
WARNING:absl:Found untraced functions such as ActorDistributionNetwork_layer_call_fn, ActorDistributionNetwork_layer_call_and_return_conditional_losses, EncodingNetwork_layer_call_fn, EncodingNetwork_layer_call_and_return_conditional_losses, TanhNormalProjectionNetwork_layer_call_fn while saving (showing 5 of 35). These functions will not be directly callable after loading.
WARNING:absl:Found untraced functions such as ActorDistributionNetwork_layer_call_fn, ActorDistributionNetwork_layer_call_and_return_conditional_losses, EncodingNetwork_layer_call_fn, EncodingNetwork_layer_call_and_return_conditional_losses, TanhNormalProjectionNetwork_layer_call_fn while saving (showing 5 of 35). These functions will not be directly callable after loading.
INFO:tensorflow:Assets written to: /tmp/policies/collect_policy/assets
INFO:tensorflow:Assets written to: /tmp/policies/collect_policy/assets
WARNING:absl:Found untraced functions such as ActorDistributionNetwork_layer_call_fn, ActorDistributionNetwork_layer_call_and_return_conditional_losses, EncodingNetwork_layer_call_fn, EncodingNetwork_layer_call_and_return_conditional_losses, TanhNormalProjectionNetwork_layer_call_fn while saving (showing 5 of 35). These functions will not be directly callable after loading.
WARNING:absl:Found untraced functions such as ActorDistributionNetwork_layer_call_fn, ActorDistributionNetwork_layer_call_and_return_conditional_losses, EncodingNetwork_layer_call_fn, EncodingNetwork_layer_call_and_return_conditional_losses, TanhNormalProjectionNetwork_layer_call_fn while saving (showing 5 of 35). These functions will not be directly callable after loading.
INFO:tensorflow:Assets written to: /tmp/policies/greedy_policy/assets
INFO:tensorflow:Assets written to: /tmp/policies/greedy_policy/assets
WARNING:absl:WARNING: Could not serialize policy.distribution() for policy "<tf_agents.policies.actor_policy.ActorPolicy object at 0x7f1dff58ef60>". Calling saved_model.distribution() will raise the following assertion error: Unable to make a CompositeTensor for "<tensorflow.python.ops.linalg.linear_operator_diag.LinearOperatorDiag object at 0x7f1d8af23be0>" of type `<class 'tensorflow.python.ops.linalg.linear_operator_diag.LinearOperatorDiag'>`. Email `tfprobability@tensorflow.org` or file an issue on github if you would benefit from this working. (Unable to serialize: No encoder for object [Tensor("ActorDistributionNetwork/TanhNormalProjectionNetwork/Exp:0", shape=(None, 8), dtype=float32)] of type [<class 'tensorflow.python.framework.ops.Tensor'>].)
WARNING:absl:Found untraced functions such as ActorDistributionNetwork_layer_call_fn, ActorDistributionNetwork_layer_call_and_return_conditional_losses, EncodingNetwork_layer_call_fn, EncodingNetwork_layer_call_and_return_conditional_losses, TanhNormalProjectionNetwork_layer_call_fn while saving (showing 5 of 35). These functions will not be directly callable after loading.
WARNING:absl:Found untraced functions such as ActorDistributionNetwork_layer_call_fn, ActorDistributionNetwork_layer_call_and_return_conditional_losses, EncodingNetwork_layer_call_fn, EncodingNetwork_layer_call_and_return_conditional_losses, TanhNormalProjectionNetwork_layer_call_fn while saving (showing 5 of 35). These functions will not be directly callable after loading.
INFO:tensorflow:Assets written to: /tmp/policies/policy/assets
INFO:tensorflow:Assets written to: /tmp/policies/policy/assets
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tf_agents/train/learner.py:122: StrategyBase.experimental_distribute_datasets_from_function (from tensorflow.python.distribute.distribute_lib) is deprecated and will be removed in a future version.
Instructions for updating:
rename to distribute_datasets_from_function
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tf_agents/train/learner.py:122: StrategyBase.experimental_distribute_datasets_from_function (from tensorflow.python.distribute.distribute_lib) is deprecated and will be removed in a future version.
Instructions for updating:
rename to distribute_datasets_from_function

Số liệu và Đánh giá

Chúng tôi đã tạo ra eval Actor bằng actor.eval_metrics ở trên, tạo ra các chỉ số thường được sử dụng nhất trong quá trình đánh giá chính sách:

  • Lợi tức trung bình. Lợi tức là tổng số phần thưởng nhận được khi chạy chính sách trong môi trường cho một tập và chúng tôi thường tính trung bình con số này qua một vài tập.
  • Độ dài tập trung bình.

Chúng tôi điều hành Actor để tạo ra các chỉ số này.

def get_eval_metrics():
  eval_actor.run()
  results = {}
  for metric in eval_actor.metrics:
    results[metric.name] = metric.result()
  return results

metrics = get_eval_metrics()
def log_eval_metrics(step, metrics):
  eval_results = (', ').join(
      '{} = {:.6f}'.format(name, result) for name, result in metrics.items())
  print('step = {0}: {1}'.format(step, eval_results))

log_eval_metrics(0, metrics)
step = 0: AverageReturn = -0.346627, AverageEpisodeLength = 86.349998

Kiểm tra mô-đun chỉ số để biết các triển khai tiêu chuẩn khác của các chỉ số khác nhau.

Đào tạo đại lý

Vòng đào tạo bao gồm cả việc thu thập dữ liệu từ môi trường và tối ưu hóa mạng của tác nhân. Trên đường đi, chúng tôi sẽ thỉnh thoảng đánh giá chính sách của đại lý để xem chúng tôi đang hoạt động như thế nào.

try:
  %%time
except:
  pass

# Reset the train step
tf_agent.train_step_counter.assign(0)

# Evaluate the agent's policy once before training.
avg_return = get_eval_metrics()["AverageReturn"]
returns = [avg_return]

for _ in range(num_iterations):
  # Training.
  collect_actor.run()
  loss_info = agent_learner.run(iterations=1)

  # Evaluating.
  step = agent_learner.train_step_numpy

  if eval_interval and step % eval_interval == 0:
    metrics = get_eval_metrics()
    log_eval_metrics(step, metrics)
    returns.append(metrics["AverageReturn"])

  if log_interval and step % log_interval == 0:
    print('step = {0}: loss = {1}'.format(step, loss_info.loss.numpy()))

rb_observer.close()
reverb_server.stop()
step = 5000: loss = -56.69059753417969
step = 10000: AverageReturn = -0.472410, AverageEpisodeLength = 164.899994
step = 10000: loss = -54.17033004760742
step = 15000: loss = -28.52847671508789
step = 20000: AverageReturn = -0.172086, AverageEpisodeLength = 93.349998
step = 20000: loss = -20.480314254760742
step = 25000: loss = -12.228870391845703
step = 30000: AverageReturn = -0.775230, AverageEpisodeLength = 251.449997
step = 30000: loss = -7.371895790100098
step = 35000: loss = -5.757593154907227
step = 40000: AverageReturn = -1.189717, AverageEpisodeLength = 330.600006
step = 40000: loss = -2.23077654838562
step = 45000: loss = -2.0682435035705566
step = 50000: AverageReturn = -1.436991, AverageEpisodeLength = 592.700012
step = 50000: loss = 2.793757438659668
step = 55000: loss = 0.9165877103805542
step = 60000: AverageReturn = -1.421196, AverageEpisodeLength = 630.849976
step = 60000: loss = -1.5204321146011353
step = 65000: loss = 1.119447112083435
step = 70000: AverageReturn = -0.937966, AverageEpisodeLength = 574.400024
step = 70000: loss = 4.193424224853516
step = 75000: loss = 4.100306034088135
step = 80000: AverageReturn = 0.252701, AverageEpisodeLength = 527.799988
step = 80000: loss = -1.2829862833023071
step = 85000: loss = -3.3187692165374756
step = 90000: AverageReturn = 1.051066, AverageEpisodeLength = 614.000000
step = 90000: loss = -0.4716823101043701
step = 95000: loss = 0.616091251373291
step = 100000: AverageReturn = 0.888614, AverageEpisodeLength = 376.600006
step = 100000: loss = -0.057090915739536285

Hình dung

Lô đất

Chúng tôi có thể vẽ biểu đồ lợi nhuận trung bình so với các bước toàn cầu để xem hiệu suất của đại lý của chúng tôi. Trong Minitaur , chức năng phần thưởng dựa trên quãng đường mà minitaur đi được trong 1000 bước và phạt tiêu hao năng lượng.

steps = range(0, num_iterations + 1, eval_interval)
plt.plot(steps, returns)
plt.ylabel('Average Return')
plt.xlabel('Step')
plt.ylim()
(-1.5613936901092529, 1.175468635559082)

png

Video

Sẽ rất hữu ích nếu bạn hình dung hiệu suất của một tác nhân bằng cách hiển thị môi trường ở mỗi bước. Trước khi làm điều đó, trước tiên chúng ta hãy tạo một chức năng để nhúng video vào chuyên mục này.

def embed_mp4(filename):
  """Embeds an mp4 file in the notebook."""
  video = open(filename,'rb').read()
  b64 = base64.b64encode(video)
  tag = '''
  <video width="640" height="480" controls>
    <source src="data:video/mp4;base64,{0}" type="video/mp4">
  Your browser does not support the video tag.
  </video>'''.format(b64.decode())

  return IPython.display.HTML(tag)

Đoạn mã sau hiển thị chính sách của đại lý trong một vài tập:

num_episodes = 3
video_filename = 'sac_minitaur.mp4'
with imageio.get_writer(video_filename, fps=60) as video:
  for _ in range(num_episodes):
    time_step = eval_env.reset()
    video.append_data(eval_env.render())
    while not time_step.is_last():
      action_step = eval_actor.policy.action(time_step)
      time_step = eval_env.step(action_step.action)
      video.append_data(eval_env.render())

embed_mp4(video_filename)