ゼロから作るDeep LearningをJuliaで実装してみる (1)論理回路

## :red_car: この記事の目的

本記事は、Deep Learningの入門書「ゼロから作るDeep Learning」を参考に、Juliaを用いて同書の内容を実装してみる、という試みです。

※これはあくまで筆者の一つの試みと提案で、**必ずしも内容が正解ではありません**のでご了承お願い致します。
また、より良いアドバイスや協力のご提案などありましたら、お気軽にお声がけ頂けますと幸いです。

## :red_car: 今回取り組むこと

本記事は、参考書の2章にあたります。
今回は以下の基本的な4つの論理回路を実装してみます。
　①ANDゲート
　②NANDゲート
　③ORゲート
　④XORゲート

### ①ANDゲート

ANDゲートについては、参考書のp.23に書かれています。
ANDゲートは、真理値表で書くと以下のようになります。
x1及びx2が入力、yが出力です。

|x1 |x2 |y  |
|:-:|:-:|:-:|
|0  |0  |0  |
|1  |0  |0  |
|0  |1  |0  |
|1  |1  |1  |

参考書のソースを元に、Juliaで実装してみます。
wは重み、bはバイアスです。

```ruby:1_logic_circuit
function AND(x1, x2)

    b = [-0.7]
    x = [x1 x2]
    w = [0.5; 0.5]
    
    calc = x * w + b
    
    if calc[1] <= 0.0
        return 0
    else
        return 1
    end
end
```

ANDゲートを実装しました。
真理値表通りに動作することを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/65220093-33db-0b37-565a-0767ecde31f4.png)
↑上枠(灰色網掛け)が実行部分、下部の数字の並びが実行結果です。
真理値表のyの値通りに動作していることが確認できました。

### ②NANDゲート

続いて、NANDゲートを実装します。
NANDゲートは、真理値表で書くと以下のようになります。
x1及びx2が入力、yが出力です。

|x1 |x2 |y  |
|:-:|:-:|:-:|
|0  |0  |1  |
|1  |0  |1  |
|0  |1  |1  |
|1  |1  |0  |

NANDゲートの実装は以下としました。

```ruby:1_logic_circuit
function NAND(x1, x2)

    b = [0.7]
    x = [x1 x2]
    w = [-0.5; -0.5]

    calc = x * w + b
    
    if calc[1] <= 0.0
        return 0
    else
        return 1
    end
end
```

NADゲートの動作確認を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/24a84549-6d4c-8847-aaba-8b4b7e246bc7.png)
上記、NANDゲートの動作確認ができました。

### ③ORゲート

続いて、ORゲートを実装します。
ORゲートは、真理値表で書くと以下のようになります。
x1及びx2が入力、yが出力です。

|x1 |x2 |y  |
|:-:|:-:|:-:|
|0  |0  |0  |
|1  |0  |1  |
|0  |1  |1  |
|1  |1  |1  |

ORゲートの実装は以下としました。

```ruby:1_logic_circuit
function OR(x1, x2)

    b = [-0.2]
    x = [x1 x2]
    w = [0.5; 0.5]

    calc = x * w + b
    
    if calc[1] <= 0.0
        return 0
    else
        return 1
    end
end
```

以下、動作確認です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/7b62933a-40d7-3958-a9d2-9fcadc914d7e.png)
上記の結果、動作確認も良さそうです。

### ④XORゲート

最後にXORゲートを実装します。
XORゲートは排他的論理和とも呼ばれています。
真理値表は以下となります。
x1及びx2が入力、yが出力です。

|x1 |x2 |y  |
|:-:|:-:|:-:|
|0  |0  |0  |
|1  |0  |1  |
|0  |1  |1  |
|1  |1  |0  |

XORゲートは、これまで作成したAND,NAND,OR各ゲートの組み合わせで実現できます。
以下のような回路を構成します。
s1,s2はそれぞれNAND,ORゲート通過時の中間値です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/1aedbe0a-7c13-405a-5394-574d8f259e98.png)

実装は以下の通りです。

```ruby:1_logic_circuit
function XOR(x1, x2)
    
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    y = AND(s1, s2)
    
    return y
        
end
```

動作確認の結果は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/5a2f52c2-b47e-3c27-2934-b7a18d2b6e84.png)

以上で論理回路の実装ができました。
次回は活性化関数の実装に入りたいと思います。


## :red_car: もくじ

[(1)論理回路](https://qiita.com/ttabata/items/f9253d5ef94ca3807f42)
[(2)活性化関数](https://qiita.com/ttabata/items/7d4b8d92e38df47cffbb)
[(3)3層ニューラルネットワークの実装](https://qiita.com/ttabata/items/4f50ec32c0276d21d966)
[(4)ソフトマックス関数](https://qiita.com/ttabata/items/21329897119f81a141e9)
[(5)MNIST手書き数字認識 その①画像表示](https://qiita.com/ttabata/items/6f7025f48fa52d465c81)
[(5)MNIST手書き数字認識 その②推論](https://qiita.com/ttabata/items/0781e1aacb11d9148053)

## :red_car: 関連情報

:paperclip: Julia早引きノート［01］変数・定数の使い方
https://qiita.com/ttabata/items/a1ada2c0cba03672e105

:paperclip: Julia - 公式ページ
https://julialang.org/

:paperclip: Julia - 日本語公式ドキュメント
https://julia-doc-ja.readthedocs.io/ja/latest/index.html

:paperclip: 初めてのJuliaとインストール (Windows & Linux)
https://qiita.com/ttlabo/items/b05bb43d06239f968035

## :red_car: 出典

■参考書
「ゼロから作るDeep Learning ～ Pythonで学ぶディープラーニングの理論と実装」
　斎藤康毅 著／オライリー・ジャパン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/4a558c91-5e9c-9d6f-3673-d44fbb583103.png)

## :red_car: ご意見など

ご意見、間違い訂正などございましたらお寄せ下さい。