data-science Julia

国産DeepLearningライブラリの Merlin.jl

Deep Learning フレームワークざっくり紹介 Advent Calendar 2017  11 日目の記事。

普段は、Kaggle の問題に挑戦する動画を投稿する底辺 YouTuber をやっています 田中 TOM

最近、機械学習関連は Julia 言語をメインで使っていて、以前Julia データサイエンスワークショップに参加した時、Mearlin.jl という国産の DeepLearning ライブラリを知ったので紹介していきます。

このライブラリは奈良先端科学技術大学院大学の進藤氏が自然言語処理分野において、入力のサンプルが異なるためミニバッチ化が難しく並列計算処理を行いにくい問題を解決するために作られました。 Julia 言語が採用されており、命令形的で動的にモデルを構築しても、Julia の特徴の一つである高速で動かせるメリットが活きて、柔軟に素早く学習を行うことが可能になっています。 参考論文:Julia 言語による深層学習ライブラリの実装と評価

詳しい内容は論文を読んでもらいサンプルコードを紹介していきます。

サンプルコード

次のような簡単なニューラルネットワークを構築します

静的評価の場合

static.jl

T = Float32
n = Node(name="x")
n = Linear(T,10,7)(n)
n = relu(n)
n = Linear(T,7,3)(n)
g = Graph(n)

x = zerograd(rand(T,10,10))
y = g("x"=>x)

params = gradient!(y)
println(x.grad)

opt = SGD(0.01)
foreach(opt, params)

入力xについてはランダムな値を入れています。 この場合、Graphを作って、そこにデータを入力し結果をだしています。 Theano 等宣言型のフレームワークの書き方。 画像などの入力の形が一定であるものは扱いやすく高速に処理できる。

動的評価

今度は、動的に入力の行列サイズが変化する場合(自然言語処理等)を考えます。

dynamic.jl

T = Float32
x = zerograd(rand(T,10,5)) # instanciate Var with zero gradients
y = Linear(T,10,7)(x)
y = relu(y)
y = Linear(T,7,3)(y)

params = gradient!(y)
println(x.grad)

opt = SGD(0.01)
foreach(opt, params)

今度はGraphを作らずに直接勾配を求めています。 このような書き方ができると学習を行う時は for 文で回している中で、毎回異なったサイズの入力データで学習を進めていくことができます。 Chainer 等命令形のフレームワークの書き方。 静的評価の時よりも遅くなってしまうが、Julia 言語の最適化によって早く実行することが可能になっています。

MNIST 学習のサンプルコード

Merlin.jl/main.jl at master · hshindo/Merlin.jl

MNIST の学習をしています。実際に実行してみると 10epoch 回してテストデータの正答率が 97%だったので、しっかりと学習が行われているようです。

感想

個人的には普段から Julia 言語を使っていて、Julia 言語がアカデミックな分野でも選択肢として存在感が出てきたのが嬉しい。 特に Julia 界隈だと Python のライブラリを呼んで実行する場合が多いので、こういった Julia 言語で書かれたライブラリが増えて高速な動きを出せるようになると、今後も使われる場所が増えてきそうな予感がしています。 まだまだ Julia 言語自体開発段階で挙動が変わったりするのでオススメするのは少し厳しい状態ですが。。。