2015 年も残りわずか数時間です. 今年もおつかれさまでした. 個人的に今年を振り返りたいと思います.

Deep Learning

個人的に一番大きかった出来事はやはり Chainer でした. Theano や Torch7 がつらくて,特に RNN をもっと直感的にかけないものかと社内で議論していて,そのうちにできる気がしてきて作りました. こんなに大事になるとは思っていませんでした. 見知らぬ人が使ってくれているのを見ると,すごいことになったなと思います.

さて,Deep Learning の中身の話としても,今年もいろいろと進展がありました.

最もインパクトがあったのは,BatchNormalization ではないかと思います. もともと ImageNet のタスクで出てきた手法ですが,汎用性が高く,今までうまく最適化できなかったいろいろな NN がこれのおかげで成功し始めているようです. ほかにも最適化を助ける手法は多く開発されています. ImageNet の分類性能は,今では最適化テクニックを競う分野になってきています.

ほかに大きく進展した中で僕がとくに興味を惹かれたのは画像生成の研究です. Google の Deep Dream が話題になったことは記憶に新しいかと思います. 誤差逆伝播法で入力画像を最適化するアイデアは,ニューラルネットの可視化の研究としては以前からありました. この流れを組む研究として写真へのスタイル適用の研究も出てきました. 写真をゴッホの画風にする,というやつです. 同僚の松元さんが Chainer での実装を公開しています.

スタイル適用の研究は面白いですが,もともとデータの生成は確率的生成モデルを用いるものが王道です. 画像の生成モデルは,Variational AutoEncoder (VAE) の登場で DNN を用いたモデル化が可能になり,一歩前進したところでした. しかし,VAE に複雑な(バリエーションの多い)画像セットを学習させると,ぼやけた画像を生成するようになるという問題がありました. そこへ,Generative Adversarial Networks (GAN) を使って段階的に解像度を上げながら画像を生成する LAPGAN という手法が出てきて,とてもシャープな画像が生成できるために,皆が驚きました. さらにそのあと,GAN を素直に ConvNet と組み合わせた DCGAN という手法が出てきて,さらに綺麗な画像が生成できるようになりました. こちらも松本さんが Chainer で実装 し,顔イラストのデータセットに適用して,(まだパーツの組み合わせがちぐはぐですが)かなり綺麗なイラストが生成できています.

VAE はニューラルネットで書かれた生成モデル \(p(x, z) = p(x|z) p(z)\) を変分近似 \(q(z|x)\) を使って学習する手法です. VAE ではこの生成モデルの尤度関数 \(p(x|z)\) (の勾配)が陽に計算できる必要があります. 画像には平行移動不変性など特別な構造がありますが,これを考慮した尤度関数は発明されていません. そこでよくガウス分布などが使われますが,すると VAE は画像の小さなずれに頑健になるためにぼやけた画像を生成するようになってしまいます.

GAN は尤度関数を陽に設計しなくてよいという利点があります. 代わりに使われるのは,データ分布と生成分布のサンプルを見分ける識別器です. 生成モデルはこの識別器をだますように学習され,識別器はこれらを見分けられるように学習されます. この 2 つのモデルを正しいバランスで学習するのが難しいという問題がありますが,ConvNet と組み合わせることでシャープな画像を生成できるようになります. シャープなだけでなく,細かいパターンが本物そっくりな画像を生成できます. この特徴は,Deep Dream やスタイル適用の手法と似たものと言えます. これらはすべて,識別器からのエラーをもとに画像を生成します. この識別器を ConvNet にすると,どうやら細かいスタイルが自然な画像が生成できるようです. 一方で,大域的な構造の獲得にはもう少し工夫が必要なようです. ただ,これが確率モデルの構造の問題なのか,単に ConvNet の規模と最適化手法の問題なのかはまだわかりません. 確率モデルの構造に adversarial な構造を取り入れる手法としては,VAE の一部を GAN で置き換える Adversarial AutoEncoder という手法も出てきており,尤度が大きく改善しています.

Adversarial networks は,サンプリングと誤差逆伝播さえできればどんな確率モデルでもマッチングできる枠組みです. 今まで陽に確率モデルを構成していた部分を adversarial networks で置き換えるというのは,来年いろいろ出てくるかもしれません. ただ,学習が難しい点が汎用的に解決できないと,応用は限定的になるかもしれません.

画像生成の話ばかりしてしまいました. ここからはメモ代わりに,僕の個人的な振り返りをします.

1~3 月

