単純パーセプトロンを用いることで線形分離可能な問題を扱うことができます。
しかし単純パーセプトロンでは応用な範囲が狭く、解くことができない問題が多くあります。
そこで今回は単純パーセプトロンを高度化するものとして、パーセプトロンの多層化や活性化関数について調べました。
パーセプトロンのの多層化
先日の記事では論理関数AND・NAND・ORを単純パーセプトロンを用いることで表現できることがわかりました。
しかし、XOR関数などの線形分離不可能な問題は単純パーセプトロンでは扱えませんでした。
そこで今回は単純パーセプトロンを高度かした多層パーセプトロンについて調べました。
XOR関数
まず初めにXOR関数をパーセプトロンで実現したいと思います。
XOR関数はAND・NAND・OR関数を組み合わせることでも表現することができます。以下にXOR関数を示します。
では上の式を前回単純パーセプトロンで実装したAND・NAND・OR関数を使用して実装します。
今回もプログラミング言語にはPythonを使用しました。
コードを示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
import numpy as np # AND, NAND, OR関数の定義 def AND(x1,x2): theta = 1.0 x = np.array([x1,x2]) w = np.array([1.0,1.0]) temp = np.sum(x*w) - theta if temp <= 0: return 0 else: return 1 def NAND(x1,x2): theta = -1.5 x = np.array([x1,x2]) w = np.array([-1.0,-1.0]) temp = np.sum(x*w) - theta if temp <= 0: return 0 else: return 1 def OR(x1,x2): theta = 0.5 x = np.array([x1,x2]) w = np.array([1.0,1.0]) temp = np.sum(x*w) - theta if temp <= 0: return 0 else: return 1 # XOR関数の定義 def XOR(x1,x2): temp = AND( NAND(x1,x2), OR(x1,x2)) if temp <= 0: return 0 else: return 1 #実行結果表示 print("XOR(0,0) = {0}".format(XOR(0,0))) print("XOR(0,1) = {0}".format(XOR(0,1))) print("XOR(1,0) = {0}".format(XOR(1,0))) print("XOR(1,1) = {0}".format(XOR(1,1))) |
実行結果です。
1 2 3 4 5 |
#XOR関数実行結果 XOR(0,0) = 0 XOR(0,1) = 1 XOR(1,0) = 1 XOR(1,1) = 0 |
このようにパーセプトロンをで表現したAND、NAND、OR関数を組み合わせることによってXOR関数を実現することができました。
多層パーセプトロンによるXOR関数
上記のコードの動きを図にしたものを次に示します。
このように一度NANDとORのパーセプロトンで計算をし、その後それらの出力をANDのパーセプトロンに入力しています。
このように単純パーセプトロンをつなぎ合わせることによって、線形分離不可能な問題を扱えるようになったものを
多層パーセプトロン(Multi-layer perceptron : MLP)といいます。
バイアスと活性化関数
単純パーセプトロンの動作式を次のように表しました。
この式は単純ですが、このままの表記だとコンピュータでは扱いにくくまた一般的ではありません。
そこで活性化関数とバイアスというものを導入して、パーセプトロンの動作を一般的にしたいと思います。
バイアス
ではまずバイアスの導入を行います。
バイアスの導入では上の式を次のように変換します。
このように閾値θを不等号の左側に移動させました。
これによって単純パーセプトロンを次のように書き換えることができます。
このように常に1を入力するダミー入力変数x0 と w0 = – θ を導入します。
これによって単純パーセプトロンの動作式は次のように表すことができます。
このように行列を用いて簡単に表すことができるようになりました。
活性化関数
まず簡略化した上記の式をさらに変形させます。
変形させた式を次に示します。
この式の f(x)のことを活性化関数(出力関数)といいます。
単純パーセプトロンでは入力が0以上で出力1、入力が0以下で出力が0となるステップ関数(ヘビサイド関数)が用いられています。
しかし活性化関数はこのステップ関数以外にも多く存在します。活性化関数をして用いられる関数の特徴として、非線形関数であることが挙げられます。また階層型ニューラルネットワークの技術の中で重要な学習を行う際には、関数の特徴として微分可能なことが挙げられます。
活性化関数として有名なものとしてシグモイド関数があります。
また近年のディープラーニングでは次のReLU(Rectified Linear Unit)関数がよく用いられています。
まとめ
- 単純パーセプトロンを階層的につなぎ合わせたものを、多層パーセプトロン(MLP)という。
- 多層パーセプトロンは単純パーセプトロンでは扱えなかった、線形分離不可能な問題も扱うことができる。
- バイアスを導入することで、入力と重みの行列計算によって簡単にパーセプトロンの計算を行うことができる。
- 単純パーセプトロンでは活性化関数としてステップ関数を用いていたが、それ以外にもシグモイド関数やReLU関数などが有名である。
参考文献
- 馬場則夫, 小島史男, 小澤誠一 : ニューラルネットワークの基礎と応用, p. 10, 1995, 共立出版
- 麻生英樹 : ニューラルネットワーク情報処理, 1989, 産業図書
- 麻生英樹ほか:深層学習 Deep Learning, 2016, 近代科学社
関連記事