2016年11月27日日曜日

Web Serviceの続き(分散システムの演習)

 「分散システム」授業での演習の続きです。JavaのJAX-WSを利用して、簡単なWeb Serviceを作成、デプロイして提供します。Web Serviceは、本来、OSやプログラミング言語に依存しない汎用性を売り物にしているはずです。ですから、簡単な演習とはいえ、それを実際に体験することは重要ではないでしょうか。



 ということで、以下のように、Mac OS XのJavaで作成し、公開したWeb Service(本質的には、wsdlファイル)を、UbutuのPythonから利用するClientを作って試しました。図のように、PythonのSOAPライブラリであるsudsを用いると、Python Clientプログラムは非常に簡単に書けます。この例では、Web Serviceとして提供される2つのメソッドを、getTime()getSquareRoot(625.0)として、Ubuntu側から呼び出して実行させています。

UbuntuのPythonでwsdlクライアントを実行

2016年11月24日木曜日

Google TranslateをMIT App Inventorで試す

 「グーグル、ニューラル機械翻訳の仕組みをブログで解説」という記事がWebに載っていました。Google Translateですね。それを試すには、すでにAndroidアプリがGoogle Playに公開されていますので、できます。しかし、ここでは、Google Translateを自分のAndroidアプリに組み込んでみます。

 そこで、MIT App Inventorです。ここには、すでに、Yandex Translateという自動翻訳用のブロックがありますので、すぐに使えます。しかし、Google Translateの方は、まだそのようになっていませんので、汎用のWeb_Getをして、返ってくるJSONファイルをデコードする必要があります。でも、JSON処理ブロックはありますので、かなり簡単にできます。

 ということで、さっそく、簡単なAndroidアプリを作成し、両者の翻訳性能(英語→日本語)をためして見ました。以下の図のようになりました。何例かやって見ましたが、圧倒的にGoogle Translateの方が優勢のようです!


 なお、Yandex Translateは無料ですが、Google Translateを上記のように自分のプログラムからAPIを呼び出して使うには、一定の料金がかかります!
 Yandexは、限時点では、仏語やスペイン語などを優先していて、日本語翻訳にはあまり力を入れていなようにも思える。それに対して、Googleの新しい手法では、統合的に日本語も対象となっているようだ。

2016年11月23日水曜日

Creating Web Services with JAX-WS

 「分散システム」授業での簡単な演習という記事を書きましたが、その続きです。
その時は、Java RMI (Remote Method Invocation)をrmiregistry(ネームサーバ)で行いました。今回は、さらに進化した現代のWeb Servicesです。以下のような仕組みです。

Web サービス(菅原健研次「はじめての分散処理システム」より引用)
 
授業でこの演習(簡単な例題で動作を確認)したいのですが、WSDLでの記述やSOAPメッセージの作成はそれなりに面倒です。それを大幅に緩和させて、しかも、Web Servicesの仕組みの本質を体験するには、JAX-WS web serviceというJava標準ライブラリを利用すれば良いようです。これで演習をやります。さらに、以下のこともできそうです!

  • JAX-WSでパブリシュしたWeb serviceに対して自動されたWSDLから、wsimport(jdkに標準付属)によって自動生成されたstub相当のプログラムを使って、クライアント側のプログラムを作成する。
  • Eclipseに組み込まれているTCP/IP Monitorを利用して、SOAPメッセージを追跡する。(ただし、この場合は、クライアントのポートをこのMonitorサーバのポートに変更する。すると、このMonitorから本来のクライアントのポートへ転送されサーバへ行く。)
  • 一例として、Java以外の例えば、Rubyでもクライアントを作成して、このWeb Serviceを利用してみる。Web2.0のもと、Web Serviceは、言語やOSに依存しません!
  • なお、ここではUDDIは省略。たくさんのWeb Sericesを生成した場合はUDDIへ登録することになるが...

-------------上図の補足---------------------------------------------------------
[1]機能
 ●人手を介さず、プログラムが自動的に協調
 ●高度なユーザリクエストを処理
[2] 構成要素
 ●アプリケーションサーバ
 ●Webサービスサーバ
 ●サービス仲介サーバ
[3] XML (eXtensible Markup Language)
 ●プログラムが、Webページの要素の意味に基づいた処理できるようにする。
[4] WSDL (Web Service Description Language)
 ●XMLベースで、Webサービスの仕様を記述する。
