[ゼロから作るDeep Learning]Affineレイヤを実装してみた


はじめに

この記事はゼロから作るディープラーニング 6章誤差逆伝播法を自分なりに理解して分かりやすくアウトプットしたものです。
文系の自分でも理解することが出来たので、気持ちを楽にして読んでいただけたら幸いです。
また、本書を学習する際に参考にしていただけたらもっと嬉しいです。

Affineレイヤ実装

Affineレイヤとは、ニューロンの入力信号と重みをそれぞれ掛けて総和し、それにバイアスをたす処理をレイヤにしたものです。

class Affine:# 入力信号に重みをかけてその総和とバイアスをたす処理のレイヤ実装
    def __init__(self, W, b):
        self.W = W
        self.b = b
        self.x = None
        self.dW = None # 逆伝播処理で求めた各微分を保存するためにインスタンス変数を作成
        self.db = None # 逆伝播処理で求めた各微分を保存するためにインスタンス変数を作成

    def forward(self, x):
        self.x = x
        out = np.dot(x, self.W) + self.b

        return out

    def backward(self, dout):
        dx = np.dot(dout, self.W.T)
        self.dW = np.dot(self.x.T, dout)
        self.db = np.sum(dout, axis=0)# 複数データ(バッチ)に対応させるには
        # バイアスの微分を前の微分の総和で求める

        return dx

逆伝播処理は、Affineレイヤの順伝播処理では掛け算と足し算を使っているので、バイアスの微分は前の微分を継承、重みと入力値の微分はそれぞれを転置して取り替えっこして前の微分と掛け算することで求める。
バイアスはただ継承するのではなく、バッチ処理を上のように行う。