Fresopiya
場所にもお金にも時間にも、何にも縛られない自由な状態になったら一体人間は何をしてどこに向かうのか。

まずはとにかく自由を目指すエンジニアのブログです。
「哲学」と「プログラミング」と「政治経済」、「ブログ」がメインになるかと。
人工知能(AI)

【人工知能】活性化関数の種類と違い。メリットデメリット。

どうも、とがみんです。

以前の記事で、パーセプトロンやニューラルネットワーク、誤差逆伝播法に夜重みパラメータの更新の仕組みについて紹介してきました。




この記事では、ニューラルネットワークに使用される活性化関数の種類や違い、メリット・デメリットについて紹介していきます。

活性化関数とその役割とは?

活性化関数とは、ニューラルネットワークにおいて、入力信号の総和を出力信号に変換する関数のことを言います。

非線形関数を用いることによってより複雑な関数を実現することができ、単一のパーセプトロンでは表せないような関数を表現するために利用されます。

勾配の発散、消失問題を防いだり、学習効率をあげるために、様々な活性化関数が考えられ、様々な種類の活性化関数が使われています。

また、活性化関数は、中間層(隠れ層)と出力層では区別して設計されます。

次に、活性化関数の種類について紹介していきます。

活性化関数の種類(中間層)

ステップ関数

ステップ関数は、入力が0を超えたら1を出力し、それ以外は0を出力する関数です。

    $$ y= \ \begin{cases} 0 \,\,\,(x\leq0) \\ 1\,\,\,(x>0) \end{cases} $$

このステップ関数はパーセプトロンの実装で使用されます。


シグモイド関数

シグモイド関数は、入力した値が大きいほど1に近づき、入力した値が小さいほど0に近づく関数です。

    $$ y = \frac{1}{1+\exp(-x)} $$

シグモイド関数は、入力に対して連続的に出力が変化し、微分の計算が簡単であることから、

1986年に発表された誤差逆伝播法による学習を伴うニューラルネットワークに使われるようになりました。

