2017年2月24日金曜日

卒研のレベルを高める手がかり(その3)

 複数のスマートフォン(Androidなど)やPCの間でデータを共有したい場面は非常に多いです。卒研でもそうでしょう。そのための具体的な方法はいくつかありますが、その中でも、key-value型のデータベースを使うためのTinyWebDBがあり、非常に便利で高性能です。これは、MIT App Inventor for Androidに備わっています。最近では、その仲間のThunkableやAppyBuiledrでももちろん使えます。

 従来のTinyWebDBは、下図のとおり、クラウド(Google App Engineなど)の上のPythonで作られていました。手軽に使えて非常に良いのですが、場合によっては、いつもクラウドへアクセスするのではなく、ローカルネットワーク(LAN)の中でそれを使いたいことも多いです。例えば、研究室内でデモする場合など、Androidアプリケーションは変更せずに、TinyWebDBのサーバアドレスだけ変更して、それができればいいですね。

ローカルネットでもTinyWebDBをつかう!

 それを実現するためのPHPプログラムを作った人がいて、早速それを利用させていただきました。上図のように、1台のAndroidでWebサーバを動かします。その際、PHPも使える必要があります。このWebサーバに、このPHPプログラム(TinyWebDB)を格納すればよいのです。Android用のWebサーバプログラム(PHP付き)は、Googleプレイに有料、無料のものが多数ありますので、それを利用できます。

 ところで、このTinyWebBDですが、"Web"の付かないTinyDBというのも、同じ構造ですが、(ネットワークを使わない)Android単体内部では使えます。これも必要に応じて使えます。Key-Value型(Tag-Value型ということもある)は、単純ですが、以下のように、Valueとしてリストも使えます。それによって、TinyDBの中に構造を持たせることができます。それによりさらに用途が広がります。

Key-Value型だが、Valueをリストにすることで構造を持たせることも可能

2017年2月22日水曜日

卒研のレベルを高める手がかり:Multi-level Models In NetLogo 6(その2)

先の記事で、NetLogo 6のMulti-Levelモデリングについて書きました。
http://sparse-dense.blogspot.jp/2017/02/multi-level-models-in-netlogo-6.html

これまでは、それぞれ2つの独立したmodel(NetLogoプログラム)であったものを、有機的、階層的に連結して、そられをマルチスレッドで同時実行させるものでした。さらに、注目すべき、下記の短い論文に出会いました。

[文献1]Arthur Hjorth, et al.: LevelSpace: Constructing Models and
Explanations across Levels, Proc. of the Constructionism 2016, pp.362-363, 2016.

その中にある図を引用させていただきます。
NetLogoの3つのmodelの連携([文献1]より引用、説明加筆)

2ページの論文なので、各modelの詳細は書かれていませんが、すばらしいアイディアであることはすぐに分かりました。以下のような内容です。model-1とmodel-3のソースコードは公開されていますが、model-2(ニューラルネットワーク)の詳細は書かれていませんので、これを自分で設計、実装すれば理解が深まり、実力がつくでしょう。

◎ model-1のみ:狼と羊の個体数のダイナミクス
羊は草を食べ、狼は羊を食べる。羊も狼も一定のエネルギーを得るとある確率で子を増やす。また、ある条件で死ぬ。草もある確率で再生する。この単独モデルでは、これらの確率は乱数で決めていた。

◎ mode-3を追加:温室効果ガスによる気温変動
このモデルを使って、model-1での草の再生の具合を、環境変動(気温変化)に依存させる。

◎ model-2を追加:ニューラルネットワーク
このモデルを、狼の(羊にも適用できるが)脳の働きを簡単に模倣するのに使用する。すなわち、model-1単独の場合は、狼の進むべき方向は乱数で決めていたが、各狼にそれぞれ簡単なニューラルネットワークを割り当てることで、環境(近隣の羊や草の情報)に応じて進む方向を決める。つまり、狼に頭脳を与える。ニューラルネットワークの辺の重みは子に継承させるが、子は、次第に僅かにそれらの重みを変えることで、より環境に適応できるだろう。

メインのmode-1に、上記の2つのモデルmodel-2, model-3を連結させて、それらをマルチスレッドで同時に動かす。これによって、よりリアリティのあるシミュレーションとなっていくだろう。

