LoginSignup
2
1

More than 1 year has passed since last update.

AI分野で必須の知識:誤差逆伝播法(バックプロパゲーション)の基礎について学習

Posted at

今回の記事では、誤差逆伝播法(バックプロパゲーション)について、Udemyの講座にて学習した内容を要約する。なお、本記事に掲載しているコードは、すべて下記URLに掲載しているUdemy講座から抜粋している
- 事前にUdemy講座の講師から許可を頂いています。

Udemy講座URL
みんなのAI講座 ゼロからPythonで学ぶ人工知能と機械学習 【2021年最新版】

目次

1.誤差逆伝播法(バックプロパゲーション)の概要
2.出力層の学習
3.中間層の学習
4.学習部分の実装コード

1-誤差逆伝播法(バックプロパゲーション)の概要

  • 順伝播:入力→出力 分類で使用
  • 逆伝播:出力→入力 学習で使用
    • 誤差逆伝播法(バックプロパゲーション)
      • 出力と正解の誤差を小さくするように重みとバイアスを更新
  • 誤差逆伝播法は出力から入力に向けて学習が進むため、 初めに出力層から説明すると理解が深まる
  • 本記事ではニューロン数が入力層2、中間層3、出力層1で実装する

2-出力層の学習

  • δ_0 = (出力 - 正解) × 活性化関数の微分系
  • 重みの修正量 = - 学習係数 × δ_0 × 入力
  • バイアスの修正量 = - 学習係数 × δ_0

3-中間層の学習

※中間層部分の説明は文章表現では限界がありますが、ご了承ください。

  • 中間層が一つの場合
    • δ_m = δ_0 × 出力層にかける重み × 活性化関数の微分系
    • 重みの修正量 = - 学習係数 × δ_m × 入力
    • バイアスの修正量 = - 学習係数 × δ_m
  • 中間層が二つの場合
    • δ_m1(中間層1) = δ_m2(中間層2) × 出力にかける重み × 活性化関数の微分系
    • 中間層1の重みの修正量 = - 学習係数 × δ_m2 × 入力
    • 中間層1のバイアスの修正量 = - 学習係数 × δ_m2
  • δを、入力に近い層に順番に渡していくイメージ

4-学習部分の実装コード

  • train部分のコードを下記の通り示す
    • 各層のニューロン数
      • 入力層 : 2
      • 中間層 : 3
      • 出力層 : 1
    • 活性化関数としてシグモイド関数を使用する
      • 通常は中間層ではシグモイド関数ではなく、ReLu関数を用いる
        • 勾配消失問題が発生するため
      • シグモイド関数の説明は別の記事に記載
   def train(self, correct):
      # 学習係数
      k = 0.3

      # 出力層の出力
      output_o = self.output_layer[0].output
      # 中間層の出力
      output_m0 = self.middle_layer[0].output
      output_m1 = self.middle_layer[1].output
      output_m2 = self.middle_layer[2].output

      # δ_0 = (出力 - 正解)×活性化関数の微分系(今回はシグモイド関数を使用)
      delta_o = (output_o - correct) * output_o * (1.0 - output_o)
      # δ_m = δ_0 × 出力層にかける重み × 活性化関数の微分系
      delta_m0 = self.w_mo[0][0] * output_m0 * (1.0 - output_m0)
      delta_m1 = self.w_mo[0][1] * output_m1 * (1.0 - output_m1)
      delta_m2 = self.w_mo[0][2] * output_m2 * (1.0 - output_m2)

      # 出力層の重みの修正量 =  - 学習係数 × δ_0 × 入力
      self.w_mo[0][0] -= k * delta_o * output_m0
      self.w_mo[0][1] -= k * delta_o * output_m1
      self.w_mo[0][2] -= k * delta_o * output_m2
      # 出力層のバイアスの修正量 = - 学習係数 × δ_0
      self.b_o[0] -= k * delta_o

      # 中間層の重みの修正量 = - 学習係数 × δ_m × 入力
      self.w_im[0][0] -= k * delta_m0 * self.input_layer[0]
      self.w_im[0][1] -= k * delta_m0 * self.input_layer[1]
      self.w_im[1][0] -= k * delta_m1 * self.input_layer[0]
      self.w_im[1][1] -= k * delta_m1 * self.input_layer[1]
      self.w_im[2][0] -= k * delta_m2 * self.input_layer[0]
      self.w_im[2][1] -= k * delta_m2 * self.input_layer[1]
      # 中間層のバイアスの修正量 = - 学習係数 × δ_m
      self.b_m[0] -= k * delta_o
      self.b_m[1] -= k * delta_o
      self.b_m[2] -= k * delta_o

参考文献

みんなのAI講座 ゼロからPythonで学ぶ人工知能と機械学習 【2021年最新版】

2
1
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
2
1