シグモイド関数の微分は以下のように表され、容易に計算することができます。

    $$ y^{'} = (1-y)y $$

しかし、このシグモイド関数には、以下のようなデメリットがあります。

  • 入力が極限に大きく、または小さくなると勾配が消える。
  • 誤差逆伝播によるパラメータの更新において、入力層に近ずくほど、学習量が小さくなり、学習が進まなくなってしまう。
  • 微分値の最大値が0.25であり、学習の収束が遅い。

>Activation functions and it’s types-Which is better?

>Yann LeCun, Leon Bottou, Genevieve B. Orr, and Klaus-Robert Muller “Efficient BackProp” (1998)

tanh関数

1990年に、活性化関数tanh関数は上記のシグモイド関数のデメリットを改善する活性化関数として提案されました。

    $$ y = \frac{\exp(x) - \exp(-x)}{\exp(x) + \exp(-x)} $$

シグモイド関数と比較して、以下のようなメリットがありますが、大きな入力に対する勾配の消失のデメリットがまだ残っています。

メリット

  • 誤差逆伝播んによるパラメータの更新において、微分値の最大値が「1」なので、シグモイド関数に比べ、入力層に近づくにつれて学習が進まなくなってしまう影響が小さい。
  • 出力が−1から1であり、出力がゼロにセンタリングされることで、学習の収束がシグモイド関数よりも容易。

デメリット

  • シグモイド関数同様、入力が極限に大きく(小さく)なると勾配が消えてしまう。

ReLU関数

ReLU関数は入力が0を超えていれば、そのまま値を出力し、そうでなければ0を出力するというものです。

    $$ y = max(0,x) $$

ReLU関数はx=0において、非連続で微分不可能ですが、その他の領域では微分可能なので、微分可能な活性化関数として扱われることが多いです。

2011年に、Xavier Glorotらが、中間層(隠れ層)の活性化関数として、ReLU関数を使った方がtanh関数を使うよりも、学習性能がよくなることを発表しています。

>Deep Sparse Rectifier Neural Networks

ReLU関数は以下のようなメリット、デメリットがあります。

メリット

  • 微分値が定数なので、計算量を圧倒的に減らせ、誤差逆伝播の計算効率が良い。
  • 微分値が一定であることから、誤差逆伝播による勾配の消失問題を防ぐことができる。

デメリット

  • 入力が負の時、微分値が0なので、重みパラメーたの更新がされない。

このようなメリットから、深い層のニューラルネットワークの学習が可能になり、現在多くのニューラルネットワークで使用されている活性化関数です。

また、このデメリットを改善するために、Leaky Relu 、PReLU、Eluなどの様々な活性化関数が提案されています。

>活性化関数ReLUについてとReLU一族【追記あり】

Leaky Relu

Leaky Relu関数は、ReLU関数の負の入力値における勾配消失を防ぐために、x<0において小さな傾きを持たせた関数です。

    $$ y= \ \begin{cases} x\ (x>0)\ \\ 0.01x\ (x\leq0) \end{cases} $$

Wikipediaによると、この関数の命名者は、この活性化関数を使う意味はなかったと報告しているそうです。

>活性化関数|Wikipedia

PReLU(Parametric ReLU)

PReLUは、ReLUのx<0における傾きを学習させながら適切に変化させます。

    $$ y= \ \begin{cases} x\ (x>0)\ \\ ax\ (x\leq0) \end{cases} $$

以下の論文では、ReLUと比較して、ほとんど計算量コストをかけずに、性能が改善されたことが報告されています。

>Delving Deep into Rectifiers:
Surpassing Human-Level Performance on ImageNet Classification

RReLU(Randomized ReLU)

RReLUは学習時に、x<0における傾きを与えられた範囲内でランダムに変化させることによって、過学習を防ぐことができます。

以下の論文で、ReLU関数、Leakey ReLU関数、PReLU関数、RReLU関数の比較がされています。

>Empirical Evaluation of Rectified Activations in Convolution
Network

Selu(Scaled Exponential Liner Units)

SELUは以下の式で表される関数です。

    $$ y= \lambda \ \begin{cases} x\ (x>0)\ \\ \alpha(\exp(x)-1)\ (x\leq0) \end{cases} $$

適切なパラメータは理論的に定まり、α=1.67326…、λ=1.0507…となります。

>ReNom 内にある活性化関数

>Günter Klambauer, Thomas Unterthiner, Andreas Mayr, Sepp Hochreiter. Self-Normalizing Neural Networks. Learning (cs.LG); Machine Learning

>[DL輪読会]Self-Normalizing Neural Networks

Elu(Exponential Linear Units)

Seluにおいてλ=1とおいたものがEluです。

    $$ y= \ \begin{cases} x\ (x>0)\ \\ \alpha(\exp(x)-1)\ (x\leq0) \end{cases} $$

下記の論文ではReLU関数、Leaky ReLU関数、SReLU関数、Elu関数が比較されています。

>FAST AND ACCURATE DEEP NETWORK LEARNING BY
EXPONENTIAL LINEAR UNITS (ELUS)

Maxout

Maxout関数は、活性化関数自体を学習させるという手法です。

ReLU関数や2次関数など様々な関数に近似することができため、MaxoutはReLUよりも表現力が高く、勾配が消えないという特徴を持っています。

詳しくは以下の記事に書かれています。

>数式で書き下す Maxout Networks

>文書分類をタスクとしたPylearn2 の Maxout+Dropout の利用

>Maxout Network

活性化関数(出力層)

出力層の活性化関数は、中間層の活性化関数とは区別して設計され、誤差関数はその中間層の活性化関数とセットで設計されます。Nは訓練データの個数、tは教師データ、yは出力データです。

恒等関数

回帰分析にニューラルネットワークを使用する場合は、恒等関数を使用します。

    $$ y = x $$

出力層の活性化関数として、恒等関数を使用した場合、誤差関数は、二乗和誤差を利用します。

    $$ E = \frac{1}{2} \sum_{n=1}^{N}(y_n-t_n)^2 $$

シグモイド関数

二値分類をするニューラルネットワークの出力層の活性化関数として、シグモイド関数を使用します。

    $$ y = \frac{1}{1+\exp(-x)} $$

出力層にシグモイド関数を使用した場合に利用する誤差関数は、以下のものです。

    $$ E = -\sum_{n=1}^{N}(t_n \log y_n+(1-t_n)\log(1-y_n)) $$

ソフトマックス関数

多クラス分類をするニューラルネットワークにおいては、出力層の活性化関数として、ソフトマックス関数を使用します。

Kは分類するクラスの数です。

    $$ y(x_k) = \frac{\exp(x_k)}{\sum_{i=1}^{K}exp(x_i)} $$

出力の総和が1となり、出力を確率として解釈することができます。

誤差関数には交差エントロピー誤差関数を使用し、偏微分は以下のようになります。

    $$ E = -\sum_{n=1}^{N}\sum_{k=1}^{K}t_{n,k}log y_{n,k}} $$

まとめ

活性化関数の種類と、そのメリット、デメリットについて紹介しました。

ニューラルネットワークに使われる活性化関数としてReLU関数がメジャーだそうですが、ニューラルネットワークの層の数等によって最的な活性化関数が変わると思うので、実際にニューラルネットワークを利用する際は比較検討したいところですね。。。

参考文献

>活性化関数の紹介

>Follow
Visualising Activation Functions in Neural Networks

>活性化関数についてのまとめ(ステップ関数・シグモイド・ReLU等々)

>Delving Deep into Rectifiers:
Surpassing Human-Level Performance on ImageNet Classification

>活性化関数|Wikipedia

>Activation functions and it’s types-Which is better?

>TensorFlow ライブラリの機械学習処理フローの練習コード集

>活性化関数ReLUについてとReLU一族【追記あり】