読者です 読者をやめる 読者になる 読者になる

【ゼロから作るDeep Learning】5章 誤差逆伝播法

  • 誤差逆伝播
    • 数値微分による勾配の計算は,実装が平易だが,計算に時間がかかるという難点がある
    • そこで微分計算を効率的に行う誤差逆伝播法の出番となる
    • 誤差逆伝播法は色んな分野で使われている
      • 天気予報
      • 数値的安定性の分析

  • 誤差逆伝播法の理解の方法は2種類ある
    • 数式によるもの
    • 計算グラフ(computational graph)によるもの
      • 視覚的に意味を理解できる.
      • 局所的な計算を伝播することによって,最終的な結果を得ることができる
      • 逆方向の伝播によって微分を効率的に計算できる

  • 計算グラフを使って問題を解くステップ
    • 計算グラフを構築する
    • 計算グラフ上で計算を左から右へ進める
      • 順伝播(forward propagation)

連鎖律(chain rule)

  • 計算グラフの逆伝播は連鎖律によって成り立つ
  • 加算ノードの逆伝播
  • 乗算ノードの逆伝播

活性化レイヤの実装

ReLUレイヤ

  • 活性化関数として使われるReLUは下記で表される {} $$ y = \left\{ \begin{array}{} x & (x > 0) \\ 0 & (x \leq 0) \end{array} \right. $$

  • 微分すると下記のようになる
    • この式を見ると以下のことが分かる.
      • 順伝播時の入力であるxが0より大きければ,逆伝播は上流の値をそのまま下流に流す
      • 逆に,xが0以下であれば,逆伝播時に下流への信号をそこでストップする $$ \frac{\partial y}{\partial x} = \left\{ \begin{array}{} 1 & (x > 0) \\ 0 & (x \leq 0) \end{array} \right. $$

class Relu:
    def __init__(self):
        self.mask = None

    def forward(self, x):
        self.mask = (x <= 0)
        out = x.copy()
        out[self.mask] = 0

        return out

    def backward(self, dout):
        dout[self.mask] = 0
        dx = dout

        return dx

  • ReLUレイヤは回路におけるスイッチのようにはたらく
    • 順伝播時に電流が流れていればONにし,流れなければスイッチをOFFにする
    • 逆伝播時には,スイッチがONであれば電流がそのまま流れ,OFFであればそれ以上電流は流れない.

Sigmoidレイヤ

  • Sigmoid関数は下記で表される {} $$ y = \frac{1}{1 + \exp(-x)} $$

  • sigmoid関数の逆伝播の考え方(省略)
  • sigmoidレイヤの実装
def Sigmoid:
    def __init__(self):
        self.out = None

    def forward(self, x):
        out = 1 / (1 + np.exp(-x))
        self.out = out

    def backward(self, dout):
        dx = dout * (1.0 - self.out) * self.out

        return dx

Affineレイヤ

バッチ版Affineレイヤ

Softmax-with-Lossレイヤ

  • ソフトマックス関数は入力値を正規化して出力する
  • Softmaxレイヤの逆伝播の値は,Softmaxレイヤと教師ラベルの差分になる

誤差逆伝播法の実装

  • ニューラルネットワークの学習の全体図
    • 前提
    • 訓練データの中からランダムに一部のデータを選び出す
    • 各重みパラメータに関する損失関数の勾配を求める
    • 重みパラメータを勾配方向に微小量だけ更新する
    • 上記を繰り返す

本章で学んだこと

  • 計算グラフを用いれば,計算過程を視覚的に把握することができる
  • 計算グラフのノードは局所的な計算によって構成される.局所的な計算が全体の計算を構成する.
  • 計算グラフの順伝播は,通常の計算を行う.一方,計算グラフの逆伝播によって,各ノードの微分を求めることができる.
  • ニューラルネットワークの構成要素をレイヤとして実装することで,勾配の計算を効率的に求めることができる.
  • 数値微分誤差逆伝播法の結果を比較することで,誤差逆伝播法の実装に誤りがないことを確認できる.

後で調べたいこと

yusuke-ujitoko.hatenablog.com

yusuke-ujitoko.hatenablog.com