/home/by-natures/dev*

データ界隈で働くエンジニアとしての技術的なメモと、たまに普通の日記。

機械学習勉強会 #9 (TensorFlow)

先日、約1年越しの機械学習勉強会を実施しました。今回のお題は、先日 Google 社よりオープンソース化された TensorFlow という機械学習ライブラリを実際に使ってみよう!というものです。

Google+ コミュニティや、前回の実施についてはこのブログの 第1回, 第2回, 第3回, 第4回, 第5回, 第6回 をご覧ください。全8回だったのですが、後半2回は記事にできていません、すみません…(^_^;

今回は TensorFlow を発表してくれる方に主催者として加わっていただきました。また、今回の勉強会の後に「運営に参加したい」という方が何名かいました。その方々を徐々に巻き込んで、今後も楽しい勉強会ができそうな予感がした #9 でした。

では勉強会の様子を簡単にお伝えします。

[toc]

14:00〜15:30 TensorFlow 導入

勉強会のはじめに、東京大学物性研究所に所属する小西さんから以下のような話がありました:

  • 機械学習とは何か
  • TensorFlow の概要・モデル
  • VirtualBox を利用して、MNIST サンプルの実行
  • 可視化ツール TensorBoard の紹介

TensorFlow は 2016年1月時点では Windows 環境に直接インストールする事はできず、Docker などを介する必要があります。今回は TensorFlow が準備された VirtualBox のイメージを用意したため、Windows ユーザーはこのイメージをセットアップして TensorFlow を動かしました。

MNIST とは 0〜9 の手書き文字の画像データベースで、機械学習の分野でよくサンプルデータとして見かけます。TensorFlow も MNIST を使った分類(Classification)をデモとして用意しているため、演習ではこれを動かし、数値を変えたりして結果がどのように変わるのかを見ました。

20160117-DSC_4965

15:30〜17:30 チーム作業(もくもく会

次にチーム分けを行い、約2時間ほどの作業時間を設けました。作業後は、どのようなことを行ったのか一人一人発表します。

チーム分けを行った理由は、時間も限られていたので共同作業は難しいかと思ったのですが、それでもスキルや興味が近い人同士が近い席になると、ディスカッションや知識の共有が行いやすいと考えたためです。

いわゆるもくもく会にした理由は、今回の勉強会の目的が「TensorFlow に触れてみよう!」ということだったので、最初に小西さんから TensorFlow の動かし方を共有があった後は、各自の興味の方向で調べてもらうことにしました。テーマを絞った「もくもく会」というイメージです。

20160117-DSC_4980

詳しい人が同じチームの方に教え合うチームもあれば…

20160117-DSC_4976_Fotor_Fotor 20160117-DSC_4988_Fotor_Fotor

自分のもっているプログラムや知識を共有し合うチームもありました。

 

個人的にはどうなるかなと不安はあったのですが、機械学習に詳しくない人でも、限られた時間に集中して調査することで得たものがあったと言っており、元より詳しい人はライブラリの使い方を更に具体的に調べたり、既存の別フレームワークで動いているものを TensorFlow へ置き換えていました。このように短い時間ではありましたが成果が出ていた人もおり、最後に全体で共有することで、参加者全体の理解を押し進めることができました。

後半の作業時間はとても集中している様子が伝わってきました。前半はそれぞれが知っていることを共有しあったりして活気づいていたのですが、後半は集中しているためか、まるで図書館にいるような気分でした(^_^; 「時間終了です」と告げると、会場が試験が終わった直後のような雰囲気に(笑)。仕事じゃないので気を抜いてください、と言ったらみんな笑っていました。

17:30〜18:30 成果発表

20160117-DSC_4997_Fotor

集中して作業した後は、一人一人がどのようなことをしたのかを発表しました。

多くの方は「使い方を調べていた」「講義の時間に使ったプログラムの意味を調べていた」など、調べもので終わっていましたが、個人的にはそれで少しでも理解が深まったなら勉強会に参加した意味はあるかな、と思っています。この勉強会は、これから機械学習なり TensorFlow なりを学んで行くための「きっかけ」を提供することを目的にしていたので、数時間でも(半強制的に?)調べ物をする時間が得られるのは有意義だと思うんです。最初は1人だとどこから手をつけたらいいか分かりませんしね。

中にはプロジェクターを使って、どんなことをしたのか報告してくれた方もいました。上の写真は、発表者が持っていた既存のプログラムを TensorFlow へ移植し、それを TensorBoard で見ているところです。

TensorFlow でマンデルブロー集合を描く

僕も運営しつつ参加したのですが、個人的には機械学習の前に TensorFlow というフレームワーク自体に興味があって、フレームワークが理解できそうな簡単なサンプルから動かそうと思い、マンデルブロー集合を描くサンプル を動かしてみました。

動くとこんな図が出てきます:

mandelbrot

気持ち悪いですね(笑)。黒いところがマンデルブロー集合、色の濃度は発散速度です。マンデルブロー集合の定義については Wikipedia などを見てほしいのですが、基本的には数列計算を行うだけなので、フレームワークの理解にはよいかと思います。Google"Visualizing the Mandelbrot set doesn't have anything to do with machine learning, but it makes for a fun example of how one can use TensorFlow for general mathematics." と言っており、簡単で楽しいサンプルです。

TensorFlow は Python3 にも対応しているのですが、マンデルブロー集合を描くサンプル は Python2系 を対象にしたソースコードとなっており、僕がインストールした TensorFlow は Python3系だったので、Python3 系でも動くように直したものを GitHub に置いています。といっても修正はほんの少しで、ライブラリの関係で動かなかった I/O の所を直したり、元々のサンプルは Jupitor というか、IPython Notebook を使っているのですが、画像を出したいだけだったので直接書き出しました。

余談ですが、TensorFlow が Python3 に対応したのは2015年末(11月?)のようで、ライブラリやらサンプルが動かないことが多いので、当面は Python2 で動かした方がいいかもしれません。このブログ用に TensorBoard を動かそうと思ったのですが、簡単には動かなそうです。。(公式では TensorBoard も Python3 をサポート、と言っているのですが…)

それはさておき、本質的な計算は Python2 でも 3 でも変わりません:

# グリッドの作成
Y, X = np.mgrid[-1.3:1.3:0.005, -2:1:0.005]
Z = X+1j*Y

# 定数、変数の設定
xs = tf.constant(Z.astype("complex64"))
zs = tf.Variable(xs)
ns = tf.Variable(tf.zeros_like(xs, "float32"))

# 変数の初期化
tf.initialize_all_variables().run()

# computation graph の作成
zs_ = zs*zs + xs
not_diverged = tf.complex_abs(zs_) < 4
step = tf.group(
  zs.assign(zs_),
  ns.assign_add(tf.cast(not_diverged, "float32"))
)

# 数列を第200位まで計算
for i in range(200):
  step.run()

22, 23行目が実際に計算を行う命令で、その前までは計算の設定、TensorFlow の言葉で言えば computation graph を作成している部分です。マンデルブロー集合の本質は14行目だけですね。15行目は発散判定を、絶対値が4を超えるかどうかで判断している部分です。boolean が not_diverged に設定されそうですが、実際は zs_ を引数にとる計算ノードになります。

ns が少し妙ですが、これは発散速度を計測する変数です。not_diverged の条件を、数列を200位まで計算するうちに何回満たすかを数え上げており、最終的にはそれを色で表して画像にしています。

Python3 で動かすのに少し苦労しましたが、デバッグ中に TensorFlow の変数やメソッドも眺めたので、基本的な動作原理を理解することができました。

懇親会

20160117-DSC_5028_Fotor

懇親会は、主催者の一人である十五(とうご)さんが主催される異業種交流会と合同で実施しました。学生の方が多かったので研究の話が多かった印象ですが、自己紹介の中で共通の話題が見つかるといっきに盛り上がったりして、そのテンションに付いて行けたり行けなかったり…(笑) 異業種交流会は本当にいろんな業界の方が来るので収拾がつけられない楽しい飲み会になります。

この機械学習勉強会の懇親会ですが、主催者という立場もあるのか、いつも何となく不思議な気分になるんです。アカデミックな世界からビジネスの世界へ出て行く学生さんと交流を持つことで、懐かしかったり、変なアドバイスをしてしまったり、俺は昔どんな気持ちだったかなぁと思いを馳せたり…。あと前職の後輩もいたので、懐かしい話もたくさんしましたね。この勉強会の主催者の方々もそうですが、どこかで知り合って、こうやってまたどこかで話しができる人がいるのはそれだけで楽しいことだなぁと感じます。

 

次回は3月ごろ?を一応予定しています。Google+ コミュニティ などでも告知しますので、ご興味あるかたはお気軽にご連絡ください!