プロクラシスト

今日の寄り道 明日の近道

DeepMind社謹製の深層学習ライブラリ『Sonnet』の事始め


スポンサーリンク

f:id:imslotter:20170411211409p:plain

こんにちは、ほけきよです。

DeepMindが数日前に、tensorflowを用いたモジュール"sonnet"をオープンソース化しました。

普段Kerasしか使っていないのですが、ちょっとだけ触ったり調べたりしたので

  • インストール方法
  • Exampleについて
  • Kerasとの違い。想定ユーザ

など、所感とともにメモとして残しておきます。

sonnetとは

  • DeepMind(今一番キテるGoogle傘下の研究所)が社内用に使っていた深層学習用ライブラリ
  • tensorflowのラッパー的立ち位置(tensorflowが入っていることが必要)
  • Linux/MacOSXで対応

requirement

  • python2.7 : 3系はまだ対応していないそう
  • tensorflow >= 1.0.1 : Deeplearning用ライブラリ
  • bazel (>= 0.4.5 )  : Google謹製のビルドツール

インストール方法

bazelのインストール

Documentをみる。自分のOSに応じて。(今回は MacOSXのhomebrew)

Installing Bazel - Bazel

brew cask install java #javaのインストール
brew install bazel

sonnetをダウンロード、チェック

  • githubからコードを取ってきて、まずはインストールできるかチェック
git clone --recursive https://github.com/deepmind/sonnet
cd sonnet/tensorflow
./configure

ないものはエラーに従って入れていく。

./configureで色々聞かれる(コンパイラを最適なやつ使うかとか、OpenCL使うかとか、pythonのパスとか) 別にこだわりがない人はEnter連打で(でも一応メッセージはみておこう)

うまくいくとこんなメッセージが。

Extracting Bazel installation...
..............................................................
INFO: Starting clean (this may take a while). Consider using --expunge_async if the clean takes more than several minutes.
.............................................................
INFO: All external dependencies fetched successfully.

ビルド、インストール

sonnetをビルド

mkdir /tmp/sonnet
bazel build --config=opt :install
./bazel-bin/install /tmp/sonnet

/tmp/sonnet以下にpip installできるファイルができるので、

