2_パーセプトロンからニューラルネットワークへ [ゼロから始めるDeepLearningを読む]プラス

AI

そもそもニューラルネットワークで何ができるのか、もう一度確認しておきます。
ニューラルネットワークを使って、教師あり学習や、教師なし学習、あるいは強化学習を行うことができます。
けれども、ニューラルネットワークの仕組みを学習すると、「これって教師あり学習じゃね?」と思ってしまうに違いありません。
ニューラルネットワークの仕組みを学習する上で、教師あり学習の回帰や分類を行うことが、その仕組みを理解するのに適しているから教師あり学習を題材にしているわけです。
そんなことから、とりあえず教師あり学習をニューラルネットワークで行なっているという前提で話が進められます。

スポンサーリンク

パーセプトロンの問題点

パーセプトロンは複雑な関数でも表現できる優れものですが、正解を求めるには適切な重みを人間が決める必要があります
適切な重みを人が決めなければならないことがパーセプトロンの問題点です。
適切な重みを自動で設定できるようになるとなんと嬉しいことでしょうか。
その要望に応えるのが、ニューラルネットワークです。
ここでは、簡単なニューラルネットワークの構造を確認していきますが、当面は適切な重みは人間が決める簡単な部分からメスを入れていきます。

ニューラルネットワークの構造

ニューラルネットワークはパーセプトロンを複数組み合わせて層を作ります。
ニューラルネットワークの層は入力層、中間層(隠れ層)、出力層で構成されます。

下図は全部で4層ありますが、重みを持つ層は3層なので3層(緑と青部分)ネットワークとします。
重みを人が決める順伝播しかありませんが矢印の方向に計算が進みます。
青い円や緑の円1つ1つがニューロン(パーセプトロン)です。
ニューロンでは入力値に対して重みを計算して複数の入力値を合算した後、活性化関数を通して次のニューロンに値を渡します。
黄色の部分が入力層、緑の部分が中間層(隠れ層)、青い部分が出力層です。

これがニューラルネットワークの姿です。
ところが、最初に確認したように、このままではパーセプトロンの塊でしかなく、重みを自動で最適な値にすることができません。
けれども、ニューラルネットワークには逆伝播という優れた仕組みが用意されています。
この仕組みについては後に少しずつアプローチすることにします。(難しい?数学的な内容が含まれます)
ここでは最適な重みの設定は考えずにニューラルネットワークの入力層から中間層、出力層のフロー(順伝播)の仕組みを取り上げていきます。

まず、パーセプトロンは次のように表すことができます。(bはバイアス)

$$y = \begin{cases} \phantom{-} 0& \text{if } (b+w_1x_1+w_2x_2 \leq \theta) \\
\phantom{-} 1&\text{if } (b+w_1x_1+w_2x_2 > \theta) \end{cases}$$

活性化関数の必要性

ニューラルネットワークは、このようなパーセプトロンを複数つなげたものですが、ここで重要なのは線形関数を単純につなげれば良いというものではないということです。
つまり、入力値に重みをかけた結果を繋ぎ合わせても意味がないということです。1次関数は何回合成しても1次関数でしかなく、ニューラルネットワークの層を重ねることで複雑な関数を作り、複雑な問題を解けるようにする目的は叶えられません。

活性化関数についての説明の前に、この内容が非常に大切な概念です。

例として、次のような関数で表すことができます。
h=(x) = cx
これを3層にすると
y(x) = h(h(h(x)))
y(x)=c*c*c*x
これはつまり、
y(x) = c^3x
と1回で表すことが可能だということです。

Pythonの関数の方がわかりやすいという場合は次のコードで試してください。

# 入力値x1を定義
x1 = 3

# 線形関数を重みを変えて2つ定義
def a(x):
    return 2*x

def b(x):
    return 3*x

# 線形関数をx1の入力値で試す
print('a関数の実行結果:', a(x1))
print('b関数の実行結果:', b(x1))
# aとbの合成関数
print('a、b合成関数の実行結果:', a(b(x1)))

# 1つの関数で表現できる
def c(x):
    return 2*3*x  # わかりやすいように 2*3*x とした

print('c関数の実行結果:', c(x1))

そんなことから、ただ単純に線形関数をつなげればよいというものではないということです。

では、どうするか?

それは、パーセプトロンが最後に行なっている作業で閾値を基準に0か1に変換している作業です。
そして、この作業は数式的には非線形関数になります。

この非線形関数が加わることで層を深くする意味が出てきます。
そして、この非線形関数のことをニューラルネットワークでは活性化関数と呼ばれています。

ニューラルネットワークのポイントは、線形関数と非線形関数(活性化関数)を組み合わせて、層を深くしていくものです。
そうすることで複雑な問題に取り組むことが可能になってきます。

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