2009/03/05

PyBrain - a modular Machine Learning Library for Python


今、python界でPyBrainが熱い!…わけじゃないですけど、個人的にけっこう注目しているライブラリ。機械学習ライブラリにおける、期待の新人が出てきなような気持ちです。

0.PyBrainとは?

PyBrainっていうのはPythonによって動く、モジュール式の機械学習ライブラリです。python界ではいままでにもニューラルネットワークとかSVMなどを扱うライブラリが存在していましたが、PyBrainではそれらをより包括的に扱う、一種の環境としての機械学習ライブラリを目指しているようです。
PyBrainが優れているのはその思想もさることながら、扱っているアルゴリズムの多さにもあります。例えばFeaturesの欄を見てみると、
  • Backprop
  • Rprop
  • Policy Gradients
  • Support Vector Machines
  • Evolution Strategies
  • CMA-ES
  • Competitive Coevolution
  • Natural ES
  • Natural Actor-Critic
  • Reward-weighted regression
  • Evolino
  • Fitness Expectation Maximization
  • SPLA
  • PCA/pPCA
  • LSH for Hamming and Euclidean Spaces
と、比較的新しいアルゴリズムについても対応する予定のよう。(リファレンスをざっと見ると、まだ対応していないアルゴリズムはけっこう多いようです)とりあえずアルゴリズムについて確認したり、テストとして組んでみる分には申し分ない仕様です。

1.ダウンロード〜インストールまで

まず、PyBrainでは以下のツールが必要となるので、足りない場合は適宜apt-getやらeasy_installやらでインストールを行います。
  • g++
  • scipy
  • matplotlib
ちなみにホームページには書かれていませんが、自分はビルドした際にcblasが足りないと怒られてしまったので、ついでにそれもインストールします。
次に、PyBrainのサイトにアクセスして、Stable versionのソースコードを入手。圧縮ファイルを展開します。

~$ cd PyBrain-0.2
~/PyBrain-0.2$ ls
LICENSE arac docs examples pybrain setup.py

setuptoolsの慣例通りにビルド。

~/PyBrain-0.2$ sudo python setup.py build
arac/src/c/layers/common.c: In function ‘void make_layer(Layer*, int, int)’:
arac/src/c/layers/common.c:12: error: ‘malloc’ was not declared in this scope
arac/src/c/layers/common.c: In function ‘Layer* make_layer(int, int)’:
arac/src/c/layers/common.c:40: error: ‘malloc’ was not declared in this scope
Traceback (most recent call last):
File "setup.py", line 87, in <module>
compileArac()
File "setup.py", line 74, in compileArac
extra_postargs=['-O3', '-g0', '-DNDEBUG'])
File "/usr/lib/python2.6/distutils/ccompiler.py", line 697, in compile
self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)
File "/usr/lib/python2.6/distutils/unixccompiler.py", line 180, in _compile
raise CompileError, msg
distutils.errors.CompileError: command 'g++' failed with exit status 1

怒られてしまいました。どうやらmallocが定義されていないみたいなので、暫定的な処置として"arac/src/c/common.h"に以下の文を付け加えます。

#include <stdlib.h>

再度ビルドを行うと、ビルドがうまくいったみたいです。

~/PyBrain-0.2$ sudo python setup.py install

でインストール。無事インストールが完了しました。
正常に動くかどうか確かめてみます。

~/PyBrain-0.2$ python
Python 2.6.1+ (r261:67515, Feb 24 2009, 20:00:00)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pybrain
>>>

何事もなくインポートすることができました。

2.試しに使ってみる〜ニューラルネットワークの構築から学習

Pybrainのチュートリアル通りに、単純なFeed Forward型のニューラルネットワークを組んでみます。Pybrainではレイヤを個別に定義し、それらを繋げてネットワークを構成することもできるみたいですが、もっと簡単にネットワークを構成できるショートカットがあるみたいですので、それを利用します。

from pybrain.tools.shortcuts import buildNetwork
net = buildNetwork(2, 3, 1)


これで2つのインプット、3つの隠れユニット、1つのアウトプットから成るニューラルネットワークが出来上がりました。とても簡単ですね。
入力したインプットからアウトプットを出すには、activate()メソッドを用います。

net.activate([2,1])

buildNetworkの時点で各ニューロンはランダムな数値で初期化されていますので、既にactivate()ができる環境になっています。

ちなみに通常、各ニューロンに用いられる活性化関数はシグモイド関数が用いられますが、違う関数を用いたい場合は適宜指定することができるみたいです。まぁ好みの問題ですね。

from pybrain.structure import SoftmaxLayer
from pybrain.structure import TanhLayer
net = buildNetwork(2, 3, 1, hiddenclass=TanhLayer, outclass=SoftmaxLayer)


次に、教師あり学習を行うためにデータセットを用意しておきます。

from pybrain.datasets import SupervisedDataSet
ds = SupervisedDataSet(2, 1)
ds.addSample((0, 0), (0,))
ds.addSample((0, 1), (1,))
ds.addSample((1, 0), (1,))
ds.addSample((1, 1), (0,))


こんな感じでインプットとアウトプットのサンプルを増やしていきます。
そして、構成されたネットワークに誤差逆伝播法で学習を行わせるため、trainerを作成します。

from pybrain.supervised.trainers import BackpropTrainer
trainer = BackpropTrainer(net, ds)
trainer.train()


train()メソッドは返り値として誤り率を返しますが、もしある一定の割合に収束するまで学習を行わせたい場合、trainUntilConvergence()メソッドが有効です。そのまんまですね。

trainer.trainUntilConvergence(validationProportion=0.25)

だいたいニューラルネットワークの構築方法としてはそんな感じですが、他にもSVMを選択することもできるようです。詳しいことはPyBrainのドキュメントを参照してください。

3.使ってみて

とりあえずざっと使ってみた感想ですが、非常に組みやすく、かゆいところに手が届くような設計がなされているライブラリだと思います。まだバージョンは0.2ですし未完成な感じは否めないですけれど、将来が非常に楽しみなライブラリです。(しかも名前がカッコいい!!)

0 件のコメント: