これは[KCS AdventCalendar2020](https://adventar.org/calendars/5690)18日目の記事です. [←17日目](https://zenn.dev/besshy8/articles/3c5b50dc255b4e) | [19日目→](https://kcs1959.jp/archives/6021/general/%e7%a7%81%e6%96%87%e5%a4%a7%e5%ad%a6%e7%94%9f%e3%81%8cunity%e3%81%84%e3%81%98%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f) # はじめに なぜか名誉代表となったsupercellです.役に立つかはわかりませんが深層学習のフレームワーク関連のことで復習がてら書いていこうと思います. この記事では,深層学習フレームワークにおける二つの計算グラフの方式についてそれぞれメリット,デメリットをまとめていきたいと思います. # 静的計算グラフ(Define-and-Run) 静的計算グラフとは,一度計算グラフを定義してからそのグラフにデータを流して計算するという方式です.例えば,Tensorflowでは以下のようなコードで計算グラフを定義します. ```python=3. import tensorflow as tf flg = tf.placeholder(dtype=tf.bool) x0 = tf.placeholder(dtype=tf.float32) x1 = tf.placeholder(dtype=tf.float32) y = tf.cond(flg, lambda: tf.add(x0, x1), lambda: tf.square(x1)) ``` `placeholder`というデータを流す入れ物を用意して,`tf.cond`という演算が行われています.(演算の詳細は[こちらへ](https://www.tensorflow.org/api_docs/python/tf/cond))注目する点は,上のコードの段階では実際の計算は行われないことです.よって,実際の計算はグラフをコンパイル後,データを入れて初めて計算されることになります.このようなプログラミングは記号を対象にしていることから,「シンボリック・プログラミング」と呼ばれています. 次に,メリット,デメリットを挙げます. ## メリット * パフォーマンスが高い * グラフの計算の最適化が行いやすい ## デメリット * 独自の文法を覚える必要がある * デバッグしにくい 注目する点は,パフォーマンスが高いということです.これは,あらかじめ計算手順が決められているがゆえに演算を効率の良いものに変換ができるためです.例えば,`a*b+1`という演算では,掛け算の後に足し算が行われる計算グラフが作成できますが,この演算を一つにまとめることができます. # 動的計算グラフ(Define-by-Run) 動的計算グラフとは,データを流してグラフが定義される方式です.この方式では,データに基づき計算を行いながら計算グラフの構築も同時に行われています.具体例を示します. ```python=3. import torch x = torch.tensor(1.0, requires_grad=True) y = torch.tensor(2.0, requires_grad=True) z = (x + 2 * y) ** 2 z.backward() ``` 上記のコードはPytorchを使って計算を行っています.計算の際にそれぞれの変数がどのような演算で計算されているかを記憶していけば,計算に応じたグラフを作成することができます.そして,変数のクラスにある`backward`メソッドを使ってグラフを逆にたどって行けば連鎖律を使ってそれぞれの変数の勾配を求めることができます.(いわゆる誤差逆伝播法)以下は上記のコードで作成されるグラフです. ![](https://i.imgur.com/dL9K59S.png) 次に,メリット,デメリットをまとめます. ## メリット * Pythonの文法で制御することができる * デバッグがPythonの機能でできる * 動的な計算がやりやすい ## デメリット * パフォーマンスが低くなりうる 注目する点は,デバッグがPythonの機能を使ってできることです.計算グラフは当然Pythonの文法の範疇で行っているのでデバッグ作業も行うことができます.静的計算グラフの場合,データを流す際にエラーが発生しやすくどこでエラーが起きるかが特定しにくいです.しかし,動的計算グラフの場合はデータを流すことと同時に計算グラフも構築していくので,ある程度構築してデバッグすることが可能です. # まとめ Pytorchしゅき.遅れて大変申し訳ございませんでした. [←17日目](https://zenn.dev/besshy8/articles/3c5b50dc255b4e) | [19日目→](https://kcs1959.jp/archives/6021/general/%e7%a7%81%e6%96%87%e5%a4%a7%e5%ad%a6%e7%94%9f%e3%81%8cunity%e3%81%84%e3%81%98%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f)