なぜTensorFlow
Google発である
この安心感はすさまじいです。まず潰れることが無いだろうということ。いつか急にサービスが停止するようなことは起こりません。
いきなりTensorFlow有料化とかはあるのでしょうか。いやきっと、クラウドサービスで高速計算を提供という形で収益化するでしょう。
機械学習の論文もバンバン出していますし、利用者も多いですし、最新の手法の実装はTensorFlowが最も早く対応するでしょう。
個人的には日本発のChainerに活躍して欲しいところですが。
もともとテンソル計算と計算グラフを記述するもの
データをテンソルとして、それを計算グラフに入れることでニューラルネットを記述できます。ですから、TensorFlowはニューラルネットを記述するのに優れています。しかし、それ専用というわけではなく、テンソルと計算グラフで記述できるものは何でも記述できます。
ニューラルネットのためだけの特別なモジュール化などをしていない分、プログラムを書くのはChainerに比べ面倒かもしれませんが、一度書いてしまえば使いまわすことができます。
また、数式を意識して書くことになるので、書いているうちに理解が深まるかもしれません。これはオマケですが。(本来理解してなければまともに使えませんが)
ここでは、モジュール化されていないことが利点であって、バラバラのパーツを使って何でもできるのです。Androidなどにも対応しており、アプリケーションを作ることもできます。
本格的に広い用途でツールとして使いたいならば、TensorFlow程向いているものはないでしょう。いつか深層学習の理解も深まり、アプリケーションとして世の中に送り出してみたいという野望がある場合には、現状それが可能なのはTensorFlowのみです。
利用者が多い
利用者が多いのも1つの利点です。なにか困ったことがあった場合、検索すれば問題の解決方法がすぐに出てきます。エラーが出てきた場合、表示されているメッセージをコピペすればそれだけで解決策が得られることもあります。
githubで公開されているコードも多く、参考にできるものがたくさんあります。
通常の「物」と違って、プログラムは再利用可能で、誰が作っても誰でも使うことができます。利用者が多いというのは、それだけ資源が多いのと一緒なのです。
TensorFlowの弱点
ネットワークを動的に書き換えられない
Define and Runの宿命です。ネットワークを定義したらば、あとはずっとそのネットワークを学習中に使うことになります。学習中に入力されたデータごとに異なる計算グラフを使いたい場合には特別コードを書く必要があります
ChainerのようなDefine by Runの場合は、データが流れて初めて計算グラフが構築されるため、データごとに構築する計算グラフを、普通のPythonの分岐コードで書いておくことができます。
従って、入力データごとに計算グラフを変化させる仕組みが必要なニューラルネットワークを記述したいのであれば、Chainerの方が圧倒的に使いやすいです。
一方で、現在はそのようなニューラルネットワークが必要なケースは多くありません。
もしかしたら、データごとに分岐したニューラルネットワークこそが、ニューラルネットの標準になる日が来るかもしれません。そのときにはChainerの大勝利が訪れるでしょう。
そのような優れたニューラルネットを発見したいというのであれば、Chainerは良い相棒になります。(日本贔屓気味)
対応GPUが高価
TensorFlowは性能の良いGPUしか認識しません。
古いGPUは使えないのです。本格的に深層学習をやるのであれば、当然GPUは必須ですから関係ないかもしれませんが、(20000万円:間違えてました)2万円くらいの安いGPUで深層学習やってみようという場合には、TensorFlowを利用してもその恩恵が受けられません。
64bitにのみ対応
32bitのコンピュータには対応していません。(誰かやっているかもしれませんが、少なくとも公式は対応していません)
今どきあまり問題じゃないかもしれませんが。
(私の古いノートパソコンは32bitです…)
私自身
私自身は基本的にChainerをベースに使っています。
しかし、多くの研究でTensorFlowが使われており、日本を代表する某超巨大企業もTensorFlowを利用していると聞きました。
なので、TensorFlowの方も手を出していこうと思っています。
TensorFlowの記事がこれから増えるかもしれないです。