ゼロから作るDeep Learning ❸ ―フレームワーク編
- 作者:斎藤 康毅
- 発売日: 2020/04/20
- メディア: 単行本(ソフトカバー)
ゼロから作るDeep Learning ③のDezero実装、勉強のためRubyでの再実装に挑戦している。計算グラフが表示できるようになって、いよいよ難しそうなところに突入していく。今回はステップ31とステップ32。
- ステップ31:高階微分の理論について。高階微分を行うために、DeZeroのネットワークを改良し、
backward()
を実行している最中もネットワークを構築する。backward()
による微分のネットワークを作ることで、このネットワークをさらにbackward()
することで2次微分が実現できるという寸法だ。なるほど、面白い。 - ステップ32:ステップ31の理論を実現するために、まずはこれまで
Variable.grad
を単なるndarray
として取り扱っていたものをVariable
として取り扱うようにする。このためにDeZeroのいくつかの点を改良する。
まずは.grad
の初期値を設定するにあたり、nparray
をそのまま格納していたものをVariable
に変更する。
def backward(retain_grad=false, create_graph=true) np = Numpy if @grad == nil @grad = Variable.new(np.ones_like(@data)) end ...
いくつかのbackward()
関数の実装を変更する。これまではVariable
からgrad
の値を取り出して計算を適用していたが、Variable
のまま演算を適用する。
class Mul < Function def forward(x0, x1) y = x0 * x1 return y end def backward(gy) x0 = @inputs[0] x1 = @inputs[1] return [gy * x1, gy * x0] end end
次のステップではこの実装をテストケースで確認する。