Deep Learningを学ぶ #1 〜単純パーセプトロンと論理回路〜


最初に

本記事は以下の本から得た知見を自分用のメモも兼ねてまとめた記事となります。ただし本の内容をそのまま書き写ししているわけではなく、ある程度自身で調べたものや感想が混じっています。ご了承ください。


ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

今回は単純パーセプトロン(又は、人工ニューロン)と呼ばれるモデルについての紹介とアルゴリズムがテーマとなります。

2 : Deep Learningを学ぶ #2 〜多層パーセプトロンとXOR〜

以降は「 Enjoy Engineer Life 」にて投稿していきます。

単純パーセプトロンとは

ニューラルネットワークのモデルの中でも非常に単純で基本的なアルゴリズムです。

情報の伝達と処理を行う「ニューロン」という脳の神経細胞が、「樹状突起」という部位を用いて、ほかの細胞からの入力信号を受けます。ここでいう信号とは、電流のような「流れ」をもつものがイメージされます。つまり信号が流れを作り、情報を先へと伝達します。ニューロン同士は「シナプス」というつなぎ目を作り、樹状突起はシナプスを通して信号を受け取っています。この、樹状突起はしばしば複数伸びて枝分かれをしており、ニューロンが入力信号を複数受け取る場合があります。

(参照:「京都大学 神経細胞の樹状突起が脳内の「道しるべ」を感知する仕組みを発見」の図1より

例えば入力信号が$X_1$、$X_2$で、出力が$Y$とします。ここで、シナプスの伝達効率というものはそれぞれ異なっており、入力信号がニューロンへ送られる際には「結合荷重」という重みが乗算されます。この重みは、各信号の重要性をコントロールする要素です。つまり、「重みが大きい=その信号の重要性が高い」ということになります。入力信号の入力$X_1$における重みを$W_1$、入力$X_2$における重みを$W_2$と表します。


y=\left\{\begin{array}{ll}0 & (W_1X_1+W_2X_2 \leqq θ) \\1 & (w_1X_1+W_2X_2 > θ)\end{array}\right\}



入力信号がある閾値を超えると"1"、越えなかった場合には"0"という信号が出力されます。この閾値を含めた実装式を今後考えていくにあたって、$θ$を$-b$とします。

y=\left\{\begin{array}{ll}0 & (b+W_1X_1+W_2X_2 \leqq 0) \\1 & (b+w_1X_1+W_2X_2 > 0)\end{array}\right\}



$b$は「バイアス」と呼ばれ、発火のしやすさを調整するパラメータとして機能します。

単純な論理回路の考え方と実装

パーセプトロンを使用することで、単純な論理回路を表現することもできます。それぞれの入力信号と出力信号の対応表である「真理値表」と、実装コードを確認しつつゲームAIで使用できそうな例を考えてみようと思います。作業としては、真理値表を満たすような$W_1$と$W_2$、$θ$の値を決めることとなります。

「ANDゲート」

$X_1$ $X_2$ $Y$
0 0 0
1 0 0
0 1 0
1 1 1



(これを満たす値の一例)
$$
(W_1,W_2,b)=(0.5,0.5,-0.7)
$$



(実装例)

def AND(x1,x2):
     x = np.array([x1, x2])
     w = np.array([0.5, 0.5])
     b = -0.7
     tmp = b + np.sum(w*x)
     if tmp <= 0:
             return 0
     elif tmp > 0:
             return 1



(想定される使用例)
敵が持つ要素の合計数値($W_1X_1+W_2X_2$)が閾値(θ)を超える危険度や優先度になった場合にターゲティング(1:発火)する。

「NANDゲート」

$X_1$ $X_2$ $Y$
0 0 1
1 0 1
0 1 1
1 1 0



(これを満たす値の一例)
$$
(W_1,W_2,θ)=(-0.5,-0.5,-0.7)
$$



(実装例)

 def NAND(x1,x2):
     x = np.array([x1, x2])
     w = np.array([-0.5, -0.5])
     b = 0.7
     tmp = b + np.sum(w*x)
     if tmp <= 0:
             return 0
     elif tmp > 0:
             return 1



(想定される使用例)
NAND=プレイヤーとの位置関係(例えば常に矢が当たる位置)にて「主人公と距離がある」「直線上に障害物がない」の両方を満たした位置の場合は移動をやめる(0)

「ORゲート」

$X_1$ $X_2$ $Y$
0 0 0
1 0 1
0 1 1
1 1 1



(これを満たす値の一例)
$$
(W_1,W_2,θ)=(0.5,0.5,0.4)
$$



(実装例)

 def OR(x1,x2):
     x = np.array([x1, x2])
     w = np.array([0.5, 0.5])
     b = -0.4
     tmp = b + np.sum(w*x)
     if tmp <= 0:
             return 0
     elif tmp > 0:
             return 1



(想定される使用例)
HPが減っているかMPが減っている(または両方)の場合にHPとMPが回復するアイテムを使用する(1)。

最後に

単純パーセプトロンの仕組みについて深掘りするのが中々難しかったですが、理解してくると読み進めるのが楽しいなと感じます。引き続き、次はこれまでのパーセプトロンでは実現できないXORゲートを見ていこうと思います。

参考