クリップした確率比
ここでは、PPO の目的関数で重要な要素である「クリップした確率比」を実装します。
参考として、確率比は次のように定義されます: $$\frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)}$$
そして、クリップした確率比は \(\mathrm{clip}(r_t(\theta), 1-\varepsilon, 1+\varepsilon)\) です。
この演習はコースの一部です
Pythonで学ぶDeep Reinforcement Learning
演習の手順
action_log_probから行動確率probを、action_log_prob_oldからprob_oldを取得します。- 旧行動の対数確率を torch の勾配計算グラフから切り離します。
- 確率比を計算します。
- 代理目的関数をクリップします。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
log_prob = torch.tensor(.5).log()
log_prob_old = torch.tensor(.4).log()
def calculate_ratios(action_log_prob, action_log_prob_old, epsilon):
# Obtain prob and prob_old
prob = ____
prob_old = ____
# Detach the old action log prob
prob_old_detached = ____.____()
# Calculate the probability ratio
ratio = ____ / ____
# Apply clipping
clipped_ratio = torch.____(ratio, ____, ____)
print(f"+{'-'*29}+\n| Ratio: {str(ratio)} |\n| Clipped ratio: {str(clipped_ratio)} |\n+{'-'*29}+\n")
return (ratio, clipped_ratio)
_ = calculate_ratios(log_prob, log_prob_old, epsilon=.2)