空飛ぶ気まぐれ雑記帳

主に趣味とかプログラミングについて扱います。

TensorflowかPyTorchなのか

何のポエムか

Deep Learningをするときは常にChainerを使っていたのですが、Chainerがサポート終了とのことで、フレームワークの乗り換えが必要になった。
その時に、選択肢として浮かんだのがTensorflowとPyTorchだった。
Microsoft Cognitive Toolkit(旧CNTK)とかnnablaとかマイナーなフレームワークはいくつかありますが、Chainer以下の普及率のものを使おうとは思わない。

元々Chainerを使っているときも思ったけど、マイナーなライブラリを使うと何かパクるときに実装の負担が大きいことに気づいた。
その点TensorflowかPyTorchなら問題ない訳で、どちらを使うかを当時は悩んでいた。

ちなみにポエムなので私が何を言いたいかは最後まで読まないと分からなくなっているが悪しからず。

Chainerの何がよかったか

そもそも、Chainerが好きだった理由はソースコードの殆どがPythonで記述されているところだ。
実行速度で他ライブラリに不利であったが、バグを見つけた時にVSCodeでCtrl+クリックでファイルを開いて、何が起きているのか検証できたし、Deep Learningの中身を読むことで勉強にもなった。
昔dlibでDeconvolutionの実装についてPRを送ったときに感じたが、やはりソースコードを読むとこれまで無かった実装に対する知見が得られるだけでなく、論文に書かれた数式に対する解釈が深まるように思う。
それは本質的な話ではなく、ChainerのBackendとしてCuPyが動いていること自体に大きな意味があったと今では思っている。
なぜなら自前でLayerを実装する際に一々高速な実装とするためにC++のコードをビルドする必要がないからだ。
実際問題、CuPyはCUDAの機能を一部しか使えないために自前でLayerを定義するときに困ることは確かにあったが、行列演算をはじめとする簡単な計算をnumpyと同様のインタフェースで操作できるというのは圧倒的な強みだった。
(最近ではどのライブラリも同じようなことができるのでこの部分はもはや強みではないかもしれないが)

結局どっちにしたかと選んだ理由について

とりあえずどちらかを選ぶにあたって、PyTorchとTensorflowで書かれたプログラムを読んでいた。
当時はTensorflow 2.0(alpha版だったか?)とPyTorch 1.0がリリースされたころだったと記憶している。

Tensorflow 1.x台の良くないと思っていたところにインタフェースの多さがあった。
tensorflow 1.xの前半はバージョンが2個上がれば異なる名前空間に同じ機能(若干書き方が違う)が1個増えるような状態だった。
確かにほかのライブラリに比べて高速であったが、既述のばらつきというのはそれだけで、他人のコードを参考にする上で害悪だ。
特に、使う名前空間によって挙動が若干異なるとなるとそれは深刻だった。

一方のPyTorchの良くないと思っていたところにChainerのフォークながら名前の語感が嫌いだった。
当時は何が嫌いなのか分からなかったが最近になって分かるようになってきた。
それは、名前のネーミングがnumpyから遠すぎるからだ。
例えば、unsqueeze。これはsqueezeの逆なので配列の次数を拡張するメソッドであるが、numpyではexpand_dimsだ。
当然、Chainerはexpand_dimsであるが、こいつは違うのだ。
ググるときに困るというのもあるが、それ以上に生理的に受け付けない。
ちなみに、Tensorflow2.0はnumpyに合わせたメンバ名を採用しているので、expand_dimsだ。

何が言いたいか

そういう訳で、現在もTensorflow 2.0を使っている。
ぶっちゃけTensorflow 2.0はあまり普及しておらず、論文の著者実装はだいたいTensorflow 1.xかPyTorchなので、「マイナーなライブラリを使うと何かパクるときに実装の負担が大きいことに気づいた」という点に関して、一切寄与していない。

それでも、名前の語感がNumpyに似ているという点と元々高速な実行速度の強みはTensorflowを使うに十分足ると思う。
もちろん、Tensorflowには結構不便なところもたくさんあって、PyTorchに逃げたくなることも多いが、それでも語感が生理的に受け付けないのは無理だ。
少なくとも、Chainerを使っていたので、読むことはできるから移植に困ることはそうない。

ところで、今回どうしてこのポエムを書いたかと言うと、Pythonのエコシステムに乗ることの重要性について書きたかったからだ。
Pythonはどちらかと言えば一神教な言語だと思っている。パッケージマネージャはpipが主流だし、行列計算はnumpy、グラフはmatplotlib、表データはpandasなどなど。
もちろん、グラフならmayaviとか色々あるが、やっぱりmatplotlibを使うというのが一般的だと思っている。
そして、それらのライブラリがあるが故にほかのライブラリでもやはり語感が揃っている方がPythonらしいと私は思っている。

だから、頼むからunsqueezeとか分けわからん名前を付けるのはやめてくれ。