Define-and-runとDefine-by-runの説明に入る前に、山崎氏は「計算グラフ」の概念を説明した。計算グラフは、計算の流れをグラフ構造により記述したもので、複雑な処理でも視覚的に処理内容を理解することができる。多くのフレームワークは、計算グラフによりニューラルネットワークを構築している。
上図ネットワークで推論を行う場合、入力データは畳み込み層(conv)、プーリング層(pool)、全結合層(fc)、活性化関数(relu)、ソフトマックス関数(softmax)を経て、処理結果が確率(prob.)として出力される順伝播で処理が進む。このネットワークで学習を行う場合、出力と教師データ(label)から誤差関数(loss)によって誤差(error)を定量化し、逆伝播で各層の勾配を計算、重み係数の更新を行う。
Define-and-runは計算グラフを構築した後にデータを流し処理を実行する方式で、「最適化しやすいが、途中経過の処理状態を確認することが面倒」だと山崎氏は説明する。その対称とされるDefine-by-runでは、計算グラフの構築と順伝播処理の実行が同時に行われるため、「途中の処理結果が確認でき、デバッグが楽になる。さらには途中の処理結果に応じて分岐など、処理内容を変更することができる」(山崎氏)として、言語処理などRNNで有効な手法だとした。
Define-and-runは、TensorFlowやCaffe、MXNetなど多くのフレームワークで実装されている。Define-by-runは、先駆け的な存在であるChainerやPyTorchの他、TensorFlowでもプレビューバージョンの一部機能で対応を始めたという。
Copyright © ITmedia, Inc. All Rights Reserved.