【Deep Learning お勉強 #3】ニューラルネットワークとは
はじめに
前回の記事はこちら
【Deep Learning お勉強 #2】パーセプトロンを実装してみよう - マツシタケイタの技術ブログ(勉強中)
今回はニューラルネットワークについて触れる。
パーセプトロンからニューラルネットワークへ
復習も兼ねてパーセプトロンの特徴は以下の通りだった。
- 重みとバイアスを設定することで意図した出力をする関数を定義する
- パーセプトロンは計算した値が閾値を超えた時に発火しある値を出力する
- 単体のパーセプトロンでは非線形の領域は表現できないが、多層のパーセプトロンによって非線形の領域を表現することができる
また、これまでのパーセプトロンの話では、重みやバイアスは実現したいものによって手動で値を設定していた。 ANDゲートを表現する場合には、どのように重みとバイアスを設定すれば、2つの入力値をパラメータとして受け取った時にANDゲートと同じ挙動をするかを人間が考え設定する必要があった。
ANDゲートのような単純なものであれば難はないが、より複雑な処理をさせたい時に重みやバイアスのを適切に設定することは難しい。
ニューラルネットワークは重みの設定を自動化できる
ニューラルネットワークはコレを解決することができる。適切な「重み」をデータから自動で学習できるというのが、ニューラルネットワークの重要な性質の1つとなる。
つまりニューラルネットワークを用いれば、ある入力値をデータとして入れた時に、こちらが意図するような値を出力するような関数を自動で生成することができるということ。(だと認識している)
ニューラルネットワークの形態
ニューラルネットワークは以下の3つの層(入力層、中間層、出力層)に分ける事ができる。
パーセプトロンと同じような構造になっていることが分る。 それぞれのニューロンで計算された値をまた次のニューロンの入力値として受け取りさらに計算させるような構造だ。
また、ニューラルネットワークを説明する用語として「活性化関数」というものがある。
活性化関数
パーセプトロンの計算方法を思い出してみると以下のように書ける。
このh(x)のような関数と活性化関数と呼ぶ。入力信号の総和がどのような活性化(発火するか)するか決定する役割があるからだ。
つまり、これまで見てきたパーセプトロンの内部では、入力として受け取った値と設定された重み、バイアスを活性化関数によって計算され、その計算結果の値を用いて出力の内容を決定させていたと言える。
活性化関数は種類がある
活性化関数にはいくつか種類がある。代表的なものは以下の3つだ。
- ステップ関数
- シグモイド関数
- ReLU関数
ステップ関数
ステップ関数はパーセプトロンで採用されていた活性化関数だ。計算結果がある閾値を超えたらある値を出力する。
実装すると以下のようになる。
また、ステップ関数をグラフにすると階段上になる。
シグモイド関数
シグモイド関数は、ニューラルネットワークでよく用いられる関数の1つである。
実装すると以下のようになる。
シグモイド関数をグラフにすると、ステップ関数を滑らかにしたような曲線を描かれる。
ニューラルネットワークでは非線形関数を用いる
ニューラルネットワークの性質を変えるものはどの活性化関数を選ぶかということだ。 活性化関数は非線形関数で無ければならない。
ニューラルネットワークは活性化関数を何層も重ねて複雑な処理している。もし、活性化関数がh(x) = cx (cは定数)
のような線形関数の場合、層を重ねる意味がなくなってしまう。仮にy(x) = cx
を3層に重ねてみるとy(x) = c^3x
と表現できてしまい、層を重ねる事に意味がなくなってしまう。
層を重ねることの恩恵を受けるために、活性化関数に非線形関数を使う必要がある。
ニューラルネットワークの計算には行列の内積を使う
ここまでで、ニューラルネットワークの内部ではどのような計算が行われているかが分かった。まとめると以下のようになる。
- 入力層で受け取った入力データを活性化関数によって計算する
- 活性化関数で計算した値を中間層のニューロンの入力値として、受け取り、活性化関数によって再び計算される。(中間層は複数の層になる場合もある)
- 中間層によって計算された値を出力層によって出力する。
※出力層の挙動は後述する。
つまり、最終的な出力を得るまでに、かなりの量の計算をする必要がある。入力データの量、ニューラルネットワーク内のニューロンの数が膨大になれば計算時間がすごいことになってしまう。
しかし、行列の内積を用いることで計算量を大幅に減らすことができる。
出力層の設計
出力層の設計の仕方も何パターンかあるようだ。出力層の設計を決定させるためには、どんな問題を解きたいかによる。機械学習の問題は大きく以下の2つに分ける事ができる。
- 「分類問題」:データがどのクラスに属するかを解く問題
- 「回帰問題」:入力データから数値の予測を行う問題
どの問題を解くかで、出力層にどの関数を設定するべきか決める事ができる。分類問題を解くためには、よくソフトマックス関数が用いられる
ソフトマックス関数
k番目のニューロンのソフトマックス関数によって出力される値は、出力層の1つ手前の層の全てのニューロンからの計算結果の和を分母として、k番目のニューロンの計算結果を分子として計算される。
この性質は確率分布として表現できる
ソフトマックス関数は確率分布を表現する
ソフトマックス関数によって出力された値は、上記の性質により0.0 ~ 1.0の間の少数値を取る。そして、出力層から得られた全ての出力値の総和は1となる。これは確率の性質と同じである。
つまり、ソフトマックス関数を使うことで確率分布を表現することができる。
最後に
ここまでで、ニューラルネットワークの構造や内部での計算方法などを知ることができた。しかし、まだ重みの設定を自動化する話は登場していない。次の章をちら見すると「ニューラルネットの学習」とある。おそらくこの学習によってニューラルネット内のパラメータを設定しているのだろう。