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

2021年6月18日金曜日

ちょっと惹かれるPython1行コード(その2)

 【what is this】前回に引き続き、短くて美しい1行コードを検討します。参考文献[1]を参考にしています。Pythonの初心者が中級へステップアップするのに適しています。小生もこれに該当しますので、個人的な忘備録でもあります。

例題:漁獲高の平均を上回る漁港をリストアップする
 今回データ分析の対象とするデータ(参考文献[2]を参考とした)を以下に示します。Python numpy配列であるFHには、主要な漁港名9つを格納しています。そして、別のnumpy配列Vには、この漁港の順に、2014年〜2018年の5年間の漁獲高(水揚げ量)を万トン単位で格納してあります。

【解くべき問題】
 上記データ45件(=9漁港x5年)の平均値を一回でも超えた漁港を示すこと。
【解答プログラム】
 以下の1行コードが解答プログラム(出力込み)です!
答えは、"銚子"、"釧路"、"焼津"の3漁港でした。

一行コードの分解 ...
 上記1行コードをすぐに理解できる人は少ないかもしれません。そこで、その中身を分解してみます。最後には、「なるほど、素晴らしい!」となるでしょう。

(1)平均値を求める
 これは下図のように、簡単です。

(2)平均値を超えるか否かを真偽配列で表す
 この真偽の配列は、下図のように生成することができます。numpyのbroadcastが働いています。

(3)"True"の位置のインデックスを求める
 上図の真偽配列において、'True'となる位置のインデックスを下図のように求めます。ここで、numpy関数nonzeroが使われていますが、'nonzero'は、Pythonでは、'True'に対応することに注意します。全45件のうち、13件が'nonzero'であり、その位置のインデックスは、下図のように2次元配列で表されます。
 例えば、上段の'0'と下段の'0'のペアは、銚子漁港の最初(2014年)のデータが、平均直を超えていることを意味します。また、釧路漁港(上段インデックス4)は、3回平均値を超えたことが分かります。

(4)漁獲高の絶対値はここでは不要
 上図は、2次元配列になっていますが、ここでは、漁港名に対するインデックスだけわかれば良いので、最初の1次元配列だけを取り出します。下図で、'[0]'がそれを実現します。

(5)インデックスのリストを配列に与える
 次に、このインデックスを漁港名に変換するのですが、以下のように、インデックスのリストを配列FHに与えることができます。

 
 これに従って処理を続けると、以下のように、漁港名のリストが得られます。

(6)最後は集合(set)で仕上げ
  最後に、漁港名の重複を除去するため、set関数を適用します。完成!

補足(Excelファイルを使う)
 上記のnumpy配列FHとVの設定に、以下のようなエクセルファイル(fishVol.xlsx)を利用しても良いでしょう。(pandasを使いますが、別途openpyxl, xlrdのインストールを要します。)

[参考文献]
[1] Christian Mayer, "Python One-Liners", No Starch  Press, 2020.
[2] 図録 主要漁港別水揚げ高(日本地図)とその推移, 2020.https://honkawa2.sakura.ne.jp/7400.html

2021年6月11日金曜日

ちょっと惹かれるPython1行コード(その1)

【what is this】誰でも、短くて美しいコードに憧れます。参考文献[1]には、Pythonによる1行コード(Python One-Liners)の考え方と実例がたくさん載っています。それを参考に1行コードを2つほど書いてみました。

例題:キノコの毒性に関するデータの学習と学習結果による予測
 機械学習の分類問題として、キノコを有毒か無毒かに分類することをやってみます。図1には、キノコの色(赤、青、黄)、笠の形(丸、角)、柄の長さ(長、短)、場所(地面、樹木)の特性によって、それが有毒か無毒かのデータ(参考文献[2]から引用)があります。これを機械学習によって学習させ、さらに、その学習データが正しく分類(予測)されたかどうかを確認します。

(注)上記データは現実のキノコにそのまま当てはまるものではなく、あくまで機械学習を学ぶために用意された仮想データです。従って、実際のキノコの毒性判定には利用しないでください。