2017年2月16日木曜日

来た!Java TensorFlow!

 Googleの著名な人工知能開発環境(ライブラリ)TensorFlowが、昨日(2017-2-15)正式版Version1となりました。

 今まではベータ版だったのですね。その際に、特に注目されたのが、Java APIが公開されたこと。ただし、Javaの場合は安定性の保証がない実験的実装となっていますが。これまでは、主にPythonでした。Pythonは非常に使いやすいのではありますが、学生諸君が(私もですが)また、新たにPython言語を覚えないといけないので、ちょっとしんどい。でも、もちろんやる気でここまできてはいました。

 ここへ来てJavaでTensorFlowが使えるとなれば、これは私にとっては一大事。取組み戦略も変えないといけないくらいの出来事です。すぐに、そのTensorFlow Java APIを使う例題を動かすことにしました。多少トラブルがあったものの、Mac Power Bookで動かして、感触を掴むことができました。

 その例題は、(どれだけの画像を学習させたは不明ですが)とにかく、与えられた画像を1,000種に分類するものです。つまり、与えた画像に映っているものが、1,000種類のもののうち、どれに一番近いかを判定します。下図が実行結果例です。

上段:ニューラルネットワークの画像→判定はcrane(鶴)。そうも見えます。
下段:ICカードリーダーの写真:→判定はmouse。そうも見えます。


 このJava例題は、学習済みのCNN(畳込みニューラルネットワーク)を使って、何でも与えられた写真(画像)を判定するものです。比較的簡単な例題として作られたものなので、それほど高性能ではありませんが、今後Javaでやるための糸口を得られたことが大きい。もちろん、今後、学習するためのCNN自体も、このTensorFlow Java APIで作ります。

2017年2月12日日曜日

卒研のレベルを高める手がかり:Multi-level Models In NetLogo 6

 今年度の卒研は終わった。その内容はまだまだ不十分だろう。そのレベルを高めるとは何を意味するだろうか。探求意欲の乏しさ、着想の未熟、現実性や実用性からの乖離、それらから脱却したい。できるところから改善を進める。普段からそのことを想い巡らしている必要があるだろう。

 エージェント指向モデリング環境NetLogoの最新版Version 6のある機能が気に入っている。Multi-level Models In NetLogo 6である。従来は、特定の自然現象や物理現象ごとに、それぞれモデル(プログラム)を作っていた。それで非常に高いレベルのシミュレーションはできた。今回、さらに、個々のモデルを連結して、ひとつの統合モデルにする機能ができたのである。しかも、それらを階層的に結合できる。それらは同時に(マルチスレッドで)実行される。

 例えば、あるモデルに含まれるある機能(サブモデル)は大まかに(マクロに)作成して動かす。別途、そのサブモデルを具体的に実現するモデルを作る。その2つを階層的に結合して一つのモデルとして、全体を同時に動かすのである。

 何か、卒研のレベルを高めるためのヒントを与えられた気がする。具体例を見てみよう。NetLogoシステムに含まれるモデルライブラリのうちから、次の2つに着目する。(両者は互いに独立に、特に関連性なく開発されたモデルである。)

Wolf Sheep Predation(羊の群れに対するオオカミの補食圧)
 草原には草が生える。羊はそれを食べて子を産む。狼は羊を食べて子を産む。それらは何れもある確率で生ずる。草が枯れてしまえば、羊が居なくなり、狼も死滅する。狼が増えすぎてもいけない。羊と狼の個体数の変動(ダイナミクス)を観察する。
 
Climate Change(温室効果ガスによる気温変動)
 CO2は、太陽からの照射エネルギーは通過させるが、地面からの輻射エネルギーは通過させないので、大気の温度は上昇する。これは、CO2 greenhouse effect (温室効果)と言われる。


Wolf Sheep Predation(羊の群れに対するオオカミの補食圧)

Climate Change(温室効果ガスによる気温変動)


 この両者を結合して一つのモデルにするのである。すなわち、Wolf Sheep Predationでの草の生え方を、Climate Changeによる温度変化に基づいて、より精密に決められる。このようにして、モデルを階層的に作って統合することで、現実性の高いモデルを作るのである。この例では、地球温暖化の問題を取り込んだことで、より現実的な課題に向かうきっかけになるだろう。

