2021年8月17日火曜日

スマホアプリで「強化学習」を学ぶ魅力!

【what is this】最近の日経ソフトウェア誌に、「Pythonで強化学習を学ぶ」の解説記事がありました。丁寧に書かれていて分かりやすく、提供されているPythonプログラムも完全に動かすことができました。しかし、ここで留まらずに、理解をさらに深めるため、別のプラットフォーム(Androidスマホ)とプログラミング環境(MIT App Inventor)で、独自にそれを再構築してみました。

■ 解説記事:Pythonで「強化学習」を学ぶ
 まず、図1に示すのがこの記事です。全16ページに渡って、強化学習が非常に丁寧に解説されています。前半7ページでは、簡単な例題を使って強化学習の概念(Q-Learning)と具体的な動作が説明されています。後半9ページでは、Pythonでこれを実現する方法を説いています。コードの説明だけではなく、肝となるQ-Tableの学習則(学習率や割引率を含む)の解説が分かりやすく示されています。


 そして、何よりも嬉しいことに、提供されているPythonプログラム(4つのPythonファイルで合計約970行)が小生の環境でも問題なく、完全に動いたことです。図2はそれを示しています。


 素晴らしい!分かった気になる!でも本当にそうなのか。単にトレースしただけではないのか?という思いもあります。理解を本当に深めるのであれば、自分で、この解説の仕様に沿って、プログラムを独自に再構築するのがいいでしょう!ということで、それを実際にやってみました。

■ スマホアプリとして上記強化学習プログラムを独自に作る
 実は、小生は、上記のPythonコードの中味はほとんど読んでいません。にも拘わらず、図3に示すような、同等機能のスマホアプリを作成することができました。これは、この解説自体が素晴らしかったことに他なりません。MIT App Inventorを利用して開発しました。


■ 
スマホアプリの強化学習での「学習(訓練)」と「評価(実行)」
 詳細はここには書けませんが、このスマホアプリによる「学習」と「評価」を簡単に示します。まず、図4の(a)と(b)は、それぞれ、学習が不十分な場合と十分な場合に、タスクを実行した様子です。
 ここでは、ロボットの行動は、「右へ前進する」か「宝石を取る」のいずれかです。ロボットが緑色の宝石の位置と一致した時に「宝石を取る」ように学習(訓練)するわけです。図4(a)は、ロボットが宝石を得ることに失敗しています。なぜなら、学習が不十分であり、今の状況(赤枠)では、
Q-Tableの[宝石を取る行動価値, 右へ前進する行動価値] 
= [-0.71757, -1.01168]
となっており、ロボットがまだ宝石の位置にないのに、より行動価値が高い(すなわち、-0.71 > -1.01)と評価された「宝石を取る」行動を行ったためです。
 これに対して、図4(b)は、学習が十分に進んでいたため、Q-Tableの中味は正当なものになっており、ロボットは今ここで「宝石を取る」のではなく、宝石へ向かうことになります。


 そして、図5に示すように、ロボットはさらに宝石に近づき(途中の一歩の図示は省略)、位置が一致したところで、
Q-Tableの[宝石を取る行動価値, 右へ前進する行動価値] 
= [5.0, -1.9]
にしたがい、最終的に自信をもって(すなわち、5.0 > -1.9)、「宝石を取る」行動が成功しています。


 動作を確認するため、十分に学習済み(Q-Tableの内容が妥当になった)後の評価実行例を以下に示します。
■ スマホアプリで「強化学習」の意義
 Pythonプログラミング、もちろん良いでしょう。でも、スマホでアプリを開発するのならば、MIT App Inventorは非常に効率良く行えます。上記解説記事では、Q-Tableの実現に、Pythonの辞書型変数やnumpy配列を使っていますが、App Inventorでも同等のことが可能です。また、Pythonのmatplotlibほど高機能ではありませんが、図3に示したとおり、App Inventorでも折線グラフ(報酬の経緯)も描けています。

 スマホで、強化学習を実行し、その状況をグラフで可視化し、学習結果としてのQ-Tableの数値を確認し、評価のためのアニメーションも実行する。それらを、ボタン操作で、掌ですべてインタラクティブに行える。この魅力は大きなものと改めて感じます!

 例えば、図3で使用したハイパーパラメータを変えて学習させたい、という場合も、図6のように直ぐにその効果(収束速度や安定度など)をグラフで確認できます。


■ MIT App Inventorプログラムの複雑度
 上に述べたとおり、Pythonで約970行とほぼ同等のプログラムをMIT App Inventorで作成しました。それがどの程度の複雑度なのかを詳しく述べることは、ここではできませんが、プログラム全体(ブロック図)をご参考までに示します。小さくで中味は見えませんがご容赦下さい。


0 件のコメント:

コメントを投稿