ゼロから作るDeep LearningをJuliaで実装してみる (2)活性化関数

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

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

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

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

本記事は、参考書の3.2章にあたります。
以下の3つの活性化関数を実装してみます。
　①ステップ関数
　②シグモイド関数
　③ReLU関数

### ①ステップ関数

入力パラメータが一つの整数または実数の場合のステップ関数は以下のように実装できます。

```ruby:2_activatioin_function
function step_function(x)
    if x > 0.0
        return 1
    else
        return 0
    end
end
```

参考書に合わせ、入力パラメータが一次元配列の場合のステップ関数を考えます。
map関数を使用し、配列の各要素が0.0より大きいか小さいかを判定します。
判定結果をfloat型に変換して返す関数を作成します。

```ruby:2_activatioin_function
function step_function(x)
    return float(map(i -> i > 0.0, x))
end
```

実際の動作確認の結果は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/db056d38-cf87-3414-9128-82e5dd4e7159.png)

上記のステップ関数をグラフに表してみます。
グラフはPythonと同じMatplotlibによりグラフ描画を実行します。

**※Matplotlibによるグラフ描画では、予めPythonのインストール及びMatplotlibのインストールが必要です。**
インストール方法についてはこちらをご参照下さい。

:paperclip: Julia早引きノート［23］JuliaでのMatplotlibによるグラフ描画
https://qiita.com/ttabata/items/96a0e172addfac690cca


予め以下のようにインポートの宣言をしておきます。
`using PyPlot`

以下のようにプログラムを作成しました。

```ruby:2_activatioin_function
using PyPlot


# ステップ関数の定義
function step_function(x)
    return float(map(i -> i > 0.0, x))
end

# xを-5から5までの範囲で0.1ずつ増える配列とする
x = range(-5, 5, step=0.1)
    
# ステップ関数を実行し、yに格納します。
y = []
y = step_function(x)
    
# グラフ描画(x-y座標上にプロット)
plot(x, y)
```

グラフ描画の実行結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/d58d4f3c-fcf7-a170-b857-285aa2e8bfaf.png)


### ②シグモイド関数

シグモイド関数(sigmoid function)は一般的に以下のように定義されます。
eをネイピア数とします。

```math
\frac{1}{1+e^{-x}}\quad(式1)
```

入力パラメータが一つの整数または実数の場合のシグモイド関数を以下のように実装してみます。

```ruby:2_activatioin_function
function sigmoid_function(x)
    return 1 / (1 + exp(-x))
end
```

次に、ステップ関数の場合と同様に入力パラメータが一次元配列の場合のシグモイド関数を考えます。
map関数を使用し各要素に対して(式1)を計算し、結果を返すという形式にします。

```ruby:2_activatioin_function
function sigmoid_function(x)
    return map(i -> 1 / (1 + exp(-i)), x)
end
```

実際の動作確認の結果は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/dce8c9bf-669c-6c42-6bcf-41865aedc546.png)

上記のシグモイド関数をグラフに表してみます。
以下のようにプログラムを作成しました。

```ruby:2_activatioin_function
using PyPlot

# シグモイド関数の定義
function sigmoid_function(x)
    return map(i -> 1 / (1 + exp(-i)), x)
end

# xを-5から5までの範囲で0.1ずつ増える配列とする
x = range(-5, 5, step=0.1)

# シグモイド関数を実行し、yに格納します。
y = []
y = sigmoid_function(x)
    
# グラフ描画(x-y座標上にプロット)
plot(x, y)
```

グラフ描画の実行結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/47b2d5d2-5355-e129-8e5b-7478d2d5ee0f.png)


### ③ReLU関数

ReLU関数は以下のように定義されます。

```math
f(x) = \left\{
\begin{array}{ll}
x & (x \gt 0) \\
0 & (x \le 0)
\end{array}
\right.
\quad(式2)
```

入力パラメータが一つの整数または実数の場合のReLU関数を以下のように実装してみます。

```ruby:2_activatioin_function
function relu_function(x)
    return max(0, x)
end
```

シグモイド関数と同様に、入力パラメータが一次元配列の場合のReLU関数を考えます。
map関数を使用し各要素に対して(式2)を計算し、結果を返すという形式にします。

```ruby:2_activatioin_function
function relu_function(x)
    return map(i -> max(0, i), x)
end
```

実際の動作確認の結果は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/67738a1e-10a8-fec2-35e9-5f44fcd8b115.png)

上記のReLU関数をグラフに表してみます。
以下のようにプログラムを作成しました。

```ruby:2_activatioin_function
using PyPlot

# ReLU関数の定義
function relu_function(x)
    return map(i -> max(0, i), x)
end

# xを-5から5までの範囲で0.1ずつ増える配列とする
x = range(-5, 5, step=0.1)

# シグモイド関数を実行し、yに格納します。
y = []
y = relu_function(x)
    
# グラフ描画(x-y座標上にプロット)
plot(x, y)
```

グラフ描画の実行結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/3eb28dd9-aa87-c260-21dc-723aa8d4c9d7.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: ご意見など

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