This page was translated by the Cloud Translation API.
Switch to English

রিপ্লে বাফারস

টেনসরফ্লো.আর.জে দেখুন গুগল কোলাবে চালান গিটহাবের উত্স দেখুন নোটবুক ডাউনলোড করুন

ভূমিকা

শক্তিবৃদ্ধি শেখার অ্যালগরিদম কোনও পরিবেশে কোনও নীতি সম্পাদন করার সময় অভিজ্ঞতার ট্র্যাজেক্টরিগুলি সঞ্চয় করতে রিপ্লে বাফার ব্যবহার করে। প্রশিক্ষণের সময়, রিপ্লে বাফারগুলিকে এজেন্টের অভিজ্ঞতা "রিপ্লে" করতে ট্র্যাজিকোলজির একটি উপসেট (কোনও ক্রমিক সাবসেট বা একটি নমুনা) অনুসন্ধান করা হয়।

এই কোলাবে, আমরা দুটি ধরণের রিপ্লে বাফারগুলি ঘুরে দেখি: পাইথন-ব্যাকড এবং টেনসরফ্লো ব্যাকড, একটি সাধারণ এপিআই ভাগ করে নেওয়া। নিম্নলিখিত বিভাগগুলিতে, আমরা এপিআই, প্রতিটি বাফার বাস্তবায়ন এবং ডেটা সংগ্রহ প্রশিক্ষণের সময় তাদের কীভাবে ব্যবহার করব তা বর্ণনা করি।

সেটআপ

টিএফ-এজেন্টগুলি ইনস্টল করুন যদি আপনার ইতিমধ্যে না থাকে।

pip install -q --pre tf-agents[reverb]
pip install -q gym
WARNING: You are using pip version 20.1.1; however, version 20.2 is available.
You should consider upgrading via the '/tmpfs/src/tf_docs_env/bin/python -m pip install --upgrade pip' command.
WARNING: You are using pip version 20.1.1; however, version 20.2 is available.
You should consider upgrading via the '/tmpfs/src/tf_docs_env/bin/python -m pip install --upgrade pip' command.

 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

tf.compat.v1.enable_v2_behavior()
 

রিপ্লে বাফার এপিআই

রিপ্লে বাফার ক্লাসে নিম্নলিখিত সংজ্ঞা এবং পদ্ধতি রয়েছে:

 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 জন্য উপাদানগুলির data_spec প্রয়োজন। এই বৈশিষ্টটি TensorSpec উপাদানগুলির TensorSpec সাথে মিলে যায় যা বাফারে যুক্ত হবে। সাধারণত এই এজেন্টটি কোনও এজেন্টের agent.collect_data_spec দেখে অর্জিত হয় যা প্রশিক্ষণের সময় এজেন্ট দ্বারা প্রত্যাশিত আকার, প্রকার এবং কাঠামোগুলি সংজ্ঞায়িত করে (পরে আরও এটি)

TFUniformReplayBuffer

TFUniformReplayBuffer টিএফ-এজেন্টগুলির মধ্যে সর্বাধিক ব্যবহৃত রিপ্লে বাফার, সুতরাং আমরা এটি এখানে আমাদের টিউটোরিয়ালে ব্যবহার করব। TFUniformReplayBuffer এ ব্যাকিং বাফার স্টোরেজটি টেনসরফ্লো ভেরিয়েবল দ্বারা সম্পন্ন হয় এবং এটি গণনা গ্রাফের অংশ।

বাফার উপাদানগুলির ব্যাচগুলি সংরক্ষণ করে এবং প্রতি ব্যাচ সেগমেন্টে সর্বাধিক ক্ষমতা সর্বাধিক max_length উপাদান রয়েছে। সুতরাং, মোট বাফার ক্ষমতাটি batch_size এক্স max_length উপাদান। বাফারে সংরক্ষিত উপাদানগুলির অবশ্যই একটি মেলানো ডেটা স্পেক থাকা উচিত। যখন রিপ্লে বাফারটি ডেটা সংগ্রহের জন্য ব্যবহার করা হয়, তখন সেই স্পপটি এজেন্টের সংগ্রহের ডেটা বিশিষ্ট হয়।

বাফার তৈরি করা হচ্ছে:

