はじめに
最近は自分自身が機械学習関連に触れる機会がめっきり減ってしまい、ブログの更新が全くできていない状態でした。久々にこの辺りの現状を調べてみたら、私がいろいろ機械学習を触っていた時と状況が大きく変化しているように見えました。
なので私が久々に調べてみて感じたところをまとめておきたいと思います。
実際に動かしてみた系の記事ではないですし、具体例がないのでもしかしたら私の頭の中で勘違いもあるかもしれませんが、そのときはご指摘いただけると幸いです。
フレームワークのこれまでと現状
ディープラーニングフレームワークの登場
ディープラーニングが画像処理や音声認識などで爆発的な精度向上を果たしたことを機に、素早くニューラルネットワークの構築と実験が可能な、ディープラーニングに特化したライブラリやフレームワークが公開されるようになりました。
ディープラーニングでトップになりたければ、むしろ便利なライブラリを後悔するのはライバルを増やすだけなのではないか?と感じるかもしれません。しかし無償で公開するメリットとして、多くの人間に使ってもらうことでバグの報告をしてもらったり、あるいは修正を手伝ってもらうことができる点が挙げられます。
つまり、ソフトウェアを人類の知恵を集合させて作り上げることができます。また、そのソフトウェアに対応したクラウドコンピューティングを有料サービスとして提供すれば、顧客の囲い込みが可能であるということもひとつの戦略として考えられるかもしれません。
いずれにしても、ディープラーニングフレームワークはオープンソースとして近年爆発的に発展してきました。
Define by RunとDefine and Run
これまでは特に、Define by RunやDefine and Runという区切り方でフレームワークが語られることが多かったです。以下の記事でも、これらの違いを強調しながら比較を行ったりしてきました。
Define by RunはPythonのコードで自由自在にネットワークを定義することができ、Pythonに親しんでいる人にとって(あるいはこれから始める人にとっても)非常に扱いやすいものでした。また、デバッグも比較的容易で、特に研究用途や新たに勉強を始める段階では非常に人気を博しました。
Define by Runなる概念を初めて提唱したのは日本のPFNことPrefferd Networks社です。PFNはPythonの深層学習ライブラリとしてChainerをオープンソース化し、(日本で?)一躍有名となりました。
Google社もTensorFlowを公開し(圧倒的なネームブランドによって?)ユーザーを爆発的に獲得し、もはやディープラーニングクラスタにおける一大勢力となっています。こちらの方はDefine and Runであり、利用者の中にはTensorFlowを使う事自体が苦痛であると感じる人も多々居たようです。
その後、Chainerをフォークしたフェイスブック社主体のPyTorchが出現し、Define by Runの取り回しの良さが世界中に広まりました。中にはPyTorchがTensorFlowの人気を奪い、政権交代が行われるだろうと感じた人も居たのではないでしょうか。
多くのフレームワークがあらわれてきた中で、異なるフレームワーク間でニューラルネットワークのモデルを共有するためにONNXというフォーマットが提唱され、フレームワーク間の境を取り除く動きも出てきました(特にPyTorchは圧倒的な使いやすさで研究者の利用者を増やしただけでなく、実用時にはPyTorchのモデルを高速に動作するCaffe2(Define and Run)に渡して利用するという形態を準備しています)。
Define and RunとDefine by Run戦争終結?
モデルの交換が自由自在に行われるようになれば、Define and RunかDefine by Runかは使いやすさや速度を兼ねて、好きなように選択できるようになります。特にプロトタイピングの段階ではDefine by Runで素早くデバッグと実験を回し、実用を意識する場合にDefine and Runにするという方法が考えられます。
しかし(筆者の憶測も多分に含まれますが)、既にユーザーを十分に獲得しているTFやPyTorchにとっては、フレームワーク間を自由に変換できることは、利用者の流出につながり面白くないかもしれません。
今年になってTensorFlow EagerモードとしてDefine by RunがTensorFlowに追加されました。更に、PyTorchは正式版リリースと共にCaffe2をPyTorchにマージし、実質Define by RunとDefine and Runを1つのフレームワークでシームレスに使えることを目指すようです。
The road to 1.0: production ready PyTorch
要するに1つのフレームワークでDefine by RunとDefine and Runが両方共使えるという状況になってきたということになります。フレームワークはこれらのいいとこ取りをしながら発展し、状況に応じてユーザーが自由に使い分けられるようになるでしょう。
もはや、私自身がこれまでブログで書いてきた、Define by Runか否かでフレームワークを選ぶのは古い考え方かもしれません(とは言っても、ネットに落ちている参考になるコードは、それぞれのこれまでの方式に則ったものが多いのは間違いないです)。
ディープラーニングフレームワークのこれから
ディープラーニング応用
実際のところ、思っているほどディープラーニングは実世界で多用されていません。機械学習の研究ではディープラーニングが目立つかもしれませんが、実用では本当に本当にごく少数でしか利用されていないでしょう。
これはディープラーニングが流行り廃れのくだらない技術だということを言っているのではありません。恐らく上手く使えばパワフルですし、今後も活発な議論は続き(今ほどではないにしても)有用な部分は生き残っていくでしょう。
しかし応用されるためにはまだ環境の整備が十分に整っているとは言えません。実用のシーンにどう嵌め込んでいけば良いのかを熟知している人はそうそう居ないでしょう(少なくとも私には長期的な利用の上手いやり方はわからない)。
従って、フレームワーク側は今後デプロイをより一層行い易い環境の整備をしていくのではないでしょうか。またディープラーニングは通常の機械学習技術に比べ、学習は勿論のこと推論時にもそれなりに計算が重くなっています(単なる行列演算でも、層の数だけ待ちは出る)。それらを容易に行うための計算機の構成なども逐次改良されていくでしょう。
ともかく、まだまだ赤ん坊の状態ですので、多くの動向を見守っていかなければなりません。