DDPG by gymnasium 16日目

前回

学習が進まず、チーターの様子を見ると開始直後に静止してお終いです。ぐーたらになってしまいました。

考えうる原因

  • ノード数が多すぎる?256
  • 学習率が大きすぎる?0.01
  • パラメータの初期値 Heがうまくいってない?/1√256は小さすぎる?
  • レイヤー正規化が上手くいってない?

→レイヤー正規化をキャンセルしてみます。

actor:
def forward(self, obs):
        #print(‘AgetDDPG.ActorNN.forward is working’)
        #print(‘====ここまではOK1====’)
        x = self.fc1(obs)
        #x = self.bn1(x)
        x = F.relu(x)
        x = self.fc2(x)
        #x = self.bn2(x)
        x = F.relu(x)
        x = self.fc3(x)
        action = F.tanh(x)
        return action

 

critic:

def forward(self, obs, action):
        input_data = T.cat([obs, action], dim=1)
        x = self.fc1(input_data)
        #x = self.bn1(x)
        x = F.relu(x)
        x = self.fc2(x)
        #x = self.bn2(x)
        x = F.relu(x)
        x = self.fc3(x)
        return x #一つの状態価値を出力する。
結果:ダメです!学習が進みません。
  
次はHeの初期値をキャンセルしてみます。
→結果:ダメです、収益が徐々に下がり気味で、Actor_lossもなぜか安定して増えていっています。
次はノードを256から64に落としてみます。また同時にバッチサイズも256から64に落としてみます。
→結果:Stepは200にして始めています。
300回やったあと、続けて1000回やってみました。頑張ってる?
ここでStepを300にしてみます。安定して前進している姿を経験再生バッファに溜め込むのが目的です。
悪化しました・・・。
ということは、残すところ学習率?0.01から0.001に細かくしました。
100Stepを1000Episode、200Stepを1000Episode実行しました。
上手くいきました。

ActorNN:He適用しない, alpha=0.0001, Adam, bn1,キャンセル bn2キャンセル

batch64,obs17→17 fc1 64→64 ReLU 64→64 fc2 64→64ReLU64→64fc3 6 →Tanh6→ action6

CriticNN:He適用, beta=0.001, Adam,bn1,キャンセル bn2キャンセル

batch64,obs17+act6→input23  fc1 64→64 ReLU 64→64 fc2 64→64fc3 1→活性化関数なし→Q_value 1

結果的に、

  • ノード数が多すぎる?256→64
  • 学習率が大きすぎる?0.01→0.001
  • パラメータのHe初期値 →キャンセル
  • レイヤー正規化→キャンセル

でうまくいきましたが、学習率が大きすぎたのが原因ではないかと考えます。

またノード数が多すぎて過学習を起こしていた可能性もあります。

またレイヤー正規化が上手くいかないのも腑に落ちません。

He初期化は原因として考えにくいので、まずはここだけ戻してみます。

問題ありませんでした。次にレイヤー正規化を適用してみます。

600Epsodeを過ぎたあたりで悪化していますが、何とか持ち直しています。どうやら、スタートダッシュで前傾姿勢になりすぎて逆に速度が遅くなっているようです。ひっくり返っているのでしょう。1000回超えたあたりでStepを伸ばしたので前のめりが修正されつつあると考えます。よってStep300にして1000回続けてみます。

ブレ幅が大きいですが、よさそうです。

いや、やっぱダメです(笑)ずっと逆立ちして頭と前足で前進しています。

600回~900回あたりで、変な癖を覚えてしまったようです。

ほんとAIってやつは突拍子もないことを考え付きます。

原因は何でしょうか、過学習と言っていいものかはさだかではありませんが、正則化のようにニューラルネットワークの最適化に対して何らかの拘束を与えるとよいかもしれません。正則化というとよく活性化関数からの出力のうち10%程度を0にして学習をさせる、ドロップアウトがでてきますが、単純にノードを64から32に落としてみたらどうかと思います。次回やってみます。