ニューラルネットワーク・ディープラーニングで学習を行う際には重要となるものはいくつかありますが、その中の一つとして活性化関数があります。
この活性化関数によってネットワークの学習精度や時間に大きな差が出てしまいます。
そこで今回はニューラルネットワーク・ディープラーニングで使用されている基本的な活性化関数について調べました。
ステップ関数
ニューラルネットワークの元となった単純パーセプトロンやニューラルネットワークの初期に使用されていたのがステップ関数です。ステップ関数とは次のような曲線を描く関数です。
数式で表現すると次のようになります。
このように閾値を超えたら1、閾値より小さいのならば0を出力します。
単純パーセプトロンなどのニューラルネットワークの初期によく用いられましたが、現在では単純パーセプトロン以外ではあまり使用されません。
ステップ関数を用いた単純パーセプトロンでも誤り訂正学習等を使用することで簡単な関数を学習数ることはできます。
しかしステップ関数は上記の通り出力の変化が激しいので、ニューラルネットワークの学習には向きませんでした。
シグモイド関数
ニューラルネットワークの活性化関数としてよく使われていたのがシグモイド関数です。シグモイド関数は次のような曲線を描く関数です。
数式で表すと次のように表します。
シグモイド関数はステップ関数と比べると非常になめらかに変化していきます。この特徴はニューラルネットワークの学習には都合がよくニューラルネットワークの学習によく使われています。
しかしシグモイド関数を使用したニューラルネットワークでは、ネットワークの層が深いと勾配消失や勾配爆発などにより学習が進まなくなってしまいます。
TensorFlow及びKerasからは次のコードで利用することができます。
1 2 3 4 5 6 7 |
#TensorFlow tf.sigmoid(x) #x : テンソル #Keras model.add(Activation('sigmoid')) #Sequentialモデル時 |
tanh関数
tanh関数は名前の通り双曲線関数であるハイパボリックタンジェントをしようした活性化関数です。グラフで表すと次のような形になります。
tanh関数はシグモイド関数の変換から来ています。上記で示したシグモイド関数は原点を通っていません。そこでこれを原点をとおした形にしたかったからです。
ではなぜシグモイド関数がtanh関数になったかというと、シグモイド関数を変形するとtanhが出てきます。
TensorFlow及びKerasからは次のコードで利用することができます。
1 2 3 4 5 6 7 |
#TensorFlow tf.tanh(x) #x : テンソル #Keras model.add(Activation('tanh')) #Sequentialモデル時 |
ReLU関数
ReLU関数は近年開発された活性化関数で、シグモイド関数やtanh関数のように勾配消失を起こさず学習できます。ReLU関数をグラフで表すと次のようになります。
またReLU関数を数式で表すと次のようになります。
シグモイド関数やtanh関数を使用したニューラルネットワークは勾配下降法による学習を行う際、関数の微分値を何度も掛け合わせます。そのため層が深い学習が進まなくなります。しかしReLU関数は微分値が1なので掛け合わせても小さくなることがなく学習が進みます。
そのため近年ではシグモイド関数よりもよく使用されます
TensorFlow及びKerasからは次のコードで利用することができます。
1 2 3 4 5 6 7 |
#TensorFlow tf.nn.relu(x) #x : テンソル #Keras model.add(Activation('relu')) #Sequentialモデル時 |
ReLU6関数
ReLU6関数はReLU関数の出力の大きさに制限を持たせた関数です。出力値が6以上の時サチュレーションをかけ大きさを制限します。
ReLU6関数をグラフで表すと次のようになります。
また数式で表すと次のようになります。
TensorFlowからは次のコードで利用することができます。
1 2 3 |
#TensorFlow tf.nn.relu6(x) #x : テンソル |
まとめ
今回はニューラルネットワーク・ディープラーニングで使用されている基本的な活性化関数をまとめました。
活性化関数にはこれら以外にもELU関数やMaxout関数など様々な種類があります。それらの関数についてはまた別の機会にまとめたいと思います。
関連記事