[5] SOAP (Simple Object Access Protocol)
 ●メッセージはXMLで記述、上記3サーバ間のメッセージ交換用プロトコル
[6] UUDI (Universal Description, Discovery and Integration)
 ●Webサービスの登録、問い合わせ、提供のためのプロトコル

2016年11月22日火曜日

日経ソフトウェア(2017年1月号)にもTensorFlow

 日経ソフトウェア(2017年1月号)、9ページという短い記事ではありますが、TensorFlowMNIST(定番の手書き数字認識)をやっているではありませんか!
人工知能(ディープラーニング)がこんなに身近で、手軽に使える時代になってしまいました。教員もうかうかできません!

TensorFlowはすぐ使えるよ、という日経ソフトウェアの記事9ページ分

 ディープラーニングでMNISTを高い精度で認識するには、多層構成の畳み込みニューラルネットワークを構成する必要があり、バックプロパゲーションでの全体の誤差関数の偏微分も効率よく計算しないといけない。TensorFlowは、そういうことを全部(ではないにしてもかなりを)受け持っているのだからこういう状況になる。

 しかし、使いこなすのはそんなに容易ではない。基礎知識がないとできない。あまりうかれていないで、地に足をつけて望む、という昔からの鉄則も心がけたい。


MIT App Inventorと人工知能(ディープラーニング)

 MIT App Inventor for Androidは、現在も進化し続けています。そのひとつとして、このサービスを新たな観点から進展させるサイトThunkable.comがあります。ここでは、いち早く、人工知能」というメニューを設置し、MicrosoftのEmotion RecognizerとImage Recognizerを使うためのブロックを提供しています。ディープラーニングに基づく画像認識ですね。


Microsoftの画像認識用のブロック(左メニューの下部)

これを利用すれば、以下のようなアプリを、App Inventorのみですぐに作れます。下図の右側の画像認識結果として英文説明が返ってきますが、自動的に日本語に翻訳もしています。この自動翻訳ブロックも上記メニューから利用できます。(英語→日本語変換はかなり難しいようです!?)

感情(左)と物(右)の自動認識結果


2016年11月20日日曜日

次にTensorFlowへ

 「PythonでゼロからDeep Learningを作る」をひと通りやった後は、いよいよGoogle TensorFlowへ行くのがひとつの流れでしょう。勉強だけやってもどうかという声もありそうですが、何か事業を始めるには、基本知識や立案能力の涵養、それと事業資金の調達が必要です。修士の研究や卒業研究も同じですね。一定の基本技術はきちんと勉強しなきゃいけない。「PythonでゼロからDeep Learningを作る」をやっていれば、TensorFlowのようなフレームワークやツール、API などの利用はぐんと楽になり、理解も深まるはずです。そう考えましょう。




  私が購入しているTensorFlowの書籍は上の2つ。共に、主要な例題として、「PythonでゼロからDeep Learningを作る」の場合と同じく、MNIST(6万点の手書き数字画像学習+1万点のテスト画像)を扱っていますので、馴染みやすいです。

 英文の方は全140ページと薄くて、コンパクトな説明となっています。和書の方は、少し厚いですが、内容的には同じようなものです。ただし、この和書は、主として、GoogleのTensorFlowの公式チュートリアルに準拠しているようです。なお、両書とも、Python3ではなく、Python2.7でやっています。TensorFlowの方がそうなっているためでしょうか。私が実際に試した限りでは、実は、TensorFlowはPython3でも特に問題無く使えるようです。

2016年11月19日土曜日

世界ランキング34位の性能のDeep Learning Pythonコードまで学べる!

別記事でもご紹介した、下記の書籍(A5版全298ページ):

斎藤康毅著
「ゼロから作るDeep Learning - Pythonで学ぶディープラーニングの理論と実装」

 隅々まで完全理解とまでは行かないが、最後のページまで来た。途中でPythonコードをタイプしながら実行したり、考え込んだりだったが、Deep Learningの基本をソースコードレベルで一定の理解ができた。この書籍は、how toものではない。理論がしっかり分かる。しかも、基礎にとどまらず、最新の技術も取り入れている。そのため、最終的に作ったPythonコードは、MNIST(手書き数字画像セット)に対する世界コンテストランキングの第34位にあたる認識率(= 99.35%)を誇る!

 このランキングを以下に示すが、認識率ではなく、誤認識率(エラー率)で順位づけしている。100% - 99.35% = 0.65%が今回の対応性能である。

