2021年8月26日木曜日

Running Q-Learning on your palm (Part1)

Japanese summary このアプリは、人工知能技術の一分野である「強化学習(特にQ-Learning)」の基本的な考え方と仕組みを、簡単な例を動かしながら学ぶものです。強化学習は、AlphaGo(囲碁)や自動運転、自律制御ロボットなどで使われ、注目を集めています。ここでは、そのような実用レベルに立ち向かう前に、身近なスマートフォンを用いて、その技術のエッセンスに触れて親しむことができます。あなたの掌の上のスマホで強化学習を楽しもう!(このアプリは、MIT App Inventorを用いて開発されました。)

This app won the "2021 October's MIT APP INVENTOR OF THE MONTH" award. 

Abstract
This app explains the basic idea and mechanism of reinforcement learning (especially Q-Learning), which is a field of artificial intelligence technology, using simple examples. Reinforcement learning is used in AlphaGo, autonomous driving, autonomous control robots, etc., and is attracting a lot of attention. Here, you can get familiar with the essence of the technology using your familiar smartphone before confronting such a practical level. As an example, a robot is trained to go straight down the corridor and successfully acquire the gem placed along the way. For this purpose, I use the reinforcement learning method called Q-Learning. Results of the training can be confirmed by the animation of the robot movement. I have developed a smartphone app that realizes these using MIT App Inventor. Q-Learning runs on your palm!

# This application for Android is published below:
Source code: here

# This app can also be applied to robots with more complex behaviors than the examples below. In that case, it is enough to add a definition of new actions and rewards. For details, please see Part 2 here.

# For the case where the robot moves on the 2D grid, please see Part3 here

