Excel関数で学ぶニューラルネットワーク(順伝播編)|Excelでわかる深層学習の仕組み
深層学習を理解するにはニューラルネットワークの仕組みについて理解する必要があります。
そこで、このページではExcel関数のみでニューラルネットワーク内の構造を再現していきます。
Excel関数を使うことでセル上にすべての値が表示されますし、”どの値”を使って”どのような計算”がされているのかが視覚的にわかるため、プログラムで組むよりも理解しやすいものとなっています。
ただ、実際にニューラルネットワークの動きは再現できていますが、通常はプログラミングのループ処理を使って何百、何千、何万回と行う“パラメータの更新”がExcel関数では再現できません。(この「パラメータの更新」がいわゆるところの「学習」です)
そのためディープラーニング自体を行うことはできませんが、本ページの内容が理解できれば基本的なニューラルネットワークの仕組みは理解できるので深層学習の仕組みもすぐに理解することができるようになるでしょう。
また、本ページでは難しい内容の説明は端折っている部分もあります。そのため簡単にニューラルネットワークについて理解していたほうが理解しやすいかもしれません。(もちろん知識ゼロでも理解できる内容にはなっているはずです)
このページではExcel関数を使ってニューラルネットワークの順伝播の流れのみを解説しています。
「順伝播のみ」とは簡単にいえば“前編のみ”の内容というわけです。
後編にあたる逆伝播(誤差逆伝播)については下記ページで解説しているので合わせて読んでみてください。(1つのぺ―ジにまとめると非常に長いものとなってしまったので分割しました)
ニューラルネットワークとは
ニューラルネットワーク(Neural Network; NN)とは人間の脳の構造を模して作られた人工のネットワーク(数式モデル)のことをいいます。こういった説明をすると少し難しく感じる人も多いと思いますが、「ニューラルネットワーク=関数」と考ればとイメージが付きやすくなります。
「関数」とはある値が入力されたら、ある値が出力される”機能”のことです。
関数は数学の授業にもでてきていて、Function(関数)の頭文字から「f(x)」のように表されます。
関数の中身が「f(x)=2x」となっていた場合、入力値は「x」、出力値は2xとなります。つまりこの場合でいうと、関数「f(x)」は入力値に対して、2をかけた値を出力するという機能をもっているということです。
このように入力された値をもとに、何かしらの計算がなされ、ある値を出力する機能のことを「関数」といいます。(プログラミングでよく出てくる「関数」もこれと同じで、引数という入力を得て、返り値という出力を行います)
ニューラルネットワークもこの「関数」と同じ働きを持っていて、ある入力値をもとに、ある出力値を導き出します。
たとえばニューラルネットワークを使うことで、花弁やガクの大きさを入力して花の種類を判別したり、手書き数字の画像データを入力して画像に書かれている数字を判別したりすることができます。
「何か」が入力されて、それをもとに「何か」が出力されるということから、基本的には関数と同じ働きを持つことがわかります。
この”ニューラルネットワークという関数”の中身は先ほど出てきた「2x」のような単純なものではありませんが、計算の内容自体は中高生でも理解できるレベルのことしか行われていません。(深く理解するには大学生レベルの内容にも入りますが本サイトではあまりそちらには触れない予定です)
ニューラルネットワークの仕組み
前項ではニューラルネットワークは「関数」といいましたが、ここでは関数の中で行われる計算処理をみていきましょう。ただ文字だけでは説明が難しいですし、理解もしづらいと思います。
そこでExcel関数でニューラルネットワークを再現したExcelファイルを用意しました。
以降ではこのファイルを使ってニューラルネットワークの仕組みを解説していきます。
forward-back-propagation.xlsx (クリックでダウンロード)
ちなみにこのファイルは「Iris分類問題」の学習を想定したものです。
入力された『ガクの長さ(sepal length)』『ガクの幅(sepal width) 』『花弁の長さ(Petal length) 』『花弁の幅(petal width)』の4つの値から、花の種類(species)である『Setosa』『Versicolor』『Virginica』の3種を分類する問題です。
この機械学習用に集められたデータを「Irisデータセット」といい、機械学習の初心者向けに公開されている代表的なデータセットの1つです。
Excelファイルの内容と、よくみるニューラルネットワークの図を比較すると、Excelファイルのどれが何を表しているかはなんとなくイメージが付くと思います。(画像クリックで拡大)
Excelファイルでは各層の1セルを1つのニューロンとみなしてニューラルネットワークを再現しています。たとえば入力層はニューロンが4つで隠れ層は3つです。隠れ層内の矢印はニューロンの値が層内で変化するということを表しています。(出力層も同じ考えです)
以降の説明で「ニューロン」という言葉が出てきますが、何を表しているのかはここで理解しておきましょう。
ニューラルネットワークの値の動きを見る(順伝播)
それでは実際にさきほどダウンロードしたExcelファイルを使い、実際にプログラムでディープラーニングを行うときの処理と同じ手順で値を入力していきましょう。
(多少順番が違うものもありますが大まかな流れは同じです)
ここではニューラルネットワークの「順伝播」における値の動きを見ていきます。
順伝播とはニューラルネットワークを構成する「入力層」「隠れ層」「出力層」において「入力層→隠れ層→出力層」の順に値を渡していくことです。
この順伝播と「逆伝播」というものを繰り返すことで、ニューラルネットワークの学習が進んでいきます。(逆伝播については別ページで解説します)
① 入力値の入力
まずはニューラルネットワークに学習するためのデータとなる「入力値」を入力します。
今回は「Iris分類問題」を想定しているため、入力値として『ガクの長さ(sepal length)』『ガクの幅(sepal width) 』『花弁の長さ(Petal length) 』『花弁の幅(petal width)』の4つの値を入力します。また学習させるには入力値が何の花の種類を表しているか、つまりは「正解」も合わせて入力する必要があります。
まずは下記リンク(Irisデータセット)から学習させるデータとして1行選んで、Excelファイルの「入力値」にその値を入力して下さい。またその時に選んだデータの答えとして「正解ラベル」の値も変更しておきましょう。
The Iris Dataset · GitHub
入力値を入力するとニューラルネットワーク内にある入力層に同じ値が入力されます。
(※本来はこのときに「前処理」というものを行ってニューラルネットワークが学習しやすいように”変換した数値”を入力層にいれますが、ここでは「前処理」は行わないで学習を進めます)
これで学習用のデータをニューラルネットワークに入力することが出来ました。
あとはこの入力値に対して、最終的な出力が「正解ラベル」と同じになるような処理がニューラルネットワーク内で行われればOKというわけです。
② 重みパラメータとバイアスパラメータの設定(入力層→隠れ層間)
次に重みパラメータ(weight)とバイアスパラメータ(bias)というものを設定していきます。
この2種類のパラメータは”ニューラルネットワークの根源”といっても過言ではないほど非常に重要な存在です。
実は深層学習の最終目標は、この重みパラメータとバイアスパラメータの値を”適正化”することです。
まだ理解できないかもしれませんが、以降の内容を繰り返し行うことで重みパラメータとバイアスパラメータが適正化されていきます。これが皆さんも聞き馴染みのある「学習」というものです。
重みパラメータは「入力層のニューロンの数」×「隠れ層のニューロンの数」
バイアスパラメータは「隠れ層のニューロンの数」だけ用意します。
(今回の場合、入力層:4ニューロン / 隠れ層:3ニューロン / 出力層:3ニューロン)
では重みパラメータとバイアスパラメータの初期値の設定をしていきます。
重みパラメータは「0~1」の範囲での乱数、バイアスパラメータは「0」とします。
通常、重みパラメータは「-1~1」の範囲での乱数を使いますが、ここではExcel関数の関係上「0~1」の範囲としています。
Excelファイル上部にある「weight/bias 初期値」をコピーし、入力層と隠れ層の間にある「weight」「bias」に値のみを貼り付けて下さい。「weight/bias 初期値」にはRAND関数を使っているため、そのまま貼り付けると貼り付け先の値にもRAND関数が適用され常に変化し続けてしまうので注意して下さい。
これで入力層と隠れ層間の重みパラメータとバイアスパラメータの値は設定完了です。
③ 入力層から隠れ層に値を伝播
入力層の各ニューロンの値と重みパラメータ、バイアスパラメータが決まったので、入力層の値を隠れ層に渡します。(これを「伝播」ともいいます)
値を渡す際は、入力値の各ニューロンに重みパラメータをかけた値の総和にバイアスパラメータを足した値が渡されます。文字で見るとわかりにくいですが下図を見ればわかると思います。
Excelファイルにはすでに式を埋め込んであるので、この計算が行われた値が表示されているはずです。その式を見ることで、どの値を使ってどのように計算しているかはすぐに理解できると思います。
④ 隠れ層を活性化(ReLU関数)
入力層から隠れ層に値を渡したら、隠れ層(のニューロン)が受け取った値をすべて活性化させます。
活性化についての詳細は省きますが、要はニューラルネットワークが学習しやすいように値を変換することと思ってもらえれば大丈夫です。
この活性化というものを行うための「活性化関数」というものがいくつも存在しますが、ここでは代表的な「ReLU関数」というものを採用します。
ReLU関数は入力された値が「0」以下であれば「0」を、「0」より大きければ「入力された値」を返す関数です。つまり(隠れ層に)入力された値がマイナスの場合は「0」、プラスの場合はそのままの値に変換されるというわけです。
(※本来は重みパラメータにマイナスもでてきますが、初期値でプラスしか出ないようになっているので、隠れ層に入力される値は現時点ではプラスのみとなっています)
Excelファイルでは隠れ層に値が伝播された時点で、ReLU関数の結果も表示されていると思います。
こちらはIf関数を使ってReLU関数の機能を再現しています。
このReLU関数が適用された隠れ層の値が“隠れ層の出力値”として出力層に伝播されます。
⑤ 重みパラメータとバイアスパラメータの設定(隠れ層→出力層間)
次に隠れ層と出力層間の重みパラメータとバイアスパラメータを設定していきます。
やることは②でやったことと全く同じです。
ただ②の時とはパラメータの数が違うということだけは注意しましょう。
重みパラメータは「隠れ層のニューロンの数」×「出力層のニューロンの数」
バイアスパラメータは「出力層のニューロンの数」だけ用意します。
(今回の場合、入力層:4ニューロン / 隠れ層:3ニューロン / 出力層:3ニューロン)
では、②の時と同じくExcelファイル上部にある「weight/bias 初期値」をコピーし、隠れ層と出力層の間にある「weight」「bias」に値のみを貼り付けて下さい。
⑥ 隠れ層から出力層に値を伝播
隠れ層の各ニューロンの出力値と重みパラメータ、バイアスパラメータが決まったので、隠れ層の値を出力層に伝播します。
伝播する値は入力層→隠れ層でやった時と同じ要領で、隠れ層の出力値に重みパラメータをかけた値の総和にバイアスパラメータを足した値が渡されます。
これもExcelファイルの式を見れば計算内容はすぐに理解できるはずです。
⑦ 隠れ層を活性化(Softmax関数)
隠れ層から出力層に値を渡したら、出力層(のニューロン)が受け取った値をすべて活性化させます。
隠れ層のときは「ReLU関数」で活性化しましたが、出力層では「Softmax関数」という活性化関数を使ってニューロンの値を活性化させます。
Softmax関数とは入力された値に対し、出力値の総和が1となる値に変換する関数です。もう少しわかりやすくいうと「入力されたごちゃごちゃの値の合計が100%となるように値を変換する関数」です。
このSoftmax関数で出力層のニューロンの値を変換することで、各ニューロンの確率が何%なのかを確認することができます。
Softmax関数は以下のような式で表されます。
(式の意味が理解できない人はExcelファイルを見ればすぐにわかると思います)
では実際にExcelファイルで確認してみましょう。
Excelファイルでは出力層に値が伝播された時点で、Softmax関数の結果も表示されているはずです。
ありがたいことにExcelにはeを底とする数値のべき乗を計算するための「EXP関数」というものが存在しているので、上の難しそうな式も下画像のように簡単に表現することができます。
⑧ ニューラルネットワークの出力値を求める
Softmax関数による出力層の活性化が完了したら、あとはニューラルネットワークの出力値を求めるだけです。
ニューラルネットワークの出力値はSoftmax関数で出力した値のうち、最も大きい数(パーセント)を持つニューロンに紐づいた正解ラベルとなります。
Excelファイルでは「出力層」の横に「onehot」というエリアが用意されていると思います。
その値は上から順に「1,0,0」「0,1,0」「0,0,1」のいずれかになっていると思います。
これは1番初めに入力した「正解ラベル」の値と紐づいています。
1番初めに入力した正解ラベルを変化させると、onehotの値が変化することが確認できます。
このとき「1」の値を持つニューロンが、その時の正解ラベルと紐づいているということです。
つまり、出力層の1番上のニューロンは「setosa」、真ん中のニューロンは「versicolor」、1番下のニューロンは「virginica」とそれぞれ紐づいているということです。
よって上画像の場合、「setosa」の確率が6%、「versicolor」の確率が68%、「virginica」の確率が26%であるため、ニューラルネットワークが導き出した出力値としては、確率の1番高い「versicolor」であるということがわかります。
出力値にはIF関数を使ってニューラルネットワークが導き出した答えを表示するようにしてあります。
ニューラルネットワークの仕組みのまとめ
以上でニューラルネットワークにおける順伝播の値の流れは終了です。
ここで注目すべきは入力した学習データに対して、出力値があっているかどうかです。
あっている人もいれば、あっていない人もいると思います。
(おそらくあっていない人の方が多いでしょう)
これは重みパラメータの初期値をランダムに設定しているためです。
これまでの計算内容を振り返えると、主に足し算掛け算が行われているだけだったことがわかります。
そのため重みパラメータとバイアスパラメータの値がテキトーなまま計算をされれば、言わずもがな最終的な出力値もテキトーな値になってしまうというわけです。
しかし、逆をいえば「重みパラメータとバイアスパラメータの値を適切なものにすれば何が入力されたとしても、正解を導き出すことができる」という考えもできます。
これこそがニューラルネットワークの仕組みです。
今回は学習データとして1つのデータしか入力していませんが、これを膨大なデータ数読み込ませれば、どのような数字が入力されたとしても学習したデータをもとに答えを導き出す関数(ニューラルネットワーク)ができるというわけです。
ニューラルネットワークの仕組みを理解したところで、
「じゃあ重みパラメータとバイアスパラメータを適切なものにするにはどうやるの?」
という疑問が出てくると思います。
これについては順伝播の対の存在「逆伝播」について理解する必要があるため「Excel関数で学ぶニューラルネットワーク(逆伝播編)」もあわせてご確認ください。
まとめ
今回はニューラルネットワークにおける順伝播の値の流れを見て、ニューラルネットワークの仕組みについて解説してきました。本ページの内容をまとめると下記の通りです。
ニューラルネットワークは「入力層」「隠れ層」「出力層」で構成されている
「入力層→隠れ層→出力層」の順に値を渡していくことを「順伝播」という
順伝播の最中に重みパラメータとバイアスパラメータが出てくる
重み/バイアスパラメータを適切な値に設定できればニューラルネットワークが完成する
Excelファイルで実際に値の流れを見ることで、プログラムでニューラルネットワークを実装するよりも、イメージがしやすかったと思います。
次回はおなじExcelファイルの下段にある「逆伝播」部分を使って重みパラメータとバイアスパラメータを適切な値に設定する方法を解説していきます。