|
公開日:2020/4/18 , 最終更新日:2020/4/29
|
前提知識
・pythonとは
・DQNとは
・Cartpole問題
こちらでCartpole問題の具体例を説明しましたが、これをDQN(Deep Q-Network)を用いて学習させます。
使用するプログラムはpython、DQN用に使用するライブラリはchainerとchainerrlです。
■DQNの構造
以下となります。

<活性化関数>
DQNの出力層は、すべきアクションの確率値で表現されるので、活性化関数は出力値のトータル値が1である必要があります。従ってsoftmax関数の仕様が望ましいです。
しかし、アクション値が連続的なもの(を離散化した)の場合は、出力は-1から-1で表現できるtanhの使用が望ましいです。
■シミュレーション
<学習>
先ずは、DQNの重みの学習を行います。シミュレーション環境は以下。
・pythonバージョン:Ver3.8で確認
・必要ライブラリ:numpy , OpenAI gym(インストール方法はこちら)
・プログラムファイル:cart_dqn.zip
結果は以下のとおり。エピソードを重ねるにつれ報酬を多く得ていくのが解ります (報酬200は、失敗せずにポールを立ち続けさせる事ができている状態)。
この結果は「agentフォルダ」に保存され、次のテストで使用します。
episode: 250 reward_sum: 161.0
episode: 260 reward_sum: 181.0
episode: 270 reward_sum: 200.0
episode: 280 reward_sum: 200.0
episode: 290 reward_sum: 200.0
<テスト>
学習結果を用いて、倒立振子を立て続けることができるか確認します。以下プログラムファイルとなります。上記プログラムに対し、テストに不要な部分を削除しております。
・プログラムファイル:cart_dqn_test.zip
シミュレーション結果は以下のとおり。

■応用問題
上記ではポールがきちんと立った状態から開始していました。次はもう少し変更して、ポールが倒れている状態から学習して、ポールを立たせる様します。その方がいかにもAIっぽくて面白いと思います。
<ライブラリ(cartpole.py)変更点>
cartpoleのライブラリを変更してポールの初期位置を変更します。私の場合は以下フォルダに保存されているcartpole.pyを変更します。
C:\Users\take\AppData\Local\Programs\Python\Python37\Lib\site-packages\gym\envs\classic_control
ファイル内の以下部分の赤文字部分を変更します。これが初期値がポールが倒れた状態を表します。ポールの位置、角度の詳細はこちらで説明。
def reset(self):
self.state = [0, 0, 3.14 , 0]
self.steps_beyond_done = None
return np.array(self.state)
<報酬の与え方>
ライブラリから返される報酬は使わず、自分で設定します。ポールが以下の状態でそれぞれ報酬を与えます。ポールが時計回りで立つ場合と反時計回りで立つ場合は、
返してくるポールの角度値が異なるので注意が必要です。

<シミュレーション>
パラメータ、シミュレーションファイルは以下のとおり。
・ ニューラルネットワークの中間層:150
・ エピソード数:1500
・ 1エピソードのステップ数:400
・ 学習用ファイル:cart_dqn2.zip
・ テスト用ファイル:cart_dqn_test2.zip
なおプログラムを実行した際に以下の様なエラーメッセージが出ますが、気にしなくても良いです。
これは、ライブラリはポールが倒れたので一度リセットを促してくるのですが、今回の場合はポールが立っていない場合もシミュレーションを動かすのを前提としているので、
リセットする必要が無いためです。
You are calling 'step()' even though this environment has already returned done = True~~
学習後のテスト結果は以下のとおり。

サブチャンネルあります。⇒ 何かのお役に立てればと
|
|