Enjoy Engineer Life

C#,Unity,C++,UE4などの技術ブログや雑記を徒然なるままに書いていきます。

【読書メモ】Deep Learningを学ぶ〜単純パーセプトロンと論理回路〜Part 6

最初に

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

f:id:rossamu:20190103000547p:plain ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

また、本記事は株式会社よむネコのプロジェクトの業務内のお時間を頂いて蓄積した知見となります。
以下会社URLです。

http://www.yomune.co/ f:id:rossamu:20191023153505p:plain


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


単純パーセプトロンとは


ニューラルネットワークのモデルの中でも非常に単純で基本的なアルゴリズムです。
情報の伝達と処理を行う「ニューロン」という脳の神経細胞が、樹状突起という部位を用いて、ほかの細胞からの入力信号を受けます。ここでいう信号とは、電流のような「流れ」をもつものがイメージされます。つまり信号が流れを作り、情報を先へと伝達します。ニューロン同士はシナプスというつなぎ目を作り、樹状突起シナプスを通して信号を受け取っています。この、樹状突起はしばしば複数伸びて枝分かれをしており、ニューロンが入力信号を複数受け取る場合があります。


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

例えば入力信号がX_1X_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_1W_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ゲートを見ていこうと思います。

参考