একটি TFUniformReplayBuffer তৈরি করতে আমরা এখানে প্রবেশ করি:

  1. বাফার সংরক্ষণ করবে এমন ডেটা উপাদানগুলির স্পেক
  2. বাফারের batch size সাথে সম্পর্কিত ব্যাচের আকার
  3. প্রতি ব্যাচ সেগমেন্টে উপাদানের max_length সংখ্যা

নমুনা ডেটা চশমা, batch_size 32 এবং max_length 1000 সহ একটি TFUniformReplayBuffer তৈরির উদাহরণ এখানে।

 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 বাফারে যুক্ত হওয়ার জন্য আইটেমগুলির ব্যাচ উপস্থাপনকারী add_batch(items) তালিকা / টুপল / বাসা হয়। items প্রতিটি উপাদানের অবশ্যই একটি বাহ্যিক মাত্রা সমান batch_size এবং অবশিষ্ট মাত্রাগুলি অবশ্যই আইটেমের ডেটা batch_size মেনে চলতে হবে (রিপ্লে বাফার কনস্ট্রাক্টরের কাছে পাস করা ডেটা 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 থেকে ডেটা পড়ার জন্য তিনটি উপায় TFUniformReplayBuffer :

  1. get_next() - বাফার থেকে একটি নমুনা দেয়। নমুনা ব্যাচের আকার এবং প্রত্যাবর্তনের টাইমস্টেপগুলি এই পদ্ধতিতে যুক্তির মাধ্যমে নির্দিষ্ট করা যেতে পারে।
  2. as_dataset() - রিফ্লে বাফারকে tf.data.Dataset হিসাবে tf.data.Dataset । এরপরে কেউ বাফার আইটেমগুলির নমুনাগুলির মাধ্যমে একটি ডেটাসেট পুনরুক্তি তৈরি করতে এবং পুনরাবৃত্তি করতে পারে।
  3. gather_all() - বাফারের সমস্ত আইটেমকে [batch, time, data_spec] আকার হিসাবে [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 <ipython-input-6-1f9907631cb9>: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.
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 <ipython-input-6-1f9907631cb9>: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 এর মতো একই কার্যকারিতা TFUniformReplayBuffer তবে টিএফ ভেরিয়েবলের পরিবর্তে, এর ডেটা অসাধারণ অ্যারেতে সংরক্ষণ করা হয়। এই বাফারটি গ্রাফের বাইরে ডেটা সংগ্রহের জন্য ব্যবহার করা যেতে পারে। নম্পিতে ব্যাকিং স্টোরেজ থাকায় কিছু অ্যাপ্লিকেশনগুলির জন্য টেনসরফ্লো ভেরিয়েবলগুলি ব্যবহার না করে ডেটা ম্যানিপুলেশন করা (যেমন অগ্রাধিকারগুলি আপডেট করার জন্য সূচীকরণ করা) আরও সহজ করা যায়। যাইহোক, এই বাস্তবায়নটি টেনসরফ্লো সহ গ্রাফ অপ্টিমাইজেশনের সুবিধা পাবে না।

নীচে এজেন্টের পলিসি ট্র্যাজেক্টোরি স্পেকস থেকে একটি 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 তৈরি 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()
 
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tf_agents/drivers/dynamic_step_driver.py:203: calling while_loop_v2 (from tensorflow.python.ops.control_flow_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.while_loop(c, b, vars, back_prop=False)
Use:
results = tf.nest.map_structure(tf.stop_gradient, tf.while_loop(c, b, vars))

ট্রেনের পদক্ষেপের জন্য ডেটা পড়া

রিপ্লে বাফারে ট্র্যাজেক্টরি উপাদান যুক্ত করার পরে, আমরা ট্রেনের পদক্ষেপের ইনপুট ডেটা হিসাবে ব্যবহার করতে রিপ্লে বাফার থেকে ট্র্যাজেক্টরিগুলির ব্যাচগুলি পড়তে পারি।

প্রশিক্ষণ লুপে রিপ্লে বাফার থেকে ট্র্যাজেক্টরিগুলিতে কীভাবে প্রশিক্ষণ দেওয়া যায় তার উদাহরণ এখানে:

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