6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

深層学習/行列積の誤差逆伝播

Last updated at Posted at 2020-03-29

#1.はじめに
 行列積の誤差逆伝播が分かりにくかったので、まとめておく。

#2.スカラー積の誤差逆伝播
 スカラー積の誤差逆伝播から復習すると、
 スクリーンショット 2020-03-29 15.41.12.png
 勾配を行う対象をLとし、あらかじめ$\frac{\partial L}{\partial y}$が分かっているものとすると、連鎖律から
スクリーンショット 2020-03-29 15.51.39.png
 これは問題ないですよね。

#3.行列積の誤差逆伝播
 ところが、行列積になると直感と変わって来ます。
スクリーンショット 2020-03-29 16.04.49.png

 なんか、ピンと来ませんよね。なので、具体的に確認します。
 設定は、2つのニューロンXと4つの重みWの内積を経てニューロンYに接続されていると考えます。
スクリーンショット 2020-03-29 16.20.37.png
スクリーンショット 2020-03-29 16.24.32.png
**1)最初に、$\frac{\partial L}{\partial X}$を求めます。**まず、これらを事前に計算しておきます。
スクリーンショット 2020-03-29 16.30.57.png
この計算を途中で利用しながら、
スクリーンショット 2020-03-29 16.35.53.png

**2)次に、$\frac{\partial L}{\partial y}$を求めます。**まず、これらを事前に計算しておきます。
スクリーンショット 2020-03-29 16.44.41.png
この計算を途中で利用しながら、
スクリーンショット 2020-03-29 16.46.43.png

#4.行列積の順伝播、逆伝播のコード
x1=X, x2=Y, grad=$\frac{\partial L}{\partial y}$とすると、

class MatMul(object):
    def __init__(self, x1, x2):
        self.x1 = x1
        self.x2 = x2

    def forward(self):
        y = np.dot(self.x1, self.x2)
        self.y = y
        return y

    def backward(self, grad):
        grad_x1 = np.dot(grad, self.x2.T)
        grad_x2 = np.dot(self.x1.T, grad)
        return (grad_x1, grad_x2)
6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?