Experience Replay ও Target Network
এই পাঠে যা শিখবেন
- Replay buffer architecture ও sampling strategies
- Prioritized Experience Replay (PER)
- Target network — hard vs soft update
- Hindsight Experience Replay (HER) — sparse reward-এর সমাধান
১ · Replay buffer-এর architecture
Buffer = circular queue. Capacity $N$ (টিপিকাল 1M for Atari). প্রতি transition $(s, a, r, s', d)$ store.
Sampling — random batch (typically 32-512). Replay age = oldest transition কত step আগের।
Capacity: 1M typical. বড় buffer = stable training, কিন্তু memory cost.
Batch size: 32-512. গ্রেডিয়েন্ট estimate quality.
Min-replay (warmup): training শুরুর আগে কত transition. typically 50K.
২ · কেন uniform replay যথেষ্ট না
Uniform sample — কিছু সমস্যা:
- Rare important transition (e.g., terminal reward) sample হার কম।
- Already-learned region-এর transition বেশি — wasted compute.
- Non-uniform learning progress.
৩ · Prioritized Experience Replay (Schaul et al., 2016)
Idea: TD-error বড় যেখানে — সেখানে শেখার সুযোগ বেশি।
Priority $p_i = |\delta_i| + \epsilon$।
Sampling probability: $P(i) = p_i^\alpha / \sum_k p_k^\alpha$।
$\alpha = 0$ → uniform. $\alpha = 1$ → fully prioritized.
Importance sampling correction: bias avoid করতে weight $w_i = (1/(N \cdot P(i)))^\beta$ — loss-এ multiply.
৪ · Sum-tree data structure
Naive priority sampling — $O(N)$ per draw. Sum-tree — $O(\log N)$।
Binary tree, leaf = priority. internal node = sum of children. sample = random in [0, total]. walk down tree.
import numpy as np
class SumTree:
def __init__(self, capacity):
self.cap = capacity
self.tree = np.zeros(2 * capacity) # internal + leaves
self.data = [None] * capacity
self.write = 0
self.size = 0
def _propagate(self, idx, change):
parent = (idx - 1) // 2
self.tree[parent] += change
if parent != 0:
self._propagate(parent, change)
def add(self, priority, transition):
idx = self.write + self.cap - 1
self.data[self.write] = transition
self._update(idx, priority)
self.write = (self.write + 1) % self.cap
self.size = min(self.size + 1, self.cap)
def _update(self, idx, priority):
change = priority - self.tree[idx]
self.tree[idx] = priority
self._propagate(idx, change)
def sample(self, value):
idx = 0
while idx < self.cap - 1:
left = 2 * idx + 1
if value <= self.tree[left]:
idx = left
else:
value -= self.tree[left]
idx = left + 1
data_idx = idx - self.cap + 1
return data_idx, self.tree[idx], self.data[data_idx]
print("Sum-tree-এ priority sampling — O(log N).")
৫ · Target network — soft vs hard update
Hard update (DQN, original):
Every $C$ steps: $\theta^- \leftarrow \theta$।
Soft update (DDPG, SAC, TD3):
Every step: $\theta^- \leftarrow \tau \theta + (1 - \tau) \theta^-$, $\tau \approx 0.005$।
Equivalence: hard $C = 1/\tau$ steps-এর সাথে soft roughly equal.
Empirical:
- Hard simpler, OK for discrete (Atari).
- Soft smoother, better for continuous (MuJoCo).
৬ · Hindsight Experience Replay (HER)
Andrychowicz et al. (2017) — sparse-reward task-এর জন্য brilliant idea.
Problem: "Goal G তে পৌঁছাও" — goal না পৌঁছালে reward 0. random exploration কখনো reward পায় না।
HER: failed episode-এ — actually-reached state-কে "hindsight goal" ধরে replay. প্রতিটি episode useful learning signal দেয়।
Effect: robotic manipulation-এ — pure DDPG fail, DDPG+HER solve.
৭ · Recent variants
- Distributed replay (Ape-X): ১০০০ actors parallel, central learner.
- Prioritized + recurrent (R2D2): stored sequence — RNN training.
- Reverb (DeepMind): production-grade replay framework.
- NLE (NetHack): replay with full game memory.
৮ · Replay-এর সমস্যা
- Off-policy distribution shift: old data current policy-র নয়। distribution mismatch.
- Large memory: 1M Atari frame ~10GB (uint8 এ store).
- Stale data: very old transitions wrong policy-এর — bias.
- Non-stationary task: environment বদলে গেলে — old data ভুল।
৯ · Modern alternatives
Replay-এর alternative — on-policy (PPO, A3C):
- প্রতিটি batch fresh — distribution mismatch নেই।
- সরল implementation.
- কিন্তু sample inefficient — প্রতি transition একবার ব্যবহার।
Hybrid (PPO + buffer): recent variants — small replay-এর সাথে on-policy update.
ভাবনার প্রশ্ন
প্র ০১Replay buffer-এর capacity choice — large বনাম small trade-off?
Large buffer (10M+):
- Pros: more diverse data, decorrelated, stable training.
- Cons: stale data (very old policy), memory cost (10s of GB).
Small buffer (10K):
- Pros: data current policy-এর কাছে, memory-friendly.
- Cons: high correlation, gradient noisy, may overfit recent.
Sweet spot: task-dependent. Atari 1M, MuJoCo 100K-1M, simple Gym 10K-50K.
Diagnostic: if return curve oscillates wildly — buffer too small. if learning slow — too large.
Modern: Reverb-এর "removed sample" tracking — adaptive sizing.
প্র ০২Prioritized replay-এর importance sampling correction কেন দরকার?
Priority sampling — distribution change. যেমন high-error transition ১০x sampled — gradient estimate biased.
$\hat{g} = \frac{1}{N} \sum_i \nabla L_i$ — uniform sample-এ unbiased estimate.
Prioritized sampling-এ — $\hat{g}_{prio} = \frac{1}{B} \sum_{i \sim P} \nabla L_i$ — biased toward high-error.
Correction: importance weight $w_i = (1/(N \cdot P(i)))^\beta$।
$\hat{g}_{corr} = \frac{1}{B} \sum_i w_i \nabla L_i$ — unbiased ($\beta = 1$)।
$\beta$ schedule: training শুরুতে $\beta = 0.4$ (some bias OK), শেষে $\beta = 1$ (fully correct).
কেন বিরাট performance gain: Atari-এ PER → 2-5× sample efficiency. key: rare-but-important transitions (terminal, breakthrough) more visible.
প্র ০৩HER কীভাবে sparse reward solve করে?
Setup: Goal-conditioned RL — state + goal $g$, reward $R(s, g) = \mathbb{1}[s = g]$ (sparse).
Naive: goal $g$ পৌঁছানো ছাড়া কোনো reward — random policy কখনো পৌঁছায় না — কিছু শেখে না।
HER trick: failed episode (goal $g$ achieve হয়নি, কিন্তু other state $s'$ visit হয়েছে) — "what if goal was $s'$?" perspective থেকে relabel.
Replay:
- Original: $(s, a, r=0, s', g)$।
- HER: $(s, a, r=1, s', g'=s_{\text{achieved}})$।
কেন এটা valid: reward function $R(s, g) = \mathbb{1}[s = g]$ — পুরো $g$-এর space-এ একই formula. তাই different $g$ relabel correct reward দেয়।
Sampling strategies:
- Future — episode-এর later state goal হিসেবে।
- Final — episode-এর last state.
- Episode — random episode state.
Empirical: robot block-stacking — DDPG fail, DDPG+HER works in ~1M samples. OpenAI Robotics suite-এর foundation.
প্র ০৪On-policy (PPO) ও off-policy (DQN) — কেন একই algorithm-এর জগতে coexist?
দু'টি paradigm-এর fundamental trade-off:
On-policy (PPO, A2C):
- Pros:
- Stable — distribution match training data.
- Simpler — no replay, no target net.
- Theoretical guarantees stronger.
- Cons: sample inefficient — কোটি sample.
Off-policy (DQN, SAC):
- Pros:
- Sample efficient — replay reuse.
- Real-world friendly (where samples expensive).
- Cons: instability, complex algorithm.
কখন কোনটি:
- Cheap simulator (Atari, MuJoCo, parallel envs): PPO simpler, often best.
- Expensive real-world: SAC/DQN — sample efficiency critical.
- Continuous control with cheap sim: PPO popular.
- RLHF (LLM): PPO standard (per-token cost low).
মূল উপলব্ধি: "best algorithm" task-dependent. architecture-এর choice domain-এর economics-এর প্রতিফলন।
অনুশীলন
-
Memory math: Atari frame 84×84×4 (uint8). 1M buffer-এর memory?
প্রতি transition: 2 frames (s + s') × 84·84·4 = 56448 bytes (~55 KB).
1M × 55 KB ≈ 53 GB. তাই DQN paper "lazy frame" trick ব্যবহার করে — overlapping frames share.
-
Soft update vs hard: $\tau = 0.001$ — কত step-এ target ~ 50% updated? equivalent hard $C$?
Half-life: $(1-\tau)^k = 0.5 \Rightarrow k \approx \ln 2 / \tau = 693$ steps.
Equivalent hard $C \approx 1/\tau = 1000$ steps.
-
PER priority: 5 transitions, $|\delta| = [10, 1, 5, 1, 1]$, $\alpha=1$। transition 1-এর sampling probability?
Sum = 10+1+5+1+1 = 18. P(1) = 10/18 ≈ 0.556.
আরও পড়ুন
- পাঠ ১৫ · Double & Dueling DQN পরবর্তী পাঠDQN-এর architectural improvements.
- পাঠ ১৩ · DQN আগের পাঠএই দু'টি trick যেখানে introduce.
- পাঠ ২২ · SAC এই পাঠের সাথে সম্পর্কিতSoft update + replay-এর modern incarnation.
- সব AI Courses ABCL TECHPython, ML, DL, NLP, CV, GenAI, RL — সব একসাথে।