情報系の手考ノート

数学とか情報系の技術とか調べたり勉強したりしてメモしていきます.

研究で使うなら PyTorch? TensorFlow?

機械学習,というよりニューラルネットワークを用いた研究を行う場合,おそらく PyTorch か TensorFlow のどちらかを使うことになるでしょう. この2つは機械学習関連では2大巨頭であり,多くの研究で使われています. そのため先行研究のプログラムが PyTorch や TensorFlow で配布されている,という状況も多いです. しかしここで PyTorch と TensorFlow,どちらを使うのかという問題が浮上します.

基本的に先行研究がありプログラムが配布されているなら,そこで使われている言語やライブラリをそのまま使うのが楽でしょう. 知らない言語やライブラリだったとしても,既存手法の実装をしなくて良いというのは大きいです. そういった前提が無く自由に環境を選べるのであれば PyTorch を使った方がいいというのが,個人的な意見になります. 私は研究で TensorFlow と PyTorch 双方を使ったことがあり,この経験から PyTorch の方が研究向きだという結論になりました. この記事では,PyTorch の方がいいなという考えに至った経緯について述べていきます.

TensorFlow

まずは TensorFlow が何かについてです. TensorFlow は天下の Google 様が開発されたライブラリです. 様々な言語に対応していたりするので,Python が嫌いな人もにっこりです. 非常に簡単にネットワークを実装でき,また学習も少ない行数で行うことができます. なにせ fit という関数を呼ぶだけで学習することができます. 極端な言い方をすると 1 行で学習のプログラムを書けます.

またデフォルトで出力されるログが比較的リッチで見やすいというのも良いところです. こういった所から手軽に何かネットワークを実装し学習させてみる,という用途ではかなり使いやすい,というのが私が抱いている印象です.

ただし個人的にはこの手軽さが TensorFlow のデメリットだとも感じています. というのも内部の処理をいじるのが結構めんどうだったりするのです. 学習が 1 つの関数を呼び出すだけで良いということは,学習時の処理をカスタマイズするには,この関数の中身を変える必要があるということになります. これ研究という用途ではかなり面倒です.

研究用途で学習時の処理を変える場合,現在はどういう手順で学習が進んでいてどこをどう変えるかということを考えることになります. TensorFlow はデフォルトでいろいろやってくれているせいで,現在の学習手順の把握も結構手間がかかります. さらにその処理を適切に変更しようとすると,内部のコードを見たりする必要が出てきます(これは最悪の場合かも).

また損失関数の定義がリファレンスに明言されていないのも個人的にモヤっとしたポイントでもあります. TensorFlow のリファレンスで BinaryCrossEntropy の項目を見ると,引数の説明や実行例が記載されています. そんな中でどんな数式が実装されているかについては載っていません. つまり実行例からどんな数式が実装されているかを知れということになります(もしくはソースコードを読むか). 手軽に実行したりする場合は気にすることはないかもしれません. しかし研究であれば話は別です.

研究で使った損失関数がどんな数式か書けないというのは論外でしょう. 「自分の手法は TensorFlow のこの関数を損失関数にして実装しました」と言われても,式が無ければ考察のしようがありません. これは TensorFlow のことを熟知していれば問題ないかもしれませんが,バージョンが変わって破壊的な変更があった場合はそこも知らなければなりません.

PyTorch

PyTorch はオープンソースで開発されている Python 用のライブラリです. 対象となっている言語は Python のみですが,まぁ Python 以外を使う明確な理由はあまり無いように思うのでそこまで問題では無いでしょう. まぁ私は Python がそんなに好きではないので,積極的に使うことはないですが.

PyTorch は TensorFlow と比べると手軽さに欠けるというのが第一印象です. 学習をするには自分でループを回してパラメータの更新を定め,ログ等の出力も自前で実装する必要があります. この点で PyTorch は TensorFlow に劣るといって良いでしょう.

ですが研究用途という点で考えると,この手軽でないという要素が PyTorch の利点となります. 多くの処理を自分で実装する必要があるということは,カスタマイズが容易であるとも言うことができます. 学習手順もかなり簡単に変えることができる上に,勾配の値を確認したり好きなタイミングで好きな形式のログを出力できます. まぁやろうと思えば TensorFlow でもできると思いますが,PyTorch のほうが遥かに楽な印象です. わざわざ PyTorch 内部のプログラムを見る機会は TensorFlow より少なかったように思います.

またリファレンスにちゃんと数式が記載されているのも有り難いです. PyTorch のリファレンスで Binary Cross Entropy の項目を見ると引数等の説明に加え,実装されている数式が記載されています. おかげでどんな計算をしているかが一目でわかります. TensorFlow の節でも述べましたが,研究をしていて損失関数の実装時に数式を知らないというのは論外と言っていいでしょう. それがちゃんとリファレンスに記載されているというのは,研究用途で使う上でかなり大きなメリットになります.

まとめ

TensorFlow と PyTorch について,双方使ってみて抱いている個人的な印象を述べました. 端的に述べるなら以下のようになるでしょうか.

  • TensorFlow は手軽に実装して学習をしたりできるが,カスタマイズをしようとすると少し手間がかかる
  • PyTorch は手軽に実装しようとすると少し手間だが,カスタマイズ性が高くリファレンスが親切である

このカスタマイズ性が高くリファレンスが親切であるという2点は研究で用いる上で重要でしょう. 少なくとも私は重要だと思います. そのため研究用途で TensorFlow と PyTorch を選べる状況にあるのであれば,私は PyTorch を推奨します. 実際私が所属していた研究室では TensorFlow が不便で PyTorch に変えたという人もいたりしました. まぁ最終的には本人の判断にはなるので,あくまで私の意見です. これが誰かの参考になれば幸いです.