はじめに
この記事はゼロから作るディープラーニング 6章誤差逆伝播法を自分なりに理解して分かりやすくアウトプットしたものです。
文系の自分でも理解することが出来たので、気持ちを楽にして読んでいただけたら幸いです。
また、本書を学習する際に参考にしていただけたらもっと嬉しいです。
レイヤとは
ニューラルネットワークに逆伝播処理を実装するには、ニューロンをレイヤというものにする必要があります。
レイヤとは、順伝播処理と逆伝播処理の両方が実装されたニューロンと考えるのが一番簡単です。
ニューラルネットワークを実装するのに必要なレイヤは、Sigmoidレイヤ・Reluレイヤ・Affineレイヤ・出力層から損失関数までのレイヤが最低限です。
レイヤはクラスとして実装して部品のようにすることで、ニューラルネットワークを様々な構造に組み替える時に運用しやすくなります。
では、今回は前回の記事にも出てきた足し算のニューロンと掛け算のニューロンをレイヤ化してみることにします。
加算レイヤ
class AddLayer:# 加算レイヤ
def __init__(self):
pass# 何も行わない
def forward(self, x, y):
out = x + y
return out
def backward(self, dout):
dx = dout * 1
dy = dout * 1 # 足し算の時は前の微分を両変数とも引き継ぐ
return dx, dy
加算レイヤでは、順伝播処理で二つの変数の値を合計して返し、逆伝播処理では前の微分をそのまま引き継がせて返します。
乗算レイヤ
class MulLayer:#乗算レイヤ
def __init__(self):
self.x = None
self.y = None # 変数xyをインスタンス変数に
def forward(self, x, y):
self.x = x
self.y = y # 変数xyの値は逆伝播処理で使うので保存しておく
out = x * y
return out
def backward(self, dout):
dx = dout * self.y
dy = dout * self.x
return dx, dy
乗算レイヤは、順伝播処理で変数xyを掛けて返し、逆伝播処理では、もう一方の変数の値と前の微分を掛けることで微分を求めて返します。