活性化関数の種類と特徴まとめ

### 活性化関数とは
　どうもNegimaruです。今回は、ニューラルネットワークの活性化関数について整理します。活性化関数とは、ニューラルネットワークに非線形性を持たせることで表現力をUPさせるものです。実際、非線形な活性化関数を用いないと、ニューラルネットワークをいくら深くしても1層のニューラルネットワークと同等の表現力しか持てません。なぜならば、ある層から次の層への変換は行列積で表され、複数の行列の積も行列となるからです。よって活性化関数はニューラルネットワークに欠かせないのです。さて、活性化関数には種類がたくさんあります。それぞれの活性化関数の特徴はどのような点で、どういうときに使うべきかを整理したことがなかったので、代表的なものについてまとめてみようと思います。自分が勉強する中で新しいものに出会ったら、その都度追記していきます。

### 1. Sigmoid関数
　まずは、Sigmoid関数について説明します。順伝播と逆伝播の式は次のようになります。
$$y = \frac{1}{1 + e^{-x}}$$
$$\frac{\partial y}{\partial x} = y(1 - y)$$
それでは、特徴と用途を述べます。
- $|x|$が少しでも大きくなるとすぐに勾配が0になってしまう。また微分の最大値が0.25なので、層を重ねると勾配消失が起きる。従って、隠れ層ではあまり使われない。（以降説明する他の関数のほうが学習効率が良い。）
- 値域が$(0, 1)$であることから、二値分類の出力層に使用。（二値分類の出力層では、入力のラベルが1である確率を出力することが多いから。また、交差エントロピー誤差と合わせて使うと、勾配の計算が綺麗になるから。）

グラフは次のようになります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605268/f4a522b8-097a-2614-724e-4a8b456b9bbb.png"/>

### 2. tanh関数
次にtanh関数について説明します。tanh関数はSigmoid関数の欠点である、勾配消失を改善するために考案された活性化関数の1つです。順伝播と逆伝播の式は次のようになります。

$$y = tanh(x) =  \frac{e^{x}-e^{-x}}{e^{x} + e^{-x}}$$
$$\frac{\partial y}{\partial x} = 1 - y^{2}$$

それでは特徴と用途を見ていきましょう。
- 実は、Sigmoid関数を平行移動してスケール変換した関数。実際、$tanh(x) = 2 \times sigmoid(2x) - 1$
- 微分の最大値が1($x =$ 0のとき)となったことで、Sigmoid関数よりは勾配消失が起きにくくなっている。
- 出力が$(-1, 1)$であり中心が0になることから、出力層で用いられることが多い。
- しかし、$|x|$が大きくなると勾配が0になってしまう問題は依然として残っている。よって、隠れ層ではあまり使われない。

グラフは次のようになります。
![tanh.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605268/b6d93ffd-b00d-ef17-b269-0c3f0ad98add.jpeg)

### 3. ReLU関数
次はReLU関数について紹介します。この関数の順伝播と逆伝播は、以下のような非常にシンプルな式で表されます。

$$y = max(x, 0)$$
$$ \frac{\partial y}{\partial x} = 
\begin{cases}
  1 \left(x \gt 0\right) \\\\
  0 \left(x \le 0\right)
\end{cases} $$

特徴と用途は次の通りです。
- 計算が高速。
- $x \gt 0$では勾配消失が起きない。
- 上記2つの特徴から、隠れ層に多く用いられる。ReLU関数のさまざまな派生形は、主流な活性化関数となっている。
- $x=0$で微分不可能であるが、$x=0$という値はほとんどとらないことから、この点での微分はとりあえず$0$としている。
- $x \lt 0$では学習が一切進まない点がデメリット。

グラフは次のようになります。
![relu.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605268/9372055e-85f5-b98b-060e-2d04562cfc16.jpeg)


### 4. Leaky ReLU関数
Leaky Relu関数は、$x \le 0$のとき学習が進まないというRelu関数の弱点を克服するためにRelu関数を改善したものです。順伝播と逆伝播の式は次のようになります。

$$y = max(x, 0.01x)$$
$$ \frac{\partial y}{\partial x} = 
\begin{cases}
  1    \left(x \gt 0\right) \\\\
  0.01 \left(x \le 0\right)
\end{cases} $$

次のような特徴と用途があります。
- 計算が高速であり、$x \gt 0$で勾配消失が起きないというRelu関数の特徴はそのまま引き継いでいるので、隠れ層で使われる。
- $x \le 0$でも勾配が0にならないので少しだけ学習が進む。
- $x = 0$では微分不可能だが、便宜的に0.01としている。

グラフは次のようになります。$x \le 0$でわずかに傾いています。
![lrelu.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605268/b6eb1c7c-9561-5691-a4af-94099bff634a.jpeg)

### 5. 恒等関数
　ここまで述べてきたように活性化関数は基本的には非線形関数です。しかし、線形なものもあります。線形な活性化関数は、ニューラルネットワークの表現力を上げるために用いられるわけではありません。その用途は、回帰の出力層で使うことです。ようは、回帰の出力層の時だけ活性化関数が存在しないノードを考えると実装が統一的でなくなってしまうので、とりあえず線形関数を活性化関数としておこうというわけです。その代表例が恒等関数です。順伝播、逆伝播の式とグラフは省略します。用途だけ書いておきます。

- 回帰の出力層で使う。（実装を統一的にするため。）

### 6. その他
　以上の他にもSoftmax関数など重要な活性化関数があります。それらについては追記します。

### 7. 参考文献
- [とにかくたくさんの活性化関数を紹介している記事](https://qiita.com/kuroitu/items/73cd401afd463a78115a)
- [主要な活性化関数を紹介している記事](https://fresopiya.com/2019/05/14/activefunc/)
- [Courseraの講座](https://www.coursera.org/learn/neural-networks-deep-learning?specialization=deep-learning)