2017年3月22日水曜日

マルチエージェントシステム NetLogo3D

 私は、アートはやっていないので、本格的な3Dグラフィックスは必要ありませんが、時として、(線画でもいいので)簡単な3Dのシミュレーションをしたい場合があります。特に、マルチエージェント指向においてです。幸い、NetLogoには、NetLogo3Dがあり、手軽に使えます。

 簡単な3D例題がシステムにも組み込まれています。例えば、下図のように、高さの異なる3つの山がある地形において、谷のある地点から、最も高い山に登るとします。そのための簡単な方針は、自分の近接8箇所(8パッチ)のうちで、自分よりも高いいずれかの方向へ行くことです。以下のようになります。
いつも近隣のより高い方向へ進んだ場合

 ある山頂に達しました。しかし、これは最も高い山ではありません。実は、最も高い山は左下の山です。基本方針は、自分の周囲のより高い方向を目指して進むのですが、ある低い確率で、逆に自分よりも低い方向を選択してみます。そうすると、時々、うまく、最高峰に達します。ここでの、3Dビジュアル化は、探索方針の理解や策略を練るのにとても有用な気がしてきます。

時には自分の位置よりも低い方向へも進むと、最高峰へ行ける場合がある
(いつも成功するわけではありません。)

2017年3月20日月曜日

CNN(Convolutional Neural Network)の仕組みを見る

 Deep Learningにおいて、畳み込みニューラルネットワークCNN(Convolutional Neural Network)は重要な地位を占めています。「畳み込み」は、古くから画像認識などで使われているようです。これをNeural Networkに組み込むことで、その威力をさらに発揮するようです。CNNについては、各種の解説記事やビデオ(Youtubeなど)もありますので、それで学ぶことができると思います。

 ここでは、Deep Learningの技術書として名高い下記の書籍の第7章「畳み込みニューラルネットワーク」に使われているPythonプログラムの構造を理解するために、それを図示してみました。もしも、この書籍で勉強している方がおられたら、ご参考にして戴けるかも知れないので...(下図はダブルクリックして拡大してご覧下さい。)

最も簡単と言われるCNNの7層構造

【参考文献】
斎藤康毅著:ゼロから作るDeep Learning - Pythonで学ぶディープラーニングの理論と実装、オライリージャパン、2016

2017年3月8日水曜日

多クラスロジスティック回帰の可視化

 Deep Learningの最も基本的なところをやります。その一つは、多クラスロジスティック回帰と呼ばれるものです。ニューラルネットワークとしては、最も単純な、中間層のない、入力層と出力層からなりますが、学習用の何種類かの画像の組を与えて、学習させます。それらとは別のテスト用の画像を与えて、学習時の画像のどれに最も近いかを推定できるものです。

 下記参考文献に基づきやってみました。ただし、ここでは、新たに可視化を重点に置きました。すなわち、学習がどのように進むのかを、入力層と出力層のノード間の重みをビジュアルに見られるようにしてみました。

 入力パタンデータは、以下の4種類です。10x10のビット列で表現します。

学習用パタンデータ4種(10x10のサイズ

 つまり、入力層のノード数は100個(10x10)です。"1"か"2"か"3"か"4"かを以下で推定するのですから、出力層のノード数は4個にします。初期状態では、全結合辺に対して、小さな重みを乱数で与えます。また、左下方にあるバイアスの辺の重みは0.0として出発します。

入力層100ノード、出力層4ノードのパーセプトロンの初期状態

 学習を進めます。すなわち、ここでは、「標準デルタ則」によって、重みを少しづつ更新し、出力ノードの出力の正解(教師信号)との差をできるだけ小さくして行きます。以下の図は、まだ学習回数2回目ですが、早くも、辺の重みが良い方向に向かって更新されているようです。(辺の青、赤は、それぞれ、重みの値の正負を表します。また、重みの値の絶対値の大きさを辺の太さで表現しています。)

学習2回目の状態

 さらに、学習回数= 1,000まで進めた結果は以下のとおりです。重みがかなりはっきりしてきました。これ以上学習回数を増やすと、徐々にさらに良い方向に行くようですが、ここで止めます。

学習回数1,000回目の状態

 学習が一応済んだ段階で、今度は、学習時に与えたパタンデータとは少し異なる以下のパタンを与えて、その認識の度合いを調べます。

認識テスト用のパタンデータ
下図は、その結果です。学習回数1,000回での結構良い認識結果ですが、10,000回に増やすとさらに認識の程度は上がることがわかります。

テストパタンの認識結果

 以上は、Deep Learningの入り口に過ぎませんが、その可能性を具体的に知る、見ることになると思います。

【参考文献】
深井裕二「Java人工知能プログラミング」、三恵社、2016

2017年3月1日水曜日

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

 Google Translate(グーグル翻訳)の素晴らしさについて以前書きました。また、その根幹となっている人工知能を改善するために、人手翻訳との比較や人手検証も重要な地位を占めているらしいことも書きました。以下の記事です。

 その「人手による翻訳と検証」は、ボランティアで多くの人々が貢献できるような仕組みになっています。私自身も、それに共感してボチボチやっていました。だいぶ貯まったようです。このほど、Google Translate Communityから感謝状(デジタル)が届きました。「Thanks!あなたは上位5%にあたる貢献件数を達成しました。」というものでした。


Google Translate Communityから届いたデジタル感謝状

 具体的な「貢献内容」は4種類あります。何れも短い文章や単語についてです。人手で翻訳する(英語<->日本語)、機械翻訳(Google Translateの結果)の妥当性を〇×で評価する(英語<->日本語)。皆さんも、英語の勉強をかねてやってみてはいかがでしょうか。

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(未来の開発者)、よい響きです。学生のみなさんにこの言葉を贈りたい!