のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

機械学習ライブラリ Chainerの紹介

Sponsored Links

皆さんこんにちは
お元気ですか。私は元気です。

Chainerと呼ばれる機械学習ライブラリを紹介しようと思います。

Chainerについて

Chainerとは?

ChainerはPreffered Networksが開発したニューラルネットワークを誤差伝播で学習する
ライブラリです。(Python)chainer.org

特徴として、Chainer は、「実際に Python のコードを用いて入力配列に何の処理が適用されたかだけを記憶しておき、それを誤差逆伝播の実行に使います」だそう。

Install

sudo pip install chainer

基本的にこれだけのインストールが非常に簡単なソフトウェアです。

他のライブラリとの比較

f:id:tereka:20150614224301p:plain
ディープラーニングが活かすIoTより抜粋。

個人的に注目した違いは以下の3点

  1. CaffeもTheanoも勉強することが多い。(設定ファイルとか)
  2. 短く書けるCaffe2058行がChainer167行で書けることは魅力でしょう。
  3. 設定ファイルや固定データセットが必要ない。Caffeでは、設定ファイルと構築したデータセットを主に使うことになっていたので、動的にDataArgumentationしようとすると面倒になる。

つまり、内容としては書きやすそうとった面で、これから使っていきたいライブラリの
1つになりそうです。

ソースコードについて

モデルの構築法

必要な部分だけ取り出すと至ってシンプルな構造です。
3層のニューラルネットワークの構築を行うだけだと以下の通りです。

これは、入力784,中間層1000,出力層10のネットワークです。

n_units   = 1000
model = FunctionSet(l1=F.Linear(784, n_units),
                    l2=F.Linear(n_units, n_units),
                    l3=F.Linear(n_units, 10))

学習方法

forward
def forward(x_data, y_data, train=True):
    x, t = Variable(x_data), Variable(y_data)
    h1 = F.dropout(F.relu(model.l1(x)),  train=train)
    h2 = F.dropout(F.relu(model.l2(h1)), train=train)
    y  = model.l3(h2)
    return F.softmax_cross_entropy(y, t), F.accuracy(y, t)

ニューラルネットワークのフィードフォワードは以上の部分です。
①Variableで使う変数を変換しています。
②DropOutや活性化関数(上記はReLu)は層としてではなく
 forwardする時に処理を加えています。
③返り値は誤差と精度です。

Backward
for epoch in xrange(1, n_epoch+1):
    print 'epoch', epoch

    perm = np.random.permutation(N)
    sum_accuracy = 0
    sum_loss = 0
    for i in xrange(0, N, batchsize):
        x_batch = x_train[perm[i:i+batchsize]]
        y_batch = y_train[perm[i:i+batchsize]]
        if args.gpu >= 0:
            x_batch = cuda.to_gpu(x_batch)
            y_batch = cuda.to_gpu(y_batch)

        optimizer.zero_grads()
        loss, acc = forward(x_batch, y_batch)
        loss.backward()
        optimizer.update()

        sum_loss     += float(cuda.to_cpu(loss.data)) * batchsize
        sum_accuracy += float(cuda.to_cpu(acc.data)) * batchsize

    print 'train mean loss={}, accuracy={}'.format(
        sum_loss / N, sum_accuracy / N)

学習フェーズを全てあげてみました。特に注目するべき箇所はこの部分です。

        optimizer.zero_grads()
        loss, acc = forward(x_batch, y_batch)
        loss.backward()
        optimizer.update()

loss.backward()を用いることで、誤差伝播を行っています。optimizerはlearningのparameter情報を保持しています。
因みに、Weight Decayや学習アルゴリズムの設定ができます(SGDとか)

以上、簡単なChainerの説明でした。他にもCNNやRNNなども揃っているので
おそらく、基本的なネットワーク構築は簡単にできると思います。