April 2020
Intermediate to advanced
552 pages
6h 13m
Japanese
前ステップでは、現状のDeZeroの実装を振り返りました。その要点をまとめると、次のようになります。
Functionクラスの__call__メソッドの中で作られるFunctionクラスを継承した先のクラスのforwardメソッドとbackwardメソッドで行うここで注目したい点は、計算グラフの「つながり」が作られるタイミングです。それは、順伝播の計算が行われるときに作られます。一方、逆伝播で行う計算に関しては、計算の「つながり」は作られません。ここに問題の核心があります。
順伝播と同様に、逆伝播においても具体的な計算は行われます。たとえば、前ステップに登場したSinクラスの場合、backwardメソッドは次のように実装されています。
classSin(Function):...defbackward(self,gy):x=self.inputs[0].datagx=gy*np.cos(x)returngx
上記のように、gx = gy * np.cos(x)という具体的な計算が行われます。しかし、現状のDeZeroでは、その計算に関しての計算グラフは何も作られません。なぜなら、その計算はndarrayインスタンスに対して行われているからです。もし、逆伝播で行う計算に関しても「つながり」が作られるならば、どうなるでしょうか。実は、高階微分は自動で求めることができるのです! その原理を説明するにあたって、まずは図31-1の計算グラフを見てみましょう。
図31-1 y=sin(x)の計算グラフ
図31-1は、y=sin(x) ...
Read now
Unlock full access