MNISTの誤認識率(error %)世界第34位の性能!

 1万件の手書き数字画像(学習用の6万件とは独立に用意された)の誤認識率が、わずか0.65%というのは驚きではないでしょうか!

認識率 99.35% !(背景は誤認識となった数字画像例。確かに紛らわしいですね。)

この書物は、入門的ではありますが、次のように、最新技術も取り入れたDeep Learningをやるという意欲的な取組みがあってのことです。

以下のような多層の畳込みニューラルネットワーク構造を採用
 conv - relu - conv- relu - pool -
 conv - relu - conv- relu - pool -
 conv - relu - conv- relu - pool -
 affine - relu - dropout - affine - dropout - softmax

重み初期値設定にHe法、重み更新法にAdam最適化を適用

 しかし、それだけのことはあります。上記にような認識率(誤認識率)を得るために学習にはかなりの計算時間がかかります。最近では、CPUではなくGPUの数値(並列)演算を利用するようです。ですが、ここでは、手持ちのNote PC(2コアCPU、2.4GHz)でやって見ました!実に、約6時間かかりました。もちろん、このNote PC、CPU稼働率100%近くで6時間走り続けましたが無事でした。この学習結果をPythonのピックルファイルに格納して利用することで、評価結果(認識結果)はすぐに得られます。

2016年11月18日金曜日

Deep Learningのビジュアライゼーション

ニューラルネットワーク、特に隠れ層が4層、5層と増えてディープになるにつれて、エッジの重み計算がどのような感じに行われて行くのか、ビジュアルにできればうれしいですね。Pythonのmatplotlibなどでもできるでしょうが、ここにNetLogoが登場します!

こんな風にもマルチエージェントモデリング環境のNetLogoが使えて、その奥深さをさらに知ることになります。NetLogoには、組み込みの例題Model Libraryに下図のような中間層1層のニューラルネットワークの学習過程を見せるものがあります。これもなかなか良いです。



と思っていましたが、もっと多層にしたNetLogoでのVisualizationは誰かやっていませんか?いました!世のかな広いです。以下に中間層4層の場合でmnist(6万枚手書き画像training)をやっています。見事ですね。なお、中間層でいくつのノードが消えているように見えます。そうです、Dropoutという技術で過学習を抑えることもやっています。


これらを実行させて、そのアニメーションを見ていると、なんだか、本当の脳のなかがこんな風に発火して考えているのかな、という思いにさせられます。

不滅の高校数学

Deep Learning関係の基本書として有名になっているものに以下の書籍があります。

Tariq Rashid, "Make Your Own Neural Network"
 (Python言語で自分でゼロからニューラルネットワークを作る)

優しく一歩づつ作って行きますが、最終的に、手書き数字の認識率98%(畳込みなどはやっていないのでそれ以上は無理かも)の性能のPythonコードを書くという内容です。その中で、ニューラルネットワークのエッジの重み更新にはどうしても微分(偏微分)が出てきます。でも、このような本の読者に、以下のような説明はいるのでしょうか?と思える丁寧さで微分も説明しています。

上記書籍での微分の説明箇所(誤植あります!?)

私の高校時代には、確か、数学IIBでこれはやったはず、と思って当時の数学教科書を見てみました。私は、どういうわけか、もう半世紀近く前になるというのに、当時の数I、数IIB、数IIIの高校教科書を持っています!

学力低下など指摘されていますが、上記の書籍が発行された米国でも事情は同じなのでしょうか。ああ、不滅の高校数学!

私の高校時代の数学IIBの教科書(微分法の説明)

2016年11月16日水曜日

JavaでDeep Learning、そしてLambda & Parallel Stream

 Deep Learningを学んだり、それを使った研究をする場合、プログラミング環境や言語の選択肢がいくつかあります。目的や用途でちがうでしょう。私の場合、総合的に考えて、プログラミングはPython、まずPythonで基本プログラミンを行い理解を深める。その後、Pythonのライブラリとしての位置づけにある、有名なGoogleのTensorFlowへ行く。そういうつもりで進めています。

しかし、実を言うと、Javaプログラミングを教えている関係で、JavaでDeep Learningの基本を全部作ってみたい。そして、Javaでの本格Deep Learning版であるDeepLearnig4Jなどへ行きたい。こちらも捨てきれない状態にあります。

