その他

【pythonでディープラーニング】バックプロパケーション回帰 出力層編 

バックプロパケーション回帰 出力層編

今回はニュートラルネットワークにsin関数を学習させます。sin関数は連続的な関数なので、回帰問題になります。
x座標をネットワークへの入力、y座標をネットワークからの出力とする。そして、sin(x)を正解とする。

前提

  • 入力層ニューロン 1つ
  • 中間層ニューロン 3つ
  • 出力層ニューロン 1つ
  • 中間層の活性化関数:シグモイド関数
  • 出力層の活性化関数:恒等関数
  • 損失関数:二乗和誤差
  • 最適化アルゴリズム:確率的勾配降下法
  • バッチサイズ:1
class OutputLyyer:
    def _init_(self, n_upper, n) #初期設定
        selef.w = wb_width * np.random.randn(n_upper,n) #重み
        selef.b = wb_width * np.random.randn(n) #バイアス
    
    def forward(self, x): #順伝播
        self.x = x
        u = np.dot(x, self.w) + self.b
        self.y = u #恒等関数

    def backward(self, t):
        delta = self.y -t
        self.grad_w = np.dot(self.x.T, delta)
        self.grad_b = np.sum(delta,axis=0)

        self.grad_x = np.dot(delta, self.w.T)

    def update(self, eta):
        self.w -= eta * self.grad_w
        self.b -= eta * self.grad_b

コード解説

重みはn_upper*nの行列、バイアスは要素数nのベクトルにしています。

各要素の初期値はランダムな値を設定。

forwardメソッドは順伝播の処理で入力と重みの行列積にバイアスを加えています。回帰問題なので活性化関数には恒等関数を使用しています。

backwardメソッドは逆伝播の処理で正解を引数としてdeltaを計算しています。

この際、重みを勾配grad_w、バイアスの勾配をgrad_b、入力の勾配をgrad_xで計算しています。

updateメソッドは重みとバイアスの更新用の処理です。それぞれの勾配に学習計数etaをかけて更新量とし、現在の値から引いています。