テンソルフローを学んでいたとき、テンソルフローの基本的な概念の1つは計算グラフであり、グラフは静的であると言われていました。そして、Pytorchで、グラフは動的であると言われました。テンソルフローの静的計算グラフとPytorchの動的計算グラフの違いは何ですか?
両方のフレームワークはテンソル上で動作し、任意のモデルを有向非巡回グラフ(DAG)として表示しますが、それらの定義方法は大きく異なります。
TensorFlowは「コードとしてのデータとコードはデータ」というイディオムに従います。 TensorFlowでは、モデルを実行する前にグラフを静的に定義します。外界とのすべての通信は、実行時に外部データに置き換えられるテンソルであるtf.Sessionオブジェクトとtf.Placeholderを介して実行されます。
PyTorchでは、物事はより命令的で動的です:進行中にノードを定義、変更、実行でき、特別なセッションインターフェースやプレースホルダーはありません。全体として、フレームワークはPython言語とより緊密に統合されており、ほとんどの場合、よりネイティブに感じます。TensorFlowで書くとき、モデルは、とにかく、これは多かれ少なかれ好みの問題のように聞こえます。
ただし、これらのアプローチは、ソフトウェアエンジニアリングの観点だけでなく、動的アプローチの恩恵を受けることができるいくつかの動的ニューラルネットワークアーキテクチャがあります。 RNNを思い出してください:静的グラフでは、入力シーケンスの長さは一定のままです。これは、英語の文の感情分析モデルを開発する場合、文の長さをある最大値に固定し、すべての小さなシーケンスをゼロで埋める必要があることを意味します。あまり便利ではないですよね。そして、再帰RNNとツリーRNNの領域でさらに問題が発生します。現在、Tensorflowでは、Tensorflow Foldを介した動的入力のサポートが制限されています。 PyTorchにはデフォルトで設定されています。
参照:
https://medium.com/towards-data-science/pytorch-vs-tensorflow-spotting-the-difference-25c75777377b
TensorFlowとPyTorchの両方で、いつでも新しい計算を指定できます。ただし、TensorFlowには「コンパイル」ステップがあり、グラフを変更するたびにパフォーマンスが低下します。したがって、計算を一度指定すると、TensorFlowの最適なパフォーマンスが達成され、同じ計算シーケンスで新しいデータが流れます。
インタープリターとコンパイラーに似ています-コンパイル手順は物事をより速くしますが、プログラムを頻繁に変更することを防ぎます。
具体的には、TensorFlowでグラフを変更すると(通常のAPIを使用して新しい計算を追加するか、tf.contrib.graph_editorを使用して計算を削除する)、この行が session.py でトリガーされます。グラフをシリアル化し、基礎となるランタイムが最適化を再実行します。これには、おそらく200usecの余分な時間がかかります。対照的に、以前に定義されたグラフまたはnumpy/PyTorchでopを実行すると、1 usec程度の低さになる可能性があります。
テンソルフローでは、firstグラフを定義する必要があります。その後、グラフを実行します。定義したグラフは不変です。実行時にノードを追加/削除することはできません。
代わりに、pytorchでは、実行時にグラフの構造を変更できます。したがって、実行時にノードを追加/削除して、その構造を動的に変更できます。