DDPG by gymnasium 7日目

さて、日をあけてしまいましたが、続きをやっていきましょう。

Contents

前回

actorが行動して集めたデータから、経験再生を使って「次の状態」からtarget_actorが「次の行動」を出力し、「次の行動」と「次の状態」からtarget_criticが「次の状態価値」出力し、TDターゲットを算出しました。

一方で、criticは経験再生を使って「現在の状態」と「そのとき取った行動」から「現在の状態価値」別名ベースラインを算出しました。

今回

ここからは、本当の意味で学習・訓練、つまりパラメータ更新をやっていきます。

オプティマイザーを定義する

オプティマイザーをActorNNクラスとCriticNNクラスの__init__()に定義しておきます。
【ActorNN】#26
self.optimizer = optim.Adam(self.parameters(), lr=alpha)
【CriticNN】#27
self.optimizer = optim.Adam(self.parameters(), lr=beta)
引数のself.parameters()は、モデル自身が持っている重みやバイアスのパラメータです。それを学習率lrでAdamによって最適化(損失関数の最小化)するインスタンスself.optimizerを定義します。

criticの学習

lean()メソド内でのTDターゲット算出後からやっていきます。
クリティックの損失関数はtensor(0.0485, grad_fn=<MseLossBackward0>)の形で出力されます。

actorの学習

続けてactorを学習します。
Actorの目的は、Criticネットワークの出力(行動価値)を最大化するような行動を選択することです。
なので、actorNN→criticNNのDDPG構造全体の出力結果をactor_lossとして、actorNNとcriticNNの両方をbackwardすることによってactorにも勾配情報が届きパラメータの更新をすることができます。

全ニューラルネットワークのパラメータを更新する

learn()メソドの締めくくりとして、36の直後にself.update_network_parameters()を入れ、メソドとして定義します。
学習結果の確認
クリティックとアクタークリティックのパラメータ更新まで行ってアクターとターゲットアクターのパラメーター更新をしない状態で試してみました。
動作確認のつもりでやりましたが、学習は進んでいるようです。
10step x 100epsode で学習したところ、ハーフチーターはエピソード開始直後に前へ倒れこむような挙動を獲得し、リワードを稼ぐようになりました。10stepでは走り続ける動作を獲得するのは無理なようです。
続いて、アクターとターゲットアクターのパラメーター更新も追加して同じことを行いました。
こちらは、足を折りたたんで低い姿勢なることでリワードを稼ぎに行っているようです。しかし80エピソードから成績が悪化していっています。うまく学習が進んでいないようです。
まあ、ニューラルネットワーク構造もまだ適当に作っているので、改善の余地があります。
また下記のようにactor_lossesとcritic_lossesの変化も可視化してみると下記のように悪化していく方向にあります。

課題

  1. 計算の高速化(print文の無効化)
  2. 適切なニューラルネットワーク構造
  3. 適切なステップ数
  4. 適切なエピソード数
  5. パラメータのセーブとロード
  6. 途中で止まった時に続行可能にしたい
  7. 計算の高速化(GPUの利用)
  8. 学習の進行状況のリアルタイム可視化

現在までのスクリプト

 

以上。次回はニューラルネットワーク構造を見直しましょう。