SVMとRandomForestの一行コード(学習と予測)
 2つの手法(SVM-サポートベクタマシンとRandomForest)によるPython1行コードとその予測結果を示します。図2は、SVMの場合です。Python numpy配列のスライシング(特性データと正解レベルを分離するため)を行い、学習(.fit)結果を予測(.predict)へ接続しています。確かに、素早く簡潔なコーディングとなりました。学習に用いたデータに対する予測結果は、正解率89%でした。9件のうち1件のみが誤まった判定となりましたが、こんな少ないデータでも良く予測できることが確認できました。


 次は、RandamForestによる場合です。こちらの結果は正解率100%でした。素晴らしい!やり方は、SVMの場合と同様です。


 なお、図1での特性データは数値で与えたが、日本語で与えたい場合は以下のようにして、別途用意した辞書型変数Dを使い、map(lambda式を使う)処理を施せばよい。以下の実行結果は、図3での実行結果と同じになります。


 上図の変数Yの計算は、以下のどちらでも良いでしょうが、2番目の方がちょっとだけ分かりやすいかもしれません。
 Y = np.array(list(map(lambda i : list(map(lambda j : D[j], i)), X)))
 Y = np.array(list(map(lambda i : [D[j] for j in i], X)))

何のために1行コードを書くのか
 さて、参考文献[1]の最後に、以下のような叙述がありました。納得ですね。
Don't cram everything into a single line of code just to show off your one-liner superpower. Instead, why not use it to make existing codebases more readable by unraveling their most complex one-liners?
(単に何でもかんでも1行に詰め込むのではなく、複雑なコードを読みやすくするために!)

[参考文献]
[1] Christian Mayer, "Python One-Liners", No Starch  Press, 2020.
[2] 黒橋禎夫, "改訂版 自然言語処理", 放送大学教育振興会, 2020.

2021年6月9日水曜日

「強化学習理論入門」の最終章は深層学習だった

 【what is this】強化学習理論入門を書籍[1]で学んできましたが、その最終章(第5章)は深層学習でQ-Learningを行うものでした。ここでその技術を述べることはできませんが、最後の例題「あるけあるけゲーム」でその魅力に浸りたいと思います。

DQN(Deep Q Network)
 これまでに、行動ポリシーπについて、状態価値関数Vπ(s)や、行動-状態価値関数qπ(s, a)を計算して、最善の行動ポリシーを求めることをやってきました。しかし、状態(s)の数が非常に大きい場合などは、全ての状態についてこれらの関数値を保存しながら利用することは困難となります。(例えば、囲碁の場合、盤面の状態の数は10の172乗というとてつもない数になると言われています。)
 そういう状況で、状態価値関数や行動-状態価値関数の近似値を、ニューラルネットワークを利用して計算するというのが、この書籍[1]の最終章のテーマです。特に、先に述べたQ-Learningをニューラルネットワークで行うのが、DQN(Deep Q Network)です。また、この実行性能をさらに高めるために、「モンテカルロ・ツリーサーチ」の基本(実行時の一歩先読み)についても取り上げられています。

DQNによる「あるけあるけゲーム」
 ここでとりあげる「あるけあるけゲーム」の規則は、図1の右側の説明にあります。キャラクターは障害物(および自分の辿った場所)を避けて、できるだけ長く歩く、というものです。何の方策もなく歩くと、図1の結果のように、長さ(Length)5程度で短く終わる場合が多いです。自分の軌跡に戻ってしまってゲーム終了となる場合も多いです。


 これに対して、DQNで一定程度学習した後に歩かせると、図2のとおり、長さ20程度まで伸びる場合が多いです。


 このDQNでの学習結果を使って、実行時にさらに一歩先読みする方法(モンテカルロ・ツリーサーチの考え方に基づく)によれば、図3のとおり、著しく長く歩くことができます。なかなか素晴らしい結果だと思います。


上記DQNの構成と実行時間
 このゲームを、如何にしてベルマン方程式に結びつけるか(アクション、報酬、状態の設計)、そして、さらにどのようにニューラルネットワークで学習させるのか、それを学べるのが、この書籍の第5章なのです。図4はその最終的な結論としてのDQNのネットワーク構成です。詳細を掴むにはこの書籍を読んで戴く必要がありますが、画像認識で多用されている畳み込みフィルター(conv2d層)が使われている点がポイントの一つです。これは、別々のレイヤーに置かれたキャラクタと障害物の位置関係を把握するためです。


 畳み込みフィルタ(5x5を8種)、隠れ層2層(2,048ニューロンと1,024ニューロン)などが含まれているので、辺の重みやフィルタ値など合計で約500万個のパラメータを最適化することになります。そのため、Google Colab(GPU利用)で、図2に示した学習に約30分を要しました。しかし、パラメータ数は膨大のようにみえますが、上記のゲーム場面のすべての状態数よりははるかに少ないです。

