【初心者向け解説】ニューラルネットワーク、活性化関数とは?

ニューラルネットワークは、パーセプトロンの悪い点を解決するためにあります。つまり、適切な重みパラメータをデータから、自動で学習できるようになります。

前回の記事では、パーセプトロンの詳細を書いていますので、是非ご覧ください。

https://toma39blog.com/2019/10/16/dplr-1/

それではニューラルネットワークの概要の説明を始める前に、まずはパーセプトロンの復習から始めます。

パーセプトロンの復習

パーセプトロンでは以下のように、良い点と悪い点があります。

  • 良い点: パーセプトロンは複雑な関数でも表現できる可能性がある
  • 悪い点: パーセプトロンの重みを設定するのは、人の手による作業が必要

軽く復習しましょう。

以下のパーセプトロンの式を覚えていますか?

x1, x2はそれぞれ入力信号、bは「バイアス」、wは「重み」の意味です。ここでは「バイアス」を常に1とします。

上の式は、入力信号と重みをかけ合わせた値にバイアスを足した値が、0より大きければ1を、0以下なら0を「出力y」として出力します。(yが1になる時を、ニューロンの発火と言います)

「バイアス」はニューロンの発火の加減の調整、「重み」は入力信号の重要度の調整の役割があります。

パーセプトロンの式を、以下のように定義します。

a = b + x1w1 + x2w2

y = h(a)

ここで新たにh(a)という関数を導入します。上の式を見たら分かる通り、「a」という入力信号の総和を、h(a)という関数によって変換し、その変換された値が出力「y」になります。

活性化関数

上記のh(a)という関数を活性化関数と呼びます。ここまでの話を含めた図が以下になります。

重み付き信号の和が「a」になり、活性化関数h()によって「y」に変換されるということです。つまり、活性化関数は入力信号の総和がどのように活性化するかを決定します。

パーセプトロンの式を見ると、閾値を境にして出力が「0」か「1」の二つに切り替わります。このような、活性化関数は「ステップ関数」と言います。

パーセプトロンは、数ある活性化関数の中で、「ステップ関数」を採用したということになります。「ステップ関数」に実際に値を入力した得た値をグラフにすると、以下のようになります。

では、パーセプトロンで、他の活性化関数を使ったらどうなるでしょう?

実はこの話が重要です。

「ステップ関数」から別の関数に変えることで、ニューラルネットワークの世界に進むことができます。

結論を言うと、パーセプトロンとニューラルネットワークの違いは、この活性化関数だけなのです!

ニューラルネットワークでは、活性化関数で入力信号が変換され、その変換された値を次のニューロンに伝えます。

では、ニューラルネットワークで使われる活性化関数である「シグモイド関数」について見ていきましょう。

シグモイド関数

シグモイド関数は以下の式で表します。

一見、複雑そうですが、シグモイド関数などの関数とはある値を入力すると、何かの出力が返される「変換器」。シグモイド関数の場合、h(1)=0.731…、h(2)=0.880…のようになります。

実際にシグモイド関数に値を入れた結果のグラフを以下に示します。

「ステップ関数」と「シグモイド関数」の比較

「ステップ関数」と「シグモイド関数」のグラフをパッと見て、グラフの「滑らかさ」が違うのが分かりますか?

「シグモイド関数」の方が滑らかな曲線になっています。「ステップ関数」は0を境に急に出力が変化しますが、「シグモイド関数」は入力に対して連続的に出力が変化します。

「シグモイド関数」の滑らかさが、ニューラルネットワークの学習において重要です。

パーセプトロンでは0か1の値の信号しか流れませんが、ニューラルネットワークでは連続的な実数値の信号が流れるのです。

だから、ニューラルネットワークでは「シグモイド関数」のような、出力が実数値の関数を使います。

「ステップ関数」と「シグモイド関数」の違いを話しましたが、

共通点は分かりますか?

グラフを見れば分かる通り、なんとなく同じ形に見えますよね?

つまり、入力信号が小さな値のとき出力は0に近くになり、入力信号が大きな値のとき出力は1に近づく構造をしています。

また、入力信号がどんなに値が大きくても、出力信号の値は0から1の間に抑えることも共通しています。

それと、二つの関数は「非線形関数」という共通点があります。

非線形関数とは?

ニューラルネットワークの活性関数は、非線形関数でなければいけません。

理由として、ニューラルネットワークは層を深くしていきますが、線形関数にしてしまうと、層を深くしても意味がないためです。

説明しましょう

例えば、活性化関数として h(x) = cx 線形関数を用いて、3層あるニューラルネットワークに対応させたと考えます。

すると、h(x) = h(h(h(x)))となります。

これは、h(x) = c * c * c * xの掛け算となります。

しかしこの式は、h(x) = a * x (a=c*c*c)と言い換えることができます。

こうなると、一回の掛け算で隠れ層のない(入力層と出力層だけ)でネットワークを表現できてしまいます。

層を何層も作り、計算しても複雑な計算はできず単調の計算しかできないのです。パーセプトロンと何も変わらないですね。

つまり、層を重ねたネットワークの利点を生かすためにも、非線形関数を用いる必要があります。

ReLUという線形関数

シグモイド関数は昔から利用されていますが、最近ではReLU関数が良く使われます。

式は以下になります。

この関数は、入力値が0以下の場合0を出力し、0より大きい値の場合そのままの値を出力します。

出力結果のグラフは以下になります。

まとめ

以上で終わりです。

今回は、ニューラルネットワークを作るために、活性化関数が重要という話、活性化関数の例、活性化関数は非線形関数でないといけない話をしました。

この記事を見て、もっと興味がわき、もっと勉強してみたいという方は、以下の本を、ご購入されてみてはいかがですか?

© 2021 toma's Blog