24. 記号型(Symbolic)と命令型(Imperative)
記号型
記号に対して計算指示を行うこ
とで計算グラフを構築
Theano, TensorFlow
設定ファイル型:Caffe, cxxnet
命令型
データに対して直接計算を指示
Chainer
Torch(本体), Minerva
#記号型
A = Variable('A')
B = Variable('B')
C = B * A
D = C + Constant(1)
# compiles the function
f = compile(D)
d = f(A=numpy.ones(10),
B=numpy.ones(10) * 2)
#命令型
a = numpy.ones(10)
b = numpy.ones(10) * 2
c = b * a
d = c + 1
24/50
25. 記号型が有利:最適化しやすい
学習ではコンパイル1回に対して実行は複数回
依存関係解析に長い時間を書けることが可能
メモリ使用量やマルチGPU、マルチノード最適がしやすい
不要な値、一時的な値を探しやすい
例えばTensorFlow では各シンボルは型とサイズを持つ
#記号型
A = Variable('A')
B = Variable('B')
C = B * A
D = C + Constant(1)
A
D
B
B * A + 1
A
B
DC
B * A C + 1
最適化
25/50
29. 現在のChainerの仕組み
Define by Run
基本的には命令型
変数に対してbackwardが呼べるように拡張
つまり、順方向の計算と同時に計算グラフを作る
Define and Run(対立概念)
基本的には記号型
TensorFlow, Theano, Torch nn
a = numpy.ones(10)
b = numpy.ones(10) * 2
c = b * a
d = c + 1
a
b
dc
b * a c + 1
Define by Runで作られる計算グラフ
29/50