2017年2月10日金曜日

FirebaseをMIT App Inventorから利用する

 「互いに、相手の居場所が変わったら、自動的に自分の端末の地図にそれが表示される」という地図アプリを作りたいとします。

 相手の緯度経度がwebデータベースに格納されるとして、適当な時にそれをチェックしてその位置情報を得て、自分のマップ上に表示すればよい。しかし、それではちょっと不満が残ります。下図のように、相手の居場所が変わったら、自動的に直ちに、自分の端末にそれを示したい!そこで、Firebaseの登場です!実際、以下の図1と図2のプログラムがそれを実現するための全体です。

【プログラム設計】互いに、相手の位置が更新されたら自分の画面に直ちに表示
自分の位置送信ボタンはあるが、相手の「位置受信ボタン」は無い!

 リアルタイムのプッシュ型と言っていいのでしょうか。FirebaseというKey-Value型のWebデータベースがあり、色々な用途があるようです。特にこれが、MIT App Inventor for Android(および、ThunkableAppyBuilderでももちろん)が使えるようになっています。大いに活用したいものです。
 App Inventorには、これまでもKey-Value型のWebデータベースとして、TinyWebDBが有名でした。これとの大きな違いは、Firebaseでは、特定のKey(タグ)に対するValue(値)が(誰かによって)変更された場合、アプリケーション側で自動的にそれを関知してその変更値を受け取ることができる!ことです。すなわち、アプリケーションが自分でデータベースを見に行って、変更があるかどうか調べる必要がありません。それによってプログラムは簡単になります。以下にその部分を示します。

(図1)データベースの値の変更を自動的に受け取る処理部

これを使って、「相手の位置が変わったら、自動的にマップのその位置にマーカーを表示する」例が以下に解説されています。分かりやすくて有用です。

Using Firebase in a real app – “Here I AM!” GPS Demo app

 それを参考に、さらに簡単なプログラムを以下に示します。図1と図2がこのアプリの全てです!

(図2)現在位置をFirebaseへ登録する部分

(注1)相手の位置を受信するボタンはありません!(自動受信です。)
(注2)本当は、自分の位置の送信ボタンも不要です。しかし、そうすると、バッテリーの消費が著しくなりますので、送信ボタンを設置しています。
(注3)とりあえず、2人用に作りましたが、Firebaseへ格納する際に、タグに個人ID情報を加えれば、3人以上もできます。


2017年2月2日木曜日

Developer of the Future!

 何かのコンテストに入選して、その賞品が届くとなれば、誰でも(年齢を問わず)ワクワクして待ちますね。その入選については、下記のとおり、本学KAITニュースと情報工学科ブログでも紹介していただきました。

http://www.kait.jp/news/1336.html
http://blog.cs.kanagawa-it.ac.jp/2017/01/y.html

 このAndroidスマホアプリのコンテスト、学会発表などとはちがう、誰にも親しめる雰囲気があります。ちょっとくつろげる、ちょっと心暖まる要素も含まれています。これにふさわしい賞品が米国から届きました!先方は、"a fun holiday gift, it's pretty cool!"と言っていました。

アメリカから郵送されてきた賞品

 帽子と「Top Developer 2016」というステッカーが入っていました。少し前に、この賞品の写真が別途送られて来ていました。これを家人に見せたところ、「トランプ大統領の帽子に似てない?」と言われました。「う〜ん、似てるかもしれないが刺繍(ししゅう)が違うでしょ。Make KAIT Great Againじゃなく、Developer of the Futureとなっている!」

ヘッドの文字部を拡大
ステッカーの裏側

 Developer of the Future(未来の開発者)、よい響きです。学生のみなさんにこの言葉を贈りたい!

2017年1月28日土曜日

こんな卒研をやってほしい:人工知能で「きゅうり」の自動選別

 注目のDeep Learningですが、下記に示した雑誌[1]で、Google TensorFlowの解説大特集が出ました。これは見逃すわけには行きません。紙版と電子版の両方とも1,000円ですから安いと思います。さっそく、中身を大まかに見てみました。後で、詳しく読んで試してみたいと思いますが、まずは、そのためのメモとして書きます。

 全179ページのうち、この特集は88ページを占めるという力の入れ方です。大まかな構成は以下のようになっています。以下の区分けやタイトルは筆者独自の見方によります。(雑誌のとおりではありません。)