今年はインフルエンザから始まりました. 昨年末のコミケで見事に感染して,つらい正月からのスタートでした. その流れでそのまま百日咳になりました. つらいつらい.

2月に鼻中隔湾曲症の手術を受けました. 鼻道の骨が曲がっているのをまっすぐにする手術です. たまたま近くの耳鼻科で日帰り手術をやっていて,9ヶ月ほど待ちましたがようやっと受けられました. 局所麻酔なので手術中はとても怖かったですが,おかげで今年は驚くほど鼻が通っています. 鼻炎自体は治らないですが…….

4~6 月

まず 4 月の上旬にオンライン機械学習という本が出ました. 1/4 だけですが,はじめての著書です. これだけでもかなり大変だったので,本一冊まるまる一人で書くのはどれほど大変なんだろうかと思います.

今年に入ってから,Deep Learning の論文追試みたいなことをちょこちょこやっていました. Caffe が辛くて Torch7 に移りましたが,これはこれで Lua がつらい. それに可変長の RNN が書きづらいという話を会社でしていて,あれこれディスカッションしているうちに,なんかできそうな気がしてきました. この時点で僕は CUDA の下回りをほとんど知らなかったので,PyCUDA を勉強して,4月中旬に Chainer を書き始めました. 割りとすぐに使えるものにはなりましたが,まさか 2 ヶ月もしないうちに公開することになるとは思いませんでした. ほとんど週末の思いつきで始めたプロジェクトですが,今はこれがメインの仕事になっているのも,予想しなかった展開です. その分,設計はあまり練られていない部分も多く,あとでユーザーを振り回す感じになってしまったのはよくなかったなと思い反省しています.

その間,Chainer の公開の半月前に,ホーチミンで開催された PAKDD 2015 に参加しました. 修士の研究を腐らせかけていたんですが,掘り起こしてきて投稿したものを発表してきました. 無事に終わってよかった. 5月でしたがホーチミンは30度超えでとても暑かった.

7~9 月

この頃は Chainer の GPU バックエンドとなる CuPy を作っていました. PyCUDA の仕組みはだいたいわかっていたのと,よくある多次元配列の実装方法もわかっていたので,それを組み合わせたものを書きました. 同僚の奥田さんがリダクションなど複雑なカーネルをしっかり作りこんでくれたので,リダクションの機能も充実させることができました. この頃はまだ NumPy(の挙動)の恐ろしさを半分も知らなかったように思います(今は CPython や NumPy の不思議な挙動あれこれに頭を悩ませる日々です). すべて pure Python で書いていましたが,これは CPU 側のオーバーヘッドを GPU 計算で隠蔽できるだろうという目論見によるものでした. これは僕が慣れていた画像認識の応用ではそのとおりに動きましたが,細かい行列演算の多い自然言語処理などの応用では思いのほか GPU 計算が軽く,速度が低下してしまいました. なかなか思い通りにはいかないものです. この点は後に奥田さんが Cython 化をがんばってくれて,大きく改善されました.

9 月は対外発表ラッシュでした. 上旬に NLP 若手の会 (YANS) で Chainer のチュートリアルをして,中旬には情報科学技術フォーラム (FIT) で最近の Deep Learning の話をしました. その間にデータサイエンティスト養成読本 機械学習入門編という本の発売イベントがありました. 記事 1 つ分だけ書かせていただきました.

10~12 月

相変わらず Chainer の開発では僕は大きめな機能の設計と実装をやっていました(具体的には Link/Chain の仕組みを作っていました). Chainer については開発以外に,meetup の開催をはじめました. コミュニティの醸成は来年の大きな目標になると思います.

そして今年の終盤はアカデミックな場所での発表が 2 件つづきました. 11 月には IBIS で Chainer の紹介をしました. 結構すでに使ってくれている方が多くて,うれしかったです. 12 月には NIPS に行きました. 自分たちは Machine Learning Systems というワークショップで発表しました. ポスター発表はそこそこ人も来てくれて,特に Jeff Dean や Alex Smola と話せたこと,MXNet の人と交流できたことがよかったかなと思います. NIPS 自体は本当に人が多くて,これは運営するのも大変だろうなあと思いました. DeepMind の人がすごく多かったのも印象的です(100 人くらい来てたらしい). Deep Learning の発表は,半分くらいは arXiv で見たことのある話でした. 話を聞くという意味ではワークショップが一番おもしろかったかも.

そして今月の後半になって,年明け早々に引っ越すことになり,12 月の中旬は家探しに明け暮れていました. 荷造りもはじめつつ……. 来年は慌ただしい幕開けになりそうです.

それでは,よいお年を.