2章 パーセプトロン

本章では、パーセプトロン(perceptron)というアルゴリズムについて説明します。

2.1 パーセプトロンとは

パーセプトロンは、複数の信号を入力として受け取り、ひとつの信号を出力します。

2.2 単純な論理回路

2.2.1 ANDゲート

それでは、パーセプトロンを使って簡単な問題を考えてみることにします。

2.2.2 NANDゲートとORゲート

続いてNANDゲートを考えましょう。

2.3 パーセプトロンの実装

2.3.1 簡単な実装

それでは、先の論理回路をJuliaで実装しましょう。
ここでは、引数としてx1x2を受け取る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

パラメータのw1w2thetaは関数内で初期化し、重み付き入力の総和が閾値を超えると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 まとめ