Excel関数で学ぶニューラルネットワーク(逆伝播編)|Excelでわかる深層学習の仕組み
深層学習を理解するにはニューラルネットワークの仕組みについて理解する必要があります。
そこで、このページではExcel関数のみでニューラルネットワーク内の構造を再現していきます。
Excel関数を使うことでセル上にすべての値が表示されますし、”どの値”を使って”どのような計算”がされているのかが視覚的にわかるため、プログラムで組むよりも理解しやすいものとなっています。
ただ、実際にニューラルネットワークの動きは再現できていますが、通常はプログラミングのループ処理を使って何百、何千、何万回と行う“パラメータの更新”がExcel関数では再現できません。(この「パラメータの更新」がいわゆるところの「学習」です)
そのためディープラーニング自体を行うことはできませんが、本ページの内容が理解できれば基本的なニューラルネットワークの仕組みは理解できるので深層学習の仕組みもすぐに理解することができるようになるでしょう。
また、本ページでは難しい内容の説明は端折っている部分もあります。そのため簡単にニューラルネットワークについて理解していたほうが理解しやすいかもしれません。(もちろん知識ゼロでも理解できる内容にはなっているはずです)
このページではExcel関数を使ってニューラルネットワークの逆伝播の流れのみを解説しています。
本ぺージは前編にあたる「Excel関数で学ぶニューラルネットワーク(順伝播編)」の続きにあたる内容です。順伝播編を見ていない人はそちらから始めて下さい。
順伝播編のおさらい
順伝播編ではニューラルネットワークの順伝播における値の動きを以下のExcelファイルを使って確認しました。
forward-back-propagation.xlsx (クリックでダウンロード)
ニューラルネットワークは関数と同じで、ある入力値に対してある結果を出力します。
ある値がニューラルネットワークに入力されたら「入力層」「隠れ層」「出力層」の順に値を伝播していきます。(順伝播)
各層間で値を伝播する際には『重みパラメータ(weight)』と『バイアスパラメータ(bias)』が付与されます。この重みパラメータとバイアスパラメータの値を適切なものにすることで、どのような値が入力されたとしても適切な答えを導く関数(ニューラルネットワーク)を作ることができます。
しかし、順伝播編では重みパラメータの初期値として「0~1の乱数」を、バイアスパラメータの初期値として「0」を設定しました。
つまり今の重みパラメータとバイアスパラメータは”テキトー”な値であり適切な値ではありません。
そのため、このページでは「誤差逆伝播法」という手法を使い、重みパラメータとバイアスパラメータの値を適切なものに変換していきます。
ニューラルネットワークの値の動きを見る(逆伝播)
それでは実際に以前使用したExcelファイルをそのまま使って、実際にプログラムでディープラーニングを行うときの処理と同じ手順で値を入力していきましょう。
(Excelファイルにはすでに関数や式を埋め込んであるため、順伝播編の内容を行うと逆伝播部分の値はすべて自動入力されます。そのため自身で入力することはありませんが、セルの中身を見ながらどのような計算がなされているかに注目しながら以降の内容を進めて下さい)
ここではニューラルネットワークの「逆伝播」における値の動きを見ていきます。
逆伝播とは文字通り、順伝播とは逆に「出力層→隠れ層→入力層」の順に値を渡していくことです。
ニューラルネットワークの導き出した答えと正解ラベルの誤差を逆伝播することで、その誤差を無くすように重みパラメータとバイアスパラメータの値を”微小”に変化させることができます。
このように誤差を逆伝播して、重みパラメータとバイアスパラメータの値を適切なものにしていく手法を「誤差逆伝播法」といいます。
以降では順伝播編で使用したExcelファイルを使い、誤差逆伝播法で重みパラメータとバイアスパラメータの値を適切なものに変化させていくときの値の動きを見ていきましょう。
① ニューラルネットワークの答えと正解ラベルの誤差を求める
逆伝播を始めるためにニューラルネットワークの答えと正解ラベルの誤差を求めます。
(※厳密にいうと「交差エントロピー誤差」で損失関数を求めてその値を逆伝播するのですが、その値は結果的にニューラルネットワークの答えから正解ラベルを引いたものとイコールになるためここでは交差エントロピー誤差についての説明は省略します)
ニューラルネットワークの答えは「順伝播時に出力層をSoftmax関数で活性化したときの値」で、正解ラベルは「onehot」と書かれているエリアの値(「1」もしくは「0」)になります。このとき正解ラベルは順伝播時に学習用データとして入力した正解によって変化します。
誤差を求めることで、ニューラルネットワークの答えが正解とどれだけ乖離(離れている)しているかがわかります。
たとえば上画像の場合、正解ラベルが「1」となっているのが1番上なので「setosa」が答えです。
このときニューラルネットワークは入力値に対する答えが「setosa」の確率は0.06(つまりは6%)であるといっています。
このときこの「0.06」から正解ラベルである「1」を引きます。
すると上の画像でいえば「-0.9」となります。(実際は-0.9・・・と続いています)
つまり誤差は「0.9」です。
では「setosa」の確率が0.98(つまりは98%)の場合を考えてみましょう。
「0.98 – 1= -0.02」となり誤差は「0.02」しかありません。
したがって、誤差を0に近づけるほどニューラルネットワークの正解率としては正しいものになるということです。(言い換えれば「重みパラメータとバイアスパラメータの値が適切になる」ということ)
ここで求めた誤差は隠れ層に逆伝播させていきます。
② 重みパラメータとバイアスパラメータの勾配を求める(出力層→隠れ層)
次に重みパラメータとバイアスパラメータの「勾配」を求めます。
勾配とは「傾き」を意味していて、下図で赤い直線で表されていいるものです。
(下図は誤差と重みパラメータの関係を表したものです)
現在の重みに対する”傾き”がもし右肩下がり(負)の場合、目標値は現在の重みよりプラス側にあるということがわかります。逆に、現在の重みに対する”傾き”が右肩上がり(正)だった場合、目標値は現在の重みよりマイナス側にあるということがわかります。
つまり「勾配(傾き)をもとに現在の重みパラメータの値をプラス、もしくはマイナス方向に更新し続ければいつかは目標値(本ページでいう”適切な値”)にたどり着く頃ができる」というわけです。(この方法を「勾配降下法」といいます)
というわけでExcelファイルを見ながら「勾配」を求める計算方法を見ていきましょう。
重みパラメータの勾配は「誤差」と「順伝播時の隠れ層の出力値」の積、
バイアスパラメータの勾配は「誤差」そのままの値となります。
③ 重みパラメータとバイアスパラメータの更新(出力層→隠れ層)
次に求めた勾配をもとに重みパラメータとバイアスパラメータの値を更新します。
先ほどもいった通り、勾配がプラス(正)の場合は現在のパラメータの値をマイナス方向に、勾配がマイナス(負)の場合は現在のパラメータの値をプラス方向に更新します。
このとき、”どれだけの量”更新するかを制御するための「学習率」というものが登場します。
学習率を使って以下のような式を行うことで、パラメータの値を更新することができます。
更新後のパラメータ値 = 現在のパラメータ値 – (学習率 × パラメータの勾配)
式からもわかる通り、学習率は大きければ大きいほど更新量が多くなります。
つまり、パラメータ値の動きは大きくなるため学習(パラメータの更新)速度は大きくなりますが、その分細かい部分まで値を更新することが出来なくなるため適切なパラメータ値が求めづらくなります。
逆に学習率が小さければ小さいほど、適切なパラメータ値を求めやすくなりますが、パラメータ値の動きは小さくなるので学習速度は小さくなります。
学習率は上記内容を加味したうえで自身の好きな値を設定します。
(通常0.01~0.1あたりで行われることが多いです)
Excelファイルでも上記の計算が行われているので、セルの中身を見て確認してみて下さい。
④ 誤差を逆伝播(出力層→隠れ層)
出力層と隠れ層間の重みパラメータとバイアスパラメータの更新は行えましたが、隠れ層と入力層間の重みパラメータとバイアスパラメータはまだ更新が行えていません。
そのため、出力層で求めた「誤差」を隠れ層に逆伝播し、隠れ層と入力層間の重みパラメータとバイアスパラメータを更新できるようにします。
計算式でいうと出力層で求めた「誤差」と「更新前の重みパラメータ(順伝播時の重みパラメータ)」の積を逆伝播します。(※これは「連鎖律と偏微分」による考えです。詳しく理解したい方は書籍もしくは他サイトを参照してく見て下さい)
⑤ 誤差を逆伝播(ReLU関数)
④で受け取った値をさらにReLU関数をとおして逆伝播させます。
ReLU関数の逆伝播では順伝播時にReLU関数に入力された値が0より大きければそのままの値、0以下であれば0に変換して逆伝播します。
Excelファイルでは順伝播時と同じくIF関数を使って再現しています。
⑥ 重みパラメータとバイアスパラメータの勾配を求める(隠れ層→入力層)
出力層から逆伝播してきた値を使ってパラメータの勾配を求めます。
基本的に②でやったことと同じ計算を行います。
重みパラメータの勾配は「逆伝播時の隠れ層の出力値」と「順伝播時の入力層の出力値」の積、
バイアスパラメータの勾配は「逆伝播時の隠れ層の出力値」」そのままの値となります。
⑦ 重みパラメータとバイアスパラメータの更新(隠れ層→入力層)
隠れ層と入力層間のパラメータの勾配が求まったので、パラメータ値も更新していきます。
こちらも③でやった内容と同じで、下記の計算式を使ってパラメータを更新します。
更新後のパラメータ値 = 現在のパラメータ値 – (学習率 × パラメータの勾配)
Excelファイルのセル内の式を見ても③と同じということがわかります。
逆伝播から順伝播へ
ニューラルネットワーク内にあるすべての重みパラメータとバイアスパラメータの値を更新したので、逆伝播は終了です。
これにより重みパラメータとバイアスパラメータは順伝播で行った時の値よりも、”少しだけ”適切な値に更新されました。
では、本当に適切な値に更新されたのかを見てみましょう。
更新後のパラメータの値を確認
まず始めに順伝播でのSoftmax関数の出力値のうち、正解ラベルとしているニューロンの値を確認しておきましょう。
今回の例でいうと正解ラベルは「setosa」なのでニューロンの値は「0.06」です。
この場合「0.06」が「1」に近づけば近づくほどパラメータの値が適切であるといえます。
では重みパラメータとバイアスパラメータを更新後の値に変換します。
Excelファイルの「逆伝播」内にある更新後のパラメータをすべて「順伝播」内のパラメータに上書きして下さい。(※セルには式が埋め込まれているので値のみを貼り付けて下さい)
これで更新後のパラメータで順伝播が行われます。
ではここで、はじめに確認しておいたSoftmax関数の出力値を再度確認してみましょう。
少しだけ「1」に近づいているはずです。
つまり重みパラメータとバイアスパラメータは”少しだけ”適切な値に更新されたということです。
これだけだとわかりづらいので、何度か更新後のパラメータをコピペしてみましょう。
Excelファイルでは順伝播の値を入力した時点で、これまでやってきた逆伝播の計算が自動で行われ、更新後のパラメータ値も新しいものに置き換わるため、そのままコピペすればOKです。
すると下図のように、更新後のパラメータを貼り付けていくたび、正解ラベルの正解率が上がっていくことがわかります。
ページの初めの方にも出てきましたが、このように順伝播で導き出した誤差を逆伝播することで、すこしづつ重みパラメータとバイアスパラメータを適切な値に更新していく手法を「誤差逆伝播法」といいます。
今回は1つの学習データしか使っていませんが、学習データを増やしてパラメータの更新回数も増やせば、どのような入力値に対しても適切な出力を導き出す”万能な”ニューラルネットワークを作ることができるというわけです。
プログラムを使って機械自身が学習する
「順伝播」と「逆伝播」の値の動きを見て、どのようにしてニューラルネットワークが学習していくかは理解できたと思います。
ただ今回やったように更新後のパラメータを手作業でコピペしていては時間がかかります。
また、今回は学習用データとして1つのデータしか入れていません。万能なニューラルネットワークを作るには学習用データの数は数百、数千、数万個と膨大な量が必要になるので手作業でパラメータの値を更新していくのは実質不可能です。
そこで出てくるのが「プログラミング」です。
ニューラルネットワークの仕組みは基本的には同じ計算の繰り返しです。
こういった決められた処理の繰り返しは、プログラムが最も得意とすることです。
つまり、これまでやってきた内容はすべてプログラム(機械)に任せればいいのです。
ニューラルネットワークをプログラムで構築できれば、こちらは学習用データを提供するだけであとは機械が勝手に学習を進めてくれます。
これが「機械学習」というものです。
まとめ
今回はニューラルネットワークにおける逆伝播の値の流れを見て、ニューラルネットワークの仕組みについて解説してきました。本ページの内容をまとめると下記の通りです。
順伝播で出力した答えの誤差を逆伝播することでパラメータを適切な値にすることができる
パラメータを適切な値に更新するにはパラメータ個々の「勾配」が必要
パラメータの勾配と「学習率」を使うことでパラメータの更新ができる
上記を繰り返し徐々にパラメータを適切な値にしていく手法を「誤差逆伝播法」という
前回の「順伝播」と今回の「逆伝播」の流れさえ理解できてしまえば、基本的なニューラルネットワークによる機械学習の仕組みは理解したといっても過言ではありません。
計算自体は単純なものでほとんどの計算は中高生でも理解できるものしか使われていません。ただ、”なぜその計算を使うのかの理由”については下記の参考書籍等を参考に各自で調べてみて下さい。
メインページでは今回やった内容をExcel VBAで再現し、ディープラーニングを行う方法も解説しているので合わせて確認してみて下さい。