IT-LIFEブログ

主にIT系のことや時事ネタや、たまに雑記

【初心者向け】ディープラーニングの起源であるパーセプトロンとは?【連載①】

 

近年話題の人工知能の一種であるDeep Learning。

理系の血が騒ぎ、これは勉強しなければならないという使命感にかられたため、現在、ゼロから作るDeep Learningという本を読んでいます。

学んだことの知識整理と情報共有のためにブログにまとめていこうと思います。

だれにでもわかるように書いているつもりです(; ・`д・´)

 

パーセプトロンとは?

パーセプトロンとは、ローゼンブラットというアメリカの研究者によって考案されたアルゴリズムです。

パーセプトロンはディープラーニングの起源となるアルゴリズムであるため、ディープラーニングを学ぶためにはパーセプトロンの仕組みを理解しなければなりません。

ここでは、パーセプトロンについて説明をしていこうと思います。

パーセプトロンは複数の信号である入力を受け取り、ある一つの信号を出力します。

信号とは「1」と「0」の二値です。

次に二つの信号を受け取り、一つの信号を出力するパーセプトロンのモデルを図で示します。

f:id:nok-0930-ss:20171129090216p:plain

この図のx1とx2は入力、yは出力です。

w1とw2は重みを表しています。

〇がいわゆるニューロン(ノード)です。

入力信号はニューロンに送られた後に、それぞれの重みで乗算されます。

そして、送られてきた信号の総和を計算し、yとして計算します。

つまり、

y=x1w1+x2w2

となります。

そして、そのyが任意で設定した限界値(閾値)θを超えていた場合のみ1を出力します。

これを「ニューロンの発火」と呼びます。

これを式で表すと以下のようになります。

 

x1w1+x2w2<=θの時

y=0

x1w1+x2w2>θの時

y=1

 

一般的にはθ = -bと表され、以下のように上記の式を変形できます。

b+x1w1+x2w2<=0の時

y=0

b+x1w1+x2w2>0の時

y=1

 

bをバイアスパラメータといいます。

表現としてはどちらも等価です。

 

ここまでがパーセプトロンの基本です。

次は実際にパーセプトロンを使って簡単な問題を考えてみます。

 

パーセプトロンで論理回路を表現

ここでは、論地回路のANDゲートについて考えてみたいと思います。

ANDゲートというものは左図のように表わされ、皆さんのスマホの中に集積回路としてたくさん入っている電子回路です。

f:id:nok-0930-ss:20171129095616p:plainf:id:nok-0930-ss:20171129095450p:plain

これをパーセプトロンで表現していきます!

ANDゲートは2入力1出力で二つの入力信号が1の時だけ1を出力し、それ以外は0を出力します。

入力に対する出力の関係表である真理値表を以下に示します。

入力 出力
x1 x2 y
0 0 0
0 1 0
1 0 0
1 1 1

 

ここで、このANDゲートをパーセプトロンで表現していきたいと思います。

パーセプトロンのパラメータであるw1,w2,θの値を調整動作に基づき設定していきます。

例えば、適当に(w1, w2, θ) = (0.5, 0.5, 0.7)としたとしましょう。

f:id:nok-0930-ss:20171129092212p:plain

入力が(x1, x2) = (0, 0)の時

x1w1 + x2w2 = 0*0.5 + 0*0.5 = 0 <= θ

となり総和が閾値を下回っているため0を出力します。

 

入力が(x1, x2) = (0, 1)の時

x1w1 + x2w2 = 0*0.5 + 1*0.5 = 0.5 <= θ

となり総和が閾値を下回っているため0を出力します。

 

入力が(x1, x2) = (1, 0)の時

x1w1 + x2w2 = 1*0.5 + 0*0.5 = 0 <= θ

となり総和が閾値を下回っているため0を出力します。

 

入力が(x1, x2) = (1, 1)の時

x1w1 + x2w2 = 1*0.5 + 1*0.5 = 1.0 > θ

となり総和が閾値を上回っているため1を出力します。

ちなみに Pythonで書くとこんな感じです。

# 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: return 0 else: return 1
if __name__ == '__main__': for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]: y = AND(xs[0], xs[1]) print(str(xs) + " -> " + str(y))

 

このように(w1, w2, θ) = (0.5, 0.5, 0.7)と設定した場合は、真理値表通りの出力が得られたので、パーセプトロンでANDゲートを表現できたことになります。

また、(w1, w2, θ) の選び方は、無数に存在します。

例えば、(w1, w2, θ) = (0.59786, 0.3432425, 0.7123131)としても、ANDゲート同じ表現になります。

つまりパーセプトロンというのは、何か入力を与えたらこの入力に対する出力の判断をニューロンが行い応答するという作業をしています。

 

これはAIの得意とする画像認識の処理に似ています。

例えば、以下の画像のように猫の画像を入力したとします。

ニューロンは入力信号である猫の画像に対して何か判断を行います。

猫だと判断されれば、yで猫である確率が高いといった判断をします(かなり、強引ですが)。

f:id:nok-0930-ss:20171129093808p:plain

そのためには、猫に対応する適切な重み(w1, w2, θ)を設定しなければなりません。 

猫に対応する適切な重みは何か?

知りません笑

 

重みの設定方法について

では、(w1, w2, θ) はどのように設定するのか?という疑問がわくと思います。

 

重みはデータから学習させて設定させていきます。

パーセプトロンでは学習できません。

パーセプトロンをニューラルネットワークに拡張することによって学習できます。

ニューラルネットワークは、適切な重みパラメータをデータから自動で学習できるという性質を持っています。

 

次のブログではニューラルネットワークの基礎と、重みの学習について書いていこうと思います!

では!

 

次の連載はこちらです。

www.it-lifelog.com