Overview of the Q-Learning app
The configuration of the developed application is explained in Fig. 1. You can see a robot and a green gem in the corridor at the bottom. Train the robot to pick up the gem at the right place. (The robot's behavior will be explained later.) To do that, first press the "init" button, then train with the "train" button. Each "train" will learn 100 steps. One step corresponds to the robot moving one block in the corridor or picking up (taking) the gem.

At each step, the action is rewarded. Positive actions that lead to success are highly rewarded. A series of actions of the robot starting from the left end to the final success or failure is called an episode. Although the position of the gem changes with each play (game), the average rewards sum for successful episodes can be calculated theoretically in this example. Repeat "train" until it approaches this theoretical value. If the theoretical value cannot be calculated, the iteration should be stopped when it is considered to have converged to a certain high value.

The data in the large yellow area (Q-table) on the screen indicates which action is preferable (worth it) depending on the situation along the way. As I will explain later, with repeated training, this Q-table will approach the correct values.

After training, press the "anim for test" button to watch the robot's behavior in animation. A major feature of this reinforcement learning is that the behavior of the robot can be determined by the contents of the Q-table. Therefore, if the Q-table is inaccurate, it often fails as follows:

On the other hand, if the contents of the Q-table are correct, gem acquisition will always succeed, as shown below:

Challenges imposed on robots and possible actions
Let's take this example in a little more detail. The actions that the robot can take, the conditions for obtaining the gem, and the conditions for completing the task (play) are shown in Fig. 2. On the other hand, Figure 3 illustrates whether “Take” (the action of picking the gem) or “Forward” (moving to the right) leads to success in a certain situation. To get the gem, the robot must do a "Take" action at the same place as the gem. Obviously, in this example, the robot should select (2) "Forward" instead of selecting "Take" in (1). After that, select "Take" in (3) and it will succeed.




It is easy for humans to write a program to solve this problem (challenge). But here, instead, let the robot itself discover the solution through learning. Please note this point!

How to choose an action
As already mentioned above, I introduced rewards to determine whether to choose between “Take” action and “Forward” action in a particular situation. As shown in Figure 4, the reward is +5 for the "Take" action that succeeds in acquiring the gem, and -1 for the other actions. And it is advantageous to choose an action with a larger sum of rewards mentioned above. 

Update Q-table
To achieve the above, I use a Q-table that represents the value (in other words, worth) of both actions for the state at that time, as shown in Figure 5. In the figure, in the untrained state (train = 0 step), the action value of "Take" is higher (larger) than that of "Forward", so the "Take" action is selected. But this is wrong because the Q-table is inaccurate. On the other hand, in the fully trained state (train = 800 steps), the Q-table has been updated to a reasonable value, and the "Forward" action is taken correctly. Roughly speaking, Q-table is an estimate of the sum of rewards. 

The Q-table update is based on a famous learning rule called Q-Learning as shown below:


This update formula means that the value of Q when taking an action in the current state is brought close to the highest value of Q that can be taken in the next state. It is known that such updates converge to the optimum Q value, assuming a sufficient number of episodes are attempted for all states. If you need a more detailed explanation, please see one of the references ([1][2][3][4][5]). And the relationship between this value of Q and the Q-table in this application is illustrated below:


In fact, the figure below shows that the contents of the Q-Table have almost reached optimal after 1100 steps of training.


Expand the app a little
Finally, here is an example of how to expand this app. This app has three hyper parameters (α, γ, ε) to increase versatility. For example, how much will the convergence speed and stability be affected if the value of the learning rate α is changed?

To confirm this, you need to display it as a line graph instead of the slider as above. It's easy to achieve. I used ChartMaker (an extension created by Kate & Emily) in reference [7]. The result is shown in Fig.6.

Enjoy reinforcement learning (Q-Learning) with this smartphone app! 

 Even deeper expansion
The above example is to familiarize you with the basic idea of "Q-Learning". In this example, the number of states is so small that the entire contents of the Q-table could be saved and updated. However, consider an example where the robot's range of movement is not a one-dimensional corridor, but a wide plane, or there are places where it cannot proceed due to obstacles. In such cases, the number of states will be enormous and will not be solved by basic Q-Learning. Therefore, the Q-table needs to be approximated by another method. One promising method is to use neural networks. The training itself will need to be done on a PC, but it will be possible to bring the trained model to a smartphone and run the animation for testing. I would like to discuss such advanced expansions in another article.

Acknowledgments
This app is my original work. However, I refer to the explanation of Q-Learning and the example Python program in reference [6]. I would like to thank Dr. Makoto Ito, the author of this article.

References
[1] Richard S. Sutton and Andrew G. Barto, "Reinforcement Learning: An Introduction, second edition", The MIT Press, 2018.
[2] Vincent François-Lavet, Peter Henderson, Riashat Islam, Marc G. Bellemare, Joelle Pineau, "An Introduction to Deep Reinforcement Learning", Now Publishers, 2019.
[3] Etsuji Nakai, "Reinforcement Learning for Software Engineers", Gijyutsu-Hyoron-Sha, 2020. (in Japanese)
[4] Azuma Ohuchi, Masahito Yamamoto, Hidenori Kawamura, "Theory and application of multi-agent systems - computing paradigm for complex systems engineering", Corona-sha, 2002. (in Japanese)
[5] Tomah Sogabe, "Introduction to reinforcement learning algorithm", Ohmsha, 2019. (in Japanese)
[6] Makoto Ito, “Learn Reinforcement Learning with Python”, Nikkei Software 2021.07, Nikkei BP, 2021, pp.24-39 (in Japanese)
[7] Kate Manning and Emily Kager,
https://github.com/MillsCS215AppInventorProj/chartmaker


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で作成しました。それがどの程度の複雑度なのかを詳しく述べることは、ここではできませんが、プログラム全体(ブロック図)をご参考までに示します。小さくで中味は見えませんがご容赦下さい。


2021年8月11日水曜日

生徒・学生のための2つのITコンテストを応援しよう!

 すでに募集は締め切られていますが、生徒・学生のためのIT関連コンテストがありますので、ご紹介します。以下の2つは、いずれも小生が応援しているものです。

U18 IT夢コンテスト(神奈川工科大学主催)
MIT App Inventor Summer Appathon(米国MIT主催)


(1)U18 IT夢コンテスト(神奈川工科大学主催)
 IT(情報技術)で実現できる未来の社会や新たなサービスなどに関する「夢」を語ってもらうコンテストです。必ずしも、完成したアプリケーションの提出は必要ありません。以下のとおり、最終審査会がオンラインで開催されますので、誰でも応援できます!
●2021-08-22(土)オンライン最終審査会
https://yumecon.ic.kanagawa-it.ac.jp/

(2)MIT App Inventor Summer Appathon(米国MIT主催)
 こちらは、3つのテーマ(City of the Future, Improving Academics, Community Computational Action)に関するアイディア(説明書とビデオも必須)とそれを実現したスマホアプリの提出が必要です。提出はすでに締め切られています。現在、誰でも投票できる「People's Choice Award」を受け付けています。彼らがどんなアイディアを持ち、どうそれを実現しているかを知って、応援しましょう!(今後、審査員による賞の発表もあります。)
https://appathon.appinventor.mit.edu/

2021年8月7日土曜日

Scratchプログラミングで強化学習の基礎(3)

【what is this】前回の「Scratchで強化学習(2)」の続編です。伊藤真著[1]にある、レベル3の例題を検討します。前回のレベル2では、開始状態から最終状態までの「エピソード」を扱いましたが、今回の例題は最終状態の無いゲームでの得点(報酬)を競うものです。予測報酬(=行動価値Q)の計算において、「割引率」を導入するのがひとつのポイントです。

■ レベル3例題:お化けの飛行訓練ゲーム
 このレベル3例題は、図1に示すように、4つのボタンのいずれかを押す毎に、報酬表にある報酬(-3から3までの整数値)が得られます。負数の場合は左へ、正数の場合は右へその絶対値を歩数として進みます。100回のボタン押下において、できるだけ多くの総報酬(右方向の遠くの位置)を得ようとするものです。

 ボタンnを押すという行動により現在の状態が状態nへ推移します。例えば、現在の状態(from)が状態1の時にボタン2を押すと、次の状態(to)としての状態2へ推移します。その際、報酬表(状態1, 状態2)の値(すなわち1)を報酬として得ます。報酬表の対角要素はすべて-1としてありますので、同じボタンを連続して押した場合は、いつも-1の報酬を得ます。


 報酬表の値は、ゲーム毎に変わりますが、もちろん、それらの値はプレイヤー(人間と「強化学習」)には知らされていません。

■ 「強化学習」プレイヤーの戦略
 今回の強化学習の戦略は、基本はレベル2の場合の学習則と同じです。しかし、冒頭に述べたとおり、今回は最終状態がなく、いつまでもボタン操作が続きます。状態の推移が巡回する場合もあります。(実際には、ここでは100回で打ち切りますが。)このため、得られる報酬がどんどん増大してしまい、行動価値Q(状態、行動)を従来の学習則のままで更新しようとしても収束しない恐れがあります。

 そこで、Q(状態、行動)を更新する際に、右辺のQの値に割引率γ(0.9とか0.8程度の値)を掛けて行き、遠くの報酬を少しづつ小さくします。それによって収束が期待できます。この割引率γを変更することで、遠くで得られる報酬の見積もりを(少なめに)調整することになります。あるQ(状態、行動)は、その絶対値よりも、他の(状態、行動)と比較して価値が高いかどうかが重要なので、この割引率の導入は妥当と思われます。(割引率導入の学習則の詳細は、参考文献[1]をご覧下さい。)

行動価値Q(状態, 行動)の計算を観察する
 上記の割引率付きの学習則によるQ(状態、行動)の計算結果を観察してみます。上に述べたとおおり、Q(状態、行動) Q(from-状態、to-状態)とみなすことができます。報酬は、図1に示した報酬表のとおりだとします。

 ボタン操作を100回で打ち切りますが、学習則にはランダム性が含まれているため、Q(from-状態、to-状態)の値は、一意には決まらず、無数に存在します。そのうちの2例を、図2aと図2bに示します。




 図2aと図2bの棒グラフの高さはまちまちのように見えますが、両者には共通の明確な特徴があります。すなわち、以下のような巡回があります。
  • 状態1では、最大Qはボタン2の場合であり、状態2へ。
  • 次に、状態2では、最大Qはボタン4の場合であり、状態4へ。
  • さらに、状態4では、最大Qはボタン1の場合であり、状態1へ。
 結論が出ました!学習により、次のようなボタン押下が最適だ!
ボタン1→ボタン2→ボタン4→ボタン1→ . . . 

■ 感想
 これまで、書籍[1]にあるレベル1,レベル2,レベル3の例題を実際に動かしながら、自分なりの詳細観察を行ってきました。エピソード的な場合と非エピソード的な場合の両方で、Q(状態、行動)とはどんなものかを知る上で、非常に有用と感じました。
 本書は、初心者向けに分かりやすく、との方針に基づき、著者独自のやさしい用語も用いた丁寧な説明に徹しています。しかし、第7章「まとめ」では、今後、強化学習を専門書でさらに深く学ぶ場合に備えて、それらの用語と専門用語の対応についても説明があります。これだけ親切な著書はみたことがありません!ありがとうございました。
参考資料
[1] 伊藤 真:ScratchでAIを学ぼう- ゲームプログラミングで強化学習を体験、日経BP、2020年8月11日第1版

2021年8月4日水曜日

A scene with a slide rule

Sometimes I write old, nostalgic articles. The following is what happened when I went to the United States in July 2014, seven years ago, to present my paper at the MIT App Inventor Summit 2014.

Perhaps modern students have never heard or touched what is called a "slide rule", but it was widely used in the world of technical computing. For example, it was actually used in some US national projects, so it's no wonder that some traces of it remain in the United States. The picture below is the elevator entrance of a hotel near MIT (Massachusetts Institute of Technology) where I was staying. I was surprised that a huge slide rule was hung on the top of the elevator door.

A huge slide rule at the entrance of the elevator

Enlarged view

The slide rule was discontinued 40 years ago with the advent of electronic calculators, but I still hold one of them. It was probably produced over 50 years ago. The photo below shows the calculation of "2 x Pi = 6.28" using this slide rule. In addition to multiplication and division, the slide rule can also be used to calculate trigonometric functions, logarithms, square roots, cube roots, etc. by exchanging the middle pard rule.

"2 x Pi = 6.28" on my slide rule

Most of the slide rules made in Japan, including the one shown in the above figure, were made of bamboo. Therefore, there is little deterioration in accuracy due to temperature and humidity fluctuations, and it has been highly evaluated worldwide. The times have advanced. And in the new era, the physical slide rule has disappeared, but as you can see in the picture below, there is a "slide rule software" for Android smartphones! It is useful for understanding the principle of a slide rule.

"2 x Pi = 6.28" in the slide rule app

2021年8月2日月曜日

Scratchプログラミングで強化学習の基礎(2)

 【what is this】前回の「Scratchで強化学習」の続編です。伊藤真著[1]にある、レベル2の例題を検討します。前回のレベル1では、「行動、報酬」だけでしたが、今回は「状態、行動、報酬」を扱う本格的な強化学習の仕組みが入っています。そこにおいて、各状態での行動に対する予測報酬(=行動価値Q)の計算を観察します。
[->続編はこちら]

■ レベル2例題:月面でダイヤ集めゲーム
 このレベル2例題は、図1に示すように、状態1〜状態3、および最終状態を持ちます。状態1から開始して、左右のどちらかを選択して次の状態へ達します。さらにその状態からふたたび左右のどちらかを選んで最終状態に達します。そこまでを1つのエピソードと呼びます。エピソードのなかで左右を選ぶ毎に、ある確率(報酬確率)でダイヤが出ます。ダイヤが出ると報酬1を、出ないと報酬0を得ます。例えば、50回のエピソードで、できるだけダイヤをたくさん集めて報酬の総計を大きくせよ、という問題です。

 場所によって報酬確率は異なります。図1の中の赤字の数値がそれです。もちろん、それらの確率は、プレイヤーには知らされていません。最も運が良ければ、1エピソードで得られる報酬は最大で2となります。


■ 「強化学習」プレイヤーの戦略
 今回の強化学習の戦略ですが、実は、状態2か、または状態3にいる場合は、前回のレベル1での戦略と同等です。しかし、状態1(開始状態)にいる場合には、左右どちらを選択した場合も、それによって直接得られる報酬に加えて、さらにその先の行動で得られる報酬も考慮する必要があります。例えば図1の場合、状態1においては、直接の報酬については、左が0.2で右が0.3なので右側の報酬確率が高いのですが、その先で得られる報酬の合計を考えると、逆に左側を選んだ方が得になります。

 このような判断を行うために、各状態において、各行動(右選択か左選択か)に対して、行動価値、すなわちQ(状態、行動)と呼ばれる値を学習によって求めることがキーポイントになります。この学習則についての詳細は、参考文献[1]を参照して下さい。このQ(状態、行動)は、その状態においてある行動を取った場合に、最終的にどれだけの総報酬が期待できるかという、期待値を計算するものです。したがって、このQの値が正確な値に近ければ、その状態で取るべき行動の指針となります。

Q(状態, 行動)の計算を観察する
 以下では、このQ(状態、行動)の計算がどのように進行するのかを観察します。図1の底辺部分から始めます。まず、図2aは、状態2における行動価値Qの推移(エピソードの進行にともなう)を示しています。50エピソード時点でみると、Q(状態2, 左)=0.25、Q(状態2, 右)=0.86が得られています。状態2における実際の報酬確率は、左=0.20、右=0.90ですから、Qの計算結果はかなり正解に近いと言えます。素晴らしい、使える!という気になります。


 次の図2bは、状態3に対するものですが、上記と同様に、Qの計算結果はほぼ、実際の報酬確率に近いことが分かります。


 次の図2cは、状態1に対するものです。この図では、Qの値が、報酬確率とかなり離れているように見えますが、これで良いのです。というのは、冒頭で述べたとおり、状態1でのQの計算は、直後の報酬だけでなく、その先で得られる報酬の総和の期待値になっているからです。


 結論として言えることは、以下のように行動することが最善のようです。(もちろん、ゲーム毎に報酬確率の設定が異なりますので、図1のケースにおいてです。)

 状態1→左側選択→状態2→右側選択

 ただし、もしも、エピソード10が終わった時点で判断すると、図3cからも分かるように、状態1で右側を選んでしまうでしょう。そうすると、最終的に高い総報酬報酬は得られないはずです。どのくらい(エピソード数)学習させるべきかについては、十分な注意が必要でしょう。

■ 感想
 このレベル2の例題は、Q(状態、行動)とはどんなもの?という疑問に答えてくれと思います。そして、強化学習の入り口へ案内してくれるように感じます。
 なお、上のグラフですが、Scratchのリストはテキストファイルとして簡単に取り出せますので、それをExcelに与えて描画させました。

謝辞
著者の伊藤真氏からのご指摘で、記事の途中から「エピソード」が、誤って「エポック」になっていたことに気づき、訂正しました。

参考資料
[1] 伊藤 真:ScratchでAIを学ぼう- ゲームプログラミングで強化学習を体験、日経BP、2020年8月11日第1版

2021年7月26日月曜日

Scratchプログラミングで強化学習の基礎(1)

【what is this】子供向けと言われるScratchですが、伊藤真著[1]にはゲームの形で、強化学習(3段階に分けたQ学習)が、実に丁寧に説明されています。大人にも有用と思われます。本記事では、このうちの最初の例題(レベル1)を対象として、(小生独自の改造も加えて)強化学習を詳しく観察します。
[->続編はこちら]

■ レベル1例題:砂漠でダイヤ集めゲーム
 レベル1例題は、図1(a)に示す左右の穴を掘って、ダイヤをたくさん集めよ、というものです。左右の穴はダイヤが出る確率が異なりますが、その確率はプレーヤーには知らされていません。ダイヤが出れば報酬1、出なければ報酬0が与えられます。プレーヤーは「人間」と「強化学習」です。限定された試行回数において、総報酬(=得点)をできるだけ多くするには、どのような戦略で左右の穴を選択すべきでしょうか?


 図1(a)はオリジナルのステージデザインですが、(b)は、後述する「予測報酬確率」の推移をグラフ化するための改造版です。

■ 「人間」プレイヤーの戦略
 人間がプレイヤーの場合、色々な戦略が考えられます。全くデタラメに左右を選ぶのではなく、ここでは、ひとつの方法として、以下の戦略をとります。例えば、試行回数100回の場合、
  1. 最初の25回は左を選択し続けて、その穴のダイヤ出現確率を予測。
  2. 次の25回は右を選択し続けて、その穴のダイヤ出現確率を予測。
  3. 残りの50回は、上記の確率の高い方の穴を選択し続ける。
 この方法は、前半の50回を「探索」に、後半の50回を「活用」に費やすものであり、これでもある程度高い得点が得られるでしょう。

■ 「強化学習」プレイヤーの戦略
 この強化学習の戦略は、試行の度に、左右のダイヤの出る確率(予測報酬確率)を更新し、その時点で確率が高い方の穴を選択します。ただし、ある小さな確率(乱雑度ε)で、それには従わずにデタラメに右が左を選びます。図2がその概要です。この書籍では明記されていませんが、このような枠組みは、一般にε-greedyポリシーと呼ばれるものです。


 上記の左右の予測報酬確率は、図3に示す学習則で更新されます。左右どちらかの穴が選択される毎に、その穴に対する予測報酬確率が更新されます。小さな値の学習率を使って、予測報酬が実際の報酬に徐々に接近することが期待されます。なお、1回当たりの報酬は、図2に示すとおり、1か0です。


■ 報酬確率が途中で変更になった場合、どちらが有利?
 両方の戦略を実際に数回(いずれも試行回数100回で)試してみました。「強化学習」の方がやや優勢のようでしたが、それほどの差はないようです。「人間」の戦略でも、両方の穴の報酬確率は、25回の試行である程度正確に掴めるからでしょう。ただし、ここには、前提条件があります。つまり、両方の穴の報酬確率はもちろん知らされていないのですが、その報酬確率は途中で変わらないという前提です。

 もしも、報酬確率が途中で変わるとどうなるでしょうか。前半で左右の穴の報酬確率を予測、後半でそれを活用、という「人間」の戦略では、後半で報酬確率が大きく変動した場合、悲惨な結果となるでしょう。

報酬確率が途中で変動しても対応できる「強化学習」
 このような、報酬確率が変動する場合でも、「強化学習」の方は対応できます。以下で、それを実際に確認します。図4(a)は、前半50回までの左右両穴の予測報酬確率の推移をグラフにしています。(実際の)報酬確率は左が0.7、右が0.4であり、予測報酬確率は、その付近を振動しています。そして、実際、左右の選択は、左が41回、右が9回であり、順当に進行しています。


 さて、ここで(51回目で)、左右の報酬確率が大きく変動しました。つまり、左右の報酬確率が入れ替わってしまいました。でもご心配なく。間もなく、予測報酬確率も、それに追随して減少(左の穴の場合)、増大(右の穴の場合)していることが分かります。右側の予測報酬確率の上昇により、右側の選択回数が上図の9回から38回まで増大しています。


 結論として、100回の試行において、上記の報酬確率(0.4〜0.7)のもとで、68点という良い得点が得られました。なるほど強化学習!という感じです。
(ただし、「途中で報酬確率が変わる」と言っても、変わった後の新しい報酬確率が一定期間持続するという前提においてです。全くデタラメに報酬確率が変化するのであれば、どんな戦略も有効とならないでしょう。)

■ 補足
 今回の例は、冒頭に述べたように、レベル1という初歩段階のものです。一般的な「強化学習」は、「状態、行動、報酬」を基に行われますが、今回は「状態」は扱わないものとなっています。レベル2,レベル3になると、「状態」も使った本格的な強化学習になって行きます。

■ 感想
 普段、PythonやJavaでプログラミングしている人にとっては、Scratchは別世界です。まどろっこしく感じる場面も多いです。しかし、本例のように、何かをもっと詳しく調査したい、その結果も素早くビジュアルにしたい、そういう場合はとても便利な開発環境だと感じました。そして、あまりプログラミングに馴れていない人に、説得力をもって説明する場合の助けになるとも思いました。

参考資料
[1] 伊藤 真:ScratchでAIを学ぼう- ゲームプログラミングで強化学習を体験、日経BP、2020年8月11日第1版

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

2021年6月28日月曜日

梅雨の合間の小さな生き物

 このコロナ禍、気軽に旅行にも行けません。暫し、近所のちょっとした水場を散策する日々です。そんな時に出会った小さな生き物たち、何か安らぎを与えてくれます。以下の写真は、ニホンアマガエルとハグロトンボと思われます。

こんな石柱を登って何処へ行くの(厚木市郊外にて)
おーい、そんな高い所まで行ったら、降りられないぞ。


いつの時代からこんな華麗なスタイルに(厚木市郊外にて)
翅を開くもまたよし


2021年6月20日日曜日

A list of my articles about MIT App Inventor apps

I have written about 300 posts on this blog, including articles on computer science and smart phone applications. Most of them are written in Japanese. However, some of them on MIT App Inventor were written in English, so that people outside Japan can also read them.

Here is a list of articles about MIT App Inventor written in English. I would be very happy if people who are going to use App Inventor to develop new apps can refer to them.

# Various apps using App Inventor 

Make a mini calendar app for Android, celebrating the New Year

Beautiful mountain view comes automatically to your smartphone 

Finally arrived! Beautiful mountain photos that were automatically recognized!

Supporting social dilemma experiments with App Inventor 

Voice Calculator: well-crafted AI tutorial 

Using the MIT App Inventor FaceExtension (for Facemesh) 

Identify the position from the key point number in Facemesh

Enjoy finding out Hamiltonian Cycles

Enjoy Reinforcement Learning in Tic-tac-Toe 

Enjoy live cameras from across the world on your smartphone 

Timer Overhead(in MIT App Inventor)

Firebase GPS demo made with ThunkableX (common to Android & iOS)
(Note: This app uses ThunkableX, not MIT App Inventor)

# Using the App Inventor Extensions (JSON, AWS, etc.)

A JSON Decoding Extension for App Inventor (1)  

A JSON Decoding Extension for App Inventor (2) 

Another example using JSON Decoding Extension

Decoding JSON by using new Dictionary Blocks 

A good example of Extension for App Inventor 

Using MIT App Inventor AWS AI Services Extension 

Creating my own extension blocks for App Inventor

# Linking App Inventor and micro:bit 

Cooperation between micro:bit and MIT App Inventor with Eddystone signals (No.1)

Cooperation between micro:bit and MIT App Inventor with Eddystone signals (No.2)

Cooperation between micro:bit and MIT App Inventor (No.3)

# Using JavaScript in App Inventor

Make MIT APP Inventor more powerful with JavaScript 

Writing formulas in both AppInventor and JavaScript 

# More App Inventor resources

Rapid Prototyping Using App Inventor in Information and Computer Sciences Course

Empowering Students to Develop Mobile Applications by Using App Inventor for Android