活性化関数

**活性化関数**（かっせいかかんすう、）もしくは**伝達関数**（でんたつかんすう、）とは、ニューラルネットワークのニューロンにおける、入力のなんらかの合計（しばしば、線形な重み付け総和）から、出力を決定するための関数で、非線形な関数とすることが多い。

## 概要
よく使われているモデルでは、人工ニューロンは1つ以上の入力を受け取り（1つ以上の樹状突起に相当）、それらの重み付け総和から、活性化関数を通して、出力を生成する。

:

数式では、以下の\varphiが活性化関数。
:y =  \varphi \left( \sum_{i=1}^m w_{i} x_i + b \right)

古典的にはステップ関数が提案された。他にもいろいろと考えることはできる。1986年のバックプロパゲーションの発表以降はシグモイド関数が最も一般的だった。現在はReLU（ランプ関数）の方が良いと言われる。活性化関数は単調増加関数が使われる事が多い。必ずしもそうしなければいけないという物でもなく動径基底関数なども使われる。

## 種類
人工神経の活性化関数は、ネットワークを強化または単純化するような特性を持つものが選ばれる。実際、線型伝達関数を使った多層パーセプトロンには、全く等価な単層ネットワークが必ず存在する。したがって、多層ネットワークの利点を生かすには非線形関数が必須である。

以下ステップ関数と線形結合の説明では、人工神経への全入力の重み付けされた総和を *u* で表し、入力数を *n* で表す。

:u = \sum_{i = 1}^n w_{i} x_{i}

ここで *w* はシナプスの重み付けベクトルであり、*x* は入力ベクトルである。これはバイアス項を加える前の値。

### ステップ関数

1943年の、いわゆる「マカロックとピッツ」の発表で提案されたもの。

ステップ関数の出力 *y* は 0 か 1 の二値であり、*u* がしきい値 *b* より大きいか小さいかで出力が決定される。入力の総和がしきい値以上であるとき、出力信号が 1 として出力される。

