はじめに
本記事では以下のChainerによる実践深層学習の紹介をします。
以下の書籍はChainerのバージョンアップによって編集・追加版が発刊されます。購入する場合は新しい書籍を購入してください。
深層学習を始めようという場合には、1からプログラミングをする方法と、ニューラルネットを記述するためのライブラリを用いる方法の2つがあります。深層学習自体を理解したいという場合には前者を、そして深層学習を実際に応用したいという場合には後者を選ぶのが最善かと思われます。そして今回紹介する書籍は後者に対応します。
1からプログラミングする
1からプログラミングする場合には、深層学習の計算処理を実装することになり、具体的にどのようなことが行われているのかを理解することに役立ちます。このような目的の場合には以下の記事で紹介した書籍が非常に役に立つでしょう。
深層学習を実用的に応用しようという場合には、いずれにしても深層学習自体への理解が必要となりますから、この道はいずれは通ることになるかと思われます。
ライブラリを用いる
例えば行列計算の実装、活性化関数の実装、これらは一度実装したら変更するものでもありません。ずっと使い続けます。いつでもその処理を呼び出せるようにしておき、ニューラルネットを設計するときに適宜用いていくことになります。つまり再利用可能な状態にして置かなければなりません。
もっと良い呼び出し方は無いかとか、どのようなデータ構造にしておくかなどを考えることは、深層学習を理解するというよりは、ソフトウェア開発に関する勉強の話であって本筋からはそれてしまいます。
すでにそのようなことが考えられて、ライブラリとして提供されているならばそれを使うに越したことはありません。ニューラルネットを構築するときにはそれらをブラックボックスのまま扱うことができます。どのような機能があるのかだけを把握していれば使うことができるため、すでに処理の中身を理解しているならばライブラリから受けられる恩恵は非常に大きいはずです。
今回は日本のPrefferd Networks社が提供するChainerについての書籍を紹介します。
結論
この本を買うべきかどうかは、かなり状況によります。
Chainerを使う気が全くない。例えばTensorFlowを選ぶというのであれば、当然買う必要はありません。またChainerを使いたい場合でも買うべきかどうかは一旦悩んでもいいかもしれません。
以下にその理由を述べていきます。
悩むべき理由
Chainerのアップデートが早い
Chainerはかなりのペースで新機能が追加されていっています。
今回紹介する「Chainerによる実践深層学習」が発売されてから数ヶ月経った現時点で、すでに書籍内で紹介されていない機能がどんどん追加されています。Chainerの最新機能を使いこなすという面においてはおそらく全くに役に立たないはずです。
畳み込みニューラルネットワークは扱われていない
深層学習を始めようといろいろ調べてみると、至るところに「MNIST」というデータセットを用いた例題があります。これは手書き数字の画像セットであり、これを使って新しいニューラルネットの性能を評価するということが行われています。
このデータセットに対しては99%以上の訓練精度が出るのが普通となっていて、手書き数字を認識させること自体が研究になることはありません。あくまで、すでにある他のニューラルネットに比べ、高い性能を持ちうるかを検証するために使われます。
MNISTは画像データなので、ニューラルネットとしては畳み込みニューラルネットが適しています。実際に多層パーセプトロンを学習させ、その後畳み込みニューラルネットで同様に学習させた場合にはやはり後者のほうが高い精度を得られます。
ここで、ニューラルネットの構造の違いによる精度の差を体感したり、データの加工の仕方を学ぶのが通例のようになっており、ある意味深層学習での「Hello World」に近い役割を担っているのがMNISTというわけです。
今回紹介する書籍ではこの畳み込みニューラルネットワークは取り扱われていません。
テーマ自体がバラバラの印象
多層パーセプトロンに対しては、MNISTやIrisと呼ばれるデータセットが用いられます。Irisは花の特徴4つを数値化してあるデータセットで、4つの特徴からその品種を当てる例題としてMNIST同様頻繁に用いられます。
本書では後半でリカレントネットワークを扱っており、時系列データを扱うための基本的な手法になっていますが、ここで突然自然言語処理の話に飛んでいきます。基礎的なことは解説されており、手を動かすことはできるかと思われますが、リカレントネット自体が深層学習の始めの一歩という感じではありません。
少なくとも多層パーセプトロンに対して理解を持っていなければ、全く何をしているのかわからないということになってしまうでしょう。
誰が買うべきか
私自信はTensorFlowもChainerも触ってみて、結局Chainerを主軸に使っていくことにしました。
これはChainerが普通にPythonを使って色々記述できるため扱いやすく(TensorFlowはかなり独特です。TensorFlowという高級言語だと思って扱うくらいの感覚)、私自信Pythonの勉強を進めていこうと考えていたためです。おまけではありますが、Chainerが日本発祥であるため盛り上がってほしいという思いもあります。
そんなときに基本的にChainerだとどのような記述でニューラルネットを扱えるのかを概観するには本書が非常に役に立ちました。
TensorFlowで行くかどうかを迷っていた時には、この本でのChainerの分かりやすい記述に後押しをもらいました。
従って、フレームワーク自体を悩んでおり、Chainerの概観を知り後押しを貰いたい場合には有効な本かなという印象です。
しかし、詳しく自分でニューラルネットを構築しようと思った場合には、やはり別途自分で調べなければなりません。(これはどのフレームワークを使うとしても同じだと思いますが)
また、テーマがバラバラという印象は有りますが、ある程度理解がある人にとってはむしろ広い範囲のことを知る機会になります。とくにRNNに関しては近年主流であるLSTMもGRUも扱っているため、数式を追えれば理解するチャンスになります。他の深層学習の書籍に比べ、噛み砕かれた説明であるため直感的な理解もしやすいです(実際、LSTM関連は初めてここで勉強が進んだ)。
余談
日本発祥ということでChainer、Googleの提供ということでTensorFlow、この2つがとても有名なのは言うまでもありません。
しかし、実際にはChainerとTensorFlowのカバーする範囲は同列ではありません。
Chainerの方がより抽象度が高く、高レベルのレイヤーをカバーしています。
例えば、
行列計算そのもの⇛順伝搬や誤差逆伝搬などの行列計算⇛ニューラルネットワークの記述方法⇛学習の方法(ミニバッチ処理などデータの渡し方)という具合で高レベルになっていくとしましょう。この場合で、Chainerがカバーしているのは順伝搬や誤差逆伝搬などのニューラルネットならではの行列計算から、学習の方法までです。
TensorFlowでは行列の計算そのものを扱っており、そこからニューラルネットの記述までをカバーしています。学習の方法は、逆伝搬などを実装してあるので、適宜データを渡すfor文を書いて自分でやってねという形になっています。
TensorFlowで学習や評価をより簡単に扱いたい場合は、別途Kerasというライブラリを追加しなければなりません。これは記述が直感的で使いやすいと評判ですが、より低階層でニューラルネットの構造を考えたい場合には結局TensorFlowに戻らなければなりません。
Chainerのカバー範囲はある意味、ニューラルネットを扱う上で必要十分な部分です。
行列計算を直接Chainerで扱うわけではないので(ChainerがCupyやNumpyを使っている)、ニューラルネット以外の機械学習をしたい場合には向いていません。一方TensorFlowは計算そのものの方法を提供しているので、ニューラルネット以外の手法も実装することができます(ただその恩恵があるかは不明)。