はじめに
この記事は 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 |
|
このネットワークを,トレーニングデータに対する負の対数尤度を目的関数として訓練するには,
1 2 3 |
|
とするだけです.明解ですね.
“nn"
パッケージには,約80種類のさまざまな Module (NNの層や目的関数に相当)が用意されており,これらを自由に組み合わせてネットワークを作ることが可能です.
行う価値や効率的な最適化法があるかどうかは別にして, add()
を用いてどんどん繋げていけばいくらでも Deeeeeeeeeep にすることも簡単にできそうです.
学習過程の制御
基本的には以上なのですが,最近の Neural Network の訓練で必須になってきている mini-batch や momentum のような技術を用いたり, 準ニュートン法や共役勾配法などのより高度な最適化を行うために,より細かく学習の制御を行う方法も用意されています.
1 2 3 4 5 6 7 8 9 10 |
|
というように,現在のパラメータの元での目的関数の値と,その勾配を返すようなクロージャを作ることで,
“optim”
パッケージで用意されているさまざまな最適化アルゴリズム(SGD, AdaGrad, L-BFGSなど・・・)を用いることも可能です.
本稿では触れませんが,module:forward()
, criterion:backward()
でネットワークの出力,勾配を得て module:gradUpdate()
で直接更新するという手段も用意されています.
ためしてみる(数字認識タスク)
ここでは, Machine Learning with Torch7 で用いられているチュートリアルコードを実際に動かしてみます.
1
|
|
でお手元にクローンして, 2_supervised
の下にもぐってみてください.
1
|
|
でデータセットのダウンロードを含めた実験スクリプト全体の実行が始まります.初回は 300MB くらいのファイルをいきなり wget
しはじめるのでご注意ください.
ここで扱っているのは, Street View House Numbers (SVHN)Datasetという, カラー画像から数字を認識するタスク,Format 2(32x32の画像)のほうです.
1
|
|
とかすると,ごく普通の線形モデルでの最適化が始まり,その過程が 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 ひとり勝ちというのはいかにもつまらないので,皆様にお手にとって頂くきっかけになれば幸いです.