April 2020
Intermediate to advanced
552 pages
6h 13m
Japanese
本付録は、ステップ14の補足ページです。ここでは、ステップ14で述べた「微分の加算に+=を使わない理由」について説明します。
まずは今回の問題について整理します。ステップ14では、同じ変数を繰り返し使えるようにするために、Variableクラスのbackwardメソッドを次のように修正しました。
classVariable:...defbackward(self):ifself.gradisNone:self.grad=np.ones_like(self.data)funcs=[self.creator]whilefuncs:f=funcs.pop()gys=[output.gradforoutputinf.outputs]gxs=f.backward(gys)forx,gxinzip(f.inputs,gxs):ifx.gradisNone:x.grad=gxelse:x.grad=x.grad+gxifx.creatorisnotNone:funcs.append(x.creator)
修正点は網掛けで示した箇所です。簡単に言えば、1回目に微分(勾配)が伝播したときは、x.grad = gxと「代入」を行い、それ以降は、x.grad = x.grad + gxと「加算」を行います。ちなみに、gxはndarrayインスタンスです。ステップ14で指摘した点は、この加算をx.grad += gxと書くと問題になるケースが出てくるということでした。ここでは、その理由を説明します。
Read now
Unlock full access