কপিরাইট 2021 টিএফ-এজেন্ট লেখক।
TensorFlow.org এ দেখুন | Google Colab-এ চালান | GitHub-এ উৎস দেখুন | নোটবুক ডাউনলোড করুন |
ভূমিকা
রিইনফোর্সমেন্ট লার্নিং অ্যালগরিদমগুলি পরিবেশে একটি নীতি কার্যকর করার সময় অভিজ্ঞতার গতিপথ সংরক্ষণ করতে রিপ্লে বাফার ব্যবহার করে। প্রশিক্ষণের সময়, রিপ্লে বাফারগুলি এজেন্টের অভিজ্ঞতাকে "পুনরায় প্লে" করার জন্য ট্র্যাজেক্টোরির একটি উপসেট (হয় একটি অনুক্রমিক উপসেট বা একটি নমুনা) জন্য জিজ্ঞাসা করা হয়।
এই কোল্যাবে, আমরা দুটি ধরনের রিপ্লে বাফার এক্সপ্লোর করি: পাইথন-ব্যাকড এবং টেনসরফ্লো-ব্যাকড, একটি সাধারণ API শেয়ার করা। নিম্নলিখিত বিভাগগুলিতে, আমরা API বর্ণনা করি, প্রতিটি বাফার বাস্তবায়ন এবং ডেটা সংগ্রহ প্রশিক্ষণের সময় কীভাবে সেগুলি ব্যবহার করতে হয়।
সেটআপ
আপনি ইতিমধ্যে না থাকলে tf-এজেন্ট ইনস্টল করুন।
pip install tf-agents
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import tensorflow as tf
import numpy as np
from tf_agents import specs
from tf_agents.agents.dqn import dqn_agent
from tf_agents.drivers import dynamic_step_driver
from tf_agents.environments import suite_gym
from tf_agents.environments import tf_py_environment
from tf_agents.networks import q_network
from tf_agents.replay_buffers import py_uniform_replay_buffer
from tf_agents.replay_buffers import tf_uniform_replay_buffer
from tf_agents.specs import tensor_spec
from tf_agents.trajectories import time_step
রিপ্লে বাফার API
রিপ্লে বাফার ক্লাসের নিম্নলিখিত সংজ্ঞা এবং পদ্ধতি রয়েছে:
class ReplayBuffer(tf.Module):
"""Abstract base class for TF-Agents replay buffer."""
def __init__(self, data_spec, capacity):
"""Initializes the replay buffer.
Args:
data_spec: A spec or a list/tuple/nest of specs describing
a single item that can be stored in this buffer
capacity: number of elements that the replay buffer can hold.
"""
@property
def data_spec(self):
"""Returns the spec for items in the replay buffer."""
@property
def capacity(self):
"""Returns the capacity of the replay buffer."""
def add_batch(self, items):
"""Adds a batch of items to the replay buffer."""
def get_next(self,
sample_batch_size=None,
num_steps=None,
time_stacked=True):
"""Returns an item or batch of items from the buffer."""
def as_dataset(self,
sample_batch_size=None,
num_steps=None,
num_parallel_calls=None):
"""Creates and returns a dataset that returns entries from the buffer."""
def gather_all(self):
"""Returns all the items in buffer."""
return self._gather_all()
def clear(self):
"""Resets the contents of replay buffer"""
নোট যখন রিপ্লে বাফার বস্তুর সক্রিয়া করা হয় যে, এটি প্রয়োজন data_spec
উপাদানের এটি সংরক্ষণ করবে। এই বৈশিষ্ট অনুরূপ TensorSpec
গ্রহনক্ষত্রের নির্দিষ্ট আবক্র পথ উপাদান আছে যা বাফার যোগ করা হবে। এই বৈশিষ্ট সাধারণত একটি এজেন্টের দিকে তাকিয়ে দ্বারা অর্জিত হয় agent.collect_data_spec
যা সংজ্ঞায়িত করে আকার, ধরন, এবং এজেন্টের প্রত্যাশিত যখন (যে সম্পর্কে আরো পরে) প্রশিক্ষণ কাঠামো।
TFUniformReplayBuffer
TFUniformReplayBuffer
, সবচেয়ে বেশি ব্যবহৃত মেমরি-এজেন্ট এবং রিপ্লে বাফার হয় এইভাবে আমরা এখানে আমাদের টিউটোরিয়াল এটা ব্যবহার করবে। ইন TFUniformReplayBuffer
ব্যাকিং বাফার স্টোরেজ tensorflow ভেরিয়েবল দ্বারা সম্পন্ন করা হয় এবং এইভাবে কম্পিউট গ্রাফ অংশ।
উপাদানের বাফার দোকানে ব্যাচ এবং সর্বোচ্চ ক্ষমতা আছে max_length
ব্যাচ সেগমেন্ট প্রতি উপাদান। সুতরাং, মোট বাফার ক্ষমতা batch_size
এক্স max_length
উপাদান। বাফারে সংরক্ষিত উপাদানগুলির অবশ্যই একটি ম্যাচিং ডেটা স্পেক থাকতে হবে। যখন রিপ্লে বাফার ডেটা সংগ্রহের জন্য ব্যবহার করা হয়, তখন স্পেক হল এজেন্টের সংগ্রহ ডেটা স্পেক।
বাফার তৈরি করা হচ্ছে:
একটি তৈরি করতে TFUniformReplayBuffer
আমরা মধ্যে পাস:
- বাফার সংরক্ষণ করবে যে ডেটা উপাদানের স্পেক
-
batch size
বাফার ব্যাচ আকার সংশ্লিষ্ট -
max_length
ব্যাচ সেগমেন্ট প্রতি উপাদানের সংখ্যা
এখানে একটি তৈরি একটি উদাহরণ TFUniformReplayBuffer
নমুনা তথ্য চশমা, সঙ্গে batch_size
32 এবং max_length
1000।
data_spec = (
tf.TensorSpec([3], tf.float32, 'action'),
(
tf.TensorSpec([5], tf.float32, 'lidar'),
tf.TensorSpec([3, 2], tf.float32, 'camera')
)
)
batch_size = 32
max_length = 1000
replay_buffer = tf_uniform_replay_buffer.TFUniformReplayBuffer(
data_spec,
batch_size=batch_size,
max_length=max_length)
বাফারে লেখা:
রিপ্লে বাফার উপাদান যোগ করার জন্য, আমরা ব্যবহার add_batch(items)
পদ্ধতি যেখানে items
একটি তালিকা / tuple / আইটেমের ব্যাচ প্রতিনিধিত্বমূলক tensors এর নীড় বাফার যোগ করা হয়। প্রত্যেকটি উপাদান items
একটি বাইরের মাত্রা সমান থাকতে হবে batch_size
এবং অবশিষ্ট মাত্রা আইটেম (রিপ্লে বাফার কন্সট্রাকটর প্রেরণ তথ্য চশমা হিসাবে একই) ডাটা বৈশিষ্ট মেনে চলতে হবে।
এখানে আইটেম একটি ব্যাচ যোগ করার একটি উদাহরণ
action = tf.constant(1 * np.ones(
data_spec[0].shape.as_list(), dtype=np.float32))
lidar = tf.constant(
2 * np.ones(data_spec[1][0].shape.as_list(), dtype=np.float32))
camera = tf.constant(
3 * np.ones(data_spec[1][1].shape.as_list(), dtype=np.float32))
values = (action, (lidar, camera))
values_batched = tf.nest.map_structure(lambda t: tf.stack([t] * batch_size),
values)
replay_buffer.add_batch(values_batched)
বাফার থেকে পড়া
তিনটি উপায় থেকে ডেটা পড়তে হয় TFUniformReplayBuffer
:
-
get_next()
- আয় বাফার থেকে এক নমুনা। নমুনা ব্যাচের আকার এবং প্রত্যাবর্তিত টাইমস্টেপের সংখ্যা এই পদ্ধতিতে আর্গুমেন্টের মাধ্যমে নির্দিষ্ট করা যেতে পারে। -
as_dataset()
- একটি হিসাবে রিপ্লে বাফার ফেরৎtf.data.Dataset
। তারপরে কেউ একটি ডেটাসেট ইটারেটর তৈরি করতে পারে এবং বাফারের আইটেমগুলির নমুনার মাধ্যমে পুনরাবৃত্তি করতে পারে। -
gather_all()
- আকৃতি সঙ্গে আয় একটি টেন্সর যেমন বাফারে সব আইটেম[batch, time, data_spec]
এই পদ্ধতিগুলির প্রতিটি ব্যবহার করে রিপ্লে বাফার থেকে কীভাবে পড়তে হয় তার উদাহরণ নীচে দেওয়া হল:
# add more items to the buffer before reading
for _ in range(5):
replay_buffer.add_batch(values_batched)
# Get one sample from the replay buffer with batch size 10 and 1 timestep:
sample = replay_buffer.get_next(sample_batch_size=10, num_steps=1)
# Convert the replay buffer to a tf.data.Dataset and iterate through it
dataset = replay_buffer.as_dataset(
sample_batch_size=4,
num_steps=2)
iterator = iter(dataset)
print("Iterator trajectories:")
trajectories = []
for _ in range(3):
t, _ = next(iterator)
trajectories.append(t)
print(tf.nest.map_structure(lambda t: t.shape, trajectories))
# Read all elements in the replay buffer:
trajectories = replay_buffer.gather_all()
print("Trajectories from gather all:")
print(tf.nest.map_structure(lambda t: t.shape, trajectories))
WARNING:tensorflow:From /tmp/ipykernel_15476/1348928897.py:7: ReplayBuffer.get_next (from tf_agents.replay_buffers.replay_buffer) is deprecated and will be removed in a future version. Instructions for updating: Use `as_dataset(..., single_deterministic_pass=False) instead. WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/data/experimental/ops/counter.py:66: scan (from tensorflow.python.data.experimental.ops.scan_ops) is deprecated and will be removed in a future version. Instructions for updating: Use `tf.data.Dataset.scan(...) instead Iterator trajectories: [(TensorShape([4, 2, 3]), (TensorShape([4, 2, 5]), TensorShape([4, 2, 3, 2]))), (TensorShape([4, 2, 3]), (TensorShape([4, 2, 5]), TensorShape([4, 2, 3, 2]))), (TensorShape([4, 2, 3]), (TensorShape([4, 2, 5]), TensorShape([4, 2, 3, 2])))] WARNING:tensorflow:From /tmp/ipykernel_15476/1348928897.py:24: ReplayBuffer.gather_all (from tf_agents.replay_buffers.replay_buffer) is deprecated and will be removed in a future version. Instructions for updating: Use `as_dataset(..., single_deterministic_pass=True)` instead. Trajectories from gather all: (TensorShape([32, 6, 3]), (TensorShape([32, 6, 5]), TensorShape([32, 6, 3, 2])))
PyUniformReplayBuffer
PyUniformReplayBuffer
হিসাবে একই functionaly হয়েছে TFUniformReplayBuffer
কিন্তু এর পরিবর্তে TF ভেরিয়েবল, তার ডেটা numpy অ্যারে মধ্যে সংরক্ষিত হয়। এই বাফারটি গ্রাফের বাইরের ডেটা সংগ্রহের জন্য ব্যবহার করা যেতে পারে। নম্পিতে ব্যাকিং স্টোরেজ থাকা কিছু অ্যাপ্লিকেশনের জন্য টেনসরফ্লো ভেরিয়েবল ব্যবহার না করেই ডেটা ম্যানিপুলেশন (যেমন অগ্রাধিকার আপডেট করার জন্য ইন্ডেক্সিং) করা সহজ করে তুলতে পারে। যাইহোক, এই বাস্তবায়নে Tensorflow এর সাথে গ্রাফ অপ্টিমাইজেশনের সুবিধা হবে না।
নীচে একটি শুরু করতে গিয়ে একটি উদাহরণ PyUniformReplayBuffer
এজেন্ট এর নীতি গ্রহনক্ষত্রের নির্দিষ্ট আবক্র পথ চশমা থেকে:
replay_buffer_capacity = 1000*32 # same capacity as the TFUniformReplayBuffer
py_replay_buffer = py_uniform_replay_buffer.PyUniformReplayBuffer(
capacity=replay_buffer_capacity,
data_spec=tensor_spec.to_nest_array_spec(data_spec))
প্রশিক্ষণের সময় রিপ্লে বাফার ব্যবহার করা
এখন যেহেতু আমরা জানি কিভাবে একটি রিপ্লে বাফার তৈরি করতে হয়, এতে আইটেম লিখতে হয় এবং এটি থেকে পড়তে হয়, আমরা আমাদের এজেন্টদের প্রশিক্ষণের সময় ট্র্যাজেক্টরি সংরক্ষণ করতে এটি ব্যবহার করতে পারি।
তথ্য সংগ্রহ
প্রথমে, আসুন দেখি কিভাবে ডেটা সংগ্রহের সময় রিপ্লে বাফার ব্যবহার করতে হয়।
মেমরি-এজেন্ট আমরা ব্যবহার Driver
একটা পরিবেশে (দেখুন আরো বিস্তারিত জানার জন্য ড্রাইভার টিউটোরিয়াল) সংগ্রহ অভিজ্ঞতা। ব্যবহার করার জন্য Driver
, আমরা একটি নির্দিষ্ট Observer
জন্য একটি ফাংশন যে Driver
চালানো যখন এটি একটি গ্রহনক্ষত্রের নির্দিষ্ট আবক্র পথ গ্রহণ করে।
সুতরাং, রিপ্লে বাফার থেকে গ্রহনক্ষত্রের নির্দিষ্ট আবক্র পথ উপাদান যোগ করার জন্য, আমরা যে কল একটি পর্যবেক্ষক যোগ add_batch(items)
রিপ্লে বাফার আইটেম একটি ব্যাচ যোগ করতে।
নীচে এই একটি উদাহরণ TFUniformReplayBuffer
। আমরা প্রথমে একটি পরিবেশ, একটি নেটওয়ার্ক এবং একটি এজেন্ট তৈরি করি। তারপর আমরা একটি তৈরি TFUniformReplayBuffer
। নোট করুন যে রিপ্লে বাফারে ট্র্যাজেক্টরি উপাদানগুলির স্পেস এজেন্টের সংগ্রহ করা ডেটা স্পেকের সমান। আমরা তখন তার সেট add_batch
চালক যে ডেটা আমাদের প্রশিক্ষণের সময় সংগ্রহ করতে হবে জন্য পর্যবেক্ষক হিসাবে পদ্ধতি:
env = suite_gym.load('CartPole-v0')
tf_env = tf_py_environment.TFPyEnvironment(env)
q_net = q_network.QNetwork(
tf_env.time_step_spec().observation,
tf_env.action_spec(),
fc_layer_params=(100,))
agent = dqn_agent.DqnAgent(
tf_env.time_step_spec(),
tf_env.action_spec(),
q_network=q_net,
optimizer=tf.compat.v1.train.AdamOptimizer(0.001))
replay_buffer_capacity = 1000
replay_buffer = tf_uniform_replay_buffer.TFUniformReplayBuffer(
agent.collect_data_spec,
batch_size=tf_env.batch_size,
max_length=replay_buffer_capacity)
# Add an observer that adds to the replay buffer:
replay_observer = [replay_buffer.add_batch]
collect_steps_per_iteration = 10
collect_op = dynamic_step_driver.DynamicStepDriver(
tf_env,
agent.collect_policy,
observers=replay_observer,
num_steps=collect_steps_per_iteration).run()
ট্রেনের ধাপের জন্য ডেটা পড়া
রিপ্লে বাফারে ট্র্যাজেক্টরি উপাদান যোগ করার পর, আমরা ট্রেনের ধাপের জন্য ইনপুট ডেটা হিসাবে ব্যবহার করার জন্য রিপ্লে বাফার থেকে ট্র্যাজেক্টরির ব্যাচগুলি পড়তে পারি।
ট্রেনিং লুপে রিপ্লে বাফার থেকে ট্র্যাজেক্টরিতে কীভাবে প্রশিক্ষণ দেওয়া যায় তার একটি উদাহরণ এখানে দেওয়া হল:
# Read the replay buffer as a Dataset,
# read batches of 4 elements, each with 2 timesteps:
dataset = replay_buffer.as_dataset(
sample_batch_size=4,
num_steps=2)
iterator = iter(dataset)
num_train_steps = 10
for _ in range(num_train_steps):
trajectories, _ = next(iterator)
loss = agent.train(experience=trajectories)
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/util/dispatch.py:206: calling foldr_v2 (from tensorflow.python.ops.functional_ops) with back_prop=False is deprecated and will be removed in a future version. Instructions for updating: back_prop=False is deprecated. Consider using tf.stop_gradient instead. Instead of: results = tf.foldr(fn, elems, back_prop=False) Use: results = tf.nest.map_structure(tf.stop_gradient, tf.foldr(fn, elems))