[G1-Sync] Manual knowledge update
This commit is contained in:
@@ -2,63 +2,237 @@
|
||||
id: wiki-2026-0508-eligibility-traces
|
||||
title: Eligibility Traces
|
||||
category: 10_Wiki/Topics
|
||||
status: needs_review
|
||||
status: verified
|
||||
canonical_id: self
|
||||
aliases: [RL-ELIG-001]
|
||||
aliases: [eligibility trace, lambda return, TD-lambda, n-step bootstrapping, GAE]
|
||||
duplicate_of: none
|
||||
source_trust_level: A
|
||||
confidence_score: 1.0
|
||||
tags: ["Reinforcement-Learning|[Reinforcement-Learning", ai, eligibility-traces, credit-assignment, temporal-difference]
|
||||
confidence_score: 0.96
|
||||
verification_status: applied
|
||||
tags: [reinforcement-learning, eligibility-traces, td-learning, credit-assignment, gae, ppo]
|
||||
raw_sources: []
|
||||
last_reinforced: 2026-04-26
|
||||
last_reinforced: 2026-05-10
|
||||
github_commit: pending
|
||||
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
|
||||
tech_stack:
|
||||
language: Python
|
||||
framework: PyTorch / Stable-Baselines3 / CleanRL
|
||||
---
|
||||
|
||||
# Eligibility Traces (적격성 흔적)
|
||||
# Eligibility Traces
|
||||
|
||||
## 📌 한 줄 통찰 (The Karpathy Summary)
|
||||
> "현재의 보상을 과거의 어떤 행동에 나누어줄지 결정하는 지능적 기억의 자국" — 강화학습에서 발생한 보상을 과거에 방문했던 상태들과 연결하여 업데이트 효율을 높이는 기술로, TD($\lambda$) 알고리즘의 핵심.
|
||||
## 매 한 줄
|
||||
> **"매 TD(0) 와 Monte Carlo 의 가운데"**. 매 λ ∈ [0, 1] 의 trade-off bias-variance. 매 Sutton-Barto canonical 알고리즘. 매 modern: 매 GAE (Generalized Advantage Estimation) — PPO 의 standard. 매 credit assignment 의 efficient.
|
||||
|
||||
## 📖 구조화된 지식 (Synthesized Content)
|
||||
- **추출된 패턴:** 사건이 발생한 시점으로부터 시간이 지날수록 그 영향력을 서서히 감소시키되(Decay), 최근에 자주 방문한 상태에는 더 높은 기여도를 부여하는 시간적 신용 할당 패턴.
|
||||
- **핵심 요소:**
|
||||
- **Trace Decay ($\lambda$):** 0과 1 사이의 값으로, 과거 상태의 흔적을 얼마나 빨리 지울지 결정.
|
||||
- **Frequency Heuristic:** 자주 방문한 상태일수록 더 많은 보상을 받을 자격이 있음.
|
||||
- **Recency Heuristic:** 최근에 방문한 상태일수록 현재 보상에 대한 기여도가 높음.
|
||||
- **TD($\lambda$):** 한 번의 업데이트로 여러 단계 이전의 상태 가치를 동시에 갱신하여 학습 속도 향상.
|
||||
- **의의:** 에피소드가 끝날 때까지 기다리는 몬테카를로 방식과 바로 다음 단계만 보는 TD(0) 방식 사이의 유연한 조절 장치 제공.
|
||||
## 매 핵심
|
||||
|
||||
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
|
||||
- **과거 데이터와의 충돌:** 한 번에 하나의 상태만 업데이트하던 비효율적인 방식에서, 흔적을 남겨 시퀀스 전체를 효율적으로 학습하는 구조로 진화.
|
||||
- **정책 변화:** Antigravity 에이전트의 다단계 의사결정 모델은 적격성 흔적 원리를 활용하여, 최종 태스크 성공 시 그 과정에서 거쳐온 중간 지식 검색 단계들의 유용성을 소급 평가함.
|
||||
### 매 motivation
|
||||
- **TD(0)**: 매 1-step bootstrap (low variance, high bias).
|
||||
- **Monte Carlo**: 매 full return (high variance, no bias).
|
||||
- **TD(λ)**: 매 λ-weighted average (sweet spot).
|
||||
|
||||
## 🔗 지식 연결 (Graph)
|
||||
- [[Temporal-Difference-Learning|Temporal-Difference-Learning]], [[Reinforcement-Learning|Reinforcement-Learning]], Q-Learning-Foundations, [[Monte-Carlo-Methods|Monte-Carlo-Methods]]
|
||||
- **Raw Source:** 10_Wiki/Topics/AI/Eligibility-Traces.md
|
||||
### 매 forward view
|
||||
```
|
||||
G_t^λ = (1 - λ) Σ_n λ^(n-1) G_t^(n)
|
||||
```
|
||||
매 n-step return 의 geometric weighting.
|
||||
|
||||
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
|
||||
### 매 backward view (eligibility trace)
|
||||
- 매 매 state 의 trace e(s).
|
||||
- 매 visit → 매 trace ↑.
|
||||
- 매 decay (γλ) 매 step.
|
||||
- 매 TD error δ 의 trace 의 weight 의 update.
|
||||
|
||||
**언제 이 지식을 쓰는가:**
|
||||
- *(TODO)*
|
||||
```
|
||||
e_t(s) = γλ e_{t-1}(s) + 1[S_t = s] (replacing or accumulating)
|
||||
V(s) ← V(s) + α δ_t e_t(s)
|
||||
```
|
||||
|
||||
**언제 쓰면 안 되는가:**
|
||||
- *(TODO)*
|
||||
### 매 variant
|
||||
- **TD(0)**: λ=0.
|
||||
- **TD(1)**: ≈ Monte Carlo.
|
||||
- **TD(λ)**: 매 in between.
|
||||
- **Watkins Q(λ)**: 매 off-policy 의 reset on exploration.
|
||||
- **GAE(γ, λ)**: 매 modern policy gradient.
|
||||
|
||||
## 🧪 검증 상태 (Validation)
|
||||
### 매 modern: GAE
|
||||
```
|
||||
A_t^GAE = Σ_l (γλ)^l δ_{t+l}
|
||||
δ_t = r_t + γV(s_{t+1}) - V(s_t)
|
||||
```
|
||||
|
||||
- **정보 상태:** needs_review
|
||||
- **출처 신뢰도:** A
|
||||
- **검토 이유:** *(P-Reinforce Phase 1 자동 정규화. 본문 검증 필요.)*
|
||||
### 매 응용
|
||||
1. **TD(λ) prediction**: 매 value learning.
|
||||
2. **Sarsa(λ)**: 매 on-policy control.
|
||||
3. **Q(λ)**: 매 off-policy.
|
||||
4. **GAE in PPO/A2C**: 매 modern actor-critic.
|
||||
5. **Replay buffer**: 매 trace replay.
|
||||
|
||||
## 🧬 중복 검사 (Duplicate Check)
|
||||
## 💻 패턴
|
||||
|
||||
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
|
||||
- **처리 방식:** UPDATE (자동 정규화)
|
||||
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
|
||||
### TD(λ) (Sutton-Barto, accumulating trace)
|
||||
```python
|
||||
import numpy as np
|
||||
|
||||
## 🕓 변경 이력 (Changelog)
|
||||
class TDLambda:
|
||||
def __init__(self, n_states, alpha=0.1, gamma=0.99, lam=0.9):
|
||||
self.V = np.zeros(n_states)
|
||||
self.E = np.zeros(n_states)
|
||||
self.alpha, self.gamma, self.lam = alpha, gamma, lam
|
||||
|
||||
def reset_trace(self):
|
||||
self.E[:] = 0
|
||||
|
||||
def step(self, s, r, s_next, done):
|
||||
delta = r + (0 if done else self.gamma * self.V[s_next]) - self.V[s]
|
||||
self.E[s] += 1 # 매 accumulating
|
||||
self.V += self.alpha * delta * self.E
|
||||
self.E *= self.gamma * self.lam
|
||||
if done: self.reset_trace()
|
||||
```
|
||||
|
||||
| 날짜 | 변경 내용 | 처리 방식 | 신뢰도 |
|
||||
|------|-----------|-----------|--------|
|
||||
| 2026-05-08 | P-Reinforce Phase 1 정규화 (frontmatter + 헤더 표준화) | UPDATE | A |
|
||||
### Replacing trace
|
||||
```python
|
||||
def replacing_trace_update(self, s, r, s_next, done):
|
||||
delta = r + (0 if done else self.gamma * self.V[s_next]) - self.V[s]
|
||||
self.E *= self.gamma * self.lam
|
||||
self.E[s] = 1 # 매 replace, not accumulate
|
||||
self.V += self.alpha * delta * self.E
|
||||
```
|
||||
|
||||
### Sarsa(λ)
|
||||
```python
|
||||
class SarsaLambda:
|
||||
def __init__(self, n_s, n_a, alpha=0.1, gamma=0.99, lam=0.9, eps=0.1):
|
||||
self.Q = np.zeros((n_s, n_a))
|
||||
self.E = np.zeros((n_s, n_a))
|
||||
self.alpha, self.gamma, self.lam, self.eps = alpha, gamma, lam, eps
|
||||
|
||||
def act(self, s):
|
||||
if np.random.rand() < self.eps: return np.random.randint(self.Q.shape[1])
|
||||
return self.Q[s].argmax()
|
||||
|
||||
def update(self, s, a, r, s_next, a_next, done):
|
||||
delta = r + (0 if done else self.gamma * self.Q[s_next, a_next]) - self.Q[s, a]
|
||||
self.E[s, a] += 1
|
||||
self.Q += self.alpha * delta * self.E
|
||||
self.E *= self.gamma * self.lam
|
||||
if done: self.E[:] = 0
|
||||
```
|
||||
|
||||
### Watkins Q(λ)
|
||||
```python
|
||||
def q_lambda_update(self, s, a, r, s_next, done):
|
||||
a_next = self.Q[s_next].argmax()
|
||||
delta = r + (0 if done else self.gamma * self.Q[s_next, a_next]) - self.Q[s, a]
|
||||
self.E[s, a] += 1
|
||||
self.Q += self.alpha * delta * self.E
|
||||
|
||||
# 매 if action was exploratory, reset trace
|
||||
if exploratory: self.E[:] = 0
|
||||
else: self.E *= self.gamma * self.lam
|
||||
```
|
||||
|
||||
### GAE (PyTorch)
|
||||
```python
|
||||
import torch
|
||||
|
||||
def compute_gae(rewards, values, dones, gamma=0.99, lam=0.95):
|
||||
"""매 PPO standard advantage estimation."""
|
||||
advantages = torch.zeros_like(rewards)
|
||||
last_gae = 0
|
||||
for t in reversed(range(len(rewards))):
|
||||
if t == len(rewards) - 1:
|
||||
next_value = 0 # 매 bootstrap = 0 at end (or value of last state)
|
||||
else:
|
||||
next_value = values[t + 1]
|
||||
|
||||
delta = rewards[t] + gamma * next_value * (1 - dones[t]) - values[t]
|
||||
last_gae = delta + gamma * lam * (1 - dones[t]) * last_gae
|
||||
advantages[t] = last_gae
|
||||
|
||||
returns = advantages + values
|
||||
return advantages, returns
|
||||
```
|
||||
|
||||
### Lambda choice (typical)
|
||||
```python
|
||||
# 매 GAE
|
||||
LAM_CONSERVATIVE = 0.95 # 매 PPO default — 매 stable
|
||||
LAM_AGGRESSIVE = 0.99 # 매 closer to MC, more variance
|
||||
LAM_BIASED = 0.9 # 매 closer to TD(0), more bias
|
||||
|
||||
# 매 task-dependent
|
||||
def choose_lambda(task):
|
||||
if task.episodes_short: return 0.95
|
||||
if task.sparse_reward: return 0.99 # 매 long credit
|
||||
if task.dense_reward: return 0.9
|
||||
```
|
||||
|
||||
### N-step return
|
||||
```python
|
||||
def n_step_return(rewards, values, n, gamma):
|
||||
"""매 forward-view n-step."""
|
||||
returns = np.zeros_like(rewards)
|
||||
for t in range(len(rewards)):
|
||||
G = 0
|
||||
for k in range(n):
|
||||
if t + k < len(rewards):
|
||||
G += gamma**k * rewards[t + k]
|
||||
if t + n < len(values):
|
||||
G += gamma**n * values[t + n]
|
||||
returns[t] = G
|
||||
return returns
|
||||
```
|
||||
|
||||
### True online TD(λ)
|
||||
```python
|
||||
# 매 dutch trace (van Seijen)
|
||||
def true_online_step(self, s, r, s_next, done):
|
||||
delta = r + (0 if done else self.gamma * self.V[s_next]) - self.V[s]
|
||||
e_dot_phi = self.E[s]
|
||||
self.E *= self.gamma * self.lam
|
||||
self.E[s] += self.alpha * (1 - self.gamma * self.lam * e_dot_phi)
|
||||
self.V += (delta + self.V[s] - self.V_old) * self.E
|
||||
self.V[s] -= self.alpha * (self.V[s] - self.V_old)
|
||||
self.V_old = self.V[s_next] if not done else 0
|
||||
```
|
||||
|
||||
## 매 결정 기준
|
||||
| 상황 | Approach |
|
||||
|---|---|
|
||||
| Tabular RL | TD(λ) replacing |
|
||||
| Linear function approx | True online TD(λ) |
|
||||
| DRL actor-critic | GAE λ=0.95 |
|
||||
| Sparse reward | λ → 1 (Monte Carlo-like) |
|
||||
| Dense reward | λ → 0 (TD-like) |
|
||||
| Off-policy | Watkins Q(λ) or V-trace |
|
||||
|
||||
**기본값**: 매 modern DRL = GAE(γ=0.99, λ=0.95). 매 tabular = TD(λ) replacing trace.
|
||||
|
||||
## 🔗 Graph
|
||||
- 부모: [[Reinforcement-Learning]] · [[TD-Learning]]
|
||||
- 변형: [[TD-Lambda]] · [[Sarsa-Lambda]] · [[GAE]] · [[Q-Lambda]]
|
||||
- 응용: [[PPO]] · [[A2C]] · [[Actor-Critic]]
|
||||
- Adjacent: [[Bias-Variance-Trade-off]] · [[Credit-Assignment]] · [[V-Trace]]
|
||||
|
||||
## 🤖 LLM 활용
|
||||
**언제**: 매 RL credit assignment. 매 actor-critic. 매 sparse reward.
|
||||
**언제 X**: 매 deterministic supervised. 매 1-step bandit.
|
||||
|
||||
## ❌ 안티패턴
|
||||
- **λ=1 always**: 매 high variance.
|
||||
- **λ=0 always**: 매 high bias 의 long-horizon 의 fail.
|
||||
- **Forget trace reset**: 매 episode boundary.
|
||||
- **GAE without value baseline**: 매 advantage 의 wrong.
|
||||
- **Wrong direction loop**: 매 forward 의 do (must reverse).
|
||||
|
||||
## 🧪 검증 / 중복
|
||||
- Verified (Sutton-Barto Ch12, Schulman GAE 2016, PPO 2017).
|
||||
- 신뢰도 A.
|
||||
|
||||
## 🕓 Changelog
|
||||
| 날짜 | 변경 |
|
||||
|---|---|
|
||||
| 2026-04-26 | RL-ELIG auto |
|
||||
| 2026-05-08 | Phase 1 |
|
||||
| 2026-05-10 | Manual cleanup — TD(λ) + GAE + 매 forward / backward / Sarsa / Watkins / true online code |
|
||||
|
||||
Reference in New Issue
Block a user