パーセプトロン

パーセプトロンを理解するために、ANDゲートの結果を教師データとして、重みとバイアスの調節をやってみる。

まず、ANDゲートの概念図なり〜




図の解説

(0,0)を入力したばあいは、0が出力される。
(1,0)を入力したばあいは、0が出力される。
(0,1)を入力したばあいは、0が出力される。
(1,1)を入力したばあいは、1が出力される。

このような出力結果になるように、pythonにて関数を書いてみる。

スカラーのばあい。
(スカラーという言葉つかいに自信なし。後述のベクトルに合わせて、ためしに、この言葉をつかっている)。

ANDゲートの出力結果になるように、重み(w1,w2)とバイアス(b)には任意の数値を入れてある。

def AND(x1,x2):
w1,w2,b=0.5,0.5,-0.7
y=x1*w1+x2*w2+b
if y<=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
y=np.sum(x*w)+b
if y <=0:
return 0
else:
return 1

ためしてみる。
AND(0,0)
0

AND(1,0)
0

AND(0,1)
0

AND(1,1)
1

OK〜

では、このばあい(任意にとったw1,w2,bの数値、順に0.5、0.5,-0.7のばあい)1と0に分かれるx1,x2の領域は、どのようになっているか。

いままで、ANDゲートを実装することを主眼に置いていたけれど、以下、入力値(0,0)、(1,0),(0,1),(1,1)にこだわらず、あくまでも、どのような数値を入力すれば、1と0になるのか、みてみよう。

もういちど、作成した関数をみてみる〜

def AND(x1,x2):
w1,w2,b=0.5,0.5,-0.7
y=x1*w1+x2*w2+b
if y<=0:
return 0
else:
return 1

y=x1*w+x2*w2+bに、
w1=0.5、w2=0.5,b=-0.7を代入する。

y=0.5×1+0.5×2-0.7

このさい、0が閾値になるので、y=0を代入。

0=0.5×1+0.5×2-0.7
0.7=0.5×1+0.5×2
0.5×2=-0.5×1+0.7

両辺を0.5で割る
x2=x1+0.7/0.5
x2=x1+1.4

たぶん大丈夫。
x2=x1+1.4のグラフを書いてみよ〜。

import matplotlib.pyplot as plt
import numpy as np
x1=np.arange(-1,1.1,0.1)
x2=x1+1.4



色を、つけてみよう。

plt.fill_between(x1,x2)




たぶん…ブルーの領域のx1,x2を入力すれば、出力はゼロだったりしそう…

ためしてみよう。

たとえば、
(x1,x2)=>  ?
(0.25,0.25)=> 0
(0.5,1.5)=>1
(0,1.5)=>1
(0,1,4)=>0

よさそう。
ちなみに、x10のさかいは、1.4..だねぇ。

参考:「ゼロから作るDeep Learning」(斎藤康毅/オライリー・ジャパン)