ニューラルネットワークとは? 特徴や仕組みを解説

Academic

こんにちは、Block GeniusのHiroです。この記事では機械学習の手法の一つであるディープラーニングに用いられているニューラルネットワークの仕組みについて説明していこうと思います。ニューラルネットワークとは、生物の神経細胞を模したものなのですが、ディープラーニングに用いられているニューラルネットワークについて説明する前に、まず神経細胞(ニューロン)について軽く説明しようと思います。

ニューロンの役割

生物の脳は多くの神経細胞(ニューロン)から構成され、それぞれが電気的な信号を送りあって情報を伝達しています。

それぞれの神経細胞は、樹状細胞、細胞体、軸索の3つの部分から成り、軸索の先は他の神経細胞と結合するために枝分かれしています。この結合部をシナプスと呼び、他の神経細胞との信号を送りあう橋渡しの役割をしています

それぞれのニューロンは電気的な信号を受け取り、それを他の神経細胞に出力します。しかし、電気信号を受け取ってもその入力が一定の水準を超えるものでない限り出力を抑える仕組みになっていて、その水準以上の信号のみを出力するようになっています。

例えば30度の水に触れても、熱いとは感じないと思います。それは、触れた水の温度を感じ取り、神経がその感覚を電気信号として伝えますが、その信号が「熱い」と感じさせるレベルに達していないため、「熱い」と感じないという仕組みになっています。

ディープラーニングのニューラルネットワーク

ディープラーニングにおけるニューラルネットワークは、生物の神経細胞の仕組みを模しています。情報を数値として入力し、その入力値が一定の水準以上であれば1を出力し、それ以下であれば0以上1未満の数値を出力します。出力値は原則として2値、0か1ですが、0から1の中間の値も他のニューロンに影響を与える可能性があるため伝達されます。

具体的な仕組みに関して下図を参考にすると、まず入力層にX1、X2、X3という読み取った数値を入力します。そして、それらの数値にw11 やw21などのウェイト(重み)を掛けていきます。第2層目である隠れ層で入力値とウェイトの掛け算の和a1を計算します(a1=X1*w11+X2*w12+X3*w13)。

同様の計算をa2とa3に対しても行います。そして活性化関数(=入力値の総和を出力値に変換する関数)と呼ばれる関数に、求めたa1やa2、a3の数値を代入することで出力値z1, z2に変換することができます。活性化関数は、0から1の“連続した“関数であるsigmoid関数が主に使われます。

Sigmoid関数(sigmoid(x)=1/(1+e^(-αx) ))

0から1までの値をとり、入力値を0から1の範囲内の出力値に変換するために用いられます。αはゲイン値と呼ばれ、この数値を変えることで、関数の傾斜を変化させることができます。

ゲイン値を大きくすれば、関数の傾きは急になり、小さくすれば緩やかになります。この関数自体は意味をもちませんが、”連続した“関数であることが重要になります。

それは、次に説明する誤差逆伝播法において微分する必要があり、連続した関数であることが微分可能である条件になるからです。

誤差逆伝播法(Back Propagation)

ディープラーニングが他の機械学習法と異なることの1つは、データの特徴量を自動的に読み取り、人間の指示なしで学習が可能であるという点でした。

このデータの特徴の検知は、入力値に対して掛け算するウェイトの値の調節をすることで行います。重要な特徴にはより重みをつけ、あまり重要でないものには比較的小さな重みをかけます。こうすることで特徴の重要度を数値化します。

そして、何を基準にしてこのウェイトを調節するの?という問いに答えるのが、この誤差逆伝播法になります。

誤差逆伝播法とは出力値と真の値との誤差を出力層から入力層へ伝播し、ウェイトの値を修正することです。出力値はウェイトの数値やsigmoid関数のゲイン値によって変化するため、この誤差が最小になるように値に変えることを目的としています。それを行う手法を勾配降下法と呼びます。

勾配降下法

勾配降下法の目的は、誤差を最小にするためにウェイト値を正しい方向へ修正していくことです。ウェイトの値が増大することで誤差が大きくなるなら、ウェイト値を下げ、その逆であれば、値を上げていきます。勾配降下法は、このプロセスを数学的に行います。

具体的な手法は、まず誤差関数を求め、関数が最小値を取る方向を関数の変化率をもとに探します。誤差関数E(w j)は以下のように表すことができます。

E(w j)=∑(ti-oi)^2

誤差関数は、目標値tiと出力関数oiの差をとり、2乗した数値の和で表します。tiは目標値であるため、変化することのない定数、oiはsigmoid関数です(oi = sigmoid(∑(wi*oi))。この差が最小化すべき誤差であり、それぞれの誤差は+(プラス)あるいは-(マイナス)の値を取りえるため、和を求める際にその差が相殺されてしまうのを防ぐために2乗します。これを最小2乗法と呼ばれ、この関数が最小値を取る方向にウェイトの値を変えていきます。

最小値を求めるために、微分法を用います。微分法は、関数のある一点における変化率を求めることで、その変化率(関数の傾き)が正の値であれば、関数は上昇傾向にあり、負の値であれば減少傾向にあることを示しています。

つまり、変化率が正(上昇傾向)であれば、最小値(or 極小値)から遠ざかっており、負(下降傾向)であれば、最小値(or 極小値)に近づいていることを意味します。微分には2つ以上の変数を含む場合に用いる、偏微分を以下のように使います。

∂E/∂w=∂E/∂o*∂o/∂w

ウェイト(w)の微小変化による誤差関数Eの変化率が∂E/∂Wで表され、まずEを出力関数oiで偏微分し、さらにoiをウェイト(w)で偏微分したものを掛け合わせることで∂E/∂Wを求めることができます。

ウェイト(w)の修正

wj∶= wjーε*∂E/∂w

∶=は「更新」であり、wjを∶=以降の値に改めて更新することを意味します。εは任意に定める学習率で、一回の学習でどれだけウェイトを変化させるかを決めます。

もとのwjの値からε*∂E/∂Wが引かれているのは、∂E/∂W>0(正の値)の場合、wjの値が増すにつれて、誤差関数Eの値は増大しているので、最小値を取るウェイト(w)の値に近づけるためにマイナスにしています。

逆に∂E/∂W<0(負の値)の場合、誤差関数は減少傾向にありwjが大きくなるごとに(ーε*∂E/∂Wは正の値でwjはより大きい値に修正され)最小値に近づきます。このように、微分法を使って、誤差が最小になる方向にそれぞれのウェイトの値を修正していくことで、自動的に重要度の高い特徴量を抽出することがきます。

まとめ

この記事では、ディープラーニングに用いられているニューラルネットワークの仕組みについて説明しました。このニューラルネットワークを用いたディープラーニングは、入力されたデータの特徴量に対して、それぞれに適切なウェイト(重み)の値を求める学習であるともいえると思います。最後まで読んで頂きありがとうございました。

ディープラーニングに関しての記事も是非ご覧ください。

タイトルとURLをコピーしました