kakts-log

programming について調べたことを整理していきます

パーセプトロンとニューラルネットワークの違い

正月休みを利用して Deep Learningに関して勉強をしています。
以前、パターン認識系の本を読んでいたのですが、実装をせずに理論だけ学んでいて、いまいち自分の中で理解が進まず挫折していました。 下記に紹介する「ゼロから作るDeep Learning ――Pythonで学ぶディープラーニングの理論と実装」では、python3系を用いてパーセプトロンから丁寧に実装して理解をすすめることができて
非常に面白いです。
現在勉強中のパーセプトロンニューラルネットワークについて、箇条書きですが簡単にまとめていきます。

パーセプトロンニューラルネットワークの違い

パーセプトロン

f:id:kakts:20170102000614p:plain
ある入力 x_1 x_2があり、それぞれの入力に対する重みと、バイアスbによって出力yが変わる。

パーセプトロンを数式で表すと以下の通りになる
f:id:kakts:20170102005157p:plain
バイアスとは、ニューロンの発火のしやすさをコントロールし、各ノードの重みは、ノードの重要性をコントロールする.
yは入力信号 b,  x_1,  x_2 の総和 h(x) = b + w_1 * b_1 + w_2 * b_2の値で決まる.
この総和関数 h(x)は一般的にステップ関数と呼ばれ、x = 0の点で非連続な関数である。

ニューラルネットワーク

パーセプトロンの考え方を応用したもので、入力層から来たデータが中間層を通過し、最後に出力層で求める出力を表現する。
中間層に関しては、実装に応じて複数の層にまたがる場合がある。
f:id:kakts:20161231163712p:plain

出力層の値は、下記で表されるシグモイド関数(Sigmoid Function)*1できまる。
 h(x) = \frac {1} {1 + exp(-x)}
f:id:kakts:20170102011637p:plain

シグモイド関数は最大が1,最小が0に収束していき、ステップ関数とは違って連続関数である。

パーセプトロンニューラルネットワークの違い

パーセプトロンニューラルネットワークの違いは、
入力に対して最終的な出力を行う際の関数(Activation-Functionと呼ばれる)が異なることである。

ステップ関数とシグモイド関数の違い

パーセプトロンにおいてはx = 0において非連続なステップ関数で0か1の2値しか返さない。
それに対してニューラルネットワークにおいては連続関数であるシグモイド関数を用いている。 シグモイド関数は入力に対して連続的に出力が変化し、この特徴がニューラルネットワークにおいて重要な意味を持つ。

ステップ関数とシグモイド関数の共通点

両者の共通点は、どちらも出力の値を 0から1の間の範囲で表せること、そしてどちらも非線形関数であることが共通点。 そしてニューラルネットワークにおいては、活性化関数に非線型関数を使う必要がある。

ニューラルネットワークの活性化関数に非線型関数を使う理由

活性化関数に、線形な関数を使った場合、中間層の無いネットワークで表現できてしまうので、層を深くすることの意味がなくなってしまう。
たとえば 3層のネットワークを構築したとして、 活性化関数を  h(x) = a * xとすると、  y(x) = h(h(h(x))) → y(x) = a * a * a * x となり、
中間層のないネットワークで表現できてしまうためである。

ニューラルネットワークは何を解決するか

パーセプトロンの重み設定(期待する入力と出力をみたすための重みを決める作業)を自動化する 従来のパーセプトロンは、入力に対して望みの出力を得るために、重みを設定する必要があり、非常に手間のかかる作業だった。
ニューラルネットワークは、与えられたデータから自動で学習し、パラメータを自動的に設定できる。

ニューラルネットワークでどういう問題を解くか

ニューラルネットワークは、主に2つの問題に対して有効である - 分類問題
与えられたデータがどのクラスに属するか判定する - 回帰問題 ある入力データから、(連続的な)数値の予測を行う

上記2種類の問題では、それぞれ、ニューラルネットワークの出力層で用いる活性化関数が異なる。
回帰問題では恒等関数、分類問題ではソフトマックス関数が一般的に使われている。
恒等関数とは、与えられた入力をそのまま出力するもので、出力に変化はない。
一方、ソフトマックス関数は、以下の数式で表すことができる。
f:id:kakts:20170102174343p:plain

出力層が全部でn個ある場合に、k番目の出力 y_kを表す式である。