define by run と define and run
ハイパーパラメータを自動で最適化するoptunaが公開されたnewsを見てすごいなと感動していた。oputunaがdefine by runに準拠しているというのを見てそういえばdefine by run と define and runの詳しい違いは何だったかわからなかったので調べてみた。
- define and run :ネットワークを構築して固定してから学習を開始する
- define by run :ネットワークは順伝搬のあとに確定されて学習
define and run のネットワークは固定というのはそのままの意味で、学習を行う前にネットワークの構造を決定する。以後その形はデータの内容や結果がどうであれ変更されることはない。
柔軟性があまりないという欠点があるが、そのかわり最適化が容易であるという利点がある。
一方define by runは途中でネットワークの構造を変更させることができる。
例えばchainerではミニバッチごと、1データごとにネットワークの構造を変化させることが可能である。順伝搬の結果ごとに分岐条件をつけて変化させるなどである。define by runはデータが通った計算のルートのみを覚えているのでその部分のみが更新される。(通らなかったルートはそもそも構築されない)
この柔軟な点は自然言語処理のRNNで有効である。例えば自然言語処理のデータセットでは文字長が異なる場合、揃えるためにパディングを行なってミニバッチ処理を行うが、define by runではデータごとにネットワーク構造を変えることができる。
参考