15import numpy as np
18class GAE:
19 def __init__(self, n_workers: int, worker_steps: int, gamma: float, lambda_: float):
20 self.lambda_ = lambda_
21 self.gamma = gamma
22 self.worker_steps = worker_steps
23 self.n_workers = n_workers
バイアスが高く分散が小さく、偏りがなく、分散が大きい。
バイアスと分散のバランスを取るために、加重平均を取ります。これは一般化アドバンテージ推定と呼ばれます。設定しました。これにより、計算がきれいになります
25 def __call__(self, done: np.ndarray, rewards: np.ndarray, values: np.ndarray) -> np.ndarray:
利点表
59 advantages = np.zeros((self.n_workers, self.worker_steps), dtype=np.float32)
60 last_advantage = 0
63 last_value = values[:, -1]
64
65 for t in reversed(range(self.worker_steps)):
ステップの後にエピソードが完了した場合はマスク
67 mask = 1.0 - done[:, t]
68 last_value = last_value * mask
69 last_advantage = last_advantage * mask
71 delta = rewards[:, t] + self.gamma * last_value - values[:, t]
74 last_advantage = delta + self.gamma * self.lambda_ * last_advantage
逆の順序で収集していることに注意してください。最初のコードはリストに追加されていて、後で元に戻すのを忘れました。バグを見つけるのに約4〜5時間かかりました。モデルのパフォーマンスは、おそらくサンプルが似ているためか、最初の実行時にわずかに向上していました。
83 advantages[:, t] = last_advantage
84
85 last_value = values[:, t]
86
87 return advantages