2019年5月1日水曜日

Scratch風の開発環境でTensorFlowを利用できる

 自分のPCに環境設定せずにTensorFlowを使いたいのならば、Google Colabですね。Gmailアカウントがあれば、Googleサーバ側のGPUだって指定して学習させられます。しかし、もっと別のものもあります。それが、Snap!([1]、[2])です。

 Snap!は、Scratch風のブロック型プログラミング環境ですが、ちょっと高級です。ラムダ式(高階関数)も使いますし、TensorFlowを使うためのブロックもあるからです。Google Colabと違って、アカウント開設も、環境設定も不要であり、ローカルマシンで学習を実行させます。そのため、GPU無しのマシンだとちょっと苦しい場合があるかも知れません。小規模な試行ならば問題ないですが。

 早速ですが、Snap!の資料[2]には、以下のような例題が含まれています。

(1)簡単なデモ:乱数(実数値)に対する平方根の学習と予測
An small example: Training a model to estimate square roots
(2)Tic Tac Toe(3目並べ)ゲーム戦略:D. Knuthは1958年に機械学習を作成
Learning to win at Tic Tac Toe
(3)実用アプリ:気候データからインフルエンザの流行の度合いを予測
Applying machine learning to real-world data

 このうち、ここでは、(1)の平方根の例題を取り上げます。元の例題のソースリスト(ブロック図)を少し変更したものを使って、どんなことができるかを、説明したいと思います。最初に、図1をご覧下さい。Snap!でのDeep Learningの画面です。Scratchと同様に、(a)に置かれた種々のブロックを、編集領域(b)で組み合わせてプログラムを作ります。(c)には、メッセージや学習結果、予測結果などを表示できます。なお、(d)は、Snap!とは直接関係ありませんが、Mac Book Pro (4コア、8ハイパースレッドだがGPUは無し)での学習実行の負荷状況です。


 平方根の学習のために、入力データ(0〜50までの実数値乱数を800個)と、その入力データに対する正解ラベル(関数srtの計算値)を用意します。図2において、関数sqrの引数が空白みたいになっていますが、これが、ラムダ式(高階関数)を使っているところです。これだけも、Snap!がScratchよりも高レベル(やや高い難易度)であることを臭わせます。


 次に、この入力を使った学習を行うための、ニューラルネットワークを構成します。そのためのブロックが用意されているのです。(現時点では、dense networkに限られているようですが)ニューラルネットワークを作るための、ハイパーパラメータ(層の数と各層のノード数、最適化の手法、誤差関数の種類など)を決めます。ここでは、(a)隠れ層が3層の場合と、(b)隠れ層が1層の場合の2つを、図3のように設定しました。赤色背景のlistの右側に並んでいる数値は、各層のノード数です。これらのハイパーパラメータの値は、通常、過去の試行経験などに基づいて決めらます。


 この後は、図4のように、学習を制御するブロックを設定します。ここでも、学習をどの程度長く行うかの反復回数や、学習係数、それと、学習時のテストのために使う入力データの割合(入力データ全体に対する比率)などのパラメータの値を決めます。そして、このブロックをマウスでクリックすると学習が開始されます。一般には、学習は長時間を要しますが、ここでは、短時間で済むようにパラメータを設定してあります。


 学習が終わった後に、入力データとは別に、評価用実数値を与えて、その出力結果を観察します。図5のとおり、4つの評価用データ(0.09, 9, 25, 49)を使います。これらに対する正解の平方根は(0.03, 3.0, 5.0, 7.0)です。図5では、図3で用意した2種類のニューラルネットワークが出力した結果を示しています。隠れ層が多い(a)が、少ない(b)よりもかなり良好な(ただし、0の近傍では良くない)結果を与えていることが分かります。このような層の深さに関しての性能傾向は一般的なことと思います。


 さて、ここまでやってみると、TensorFlowを知っている人は、Snap!ではTensorFlowをベースにしているのはないかと感じると思います。そのとおりのようです。実際、Snap!には、Open support panelと言うブロックを持っていて、これを使うとtensorflow.js(JavaScript版のTensorFlow)による学習状況などを観察できます。図6にその一例を示します。


 以上は、簡単なデモプログラムにすぎませんが、定番となっている「PythonでTensorFlow」とはちょっと違う観点を与えてくれる、Snap!の魅力を垣間見ることができたように思います。冒頭で示したとおり、Snap!の解説[2]には、より実用的なアプリの例題(インフルエンザ流行の予測)等もあり、生データを入力データへ加工することも含めたブロック図も示されています。また、当然ながら、画像や音も扱えます。今後これらについても調べて行きます。

 児童、生徒にもAI(人工知能)教育を。これは、小学校での英語、プログラミングの必修化に沿った流れのようです。ScratchML4K(Machine Learning for Kids)はそのための具体的な環境です。そこでは、学習させる画像や音、テキストを自分自身で収集して学習させ(Neural Networkそのものには触れませんが)、未知のものに対する分類や予測を体験できます。

 今回のSnap!は、もう一歩深入りして、Neural Networkを具体的に構成し(ハイパーパラメータを自分で指定して)、その動作も観測(誤差の低減確認)するところまで進めています。したがって、これは、大学でのコンピュータサイエンス教育にも適していると考えられて、例えば、米国UCバークレイ校ではSnap!をベースにしたカリキュラム(苦痛ではなく、楽しみながら美しいと感じてもらえることを目指しているような)The beauty and joy of computing [3] も公開しています。

参考文献
[1] UCバークレイのSnap!サイト:https://snap.berkeley.edu
[2] Ken Kahn, A guide to building AI apps and artefacts:
https://ecraft2learn.github.io/ai/AI-Teacher-Guide/chapter-6.html
[3] The beauty and joy of computing, https://bjc.edc.org/bjc-r/course/bjc4nyc.html

0 件のコメント:

コメントを投稿