そんななかで、「Java人工知能プログラミング」という書籍を入手しました。あまり詳しい解説のない入門書ですが、ゼロからDeep Learningの基礎部を作るようになっています。ノイズに強い学習をめざすデノイジングオートエンコーダも作っています。そして、何よりも、「これはいい!」と感じたこと、それはJava SE8のLambda式と並列Streamを使っていることでした。さっそく学習する例題を実行させました。4コア(8ハイパースレッド)のマシンの実行時のCPU稼働率を示します。圧倒的な並列度の高さを感じられました。

下図で左側は通常Stream、右側はParallel Streamの場合です。



2016年11月15日火曜日

分散システムでの簡単な演習

「分散システム」という授業をやっている。週1コマなので講義主体となるが、演習もやりたい。しかし、分散システムとしての演習にはその環境設定が大変である。でも、自分のノートPCだけで(サーバとクライアントを疑似的に起動して)ある程度のことはできる。それには、JavaのRMI(Remote Method Invocation)が良いだろう。


EclipseなどのJava開発環境があれば(あるいは無くてもコマンドラインからJavaコンパイルができれば)何も余分に必要ない。図のように、ネームサーバ rmiregistryを起動できる。次に、サーバ側プログラムを用意して、リモートオブジェクトにしたいもの(クライアントに使わせたいもの)をrmiregistryにrebind()で登録するだけ。クライアント側は、rmiregistryからlookup()でそのリモートオブジェクト(のstub)を取り込めば、必要なメソッド(サーバ側にある)を起動できる。
以前は、rmicコンパイラで、自分でstubを生成する必要があったが、現在はその必要はなくなったので、一層便利になった。

厚木有隣堂の「人工知能フェア」

すでにご覧になった方も多いかも知れませんが、厚木の有隣堂書店で「人工知能フェア」というコーナーがありました。
http://www.yurindo.co.jp/honatsugi/3675

このフェアのコーナーには、人工知能の一般啓蒙書から難しそうな専門書までいくつか展示してありました。そのなかで、専門書としてベストワンに上がっているのが、添付写真の「Pythonでゼロから作るDeep Learning」です。この本、すでに、Amazonでも大きな反響を呼んでいます。私も、実は少し前に買ってこれで、勉強中なのです。約300ページですが、8割かたは読破?したので、最後まで読んだら、少し詳しい書評(というよりも自分なりのまとめ)を書こうと思っています。



評判どおり、すばらしいです。step by stepで進みますが、最後の方ではCNN(畳み込みニューラルネットワーク)まで行って、最終的に、テスト用に用意された10,000枚の手書き数字の判定の認識率が99%を越える性能のPythonソースプログラムへ行きます!(訓練用手書き60,000枚とはもちろん別のものです。)

バックプロパゲーションでの偏微分を、数値微分ではなく、計算グラフでやるというのが(一般的なのかどうか知りませんが)私には目新しいことでした。この件は、Stanfordの公開講座の資料に基づくと書いてありました。

2016年11月14日月曜日

卒業研究でもMIT App Inventor

卒業研究でもMIT App Inventor。最近のExtensionsではない従来のActivity StarterでJavaを呼び出方法も非常に有効。T君はその方法で、災害などで閉じ込められた人とのBlutooth通信(Internet不可)アプリを開発中。うまく行っている。


MIT App Inventor for Android !

MIT App Inventor for Android ! ここ1年くらいで、最も大きな進歩は、Entensionsだ。原理的には、ユーザがJavaで自由に機能ブロックを作成定義できる!しかし、現実にはかなりハード。だから、Taifun氏らによる開発に期待。既に利用している。



Deep Learning = 人工知能か

Deep Learning = 人工知能か。その風潮になってきた。原理を知るには、一定の書物できちんと勉強したい。和書(和訳ではない)「ゼロから作るDeep Learning - Pythonで学ぶディープラーニングの理論と実装」は、絶賛したい書籍!いずれ詳しい書評を書きます。

NetLogo

NetLogoは、非常に優れたエージェントモデリング環境だ。しかし、時には、さらに現実感のあるモデル(実際のネットワーク構造や実際のエージェント間距離など)も動かしたい。そのため、一人のエージェントを1台のスマホに実装した:

人工知能→Deep Learning

人工知能→Deep Learning。IBM Watson, Google TensorFlowなどの環境やツールが揃ってきた。だが、それがどういう理論と仕組みなのかを知るには、ゼロから作ってみることも重要。ある手引きに沿って挑戦: