a lonely miner

[MLAC 2013 7日目] Torch7でお手軽ニューラルネットワーク

はじめに

この記事は Machine Learning Advent Calendar 2013 の 7日目の記事です.

2013年,Deep Learning もアカデミックレベルではさまざまな分野への浸透が進み,バズワードの域を脱したように思えます. これまでは,機械学習というと,応用分野においては(分類/回帰といった)タスクを決めてしまった上でブラックボックスとして 扱うもの,という空気がありましたが, Deep Learning に代表される柔軟な,いかようにも組み上げられるモデルは,問題の性質を積極的に(特徴量としてではなく,モデル自体に)組み込むことを容易にする,大きな武器になるのではないかと感じています.

素性エンジニアリング vs モデルパラメータエンジニアリング の不毛な戦いが幕を上げた,という見方もできちゃいそうですが・・・..

さて今回は, Torch7 という,Neural Networkを中心とした機械学習向けの環境をごくごく簡単に紹介します. Torch7自体は,比較的最近公開されたソフトウェアですが,”7”という文字から伺えるとおり, 主開発者の Ronan Collobert 氏が中心となって,かれこれ10年以上継続的に開発されているパッケージのようです.

論文としては, NIPS’11 BigLearn Workshop のものが初出でしょうか. Neural Network向けのソフトウェアパッケージというと, Theano/Pylearn2 が主流ですが(要出典),Torch7の特徴をいくつか挙げてみましょう.

  • スクリプティング言語として, Lua が採用されています.  そのため,他のアプリケーションにおけるスクリプティング環境としての組み込みが容易になっているそうです.  試していないのですが,iOSアプリへの組み込みも可能だとか・・・?
  • テンソルのサポートが手厚く,次元を変えたりメモリ上の配置を変えたり,四則演算を行ったり,がらくちん
  • NNを構成するモジュールが大量に備わっており,ブロックを組み立てる感覚でモデルを作ることができる
  • 独自のオブジェクトシステムが備わっており,OOPっぽいプログラムが可能
  • BLAS, CUDAなどのサポート
  • なぜかIDEがついてくる!! (torch -ideで起動できます)

Theano/Pylearn2との比較については,Theano開発チームによる以下の資料(とくに Table 1)が参考になります.

Theano は Deep Learning の総本山であるモントリオール大のチームが強力に推進しているプロジェクトだけあって, 機能面での対抗はなかなか厳しそうですが,頑張ってます,,,頑張っています!

Torch7のセットアップ

Torch7 よりどうぞ.

インストールしたのがしばらく前なので記憶が曖昧なのですが,私の環境(MacOS X 10.9)では,特に引っかかるところはなかったように思います.要cmake

私は使いませんでしたが,aptが動くLinuxか,homebrewが動くMacなら,インストールスクリプトも用意されています. しかし,こちらのインストールスクリプト,若干お行儀が悪い気もするので,気になる方は実行前に一度眺めてみてください.

各種の拡張機能(カメラへのアクセスなど)は,luarocksというパッケージマネージャ(Rubyにおけるgem,Pythonにおけるpipのようなもの)を用いて管理するようです.

Torch7で多層パーセプトロン

ネットワークの構築

Torch7 における Neural Network の構築は非常に簡単です. たとえば,基本的な中間層1層のネットワークは,以下のようなコードで表現できます.

1
2
3
4
5
6
 require nn"
 mlp = nn.Sequential()        -- Multi Layer Perceptron
 mlp:add( nn.Linear(1000, 25) ) -- 1000 input, 25 hidden units
 mlp:add( nn.Tanh() ) -- hyperbolic tangent transfer function
 mlp:add( nn.Linear(25, 10) ) -- 10 output
 mlp:add( nn.SoftMax() ) -- softmax output

このネットワークを,トレーニングデータに対する負の対数尤度を目的関数として訓練するには,

1
2
3
 criterion = nn.ClassNLLCriterion()
 trainer   = nn.StochasticGradient(mlp, criterion)
 trainer:train(dataset)

とするだけです.明解ですね.

“nn"パッケージには,約80種類のさまざまな Module (NNの層や目的関数に相当)が用意されており,これらを自由に組み合わせてネットワークを作ることが可能です. 行う価値や効率的な最適化法があるかどうかは別にして, add() を用いてどんどん繋げていけばいくらでも Deeeeeeeeeep にすることも簡単にできそうです.

学習過程の制御

基本的には以上なのですが,最近の Neural Network の訓練で必須になってきている mini-batch や momentum のような技術を用いたり, 準ニュートン法や共役勾配法などのより高度な最適化を行うために,より細かく学習の制御を行う方法も用意されています.

1
2
3
4
5
6
7
8
9
10
 parameters,_ = mlp:getParameters()
 feval = function(x)
           -- input : 入力事例テンソル , target : inputに対する正解ラベル(一般にはテンソル)
           local output = mlp:forward(input)     -- 前向きに伝播させて,出力を得る
           local f      = criterion:forward(output, target) -- 決められた Criterion の元での目的関数の値を計算
           local df     = criterion:backward(output, target) -- 勾配を計算
           return f, df   -- 目的関数の値と,その勾配を返す
         end
 optim.lbfgs(feval, parameters) -- parametersを更新
 --(注意)細かい部分を省いた擬似コードなので,このままでは動かないと思います XD

というように,現在のパラメータの元での目的関数の値と,その勾配を返すようなクロージャを作ることで, “optim” パッケージで用意されているさまざまな最適化アルゴリズム(SGD, AdaGrad, L-BFGSなど・・・)を用いることも可能です.

本稿では触れませんが,module:forward(), criterion:backward() でネットワークの出力,勾配を得て module:gradUpdate() で直接更新するという手段も用意されています.

ためしてみる(数字認識タスク)

ここでは, Machine Learning with Torch7 で用いられているチュートリアルコードを実際に動かしてみます.

1
 git clone https://github.com/clementfarabet/torch-tutorials.git

でお手元にクローンして, 2_supervised の下にもぐってみてください.

1
 torch ./doall.lua

でデータセットのダウンロードを含めた実験スクリプト全体の実行が始まります.初回は 300MB くらいのファイルをいきなり wget しはじめるのでご注意ください.

ここで扱っているのは, Street View House Numbers (SVHN)Datasetという, カラー画像から数字を認識するタスク,Format 2(32x32の画像)のほうです.

1
 torch ./doall.lua -size small -model linear -batchSize 100 -plot

とかすると,ごく普通の線形モデルでの最適化が始まり,その過程が gnuplot でプロットされていきます.

2_model.lua には線形モデル(linear),隠れ層1層のニューラルネット(mlp),2-stageのたたみこみニューラルネット(convnet) が定義されており, -model オプションで切り替えることが可能です. おフロに入っている間,40分くらい回した結果は以下のような感じです.

  • mlpモデル

  • convnetモデル

うーん,mlpはまだまだ伸びそうだなぁ.convnetは局所解につかまってしまったのでしょうか.時間切れにつき,あまり直感に沿った結果は出せませんでしたが,学習によって正解率が向上している,ということは一応みてとれます.

Torch7 をより深く知るために

最後に,いくつか資料へのリンクをまとめておきます.

メイン開発者の Ronan Collobert 氏による Torch7 の解説です.ソフトウェア全体のアーキテクチャや, Lua を採用した理由,実際のパフォーマンスなどがまとめられています,

上に挙げたチュートリアル資料です.Auto-Encoder のサンプルや,新しいモジュールのプログラミング方法など,本稿では触れられなかったトピックが盛りだくさんです.これを遊んでみるだけで年を越せるかも・・・

流量はさほど多くありませんが,盛んに開発中のソフトウェアですので,こちらを追うことも重要かと思います.

@0kayu さんによる,Pylearn2を中心としたディープラーニングの実装に関するよいまとめスライドです.

そもそもなんで自然言語処理においてニューラルネットが流行ってるの?というあたりに焦点を当てた資料です.ガッツリ!

まとめ

Lua を用いて Neural Network を簡単に構築できる, Torch7 というソフトウェアを紹介いたしました.

Theano ひとり勝ちというのはいかにもつまらないので,皆様にお手にとって頂くきっかけになれば幸いです.

Comments