2021年7月10日土曜日

今いちど強化学習のCartPole(倒立振子)問題

【what is this】強化学習の定番例題のひとつに、CartPole(倒立振子)があります。多くの場合、ポールの初期状態をほぼ真上(北向き)にしていますが、完全に倒れた真下(南向き)にした場合でも、うまく学習できて、長時間ポールを立て続けることができます。

■ CartPole(倒立振子)問題 - 制御工学と強化学習
 この問題は、よく知られているように、台車にポールを立てた状態を長く維持するための制御です。図1にあるように、当初は制御工学の問題(1)だったと思います。それが、強化学習で著名なR. S. Suttonの書籍(2)で、Q-Learning(=強化学習の手法のひとつ)の例題としてとり上げられました。その後さらに、強化学習の実行とテスト(シュミレーションによる)のための例題として、MATLAB(3)や、OpenAI(4)で扱われています。

図1 CartPole(倒立振子)問題 - 制御工学と強化学習

■ Q-LearningでCartPoleを解く
 ここでは、OpenAIのGym(その中の"CartPole-V0"という環境)を使います。全体の状態は、台車の位置と速度、ポールの角度と角速度の4項で表現されます。これらは連続量なので、Q-Learningで扱うには、これらを離散化(連続量を6区分するなど)します。台車の制御は、単位時間毎に一定の力で右へ押すか、左へ押すかだけです。その動作に反応したポールの新しい状態は、Gymが運動方程式の計算結果として返してくれます。ただし、各時点でその状態がどの程度好ましいのかを示す点数付け(報酬付与)は、自分で設計します。

 ここでの問題は、どういう状態の時、台車をどちらに動かすのが良いかを学習させることです。それをQ-Learningという手法で実行します。OpenAIのGymを利用したのは、上記の力学計算をやってくれるとともに、台車とポールのアニメーションも提供されるからです。ビジュアライゼーションはいつも重要です!

■ Q-Learningによる学習結果をみる
 技術的詳細は置いておき、結果を楽しみましょう。以下の図は、まだ学習があまり進んでいない段階です。すぐに倒れてしまうことが多いです。アニメーションの途中で、ガクッとなっているのは、そこでポールが倒れることを意味しています。真北から左右に12度以上開いた角度になった時がそれに該当します。倒れるとその試行(エピソード)が終了し、直ちに、次の新しい試行に入っています。

学習初期の状態(開始時、ポールの向きはほぼ真上

 一方、次の図は、学習がかなり進んだ段階です。上図に比べると、だいぶ長い間、ポールが倒れずに台車を制御できていることが分かります。

学習終盤の状態(開始時、ポールの向きはほぼ真上

 さて、上記では、新しい試行はいつもポールをほぼ垂直に(僅かに左右に傾けて)立てた状態から開始しました。それでは、今度は、ポールが完全に倒れた状態、すなわち、真南を指している場合はどうでしょうか。その状態から、ポールを真北に向けてそれを維持するのはかなり大変そうに思います。
 これを、深層学習(DQN : Deep Q Network)を用いてQ-Learningでやった報告が参考資料[1]にありました。それを追試した結果が以下の図です。

学習終盤の状態(開始時、ポールの向きは真下

 うまく行っています!ポールが、真下から持ち上がっています。このDQNでは、Chainer(Tensorflowでも良いのですが)を使っています。中間層のノード数は150で、この状態になるまでに約1,000エピソードを学習させました。実行時間は、通常のPCで10分程度でした。
 このようなアニメーションで興味を抱き、強化学習の詳細に入って行くきっかけになればよいですね。

参考資料
[1] 制御工学の基礎あれこれ
http://arduinopid.web.fc2.com/index.html

0 件のコメント:

コメントを投稿