デザイン会社 btrax > Freshtrax > Googleが提供する機械学習...
Googleが提供する機械学習ライブラリ TensorFlow を1時間で試してみた
Googleは機械学習のライブラリTensorFlowをオープンソースとして公開した。すでにGoogleの写真検索や音声認識技術に使用されているもので、大きな注目を集めている。AmazonやFacebookも機械学習システムをオープンソースとして公開している。
オープンソースのライセンスは、Apache 2.0だ。簡単にいうと使っていることを明記さえしておけば商用でも利用可能である。
今後、様々なサービス、研究機関等で機械学習が使われていくことが増えると予想される。機械学習、AIは基盤技術としてすべての産業に影響を及ぼすことから、今後見逃せない動きである。
参考:
TensorFlowのインストール
今回は、機械学習に馴染みがない人がまずTensorFlowを試してみることを目的にしている。なお、この記事はMacを対象としている。OSは、Mac OS X Yosemite(10.10.5)だ。 次の説明に従って、TesorFlowをインストールする。公式ドキュメント Getting Started
環境
Ubuntu/Linux、Mac OS Xに対応している。今回はMac OS X Yosemite(10.10.5)を使う。まだWindowsには対応していないようだ。
TensorFlowはPythonで動かすことができる。Pythonは日本では最も人気がある言語ではないが、少なくともシリコンバレーでは人気が高い。pythonでDjango等を使ってWebアプリを作っている人も多い。また自然言語処理などのライブラリも充実していてるため、この分野に興味がある人はぜひ学んでみよう。個人的な感想だが、癖がなく学びやすい言語だと思う。ちなみに、Raspberry PiもPythonでプログラムできる。
なお、Python2.7が必要であるため注意しよう。(3系の動作は確認していないが、公式ドキュメントでは2.7が必要と書かれている。)
pythonのバージョンは以下のコマンドで確認できる。
$ python -V Python 2.7.10
インストール
Pythonのパッケージ管理システムのpipを用いてインストールすることができる。
また、公式ドキュメントでも推奨されているように、virtualenvを使った。virtualenvを使えば、環境ごとにPythonのバージョンと、パッケージを管理できる。
$ sudo pip install --upgrade virtualenv $ virtualenv --system-site-packages ~/tensorflow $ cd ~/tensorflow/ $ source bin/activate # bashの場合. cshの場合は $ source bin/activate.csh となる (tensorflow)$ pip install --upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.5.0-py2-none-any.whl
実行確認
以下のHello World と、簡単な足し算のソースで正しくインストールされたことを確認しよう。
(tensorflow)$ python >>> import tensorflow as tf >>> hello = tf.constant('Hello, TensorFlow!') >>> sess = tf.Session() >>> print sess.run(hello) Hello, TensorFlow! >>> a = tf.constant(10) >>> b = tf.constant(32) >>> print sess.run(a+b) 42 >>>
チュートリアル
Googleはすでに10個のチュートリアルを提供している。まず、機械学習に馴染みがない人向けのチュートリアル、MNIST For ML Beginnersをやってみよう。
MNISTとは、以下の画像のような、手書きの文字列を認識するものである。画像認識では定番と言えるテーマだ。プログラムでいうとHello worldのようなものだと思う。
なおこのチュートリアルは、TensorFlowを学習するための簡易なもので、正解率はおおよそ91%しかない。これはTensorFlowの性能が低いということではなく、あくまで練習用の課題であるためだ。より本格的なMNISTのチュートリアルは別に用意されている。
MNISTデータ
MNIST用のデータは、機械学習の著名な研究者であるYann LeCun氏のwebsiteで公開されている。チュートリアルで、データセットをWebから取得してローカルに保存するスクリプトが提供されているのでそれをありがたく使うことにする。機械学習では、アルゴリズムの正確性を評価するために、共通のデータセットを使うことが多い。今回使うデータセットは、他の機械学習のライブラリのサンプルでも良く使われるものだ。
ソースコードをダウンロードし、input_data.pyを作る。minst.pyから以下のように呼び出す。
minst.py
import input_data mnist = input_data.read_data_sets('MNIST_data', one_hot=True)
実行すると、ディレクトリ(MNIST_data)が作成され、その中にデータが保存される。
(tensorflow)$ python minst.py (tensorflow)$ ls MNIST_data input_data.py input_data.pyc mnist.py
60,000の学習用データと、10,000のテスト用データが入っている。結果を一般化するために、学習用データとテスト用のデータが分かれていることが重要で、テスト用データを学習させてはいけない。なお、それぞれの画像の大きさは、28×28ピクセルである。
チュートリアルでは、細かくステップに応じて解説をしてくれている。ソースコードを1つにまとめると、次のようになる。
mnist.py
import input_data import tensorflow as tf # データのダウンロード mnist = input_data.read_data_sets('MNIST_data', one_hot=True) sess = tf.InteractiveSession() # 入力用のプレースホルダー(実行時に入力する変数)の定義 # 画像枚数はどんな値でも入れられるようにNone(指定しない)にしておく、 28×28ピクセル = 784次元という意味 x = tf.placeholder("float", [None, 784]) # 重みとバイアスの変数の定義 W = tf.Variable(tf.zeros([784,10])) b = tf.Variable(tf.zeros([10])) # モデル式 y = tf.nn.softmax(tf.matmul(x,W) + b) # 正しい値を入力するためのプレースホルダー y_ = tf.placeholder("float", [None,10]) # コスト関数 cross_entropy = -tf.reduce_sum(y_*tf.log(y)) train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy) init = tf.initialize_all_variables() sess = tf.Session() sess.run(init) # 学習。1000ステップ行う for i in range(1000): batch_xs, batch_ys = mnist.train.next_batch(100) sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) # 正答率の算出 correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) # 結果を出力 print sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels})
実行すると、結果として0.91前後の値が得られる。計算量が少ないため、すぐに結果が得られる。
(tensorflow)$ python mnist.py Extracting MNIST_data/train-images-idx3-ubyte.gz Extracting MNIST_data/train-labels-idx1-ubyte.gz Extracting MNIST_data/t10k-images-idx3-ubyte.gz Extracting MNIST_data/t10k-labels-idx1-ubyte.gz 0.9206
これはあくまで勉強用のサンプルでしかなく、精度もかなり低い。熟練者用のMNISTのチュートリアルも用意されているので、次はこれもやってみるとよいだろう。
TensorFlowはすぐに、楽チンに使えるものではない
TensorFlowは機械学習初心者がすぐに使えるようなものではないということ。私自身も含めてTensorFlowがなんだか注目されてるから触ってみたいという人も多いが、ちょっと興味があるからといってすぐに使えるものではない。
TensorFlowでは、数式で表されるアルゴリズム、概念を、比較的直感的にそのままプログラムとして表すことができる。しかし、ニューラルネットワークはもちろん、最適化問題についての基本知識がないと、アルゴリズムはチンプンカンプンだ。「コスト関数」、「最急降下法」など、基本的な単語が出てくるたびに困ると思う。このため、最低でも高校や大学で数学をやった人でないと難しい部分が多い。
TensorFlowはやろうと思えばいろんなことができるが、アルゴリズムや使い方がわからなければ、何もすることができない。これを機に、機械学習について学んでいきたいという人ならチャレンジすべきだが、まず人工知能をちょっと試したいという人はIBMが提供するWatson APIなどの自然言語処理や、感情表分析、画像解析などの目的毎に分けられていて、APIとして提供されているもののほうが使い方も簡単でよいと思う。今後、機械学習や機械学習のAPIについて、このブログでも紹介していきたい。
筆者: Yuichi Shiga / Software Engineer, btrax, Inc.
CES 2025の革新を振り返りませんか?
1月11日(土)、btrax SFオフィスで「CES 2025 報告会: After CES Party」を開催します!当日は、CEOのBrandonとゲストスピーカーが CES 2025 で見つけた注目トピックスや最新トレンドを共有します。ネットワーキングや意見交換の場としても最適です!