VisasQ Dev Blog

ビザスク開発ブログ

エンジニア勉強会でChainerとKerasの比較をしてみました

はじめに

こんにちは、新卒1号エンジニアの村上です。

ビザスクでは去年の7月頃から毎週水曜日にエンジニア勉強会(読書会)をやっています。当初は1冊本を選んで、章ごとに担当を決めて読書会形式で行っていました。(ex.『エキスパートPython』『リーダブルコード』)

ところが、最近になって「たまには手を動かして新しい技術に触れることもしたいよね!」という想いから、個人の興味がある分野でビザスクに還元できそうな内容をプレゼンするという形式になりました。

今回は、その先々週の勉強会で発表した内容になります。

おしながき

  • ChainerとKerasでやったこと
  • スライド
  • スライドの補足
  • まとめ

ChainerとKerasでやったこと

分類問題を題材に、シンプルなニューラルネットワークをChainer、Kerasそれぞれで実装して、比較しました。 扱ったデータセットは、この手の分析では定番のiris(アヤメデータ)です。

初めは、Chainerで実装しながら深層学習について勉強しようと本を買って進めていたのですが、勉強会の1週間ほど前に中川さん(野球の人)から、「Kerasってのがあるらしいよ」ということを聞いて、それまで自分はKerasの存在すら知らなかったのですが、どうやらChainerよりも簡単に書けるみたいな情報もあり、試しに使って比較してみようと思ったのがきっかけです。

Chainerについての内容の方に若干偏っているところはありますが、Chainerでこう書くのがKerasだとこう書けるのかというような参考にはなるかと思います。

スライド

 

スライドの補足

Chainerのこと

Chainerでは順方向に計算する過程で、各ノードが持つ情報をVariableオブジェクトに保持し、その後、逆方向に計算することで誤差関数の微分値を得ています。 これらを明示的に書くところに安心感があるのかなと思いました。

また、モデルの定義もinitにはlinksを使ったパラメータを含む関数を書き、callに誤差関数を書き、fwdには順方向の計算式を書くといった基本的なお作法を覚えてしまえば直感的でわかりやすいと思います。

Kerasのこと

一方で、Kerasは入力層から出力層に向かって順番に必要なノード数の定義や活性化関数を定義します。 これはネットワーク図に描かれる順番通りなのでとても直感的です。 また、モデルの設定や要の学習部分では素朴に書くと冗長になりがちなところをcompileやfitメソッドを使うことでとてもコンパクトに書くことができます。

先ほどChainerのまとめで「明示的に書くことの安心感」と言いましたが、毎回書く冗長なコードはできるだけ削ぎ落とし、問題に応じたモデルの定義に専念させる方がフレームワークとして理にかなっているのかもしれません(個人的にはChainerが好き)。

まとめ

今回は、入門ということでとてもシンプルな分類問題を扱いました。

使用した分類モデルも単純な3層のニューラルネットワークです。

この分野にはその他にもword2vec、AutoEncoder、RNNやLSTMなど、魅力的なキーワードが存在する中で、個人的には自然言語処理の技術としてwebに応用が効くところの興味関心が最近は強いです。

まだまだこの辺りは勉強中なのですが前回の花村の記事でも紹介があったNeo4jなどのグラフDB技術とも組み合わさって....などと考えるとわくわくします。

きっとこの辺りのエキスパートも直にジョインして、急速に現実味を帯びてくるはずと妄想したり(たまに議論したり)しています。

なんだか後半、夢の話になってしまいましたが、最後まで読んでいただきありがとうございました。

テクノロジーのチカラで知見のサービスを一緒に育ててくださるPythonistaを募集しています!