web-dev-qa-db-ja.com

DQN-Q-Lossが収束しない

私の環境でDQNアルゴリズムを使用してエージェントをトレーニングしていますが、次のようになります。

  • エージェントは個別のアクション(左、右、上、下)を選択して車を制御しています
  • 目標は、他の車に衝突することなく、希望の速度で運転することです
  • 状態には、エージェントの車と周囲の車の速度と位置が含まれます
  • 報酬:他の車に衝突した場合は-100、希望の速度との絶対差に応じた正の報酬(希望の速度で運転している場合は+50)

私はすでにいくつかのハイパーパラメーター(ネットワークアーキテクチャ、探索、学習率)を調整しましたが、これにより降下の結果が得られましたが、それでも、本来あるべき/より良い結果にはなりません。エピソードあたりの報酬は、トレーニング中に増加しています。 Q値も収束しています(図 1 を参照)。ただし、ハイパーパラメータのすべての異なる設定でQ損失は収束しません(図 2 を参照)。私は、Q-ロスの収束の欠如がより良い結果の制限要因であるかもしれないと思います。

1つの離散アクショントレーニングのQ値

トレーニング中のQ損失

20kタイムステップごとに更新されるターゲットネットワークを使用しています。 Q損失はMSEとして計算されます。

Q-ロスが収束しない理由はありますか? Q-LossはDQNアルゴリズムに収束する必要がありますか? Q-lossがほとんどの論文で議論されていないのはなぜでしょうか。

9
user8861893

ポリシーが更新されるとデータが変化し続けるため、Q-lossが収束しないのは正常なことだと思います。これは、データが決して変更されず、データに複数のパスを作成して、重みがそのデータに適切に適合していることを確認できる教師あり学習とは異なります。

もう1つ、ターゲットネットワークをタイムステップごとに少し更新する(ソフト更新)方が、Xタイムステップごとに更新する(ハード更新)よりもうまく機能することがわかりました。

はい、損失の値は期待されるQ値と現在のQ値の差を意味するため、損失は補償範囲でなければなりません。損失値が収束する場合のみ、電流は最適なQ値に近づきます。発散する場合、これは、近似値がますます正確でなくなることを意味します。

ターゲットネットワークの更新頻度を調整してみたり、各更新の勾配を確認したりできます(勾配クリッピングを追加)。ターゲットネットワークを追加すると、Qラーニングの安定性が向上します。

Deepmindの2015ネイチャーペーパーでは、次のように述べられています。

ニューラルネットワークを使用してメソッドの安定性をさらに向上させることを目的としたオンラインQラーニングの2番目の変更は、Qラーニングの更新でトラジェクトyjを生成するために別のネットワークを使用することです。より正確には、Cの更新ごとにネットワークQを複製してターゲットネットワークQ 'を取得し、Q'を使用してQ学習ターゲットyを生成しますj 次のCのQの更新の場合。この変更により、標準のオンラインQラーニングと比較してアルゴリズムがより安定します。t、at)Q(st + 1、a)すべてのaのため、ターゲットyも増加しますj、おそらく政策の変動や分岐につながる。古いパラメーターのセットを使用してターゲットを生成すると、Qの更新が行われてから、更新がターゲットに影響を与えるまでの間に遅延が追加されます。j、発散や振動が発生する可能性がはるかに低くなります。

深層強化学習による人間レベルの制御、Mnih et al。、2015

カートポール環境で他の人が同様の質問をした実験を行いました。100の更新頻度で問題が解決します(最大200ステップを達成)。

C(更新頻度)= 2の場合、平均損失のプロット: C=2

C = 10

C=10

C = 100

enter image description here

C = 1000

enter image description here

C = 10000

enter image description here

損失値の発散が勾配爆発によって引き起こされる場合は、勾配をクリップできます。 Deepmindの2015 DQNでは、作成者は値を[-1、1]内に制限することでグラデーションをクリップしました。他のケースでは、- Prioritized Experience Replay クリップグラディエントの作成者は、ノルムを10以内に制限します。ここに例を示します。

DQNグラデーションクリッピング:

    optimizer.zero_grad()
    loss.backward()
    for param in model.parameters():
        param.grad.data.clamp_(-1, 1)
    optimizer.step()

PERグラデーションクリッピング:

    optimizer.zero_grad()
    loss.backward()
    if self.grad_norm_clipping:
       torch.nn.utils.clip_grad.clip_grad_norm_(self.model.parameters(), 10)
   optimizer.step()
1
Alexander