Deep Q-Network(DQN)(最終回)なんとか棒を倒さず安定させられました
Deep Q-Network(DQN)による倒立振子 第7回
はじめに
前回は学習させる方法を見ていきました。今回は残りの部分をさっと流して棒を安定させるためにどこがおかしいか探っていきます。
最後のプログラムのコードです。
if DQN_MODE: targetQN = mainQN # 行動決定と価値計算のQネットワークをおなじにする # 1施行終了時の処理 if done: total_reward_vec = np.hstack((total_reward_vec[1:], episode_reward)) # 報酬を記録 print('%d Episode finished after %f time steps / mean %f' % (episode, t + 1, total_reward_vec.mean())) break # 複数施行の平均報酬で終了を判断 if total_reward_vec.mean() >= goal_average_reward: print('Episode %d train agent successfuly!' % episode) islearned = 1 if isrender == 0: # 学習済みフラグを更新 isrender = 1
targetQN = mainQN # 行動決定と価値計算のQネットワークをおなじにする
DQNは1行動で新しいtargetQNに変わります。DDQNでは1試行でtargetQNを変更するので1行動では変わりません。
total_reward_vec = np.hstack( (total_reward_vec[1:], episode_reward) ) # 報酬を記録 print('%d Episode finished after %f time steps / mean %f' % (episode, t + 1, total_reward_vec.mean()))
1試行が終わった時点で、何試行目かと何行動で棒が倒れたかと平均報酬をプリント表示しています。
if total_reward_vec.mean() >= goal_average_reward:
print('Episode %d train agent successfuly!' % episode)
直前10試行の平均報酬が195点を超えると「何試行目で成功!」と表示します。
その後の試行の挙動を表示して動きが見れるようになります。
以上です。
現状ではこの状態で200試行を過ぎても安定しません。
=== ここから失敗談になります。進展はありません ===
やっとこと
(1)learning_rate = 0.00001 学習係数を変更する
(2)隠れ層の活性化関数を変えてみる
(3)コンパイルの最適化関数や損失関数を変えてみる
(4)報酬は1, 0, -1に固定だったが報酬・罰則の点数をいろいろ変えてみる
=== ここまで進展なしです ===
(5)改めてこちらのサイトを最初から詳しく読み直してみます。
CartPoleでDQN(deep Q-learning)、DDQNを実装・解説【Phythonで強化学習:第2回】
# [1]損失関数の定義 # 損失関数にhuber関数を使用します 参考https://github.com/jaara/AI-blog/blob/master/CartPole-DQN.py def huberloss(y_true, y_pred): err = y_true - y_pred cond = K.abs(err) < 1.0 L2 = 0.5 * K.square(err) L1 = (K.abs(err) - 0.5) loss = tf.where(cond, L2, L1) # Keras does not cover where function in tensorflow :-( return K.mean(loss)
上の部分が(最後にコードをまとめて掲載します。)のところでは
「 return K.mean(K.minimum(0.5*K.square(y_pred-y_true), K.abs(y_pred-y_true)-0.5), axis=1) 」
この一行に書き換わってました。
コンパイルするときの損失関数ですが気になったので最初のほうに変更します。
モジュールがインポートされてないエラーが出たので
import tensorflow as tf
も追加して修正して実行したところ、安定しました!!
しかも60試行過ぎたあたりで急に安定してきてます。
無事きれいに終わることができました。
まとめ
ニューラルネットワークはKerasを使って入力層ー隠れ層ー出力層を作れます。(Kerasは、Pythonで書かれたオープンソースニューラルネットワークライブラリである。)
活性化関数や最適化関数や損失関数を使ってうまい具合に重みを学習させます。fit()で学習して、predict()で予測します。
頭のいい誰かが作ったモジュールで、頭のいい誰かが作った関数を使って、頭のいい誰かが作ったプログラムコードを写してなんとか動くかたちに出来ました。
なんとなく分かる部分もあったり分からない部分も多くあったりしますが実際エラーと戦いながらコード解読していくことで流れはつかめたような気がします。
本日はここまで。Deep Q-Network(DQN)は一旦これで終わりにして次回からは新しいことをやってみたいです。
参考サイト
保存ファイル
lesson49.py
文責:Luke