ニューラルネットワークで使われる活性化関数まとめ


現在のAIブームで注目されているニューラルネットワークでは活性化関数という関数が用いられます。
本記事では、ニューラルネットワークで使われる代表的な活性化関数を紹介します。

本記事の内容

ニューラルネットワークにおける活性化関数
・活性化関数
・ステップ関数
・シグモイド関数
・ReLU関数
・ソフトマックス関数
・恒等関数
最近の活性化関数
・Swish関数
・Mish関数
最後に

ニューラルネットワークにおける活性化関数

ニューラルネットワークは、人間の脳の神経細胞(ニューロン)を電気信号が伝わっていく様子を模倣したものです。
そのことから、ニューラルネットワークの最小単位は人工ニューロン(neuron)と呼ばれます。
ニューロンにおける入力に重みを乗算し、バイアスを加えた総和から出力を決定する関数のことを活性化関数と言います。
活性化関数は、ニューロンへのすべての入力を出力に変換する関数で、出力を決定するための非線形変換を担います。
活性化関数にはどんなものがあるか詳しく見ていきましょう。
AI(人工知能)用語集の中の活性化関数はこちら

本記事では関数のグラフを描くコードも載せておきます。

活性化関数

ステップ関数

まずは基本的なステップ関数です。
これは単純パーセプトロンと全く同じものになります。

グラフは以下のようになります。

Pythonでグラフを描くコードは以下のようになります。

import numpy as npimport matplotlib.pyplot as pltdef step_function(x):y = x > 0return y.astype(np.int)x = np.arange(-10.0, 10.0, 0.1)y = step_function(x)plt.plot(x, y)plt.ylim(-0.1, 1.1)plt.show()

シグモイド関数

シグモイド関数はあらゆる入力値を0~1の範囲の数値に変換して出力する関数です。
ニューラルネットワークでよく用いられてきた関数です。

しかし、シグモイド関数を用いると勾配消失問題が起きやすく、学習が停滞してしまうことがあるため最近ではあまり用いられません。


グラフを描くコードは以下のようになります。

import numpy as npimport matplotlib.pyplot as pltdef sigmoid_function(x):  return 1 / (1 + np.exp(-x))input_data = np.arange(-10.0, 10.0, 0.1)output_data = sigmoid_function(input_data)plt.plot(input_data, output_data)plt.ylim(-0.1, 1.1)plt.show()

ReLU関数

ニューラルネットワークでシグモイド関数の次に用いられてきたのがReLU関数です。

ReLU関数は勾配消失問題が起きにくく、形が簡単なので計算しやすいという特徴があります。

グラフを描くコードは以下のようになります。

import numpy as npimport matplotlib.pyplot as pltdef relu(x):  return np.maximum(0, x)x = np.arange(-10.0, 10.0, 0.1)y = relu(x)plt.plot(x, y)plt.show()

ソフトマックス関数

ソフトマックス関数はニューラルネットワークにおいて分類問題の出力層で用いられます。

ソフトマックス関数は出力の総和は1になるという特徴があります。
グラフは以下のようになります。

コードで確認してみます。

import numpy as npimport matplotlib.pyplot as pltdef softmax(a):  exp_a = np.exp(a)  sum_exp_a = np.sum(exp_a)  y = exp_a / sum_exp_a return y#a = np.array([0.3, 2.9, 4.0])a = np.array([0.5, 3.1, 4.3])y = softmax(a)print(y)print(np.sum(y))#合計は1になるx = np.arange(-5.0,5.0, 0.1)y = softmax(x)plt.plot(x, y)plt.show()

実行結果は、
[0.01690191 0.22756284 0.75553525]

1.0
となります。

恒等関数

出力層で用いられる関数には恒等関数もあります。
常に入力した値と同じ値をそのまま返す関数です。
この関数は、一般的に回帰問題で用いられます。


コードは以下のようになります。

import numpy as npimport matplotlib.pylab as pltdef identity(a):  return ax = np.arange(-10.0, 10.0, 0.1)y = identity(x)plt.plot(x, y)plt.show()

最近の活性化関数

ReLU関数の後継として提案されたSwish関数とMish関数について紹介していきます。

Swish関数

Swish関数は2017年に提案されたReLU関数によく似た形の関数です。
しかし、x=0でも連続な関数となるところが違いになります。
Swish関数は以下のように表されます。

式を見ると分かるように、σ(βx)はシグモイド関数になっています。
β=1の場合のグラフを描いてみます。

コードは以下のようになります。

import numpy as npimport matplotlib.pyplot as pltdef sigmoid_function(x):  return 1 / (1 + np.exp(-x))def swish(x):  return x * sigmoid_function(x)x = np.arange(-10.0, 10.0, 0.1)y = swish(x)plt.plot(x, y)plt.show()

Mish関数

Mish関数はさらに最近の2019年に提案された活性化関数になります。
Swish関数よりも良い性能を発揮することが分かっています。
式は次のように表されます。

σ(x)はソフトプラス関数と呼ばれています。
グラフは以下のように表されます。

コードも載せておきます。

import numpy as npimport matplotlib.pyplot as pltdef softplus(x):  return np.log(1.0 + np.exp(x))def tanh(x):  return (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x))def mish(x):  return x * tanh(softplus(x))x = np.arange(-10.0, 10.0, 0.1)y = mish(x)plt.plot(x, y)plt.show()

Swish関数とほとんど変わらないように見えますが、二つを重ねてみましょう。

青線がSwish関数、オレンジ線がMish関数になります。
グラフより、x=0付近の変化がMish関数の方がダイナミックであることが分かります。
これは誤差が顕著に伝わることを示します。
ただ、指数計算が多いので、計算に少し時間がかかるといった点もあげられます。
Mish関数は実装が簡単で効果も高いためニューラルネットワークにおいて最近注目されている活性化関数になります。

最後に

以上、ニューラルネットワークにおける代表的な活性化関数を紹介しました。
それぞれの関数によって、メリットデメリットがありますが、構築するモデルにあったものを用いて使いこなすことができると良いですね。
様々な活性化関数についての動画もこちらから見られます。

最後までご覧いただきありがとうございました。

最新情報をチェックしよう!
企業向けAI人材育成サービス

企業向けAI人材育成サービス

AI事業発足やAI導入に必要な人材育成のステップとAI研究所が提供するサービス。AI研究所の人材育成サービスでは、3つのステップを軸に御社の業務内でAIを活用できる人材育成やAIプロジェクトの支援を行います。

CTR IMG