たれぱんのびぼーろく

わたしの備忘録、生物学とプログラミングが多いかも

BackwardとOptimizer

「誤差はいくつか」と「誤差をどう重みに反映するか」の役割分担.

特定の層だけ学習無しにしたい場合(例: Encoder-FixNet-Decoder)、誤差逆伝播をFixNetで止めるのはNG. なぜならEncoderへ誤差が伝わらないから.
Backwardは通常通り計算して、OptimizerをEncoder/Decoderのみに適用すればいい.
実践的にはOptimizerの初期化時にEncoder/Decoderのみを渡せばいい.

Fine-tuningなどで出力層にのみ新規レイヤーを学習させたい場合(例: FixedEncoder-Decoder)、Backwardごと止めると合理的.
FixedEncoderに誤差が流れる必要がそもそもないので、Decoderのみ require_grad して逆伝播させ、Optimizerをかける.
上記のFixNetとの違いは学習が必要な層がBackwardの終端にあるか否か.