上記のサイトで、人工知能について学ぶ際に実際にプログラミングをしながら学ぶという話をしました。また、本記事ではディープラーニングの基礎知識として必要なパーセプトロンというアルゴリズムについてご紹介したいと思います。
・本サイトは以下の書籍を参考にしています。
文字だけで理解するのではなく、実際に手を動かしながら学ぶことで理解を深めることができると思います。
目次
パーセプトロンとは?
パーセプトロンとは、複数の信号を入力として受け取り、一つの信号として出力する処理のことです。
信号は、「1=流す」「0=流さない」の2通りだけとなっています。
今後、学んでいくニューラルネットワークやディープラーニングへと進む上で、必要不可欠な考え方になりますので、本記事で確実に抑えていきましょう。
パーセプトロンを数式で表すと以下のようになります。
数式を少し説明したいと思いますが、
x1,x2は入力信号、yは出力信号、そしてw1,w2は重みを表現します。
wはweightの略です。
そして入力信号には、それぞれに固有の重み(w)が乗算されます。
そしてさらにそれらの値を足します。その総和が限界値であるθを超えた場合のみ「1」を出力するという意味になります。この「1」を出力する時「ニューロンが発火する」と一般的には呼びます。
パーセプトロンは、複数の入力信号に対してそれぞれ固有の重みを持っています。
そして、その重みによって各信号を制御し、重みが大きければ大きいほど、その信号に対する重要度が高くなっていくのです。
※そこまで深く考え込まず、今はそういうものなんだな~と思ってもらえれば大丈夫です。
単純な論理回路を作ってみる
1、AND演算
Pythonを使って、先ほど記述したパーセプトロンの数式に値を代入して計算をし、AND演算を実装してみたいと思います。
# coding: utf-8 import numpy as np def AND(x1,x2): x = np.array([x1,x2]) w = np.array([0.5,0.5]) b = -0.7 tmp = np.sum(w*x) + b if tmp <= 0: print(0) else: print(1) AND(0,0) AND(1,0) AND(0,1) AND(1,1) ''' 【出力結果】 0 0 0 1 '''
先ほど、θを使いニューロンを発火させるトリガーとして数式を表しましたが、実装をする際には、θを-b(バイアス)に書き変えます。そうすると、数式が以下のようになります。
※バイアス=ここでは下駄を履かせるという意味で捉えてもらってかまいません。
AND演算をするためには、重みやバイアスは
(w1,w2,b)=(0.5,0.5,0.7)
(0.5,0.5,0.8)
(1.0,1.0,1.0)などで動作します。
重みやバイアスが決まったら、Pythonで実装してみましょう。
出力結果が意図した結果になっていれば成功です。
2、NAND演算
NAND演算を実装する際には、先ほどのAND演算で使った重みやバイアスを変更するだけで実装ができてしまいます。
AND演算:(w1,w2,b)=(0.5,0.5,0.7)
NAND演算:(w1,w2,b)=(-0.5,-0.5,-0.7)
# coding: utf-8 import numpy as np def NAND(x1,x2): x = np.array([x1,x2]) w = np.array([-0.5,-0.5]) b = 0.7 tmp = np.sum(w*x) + b if tmp <= 0: print(0) else: print(1) NAND(0,0) NAND(1,0) NAND(0,1) NAND(1,1) ''' 【出力結果】 1 1 1 0 '''
3、OR演算
OR演算も実装する際には、AND演算で使った重みやバイアスを変更するだけで実装ができてしまいます。
AND演算:(w1,w2,b)=(0.5,0.5,0.7)
NAND演算:(w1,w2,b)=(0.5,0.5,0.2)
# coding: utf-8 import numpy as np def OR(x1,x2): x = np.array([x1,x2]) w = np.array([0.5,0.5]) b = -0.2 tmp = np.sum(w*x) + b if tmp <= 0: print(0) else: print(1) OR(0,0) OR(1,0) OR(0,1) OR(1,1) ''' 【出力結果】 0 1 1 1 '''
4、XOR演算
ここが少し、難しい所になります。XOR演算というのは入力、出力は以下のようになります。
しかし、これは重みやバイアスを変えるだけでは実装できません。
実際に先ほど使ったパーセプトロンの数式をグラフにしてみると分かりやすいと思いますが、AND演算やOR演算などは1次方程式なので直線になります。
しかし、XOR演算をする場合、曲線を表現しなければ実装はできません。
しかし、AND演算、OR演算、NAND演算を組み合わせることにより、XOR演算を実装することができるのです。
回路はこのような形になります。
そうしましたら、先ほど実装してきた演算を関数として、XOR演算を実装してみましょう。
ソースコードは以下のようになりますが、もっといい書き方はいくらでもあると思うので、著者よりもプログラミングができる方は是非効率の良い方法で実装してみてください。
# coding: utf-8 import numpy as np def NAND(x1,x2): x = np.array([x1,x2]) w = np.array([-0.5,-0.5]) b = 0.7 tmp = np.sum(w*x) + b if tmp <= 0: return 0 else: return 1 def OR(x1,x2): x = np.array([x1,x2]) w = np.array([0.5,0.5]) b = -0.2 tmp = np.sum(w*x) + b if tmp <= 0: return 0 else: return 1 def AND(x1,x2): x = np.array([x1,x2]) w = np.array([0.5,0.5]) b = -0.7 tmp = np.sum(w*x) + b if tmp <= 0: return 0 else: return 1 def XOR(x1,x2): s1 = NAND(x1,x2) s2 = OR(x1,x2) y = AND(s1,s2) print(y) XOR(0,0) XOR(1,0) XOR(0,1) XOR(1,1) ''' 【出力結果】 0 1 1 0 '''
まとめ
パーセプトロンについて理解できましたか?
今後、学習していくニューラルネットワークなどのベースにもなってきますので、ここでつまづいてしまった方はもう一度じっくり考えながら実装してみてください。時には自分で考えて息詰まることも大切です。
次回は、「ニューラルネットワーク」の仕組みについて紹介していきたいと思います。
斎藤 康毅「ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装」(オライリージャパン,2016)
No comments yet.