pip install /tmp/sonnet/*.whl

とする。これで完了

チェック

pythonを起動し、以下のコードを打つ

 import sonnet as snt
 import tensorflow as tf
 snt.resampler(tf.constant([0.]), tf.constant([0.]))

下記の表示になればOK

<tf.Tensor 'resampler/Resampler:0' shape=(1,) dtype=float32>

Exampleを試す

タスク

使えるようになったので、exampleを実際に動かしてみる。 普通こういうのはMNISTを使って分類が定番だが、今回のexampleはRNN(多層のLSTM)を使ったもの。まだexampleはそれしか用意されていないよう。

中身のコードを見ながらLSTMをどうやって書くのか眺めるのはいいかもしれない。今回は結果だけ。

データセット

シェークスピアの“CORIOLANUS”を使って学習させ、それっぽい文章を生成するRNNを作ろうという感じ。

Coriolanus (The New Cambridge Shakespeare)

Coriolanus (The New Cambridge Shakespeare)

結果

中身は置いておいて、とりあえず実行してみる。*1

python rnn_shakespear.py

はじめにWARNINGがたくさんでた後に、学習が進んだ。WARNINGは

「お前、もっと環境を最適化できるけどしないの?」

というやつ。

結果はたまに文章ぽいのもあるがちゃんとした文章とは程遠い。学習データが少ないから?

INFO:tensorflow:9999: Training loss 78.764648. Validation loss 100.533051. Sample = b_0: 
ht this, and we letter my house of Hereford,|Will reason at wailer, I have by found you.||BENVOLIO:|
No, therefore, none me thy ear, or we were not a|great-father uncle Edward's right divined soul six with his first,|
And then I tear the back of pleasure; and our sword|
To bowly me of preceion dubfil-god:|Go well in Aufidius to year:|
You may not show thy length.|
|PARIS:|
His lady.|
|POLIXENES:|So Margaret.|
|LEONTES:|Hail, sir, too saying!|
|NORTHUMBERLAND:|So parentme: call me wench-for my greatest,|
Twear have a man; twerver it sorrows I lovely curs you,|Gives me, encorst, for his masters did not myself;|
For thy welcome visiting name of your native|hath not all thy desires to run broke us|
Yon me--and Phoebus Derby, be said, hast thou no man all, my oaths,|Break not that maids with this nighuls of your life|
Will grow themselves: both best in earth! had he were no;|
Who adveral with punish made both|To do them, and majesty, Aumelle;|Many to this the coming love marriage|What, lost deny here: h
INFO:tensorflow:Reducing learning rate.
INFO:tensorflow:Test loss 129.366608

また、学習したモデルは /tmp/sonnet以下に保存される。

中身をちょっとだけ見る

sonnetでは、Deeplearningのネットワークをを作る部品がsonnet/python/modulesに色々と揃っている。

sonnet/sonnet/python/modules at master · deepmind/sonnet · GitHub

例えば

  • conv : CNNのconvolution層を作ることができる
  • gated_rnn : LSTMなど、RNNに用いるゲートを作ることができる

また、ここに、いくつかの既製のネットワークがあるようだ。

sonnet/mlp.py at master · deepmind/sonnet · GitHub

  • Alexnet
  • ConvNet
  • Multi Layer Perceptron
  • Dilation

f:id:imslotter:20170411212105p:plain
(例 : AlexNetのアーキテクチャ(Krizhevsky 2012))

例えば、自分でネットワークを作りたければ↓のようにネットワークを構成していく (DeepMindのSonnetを触ったので、TensorFlowやKerasと比較しながら解説してみた より拝借)

def build(inputs):
    outputs = snt.Conv2D(output_channels=32, kernel_shape=4, stride=2)(inputs)
    outputs = snt.BatchNorm()(outputs)
    outputs = tf.nn.relu(outputs)
    outputs = snt.BatchFlatten()(outputs)
    # TensorFlow
    weight = tf.Variable(tf.truncated_normal(shape=[4096,10]))
    bias = tf.Variable(tf.constant(0.1, shape=[1,10]))
    outputs = tf.matmul(outputs, weight) + bias
    outputs = tf.nn.relu(outputs)
    return outputs
model = snt.Module(build)

学習はtensorflowの記法にしたがって行う。

これがKerasだと、以下のような感じで書く

model = Sequential()
model.add(Conv2D(32, kernel_size=(2,2), activation='relu', input_shape=(28,28,1))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Flatten())
model.add(Dense(10))
model.compile(loss='mean_squared_error', optimizer=Adam())

学習はmodel.fit(...)を使う。

最も大きな違いは

  • sonnetはtensorflowとコード上で組み合わせて使うことができる
  • Kerasはkerasとして閉じている

ということ。これは一長一短で、Kerasは全てKerasとして使うことができるので、終始一貫して直感的に扱うことができるように構成されている。しかし少し手の込んだネットワークに拡張しようとすると、柔軟性が低いと感じることがある。

一方でsonnetは面倒なところだけをモジュール化して、細かく設定したい時にはtensorflowをそのまま用いることができるので、自分で柔軟性を自由に調節できる。 しかし、tensorflowを使うのは、Kerasに比べて少し敷居が高いように感じられる。

あとは、ドキュメントやtutorialが圧倒的に少ない。そしてもちろん日本語はない。

所感

sonnetは、すでにtensorflowを使っている強い人たち が対象なのかなって思った。 そういう意味ではまさにDeepMindの社員が使うようなイメージに近い。面倒なところをなるべく省いて、本当に大事なところだけ集中するためのツール、というイメージでした。研究者の間では流行るかもしれない。

個人的には、Kerasを使えればまずはいいかな… もうちょっとtensorflowになれる必要があるなと感じました。

*1:ちゃんと勉強したらまたメモとして記事にしようかな…

PROCRASIST