FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

ゼロから作るDeep Learning ③ のDezeroをRubyで作り直してみる(ステップ31/ステップ32)

ゼロから作るDeep Learning ❸ ―フレームワーク編

ゼロから作る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

次のステップではこの実装をテストケースで確認する。