前記事ではパーセプトロンについて学びましたが、本記事ではパーセプトロンとは異なる部分を中心にニューラルネットワークについてご紹介していきたいと思います。
・本サイトは以下の書籍を参考にしています。
文字だけで理解するのではなく、実際に手を動かしながら学ぶことで理解を深めることができると思います。
目次
ニューラルネットワークとは?
ニューラルネットワークとは一体なんなのでしょうか?
それには、まずパーセプトロンを思い出さなくてはいけません。
パーセプトロンでは、重み(w1,w2)を実際には人の手で決めているという所がデメリットになってきます。人の手で毎回決めていてはそれは人口知能とは呼べません。
その重み付けを適切に自動で学習できるというのがニューラルネットワークになります。
そこで、少しパーセプトロンの復習をしたいと思いますが、上記の数式にあるbはバイアスというものでした。
バイアスとは、ニューロンの発火のしやすさをコントロールするものでしたね。
そしてそれぞれの入力値(x1,x2)に重み(w1,w2)を掛け、それにバイアスも足した総和が「0」を超えていた場合には「1」を出力するというものでした。
ちなみに、バイアスの入力信号には常に1が掛けられています。
活性化関数の使用
それでは、上記の数式をもっと簡単な形にしてみたいと思います。簡単にするには場合分けの動作で「0」を超えたら「1」。そうでなければ「0」を出力する関数を作りたいと思います。
ここではh(x)という新たな関数を使います。
ここで登場してきたh(x)という関数ですが、このような関数(入力信号の総和を出力信号に変換する)は、一般的に活性化関数と呼ばれています。
活性化関数とは、入力信号の総和をどのように活性化するか(どのように発火させるか)ということを決定する役目があるそうです。
一般的に「単純パーセプトロン」というのは単層ネットワークで、活性化関数にステップ関数を使用しています。
※ステップ関数=閾値を境にして出力が切り替わる関数
しかし、「多層パーセプトロン」というのは多層ネットワークでシグモイド関数を使用するネットワークになり、それをニューラルネットワークと呼びます。
よって、パーセプトロンでは活性化関数としてステップ関数を使用するが、その活性化関数を変えることによってパーセプトロンからニューラルネットワークに進化することができます!
シグモイド関数
ニューラルネットワークでよく使用される関数はシグモイド関数です。
シグモイド関数の数式はこちらになります。
exp(-x)はeの-x乗を意味します。eはネイピア数の2.7182・・・の実数を表します。
なんか難しいなあ。。。って思う方もいると思いますが、これも結局は関数です。
関数は何かしらの入力があれば内部で処理して何らかの出力をする変換器です。
シグモイド関数には例えば1や2を入力した場合、h(1.0)=0.731・・・、
h(2.0)=0.880・・・のようにある値が出力されます。
ステップ関数の実装
それでは、まずパーセプトロンの活性化関数であるステップ関数をPythonで実装していきたいと思います。実装では視覚的に分かりやすくする為にグラフで表示してみたいと思います。
import numpy as np import matplotlib.pylab as plt def step_function(x): return np.array(x > 0, dtype=np.int) x = np.arange(-5.0,5.0,1.0) #x軸の範囲を-5.0~5.0まで1.0ずつ区切っている y = step_function(x) plt.plot(x,y) plt.ylim(-0.1,1.1) #y軸の範囲を指定する plt.show()
出力結果は以下のようになります。
結果からわかるように、ステップ関数では、0を境に出力が0から1に切り替わります。
ステップ関数ではこのように、階段のように値が切り替わることから「階段関数」と呼ばれることもあるそうです。
シグモイド関数の実装
それでは、この数式を元にシグモイド関数を実装してみましょう。
コードはステップ関数の部分を代入していた変数yと関数を変更するだけになります。
import numpy as np import matplotlib.pylab as plt def sigmoid(x): return 1 / (1 + np.exp(-x)) x = np.arange(-5.0,5.0,0.1) y = sigmoid(x) plt.plot(x,y) plt.ylim(-0.1,1,1) plt.show()
出力結果はこのようになります。
それでは、シグモイド関数とステップ関数を比べてみましょう。
sigmoid関数を用いた図とステップ関数を用いた図
シグモイド関数では滑らかな曲線になっており、ステップ関数では直線で曲がっているのが分かるかと思います。
ここで、言えるのはどちらも入力値が少なければ0に近く、入力値が大きければ1に近づくという点です。
また、どちらもどんなに値が小さくても0に押し込み、どちらもどんなに入力値が大きくても1以下におさまるのも共通点です。
まとめ
今回はパーセプトロンとニューラルネットワークの具体的な違いについて述べました。
また、パーセプトロンでは活性化関数としてステップ関数を、ニューラルネットワークでは基本的にはシグモイド関数をよく使用しています。
パーセプトロンでは「単層パーセプトロン」、ニューラルネットワークでは「多層パーセプトロン」と別名では呼ばれます。
続いては、非線形関数やニューラルネットワークで最近活性化関数として使用されているReLU関数、そして多次元配列について学んでいきたいと思います。
斎藤 康毅「ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装」(オライリージャパン,2016)
No comments yet.