始める無料で始める

クリップした確率比

ここでは、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)
コードを編集して実行