2章 パーセプトロン
本章では、パーセプトロン(perceptron)というアルゴリズムについて説明します。
~
2.1 パーセプトロンとは
パーセプトロンは、複数の信号を入力として受け取り、ひとつの信号を出力します。
~
2.2 単純な論理回路
2.2.1 ANDゲート
それでは、パーセプトロンを使って簡単な問題を考えてみることにします。
~
2.2.2 NANDゲートとORゲート
続いてNANDゲートを考えましょう。
~
2.3 パーセプトロンの実装
2.3.1 簡単な実装
それでは、先の論理回路をJuliaで実装しましょう。
ここでは、引数としてx1
とx2
を受け取るAND
という関数を定義します。
function AND(x1, x2)
w1, w2, theta = 0.5, 0.5, 0.7
tmp = w1*x1 + w2*x2
if tmp <= theta
return 0
else
return 1
end
end
パラメータのw1
、w2
、theta
は関数内で初期化し、重み付き入力の総和が閾値を超えると1
を返し、それ以外は0
を返します。
(0, 0) -> 0
(1, 0) -> 0
(0, 1) -> 0
(1, 1) -> 1
期待した通りの出力になっていますね!
これで、ANDゲートは実現することができました。
同様の手順で、NANDゲートやORゲートも実装することができますが、ここでは、この実装に少しだけ手を加えたいと思います。
2.3.2 重みとバイアスの導入
先のANDゲートの実装は素直で分かりやすいのですが、これ以降のことを考えて、別の実装方式へと修正したいと思います。
~
ここでは、JuliaのREPLで逐次結果を確認しながら進むことにします。
julia> x = [0, 1]; # 入力
julia> w = [0.5, 0.5]; # 重み
julia> b = -0.7; # バイアス
julia> w' * x
0.5
julia> w' * x + b
-0.19999999999999996 # およそ-0.2(浮動小数点数による演算誤差)
この例で示すように、Juliaの配列の乗算は行列の積として扱われます。
そのため、w' * x
の計算では、'
によってw
配列を転置してx
との積が計算されます。
この重み付き和にバイアスを加算すれば計算は終了です。
2.3.3 重みとバイアスによる実装
「重みとバイアスによる方式」を用いれば、ANDゲートは次のように実装することができます。
function AND(x1, x2)
x = [x1, x2]
w = [0.5, 0.5]
b = -0.7
tmp = w'*x + b
if tmp <= 0
return 0
else
return 1
end
end
ここで -θ をバイアス b と命名しましたが、バイアスは、重みの w1 や w2 とは別の働きをすることに注意しましょう。
~
それでは、続いてNANDゲートとORゲートを実装しましょう。
function NAND(x1, x2)
x = [x1, x2]
w = [-0.5, -0.5] # 重みとバイアスだけがANDと違う!
b = 0.7
tmp = w'*x + b
if tmp <= 0
return 0
else
return 1
end
end
function OR(x1, x2)
x = [x1, x2]
w = [0.5, 0.5] # 重みとバイアスだけがANDと違う!
b = -0.2
tmp = w'*x + b
if tmp <= 0
return 0
else
return 1
end
end
前節で説明した通り、AND、NAND、ORは同じ構造のパーセプトロンであり、違いは重みパラメータの値だけでした。
NANDとORゲートの実装においても、ANDと異なる箇所は重みとバイアスの値を設定する箇所だけになります。
2.4 パーセプトロンの限界
~
2.4.1 XORゲート
XORゲートは排他的論理和とも呼ばれる論理回路です。
~
2.4.2 線形と非線形
~
2.5 多層パーセプトロン
残念ながら、パーセプトロンはXORゲートを表現できませんでした。
~
2.5.1 既存ゲートの組み合わせ
さて、XORゲートを作るにはいくつか方法があります。
~
2.5.2 XORゲートの実装
続いてXORゲートをJuliaで実装してみます。
~
function XOR(x1, x2)
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
end
このXOR
関数は、期待した通りの結果を出力します。
(0, 0) -> 0
(1, 0) -> 1
(0, 1) -> 1
(1, 1) -> 0
これでXORゲートを完成させることができました。
~
2.6 NANDからコンピュータへ
多層パーセプトロンは、これまで見てきた回路よりも複雑な回路を作ることができます。
~
2.7 まとめ
~