本書[1]で学んだ感想
 基礎から始めて高度な強化学習理論が実に丁寧に説明されており、最後まで挫折せずに読めました。書籍によっては、最初は緻密な説明がなされていても、途中から杜撰な叙述になったり、急に飛ばしはじめたりする場合もあるのですが、本書は全くぶれることなく、最後まで緻密な説明で貫かれています。Pythonのコードの説明も、同様に非常に詳しく、読者にとってとてもありがたい。完全に理解したとは言えないかも知れないが、この強化学習理論の専門書(5章構成、全283ページ)を丸々一冊読み上げたということで、力がついた気がします。
 なお、著者自身によって、この書籍全体を要約解説したスライド50枚も公開[2]されており、(本書を読み終わった後に)知識を整理するのに大いに役立つと感じました。

本書に関する小生のブログ記事
 実は、この書を読みながら、自分のメモとして、これまでに、以下の記事をこのブログに書いて来ましたので、よろしけばご参考にされたい。

[第1章] 強化学習のゴールと課題
[第2章] 環境モデルを用いた強化学習の枠組み
[第3章] 行動ポリシーの改善アルゴリズム
[第4章] サンプリングを用いた学習法
[第5章] ニューラルネットワークによる関数近似
 ・「強化学習理論入門」の最終章は深層学習だった(↑今回の記事)

[参考文献]
[1] 中井悦司:ITエンジニアのための強化学習理論入門、技術評論社、2020年7月
[2] 中井悦司:60分で学ぶ「強化学習理論入門」、2020/09/04
https://speakerdeck.com/enakai00/60fen-dexue-bu-qiang-hua-xue-xi-li-lun-ru-men?slide=50

2021年6月4日金曜日

強化学習:モンテカルロ法とQ-Learning

【what is this】強化学習に関するさらなる続編です。前回のレンタカーショップ問題とは異なり、環境モデルが分からない場合の例としての迷路問題をとりあげます。そして、その解法としての、モンテカルロ法とQ-Learningの性能を観察します。

迷路問題とレンタカーショップ問題
 先のレンタカーショップ問題では、ある状態Sにおいて行動aを取った場合に、得られる報酬rと次の状態S'が起こる条件付き確率が分かっている(計算できる)必要がありました。しかし、現実の問題ではそれを満たさない場合も多いです。以下に述べる迷路問題(開始点から終点までの最短経路を求める)もその一つです。

モンテカルロ法とQ-Learning
 ここでは、迷路問題に対する解法として、モンテカルロ法とQ-Learningなどを検討しています。本記事は、実際のところ、これまでと同じく、中井悦司著[1]の第4章を学んだ成果を簡単に書いたものです。
 モンテカルロ法では、上に述べたような条件付き確率に頼るのではなく、シミュレーションによって、行動aに対して得られる結果の情報にもとづいて学習を行います。この方法では、シュミレーションのエピソード(episode:開始点から終了点に達する)が完了した情報が必要です。これに対して、Q-Learningと呼ばれる方法は、エピソードの完了を待たずに、1ステップ分の新しい情報を使って学習を進められる点が特徴です。

 手法の詳細は、参考文献[1]などをお読みいただきたいのですが、ここでは結果だけを示して、さらに知識を深める手掛かりとしたいと思います。図1は、両方法による迷路の最短経路の探索結果です。開始点(S)からゴール(G)を目指して、壁(#)を避けながら、上下左右のいずれかへ進みます。両方法で辿ったパスは違っていますが、ともに最適解になっているはずです。注目すべきは、学習に要した時間です。Q-Learningの方が圧倒的な高性能を示しました。


 これらの性能をさらに明確に示しているのが、図2です。学習中にどれだけの長さのepisodeを得たかを比較しています。モンテカルロ法では、初期の段階では、非常に長いepisodeを取得しながら学習しています。つまり、長いパスをさまよってなかなかゴールへ辿り着かない状況となっています。これに対して、Q-Learningでは、開始まもなく、急激に短いパスとなり、効率的に学習が行われていること示しています。


感想
 冒頭に述べた中井悦司著[1]では、今回の第4章(Q-Learningあたり)がクライマックスと言えましょう。しかし、書籍全体の約6割を占める第3章「環境が分かっている場合」の状態価値関数による(ベルマン方程式に基づく)統計学的な厳密解の求め方までで、それに必要な基礎は出来上がっています。つまり、第3章まで熟読すれば、第4章はスムーズに理解できるはずです。この書では、非常に丁寧な叙述が特色であることを強く感じます。また、確認のためのPythonコードについても詳しい説明がついていますので、少なくとも、Pythonの初級を終えていれば、理解にはほとんど困らないと思います。

[参考文献]
[1] 中井悦司:ITエンジニアのための強化学習理論入門、技術評論社、2020年7月