【A】 PP. 11-22:ラズパイでGoogleの人工知能
・GoogleのTensorFlowが、超小型コンピュータラズパイから使えるようになった。
・TensorFlowの概要と、考えられる応用やアイディア
・TensorFlowの解説、使える関数群の紹介など

【B】PP. 23-52:きゅうりの自動選別への応用
https://www.youtube.com/watch?v=PY-PN5xfw_0&t=12sより
・農家で手間のかかっている「きゅうり」の自動選別の実験システムの構築
・その頭脳は、ラズパイ3上のTensorFlowで作成。その設計と実装の詳細。
・きゅうりの大小、曲がり具合などから、4等級に自動判別して、サーボモータで、指定の箱にはじき入れる。その様子は、下記ビデオに公開されている。
https://www.youtube.com/watch?v=Nho2yyCdb3A
(現段階では、人手による選別の方がずっと速いが、今後の可能性を感じさせられる。)

【C】PP. 53-86:TensorFlow初体験ガイド
・対象PCなどの確認とインストール
・Googleの公式webページに沿った解説
・TensorFlowプログラミングの基礎
・MNIST(手書き数字セット)の学習と認識実験
・顔認識アプリケーションを試作(畳込み層も使ったブッシュ元米大統領の顔)

【D】PP. 87-91:TensorFlow以外の人工知能ライブラリ
・Caffe, Chainerについても簡単に説明

【E】PP. 92-98:Deep Learningのアルゴリズムの簡単なまとめ
・ニューラルネットワークの順伝播、逆伝播などの説明
・誤差関数の微分を使った重みの更新なども含む

-------------------------------------------------------------------------------------------
雑誌[1] Interface(インターフェース) 2017年 03 月号 雑誌 – 2017/1/25
書籍[1] Make Your Own Neural Network (English Edition), Tariq Rashid  (著)
書籍[2] ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装, 斎藤 康毅  (著)
-------------------------------------------------------------------------------------------

 以下は、筆者の簡単な感想になります。

【B】で示された「きゅうりの自動選別」を知り、このような現実的な問題を解くアイディアは素晴らしいと感じた。ぜひ、卒業研究として見習ってほしい!

 本特集記事は、全体的に力作であり非常に参考になる。しかし、この雑誌だけで、その内容を完全に把握することは、初心者には難しいのではないかとも感じる。Deep Learningのポイントの1つは、バックプロパゲーション(誤差逆伝播)にある。その仕組みの概要は【E】でも一応述べられてはいる。しかし、それだけでは理解は難しいだろう。その克服には例えば、上記の書籍[1](平易な英書)を勉強すればよい。そこには、非常に丁寧に、「出力層で検知される誤差(正解とその時点の評価値との差)が、それ以前の中間層各層においてどの様に(逆方向に)配分されるか」も詳細に説明されている。これが、誤差逆伝播のきもなのであるから。

 さらに重要なのが、畳込みである。CNN (Convolutional Neural Network)である。この特集の【C】では顔認識をTensorFlowを使ってやっており、そこでは畳込み層を何層か使っている。しかし、「畳込み」の意味とその処理内容には触れていないようである。ニューラルネットワークによる学習機構の基礎を学んだ上で、CNNに向かうのが良いであろう。そのための、優れたテキストの一つが、上記に示した書籍[2](和書)である。ぜひ、多くの皆さんに勉強していただきたい。
 今や、このCNNは、高精度の認識のためには不可欠の技術と考えられている。書籍[2]以外にも、CNNを解説している以下のYouTubeビデオも有用であろう。何とか聞き取ることで英語の訓練にもなる。

2017年1月22日日曜日

あらためて驚きました2:Google Translate


 Google翻訳のすばらしさについて、下記の記事を書きました。