:y = H(u - b) = \left\{ \begin{matrix} 1 & \mbox{if }u \ge b \\ 0 & \mbox{if }u 
:\varphi(x) = H(x)

### パーセプトロン

パーセプトロンでは、前述のモデルから、線型和にバイアス値 *b* を加えることが提案された。

:y = u + b
:\varphi(x) = x

一般にこのような純粋な形式の伝達関数は回帰設定の場合のみしか使えない。二値分類設定では出力の符号で 1 または 0 に対応させる。これはすなわち、上述のステップ関数で b の符号を反転した場合と等価であり、学習アルゴリズムで有効である。

### シグモイド関数
:\varphi(x) = \varsigma_1 (x) = \frac{1}{1+e^{-x}} = \frac{ \tanh(x / 2) + 1 }{ 2 }
比較的単純な非線形関数であるシグモイド関数は、微分の計算も容易であることから1986年に発表されたバックプロパゲーションを伴うニューラルネットワークで使われる。ネットワークを数学的に扱うことが容易になるため、シミュレーションの計算負荷を減らしたいと思っていた初期の研究者がシグモイド関数をこぞって採用した。

1990年代になり、活性化関数は原点を通すべきと言う考えから、標準シグモイド関数よりもそれを線形変換した tanh の方が良いと提案された。
:\varphi(x) = \tanh(x)

### ソフトサイン
下記関数をソフトサイン（）と呼び、2010年の Xavier Glorot らの研究では tanh と同程度に良かった。
:\varphi(x) = \frac{x}{1 + |x|}

### ソフトプラス

下記関数をソフトプラス（）と呼び、これが活性化関数として使われることもある。
:\varphi(x) = \log(1 + e^x)

### ReLU（ランプ関数）

2011年、Xavier Glorot らは隠れ層の活性化関数としてmax(0, x) を使った方がtanhやソフトプラスよりも改善するということを発表した。一般的にはこれはランプ関数と呼ばれるが、ニューラルネットワークの世界では**ReLU** (、正規化線形関数）と呼ばれる。ヤン・ルカンやジェフリー・ヒントンらが雑誌ネイチャーに書いた論文では、2015年5月現在これが最善であるとしている。発想としては区分線形関数を使った1次スプライン補間である。線形補間を参照。
:\varphi(x) = x_+ = \max(0, x)

2013年にmax(0.01x, x) がLReL (leaky rectified linear) と命名された。ただし、命名者はこの活性化関数を使う意味はなかったと報告している。

2018年にx*sigmoid(x) がSwish (あるいはSiLU, sigmoid weighted linear) と命名された。この関数はReLUよりも高い分類精度を得ることができると示されている。

### 切断冪関数
ランプ関数（ReLU）を一般化すると切断冪関数になり、n次スプライン補間。2乗はクォーターパイプ関数（）とも呼ばれる。
:\varphi(x) = x_+^n = (x_+)^n

### 多項式
2次以上の多項式も非線形関数であり、活性化関数に使える。
:\varphi(x) = x^n,\ n \ge 2

### 絶対値
絶対値はReLU（ランプ関数）と同様、線形に近い非線形関数。傾きが0の場所が無いという特徴がある。
:\varphi(x) = |x|

### Snake
2020年に Liu Ziyin らが提案したSnake関数は正弦関数を使用した単調増加の関数であり、ReLU等に比べ周期的な入力に対しより頑健になることが期待される。
:\varphi(x) = x + \sin^2 x

### 三角関数
2020年に Vincent Sitzmann らが活性化関数に正弦関数を使う物をSIREN（Sinusoidal representation networks）と命名した。画像や音声等の情報をニューラルネットワークへ符号化するタスクにおいて、他の活性化関数よりも高い精度を得られたことが確認されている。
:\varphi(x) = \sin x

### 動径基底関数
1988年に David S. Broomhead らが活性化関数に動径基底関数を使う物を動径基底関数ネットワーク（RBFネットワーク, radial basis function network）と命名した。
: \varphi(x) = \exp(- \beta x^2)

### ウェーブレット
1992年に Qinghua Zhang らが活性化関数にウェーブレットを使う物をウェーブレットネットワークと命名した。

### maxout
2013年に Ian J. Goodfellow らが発表した活性化関数。通常の活性化関数は実数から実数への写像であるが、活性化関数 maxout は（線形変換した後の）複数の実数の値に対する最大値を出力とする。発表者は dropout（層内を全結合にしない手法）との併用で論文を書いている。

## 出力層の活性化関数と誤差関数
出力層は隠れ層とは区別して設計する。活性化関数と誤差関数をセットで設計する必要がある。そして、問題の種類ごとにそれらは異なる。絶対的なルールはないが、下記の方法が一般的な方法である。ここであげた手法は誤差関数の偏微分が全て出力と目標値の差になっていて扱いやすい。

変数の使い方は以下の通り。
* N：訓練データの個数
* d_n：n番目の訓練データの目標値
* y_n：n番目の訓練データの出力

### 回帰
* 活性化関数：\varphi(u) = u
* 誤差関数：E(w) = \frac{1}{2} \sum_{n=1}^N \| y_n - d_n \|^2
* 誤差関数の偏微分：\frac{ \partial E_n(w) }{ \partial u } = y_n - d_n

### 二値分類
出力は1つで確率と解釈する。d_n は 0 または 1 もしくは確率。誤差関数は最尤推定で導出できる。
* 活性化関数：\varphi(u) = \varsigma_1 (u) = \frac{1}{1+e^{-u}}
* 誤差関数：E(w) = - \sum_{n=1}^N (d_n \log y_n + (1 - d_n) \log (1 - y_n))
* 誤差関数の偏微分：\frac{ \partial E_n(w) }{ \partial u } = y_n - d_n

### 多クラス分類
K 個のクラスに分類する。出力は K 個で、総和は 1 であり、そのクラスに所属する確率と解釈する。d_{n,k} は 0 または 1 もしくは確率で、n 番目の訓練データがクラス k に所属する時 1。\sum_k d_{n,k} = 1 。交差エントロピーを使用している。この活性化関数はソフトマックス関数と呼ばれる。このまま計算すると浮動小数点数に入りきらなく、オーバーフローすることが多いが、u_k は全て同じ数を引いた場合は結果が同じになる事を利用して、\max_k u_k を全てから減算して活性化関数を計算すると良い。
* 活性化関数：\varphi(u_k) = \frac{e^{u_k}}{\sum_{i=1}^K e^{u_i}}
* 誤差関数：E(w) = - \sum_{n=1}^N \sum_{k=1}^K d_{n,k} \log y_{n,k}
* 誤差関数の偏微分：\frac{ \partial E_n(w) }{ \partial u_k } = y_{n,k} - d_{n,k}

## 論理演算
論理演算の実装を、活性化関数が、マカロックとピッツのモデル（ステップ関数）の場合とランプ関数（ReLU）の場合とで示す。よく知られているように、中間層のニューロセルの無い単純パーセプトロンでは、線形分離不可能なものは扱えない。例えばこの例では、2入力のXORを実装できないため、実際に以下に示すようにXORでは中間層が必要になっている。真 = 1で偽 = 0、ReLU は真 = 1で偽 = -1である。ReLUは出力の正負で真偽を判断する。

## 関数近似
ランプ関数（ReLU）にて y = x^2 を近似してみる。
; 訓練データ
: (x, y) = {(-3, 9), (-2, 4), (-1, 1), (0, 0), (1, 1), (2, 4), (3, 9)}
; 学習結果
: 2\varphi(-x - 2) + 2\varphi(-x - 1) + \varphi(-x) + \varphi(x) + 2\varphi(x - 1) + 2\varphi(x - 2)
これは折れ線によって近似している（線形補間）。これを一般化すると十分な数のニューロンがあれば任意の関数がランプ関数（ReLU）を活性化関数として使って表現できることが分かる。

## 出典