chainerでcleargrads後のaddgradsでSource gradient is not set.エラー
chainerでは、複数のGPUを使って並列にlossを求めて逆伝搬し、勾配を足し合わせてからupdateする方法がサポートされている。
Using GPU(s) in Chainer — Chainer 1.15.0.1 documentation
コードは以下のようになる。
model_0.cleargrads() model_1.cleargrads() loss_0 = model_0(x0, t0) loss_1 = model_1(x1, t1) loss_0.backward() loss_1.backward() model_0.addgrads(model_1) optimizer.update() model_1.copyparams(model_0)
このうちaddgrads
でSource gradient is not set.
というエラーが発生した。発生箇所はこのあたりだが、原因がよくわからなかった。
ソースコードを読んでいて原因がわかった。どうやらChain
インスタンスでadd_link
したlink
のうち、未使用のものがあるとこのエラーが発生するらしい。解決策としては
- 未使用のlinkを消す
cleargrads
ではなくzerograds
を使う
といった感じだろう。
エラーの原因が分かるようassertを出すPRを作ろうと思ったが、Chain
内に書くしか無く、そうするとChain
内で全param
を網羅的に調べる必要があるので、コードが汚くなるし処理が重複してしまう。うーん、errorをthrowする設計がたまに恋しくなるなぁ。