今回の記事では、誤差逆伝播法(バックプロパゲーション)について、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関数を用いる
- 勾配消失問題が発生するため
- シグモイド関数の説明は別の記事に記載
- 通常は中間層ではシグモイド関数ではなく、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
#参考文献