あらためて驚きました:Google Translate

 さらに、なるほどと思ったことがあり、ここに書きます。やはり人間の力が必要ということです。ニューラルトランスレートという数理にもとづく高度な翻訳機構ですが、人間の自然な言語感覚や一般的な感性を自動的に生成することは困難なようです。こんなすばらしいGoogle Translate(グーグル翻訳)ですが、多くの利用者に人手による改善の協力を求めています。

 すなわち、例えば日本語 -> 英語、英語 -> 日本語について、翻訳例の妥当性検証や翻訳そのものを利用者に要請しています。協力したい気持ちがあったので、私も少しづつやっています。(1,000件は越えました!)比較的簡単な翻訳検証や翻訳要請が出ます。スマホでもできるので、ちょっとした空き時間にもできます。もちろん、ボランティアですが、励みになるように、デジタルバッチを、貢献量に応じてもらえます。

 これは、「集合知」というやり方でしょうか。性善説で成り立つようです。多くの利用者は、真剣に改善に貢献したいと思ってやるでしょう。仮に、悪意のある人がやったとしてもそれはノイズの一種にすぎず、学習が進むにつれてフィルタリングされて行くので問題はないように思われます。


2017年1月19日木曜日

きりがありませんが、Deep Learning体験

 いろいろあってどれで学んだらよいのか、迷う人も多いと思われるDeep Learning.
またここに書くことになりました!DeepBeliefというツール(ライブラリ)です。確か、あれもなったなあ、と思い出すためのメモとして書きます。

 これにより、Android, iOSなどスマホで動くアプリを作ることができます。またサンプルプログラムもあって、Androidであれば、すぐにAndroid Studioのプロジェクトとしてimportして動かせます。

 その例題は、もちろんオフラインで、すなわち、すでに学習済みの状態なので、Androidのカメラで何かを撮影すれば、リアルタイムに何が写っているかを答えてくれます。学習方法やその処理内容は自分でAPIを利用してもちろん改善することができます。

 下図は、Androidのカメラで障子を写しました。その奥にある洗濯物の陰が見えます。認識結果はリアルタイムに左上に短い英語で示されます。shoji-0.85, window shade - 0.07と出ています。shoji(障子)、見事ですね。

AndroidスマホでのDeep Learningによる画像認識

2017年1月18日水曜日

あらためて驚きました:Google Translate

今月号の「情報処理」に下記の記事があります。
■ニューラル機械翻訳の衝撃

これまでの機械翻訳っていうのは、(知りませんでしたが)ニューラルネットワークを使ったものでは無かったが、Googleがこれをやって驚異的な成果を上げているということのようです。

これを読んでなるほど!と思いました。少し前に、私は下記の記事を書きました。そこでのGoogle Translateの性能がかなり凄そう!と思ったことと合致しています。

Google TranslateをMIT App Inventorで試す
http://sparse-dense.blogspot.jp/2016/11/google-translatemit-app-inventor.html

最近の一連の「人工知能」の立役者の一人は間違いなくGoogleのようです。
さらに驚きました。下記の英文を改めてGoogle Translate(Web版)で翻訳してみました。漢字の名前を除けば、ほぼ完璧(95点くらい)ではないでしょうか!しかも、日々進化しているようです。(日本語文がちょっと短いなと思ったら、to encourage his students to ... という修飾部が抜けていますが、これはご愛敬。

原文のうち、特に根幹部の青文字部分をどう訳すのかと思っていましたが、very goodです!

【英語原文】
Elevator Fun was developed by Professor Fujio Yamamoto of Kanagawa Institute of Technology, Japan to encourage his students to develop their own Android apps rapidly. The app estimates the next arrival floor of an elevator using the acceleration sensor, aka accelerometer, equipped on each phone. The app detects the velocity profile, in particular, the length of a constant velocity section, which corresponds to the number of floors the elevator passes through during a trip. Since elevators have different speeds, you can calibrate the app with the actual performance of your elevator. Great for those living and working in tall buildings!

【Google Translateの翻訳結果】
Eleven Funは、神奈川工業大学の山本藤夫先生が開発したものです。 アプリは、各携帯電話に装備された加速度センサー(加速度センサー)を使用してエレベーターの次の到着階を推定します。 アプリは、速度プロファイル、特に一定速度セクションの長さを検出します。これは、旅行中にエレベータが通過する階数に対応します。 エレベーターの速度が異なるため、エレベーターの実際のパフォーマンスでアプリを調整することができます。 高層ビルで暮らしている人には最適!