ディープラーニングの基礎の原理をPythonで動かしてみる【Deep Learning/パーセプトロン】
目次
こんにちは。データサイエンスについて勉強している人です。
今回から「Deep Learning(ディープラーニング/深層学習)」の基礎について勉強しながら記事にまとめていこうと思います。
「Deep Learningってすごそうだけど、結局何なの?」「どうやって動いているの?」「DLエンジニアが何言ってるかわからん!」という方のための基礎となる動作原理や用語の意味をわかりやすくまとめていけたらと思っています。
今後扱う予定の内容 ↓ ↓
- ニューラルネットワークの学習
- 損失関数
- 勾配法
- 誤差逆伝播法
- パラメータの更新
- 正則化
- 畳み込みニューラルネットワーク
- ディープラーニングの高速化
(あくまで予定。)
今回はまずDeep Learningの肝とも言えるニューラルネットワークの、その基礎となる「パーセプトロン」の動作について、Pythonで見ていこうと思います。
Deep Learningの基本となるパーセプトロンとは?
パーセプトロンはニューラルネットワークの基礎となるアルゴリズムで、複数の信号入力から一つの信号を出力します。どのようなアルゴリズムかと言うと、入力値に重みをかけ合わせて、その総和がある閾値を超えたら1を出力し、そうでなければ0を出力する、というようなものです。
パーセプトロンをPythonで動かしてみる
単純なパーセプトロンとして、2つの入力(x1,x2)を受け取り、ひとつの値を出力する関数Fを考えます。
数式で書くとこうです。
pythonで書くとこのようになります。
def F(x1,x2):
x = np.array([x1, x2])
w = np.array([.5, .5]) # weight 重み
b = -.7 # bias バイアス
t = np.sum(w*x) + b
if t <= 0:
return 0
else:
return 1
bをバイアス、wを重み(weight)と言います。これらのパラメータを変えることで、「入力に対してどのような出力をするか?」を変化させることができます。
上記のPythonの例は論理回路で言うANDゲートのような動作をして、例えば0と1の入力に対しては、(1,1)の組み合わせのときのみ1を出力し、他の組み合わせ(0,0) (0,1) (1,0)では0を出力します。
F(1,1) # 出力は1
とを変えることで、ORゲートやNANDゲートも再現可能です。
このような複数値に対して1つの値を出力するアルゴリズムがパーセプトロンです。難しい言葉がでてきたように感じますが、蓋を開けてみればただの1次関数です。
多層パーセプトロンをPythonで動かしてみる
続いて、より複雑な入出力の動作を確認してみたいと思います。1次関数ではなく二次関数のような線型でない動作をさせたい場合は、パーセプトロンを複数組み合わせて多層パーセプトロン(multi-layered perceptron)にします。
今回はXORゲートを例にしてみます。
まず、AND, OR, NANDゲートを作ります。
def F(x1,x2,w,b):
t = np.sum(w*np.array([x1, x2])) + b
if t <= 0:
return 0
else:
return 1
def AND(x1,x2):
w = np.array([.5,.5])
b = -.7
return F(x1,x2,w,b)
def OR(x1,x2):
w = np.array([.5,.5])
b = -.2
return F(x1,x2,w,b)
def NAND(x1,x2):
w = np.array([-.5,-.5])
b = .7
return F(x1,x2,w,b)
x1,x2 = 0,1
AND(x1,x2),OR(x1,x2),NAND(x1,x2) # 出力は(0,1,1)
AND, OR, NANDはいずれも1層のパーセプトロンで、バイアスと重みのパラメータを変えることで表現できます。
これらのゲートを組み合わせてXORゲートを作ります。
def XOR(x1,x2):
return AND(NAND(x1,x2), OR(x1,x2))
XOR(1,1), XOR(1,0), XOR(0,1), XOR(0,0) # 出力結果 (0, 1, 1, 0)
最初の入力(x1,x2)を第0層, 次の入出力(ここではNAND, ORの入出力)を第1層、最後の入出力(ここではAND)を第2層、というように全部で3層のパーセプトロンで構成されています。
このように層を重ねていくことでより複雑な入出力を表現できるようになります。
まとめ
というわけで、今回はディープラーニングの基礎となるパーセプトロンについてPythonで実際に動作を確認しながらまとめてみました。
- パーセプトロンは複数の入力に対して値を出力するアルゴリズム
- パーセプトロンは重みとバイアスのパラメータを持つ
- パーセプトロンの層を重ねることで複雑な入出力を表現できるようになる
特に最後の「層を深くしていく」というのは、ディープラーニング感がでてきましたね。
次回はパーセプトロンの発展形であるニューラルネットワークについてまとめてみたいと思います。
それでは〜
参考書籍
今回参考にした書籍はAmazonでも入門に評価の高いこちら。実際に手を動かしながらディープラーニングについて学べます。