徒然電脳

日々のプログラミング(とその他)忘備録 このサイトは独自研究のみに基づきます マサカリ歓迎しますというかよろしくお願いします

ディープラーニング2 ~ニューラルネットワークへ

目次

ディープラーニング1
ディープラーニング2 ←イマココ

パーセプトロンニューラルネットワークへ発展

ニューラルネットワークは入力層、中間層(隠れ層)、出力層の3つから構成されます。

f:id:TempProg:20171021004332p:plain 図1

例えば、図1の例では左側の2つのニューロンが入力層、真ん中の3つのニューロンが中間層(隠れ層)、右が出力層ということになります。 ニューラルネットワークは、ニューロンのつながり方はパーセプトロンと変わりませんが、その中身が少し異なります。次から中身を少し見てみましょう。

 ニューロンの中身

さて、ニューラルネットワークにおけるニューロンの中身を見てみます。 前回、パーセプトロンにおける入力と出力の関係は式1で表現できるとしました。

式1

{\displaystyle 
    y = 
    \begin{eqnarray}
      \left\{
        \begin{array}{l}
         0\qquad(x_1w_1 + x_2w_2 \leq θ) \\
         1\qquad(x_1w_1 + x_2w_2 > θ)
        \end{array}
      \right.
    \end{eqnarray}
  }

そして、閾値[θ]をバイアス[b]として書き換えたのが式2です。

式2

{\displaystyle 
    y = 
    \begin{eqnarray}
      \left\{
        \begin{array}{l}
         0\qquad(b + x_1w_1 + x_2w_2 \leq 0) \\
         1\qquad(b + x_1w_1 + x_2w_2 > 0)
        \end{array}
      \right.
    \end{eqnarray}
  }

バイアスで書き換えた事により、図2のような表現ができます。

f:id:TempProg:20171021005442p:plain 図2

このように、bも入力の一部として認識することが可能です。 更に式2に対して新しく関数hを定義し、簡略化します。

式3

{\displaystyle
y = h(b + x_1w_1 + x_2w_2) \\ \\

    h(x) = 
    \begin{eqnarray}
      \left\{
        \begin{array}{l}
         0\qquad(x \leq 0) \\
         1\qquad(x > 0)
        \end{array}
      \right.
    \end{eqnarray}
  }

ニューラルネットワークにおいて使われる関数hは活性化関数と呼ばれます。 この一連の流れから、パーセプトロンにおける活性化関数は式3のように定義されていると説明できます。 これが階段関数であることは議論の必要性はないと思います。

sigmoid関数

前項で一般的に活性化関数という存在を明かしました。これはいわば、階段関数以外の関数も利用されるということです。

式4

{\displaystyle

    h(x) = \frac{1}{1 + e^{-x}}
  }

式4の関数をsigmoid関数と呼びます。図3はsigmoid関数のグラフです。(pythonのmatplotlibを使用)

f:id:TempProg:20171021011416p:plain図3

sigmoid関数はy = 0とy = 1の直線に漸近します。これは階段関数をより滑らかにした関数といえるかもしれません。

ReLU関数

式5

{\displaystyle
    h(x) = 
    \begin{eqnarray}
      \left\{
        \begin{array}{l}
         0\qquad(x \leq 0) \\
         x\qquad(x > 0)
        \end{array}
      \right.
    \end{eqnarray}
  }

  }
]

図4は式5のReLU関数のグラフです。

f:id:TempProg:20171021011922p:plain 図4

sigmoid関数とReLU関数、階段関数の違い

どの活性化関数を使うかによってニューラルネットワークの振る舞いは大きく変わるはずです。どうやら、どれを使うかによってどう変わるかについては現在の私には理解不可能のようですが、ReLU関数がベスト?無難?な印象を受けました。

非線形

活性化関数は上記で紹介したもの以外にも多数存在します。 しかし、そのどれもが非線形です。 そこには理由があります。 証明まではしませんが、軽い説明。

仮に活性化関数を式6のような線形関数と定義してみます。

式6 (a, bは定数)

{\displaystyle

    h(x) = ax + b
  }

ニューラルネットワークは何層もありますから、たとえば出力は式7のような状態になります。

式7

{\displaystyle

    y = h(h(h(x)))
  }

これを展開してみましょう。

式8

{\displaystyle
y = a(a(ax + b) + b ) + b \\
y = a(a^{2}x + ab + b) + b \\
y = a^{3}x + a^{2}x + a^{2}b + ab + b \\
y = (a^{3} + a^{2})x + (a^{2}b + ab + b)
  }

このように、3つ重ねても元のax + bの形に戻ってしまいます。 すなわち、線形関数を使って2層以上のニューロンを重ねる行為に意味が無いのです。(1層に落とし込める)