1. 活性化関数とは [概要]
活性化関数 (activation function, 激活函数)とは,ニューラルネットワーク中の1つのニューロンにおいて,複数ノードの和を入力として,その出力を最終決定する関数である.名前の通り「小さな入力値を活性化させて,大きな出力を得ること」が,活性化関数の主目的である.
この記事では,現代のディープニューラルネットワークで用いられる「活性化関数」について,その役割や機能をまとめる.また,活性化関数を以下の2種類に分類して述べる:
- 隠れ層用(3,4節):tanh関数や,ReLU型の活性化関数
- 出力層用(5節):シグモイド関数・softmax関数
※ この2分類は, Deep Learning Bookの2分類に揃えたものである
1.の隠れ層では,毎回の線形層の出力値を活性関数で活性化する.この際,tanhやシグモイドのように「S字型で,入力値を押しつぶし (squashing) することができる形状の非線形関数」を使用することで,出力値の強い値だけ特徴を強調して伝搬し,弱い入力値は0や-1に近い値に抑制して出力し,次の層で無視するような出力を期待できる(※ 2.1.1説で述べるように,これらは「ステップ関数」の代替関数である ).これにより,各層の活性化関数を経ると,必要な特徴のみ厳選・強調(=検出)されていき,学習も安定・高速化する.
CNNの隠れ層の場合だと,畳み込み層でフィルタリングをしたあとに,毎回 ReLU型関数を活性化関数として用いる.これにより,深いCNN全体で,複雑な非線形表現を学習でき,モデル全体の表現力が増す.逆にDNNにおいて,ReLUを配置しないで畳み込み層だけ繰り返すだと,層数をいくら深くしても,線形変換の合成しかモデリングできないゆえ,表現力が低い.
2. の出力層では,シグモイド関数や,softmax関数により,最終出力値を確率分布ベクトル化(各要素の和を1に)する出力値全体の調整を行ったうえ,強調・抑制を行う(= argmax関数の役割と同等).これにより,2値出力や,one-hotベクトルのターゲットベクトルとの損失を取ることができる出力になるうえ,(soft)argmax化により,多数クラスの中でも1つの正解らしきクラスだけが大きな確率値に強調される
1.1 記事の構成
2節以降の構成を以下に示す:
- 2節:活性化関数の目的と役割
- 2.1 隠れ層での目的と役割
- 2.2 出力層での目的と役割
- 3〜4節 隠れ層用:
- 3節 古典:古典的な活性化関数(tanhやシグモイド)
- 4節 現代:ReLUとその発展型 (PReLU, GELU, Mishなど)
- 5節 出力層用:
- 6節 まとめ
まず,前置きとして2節では,活性化関数の(主にニューラルネットワークでの)使用目的と役割についておさえる.その後,3節以降では,隠れ層用の活性化関数を,隠れ層用(3,4節),出力層用(5節)の2種類に分類して紹介する.
ReLU (Rectified Linear Unit) [Glorot et al., 2011] が提案されて,そのあとAlexNet (2012)での使用によりCNNにおいても実績が出て以来,現在のディープラーニングの隠れ層の活性化関数では,ReLU型の活性化関数が主に使われる(4節).よって,隠れ層用の活性化関数は,シグモイドやtanhなどの「ReLU登場前からあるもの(3節)」と,ReLU登場後の「ReLU型の活性化関数(4節)」の2つに分類して述べる.
2. 活性化関数の目的と役割
2.1 隠れ層での目的と役割

この節では,$j$番目の隠れ層の,出力$y_i$を担当するニューロンにおいて,シグモイド関数を活性化層に用いた場合(図1-a)を例として,「隠れ層における活性化層の目的(もとい役割)」について考えたい.
このとき,隠れ層の活性化関数は,以下の2つの目的を達成するために使用する:
- 【押しつぶし】線形層で,各ノードの入力を,重み$w_{ji}$で掛けて和をとると大きい値になる(図1-a).よって活性化関数を通すことで,$[0,1]$などの狭い単位長の出力範囲内への押し潰し(squashing)をおこなう(図1-b).
- 入力値の定義域全体を,グシャっと押しつぶして「入力値の範囲よりも狭い範囲」の出力値に押し込める(※ “squashing”を画像検索してもらうと,イメージがつかめる)
- 【識別力を高める】各ニューロン出力(活性化値)の2クラス識別性能を高め,隠れ層の特徴としての識別性能を向上させる.
例えば,3層MLPの隠れ層に,シグモイド関数を活性化関数で使用した場合を考える(図1).シグモイドは閾値$\theta = 0$と出力の中央値$0.5$を中心に,上下左右とも対称な関数である.よって,入力が閾値から離れるほど,両端の飽和値「0か1」の出力を取る.
また,押しつぶし効果により,入力の各値よりも,活性化された出力は,1付近と0付近の値に集中(漸近)するので,ニューロンユニットの2クラス分類性能が増す(図1-b).
2.1.1 S字形微分可能関数で代替

昔のニューラルネットワーク以前のパーセプトロンでは,活性化関数にも線形の「ステップ関数」を用いていた(図2-a).ステップ関数は,閾値(ここでは0)以上の値を1に,閾値以下の値を0に変換する関数である:
\begin{align}
y_j =
\begin{cases}
1 & (t_j \geq 0)\\
0 & (t_j < 0)
\end{cases}
\tag{2.1}
\end{align}
前述の2つの目的は,非線形の関数を用いずとも,ステップ関数でも達成できる.
しかし,3層MLPで,勾配降下法により誤差逆伝搬をおこないたい際に,ステップ関数だと「微分値が全て0である」ゆえに扱いづらい.また,ステップ関数しか活性化関数に使わないと,全ての層が線形層の構成になるなので,ニューラルネットワーク全体が線形表現化してしまい,非線形の複雑な入出力関係を学習できないモデルになってしまう.
そこで,シグモイドやtanhなどの微分可能なS字形関数が,ステップ関数の代替として使われるようになった(図3-b).これらの関数は入力値の押しつぶしが可能なS字形であり,ステップ関数の代わりの役割を担うことができる.それでいて,これらは微分可能でもあるので,バックプロパゲーションによる最適化が可能であるので,ニューラルネットの(微分可能)層として使用できる.
こうして3層MLPでは,各ニューロンユニットの出力が,活性化関数を通るごとに非線形化されて(ソフトに)NMSされるので,必要な情報だけを強めて他は弱める情報伝達ができるようになり,高い表現力を持つ予測モデルになった.
2.1.2 応答の強い箇所だけ強調
CNNの隠れ層において,活性化関数(主にReLU型の関)は,NMS(Non-maximal Suppression)を実施していることに相当している.画像上・特徴マップ上において,tanhやReLU型関数は「閾値以上の位置の出力」だけをそのまま・もしくは強めて出力し,他の箇所は0や-1の値に抑制して出力するからである.
※詳しくは,NMS(Non-maximal Suppression)の記事の,3節を参照
この類似性から,CNNにおける活性化関数を検出層(detector layer)と役割名で呼ぶ場合もある.このはなしはDeep Learning Book だと,9.3節 Poolingの冒頭に書いてある(ただし,最近はこの呼び方は聞かない).
2.2 出力層での目的と役割
2.2.1 識別NNの場合
識別問題向けニューラルネットワークでは,出力層softmax関数や,シグモイド関数などをで用いる.その使用目的も,基本的に前述の「隠れ層向けの2つの目的」(2.1節)と共通していて,出力を「ぺしゃんこ化」することにある.
これら2.1冒頭の2目的に,識別問題だと,以下の目的3も追加される:
- 【出力値をベルヌーイ・マルチヌーイ分布にする】各ニューロンの入力群に対して,softmax関数などで,確率的分布出力化する(5節).
ロジスティック回帰や,識別モデル向けのニューラルネットワーク・CNNでは,「入出力の条件付き確率が,Kクラス構成のマルチヌーイ分布である」と仮定する.よって,そのためにsoftmaxを出力層に用いて,出力ベクトルをマルチヌーイ分布化するのが通例である (詳しくはsoftmaxの記事を参照).
2.2.2 回帰NNの場合
回帰問題向けでは,出力層ではとくに活性化関数を使わず,出力スカラーもしくは出力ベクトルを最小自乗誤差(MSE)の損失関数で学習することが多い.
逆に言うと,出力のバラつきや範囲が大きい場合,出力層では調整しないことになる.よって,入力データの正規化・スケーリングや,隠れ層での調整(局所応答正規化やバッチ正規化)などで,出力層以前の各層で,値の範囲を調整することが大事になるとも言える.
3. 隠れ層用:古典的な活性化関数
2節までで,概要と使用目的がつかめたと思うので,ここからは,代表的な隠れ層を列挙していく.3節ではReLU登場以前の3層MLPやRNNでよく用いられてきた,2つの活性化関数(シグモイドとtanh)について述べる.
3.1 シグモイド関数

シグモイド関数(sigmoid function)は,ステップ関数より便利な活性化関数として使われるようになった,以下の関数である:
\[\sigma(x) = \frac{1}{1 + \exp(-x)} \tag{3.1} \]
別名,ロジスティックシグモイドとも呼ばれる.
導関数が以下のように計算が楽な形なので,シグモイド関数は勾配降下法で勾配を計算しやすい:
\[\sigma^{\prime}(x) =\sigma(x)(1-\sigma(x)) \tag{3.2} \]
以上のように,3層MLPで使用する際に好ましい性質があるので,よく使われていた.
しかし,シグモイドは図3を見てもわかるように,$(-4,4)$あたりの範囲より外だと,0と1に出力活性化値がそれぞれ飽和し(図3-左),その微分値もほとんど0である(図3-右).したがって,両端で値が飽和すると,勾配が小さくなりすぎて,学習が滞ってしまう.
また,(ゼロ中心のガウス正規化を継続しやすい)ゼロ中心の出力ではなく,0.5中心の出力なので,隠れ層間の伝搬を経ていくなかで,ガウス分布の中心がずれていく内部共分散シフト(internal covariate shift)が起きやすい問題もある.よって,層の数が多いDNNには,使いづらい面があった.その意味で,次節のtanhのような「ゼロ中心の活性化関数」のほうが有効であるので [Lecun 98],3層MLPやLSTMなどでは,tanhが使われるようになっていった
3.2 tanh 関数(Hyperbolic tangent)

tanh関数 も,シグモイド関数に似た,よく使われてきたシグモイド型の活性化関数である(図4):
\[ \text{tanh}(x) = \frac{\exp(x) – \exp(-x) }{\exp(x) + \exp(-x) } \tag{3.3}\]
tanhは,以下のように「シグモイド関数をスケールして,0中心へ平行移動させた関数」ともみなせる:
\[ \text{tanh}(x) =2 \cdot \sigma(2x) -1 \tag{3.4}\]
このおかげで,tanhの出力は「ゼロが中心」であり,シグモイドの問題が1つ解消されている.
また,tanhの微分値は(図4-右)はシグモイドの微分値(図3−右)より大きいので,たくさん勾配を逆伝搬できるので,学習が速くなる利点がある.
ディープラーニング時代に入ってReLU型の活性化関数(次節)が中間層の活性化の定番になってからも,tanhは,LSTMやGRUなどのRNNでは,構成部品として変わらずに用いられてきた.自己回帰型生成モデルであるWaveNetで,ゲート機構付きtanhユニット(GTU)が活性化関数に採用されたゆえ,WaveNet界隈で tanhがよく使用されることになった(詳しくは子記事の2.2節).
4. 隠れ層用(現代):ReLUとその発展型
4.1 ReLUの基本型

ReLU(Rectified Linear Unit)は,コンピュータビジョンでの認識タスクで,CNNの中間層によく用いられる活性化関数である(図5):
\[
f(x) = \max(0,x) \tag{4.1}
\]
3節のシグモイド・tanhと異なり,正の範囲は(押しつぶしを行なわずに)そのまま出力するのが特徴である.逆に,負の範囲はステップ関数と同じになっており,全ての入力値を出力値0にして押しつぶす.ReLUは,電気業界で使用される整流器(rectifier)と同じの「負の範囲の入力のみ遮断する」作用をもつので,Rectified Linear Unitと呼ばれる(※ ただし,実際のアイデアの出元は bio-inspiredではある).
ReLU型の活性化関数がCNNで定番化した第一の理由は,DNNの学習の収束時間が早くなることにある.収束が早くなる理由は,(図5-右)のように,「正の範囲で微分値が全て1」となるようReLU型が設計されたことにある.これにより,シグモイドやtanhのように「勾配が0に飽和して学習が進行しなくなる」こともなく,勾配消失も生じない.つまり,深いDNNでもしっかりと大きな量の勾配を,序盤の層まで逆伝搬できるようになった.
また [Glorot et al., 2011] でも強調されているように,ReLUは,入力前の値の50%程度を0にさせてくれて,スパースな特徴マップを得やすい利点がある.このスパース化でも,計算高速化のメリットも生じるので,層数の多いDNNでは有利になる.
4.2 ReLUの発展型
この節では,前述の初期ReLUの問題を解決していくために登場し,その後更に改善されていった「ReLUの発展型」の各関数について,簡単にだけ述べる.詳しくは,子記事の ReLUとその発展型の活性化関数を参照のこと(そちらでは,関数の式も表記して,より詳しく各関数を紹介している).
ReLUは,CNN向けに便利な活性化関数であったが,負の値が全て0で出力されることから生じる問題があった.負の値の入力がいつも0で出力されるので,学習中に入力がいくら変わっても0しか出力できず,活性化ができなくなる「ニューロンの死」が起こってしまい,それ以上そのニューロンの重みの学習が進行しなくなる問題があった.そこで,Leaky ReLUや,PReLUが改善案として提案される.
LeakyReLU [Maas et al., 2013] は,4.1.1で述べた「学習中のニューロンの死」が生じないように,負の入力にも0.01の傾きを与え $f(x) = -0.01 x (x \leq 0)$ の出力を与えたものである.これにより,入力が負の場合も少しだけ漏れて(leak),勾配がつき続ける.よって,勾配消失を避けられるようになった.
また,PReLU(Parametrized ReLU) [He et al., 2015] は LeakyReLU を一般化させ,負の側の傾きを $a$ でパラメタライズ化し$f(x)= -ax (x \leq 0)$としたものであり,Leak度合いの $a$ も同時に学習させる.傾きも学習することで,過学習のリスクも減り,著者らが目指している非常に層の深いネットワーク($l \leq 13$) に対応できるようになった.
一方,「ReLUに似た関数形だが,非線形な微分可能関数を使おう」という提案が出てきはじめた.GELU (Gaussian Error Linear Units) [Hendrycks and Gimpel et al., 2016] は,その代表的な提案である.GELU は,ReLUに似た関数形の以下の関数を,ガウス誤差関数で近似計算する関数である.GELU は,ドロップアウトの仕組みによる「確率的な正則化」の性質も合わせ持つ.よって,学習も高速に進めつつ,過学習を抑制して正則化も達成できる.大規模なモデルに対して,これらの性質が効いてくることから,Transformerを使用した一般化言語モデルの BERT [Devlin et al., 2019] などの基盤モデルでよく使用されることとなった.ViT(Vision Transformer)も,全結合層の活性化関数はGELUである.
また,Swish [Ramachandran et al., 2017] は,最高性能を出すReLU型の活性化関数を,強化学習を用いて探索した結果得られた活性化関数である.こちらも近年の,ビジョンやNLP,音声系の分野でよく用いられている.
5. 出力層用の活性化関数
5.1 2クラス識別:シグモイド
3.1節で隠れ層向けの活性化関数として紹介した「シグモイド関数」は,2クラス識別問題の出力層としてよく用いられる.
より具体的には,2クラス識別問題で,ネットワークの出力ベクトルを,ベルヌーイ分布として出力したい場合に用いる.シグモイドによる出力は,ロジスティック回帰などにおいて,古くから統計と機械学習で用いられてきたパターンであり,その出力方法がニューラルネットワークにも採用されている.
5.2 多数クラス識別: softmax
3クラス以上の,多数のNクラス識別向けには,学習用ラベルはone-hotエンコーディングされたベクトルを用いる.よって,one-hotベクトルに対応するマルチヌーイ分布を出力したする際に,出力層にはsoftmax関数を用いる.
ちなみに,これらのような「ベイズ的な確率条件付きモデルでの,確率分布の種類・選択」についてまだ詳しくない方には,ビジュアルテキスト パターン認識の6章「ベイズ推定」が,簡潔でわかりやすいので,オススメしておく.
5.3 回帰NN向け: 恒等関数
回帰向けのディープニューラルネットワークでは,教師データの正解ベクトル $\bm{y}_i$ を,出力層に活性化は使わず,そのまま学習する.その際,入出力間の条件付き分布には,ガウス分布が仮定されていると言える.
6. 活性化関数のまとめ
「活性化関数」について,主な関数をディープラーニングの視点で,隠れ層向けと出力層向けに分類して紹介した.活性化関数はニューラルネットワークの隠れ層もしくは出力において,「押しつぶし(squashing)」による出力範囲の調整,および非線形変換による表現力の向上を担当する.
また,活性化関数の関数形およびその微分関数の形次第で,学習の安定度や速度が向上する.したがって,目的に適した活性化関数を選択することが,短い学習時間で,なおかつ学習全域解に収束させるためには大切である.
DNNの隠れ層では,ReLU型の活性化関数を主に用いる.近年はReLUの改善版である,SwishやGELUなどが,オリジナルのReLUの代わりに使われるようになってきている.
また,DNNの出力層では,多クラス識別モデルの場合にはsoftmax層を使い,回帰モデルの場合には何も出力層を使わないパターンが典型的である
関連書籍
- Pythonで学ぶ画像認識 (機械学習実践シリーズ) 【📖紹介記事】, 田村 雅人, 中村 克行, インプレス, 2023.
- 第3章 深層学習を使う準備
- DNNにおける順伝搬処理: 活性化関数 (p88)
- 第3章 深層学習を使う準備
- 深層学習 改訂第2版 (機械学習プロフェッショナルシリーズ) 岡谷貴之,講談社,2022.
- 2.1.2 活性化関数 (p13)
- 画像認識(機械学習プロフェッショナルシリーズ),原田達也,講談社,2017.
- 5.7 確率的識別関数 (p138)
- 6.2.1 多層パーセプトロン (p157)
- Deep learning for NLP and speech recognition Kamath, Uday, John Liu, and James Whitaker., Vol. 84. Cham: Springer, 2019.
- 「4.4.1 Activation Functions」
- Deep learning. Ian Goodfellow, Yoshua Bengio, and Aaron Courville. MIT press, 2016.
- 「6.2.2 Output Units」.
- 「6.3 Hidden Units」
References
- [Glorot et al., 2011] Glorot, Xavier, Antoine Bordes, and Yoshua Bengio. “Deep sparse rectifier neural networks.” Proceedings of the fourteenth international conference on artificial intelligence and statistics. JMLR Workshop and Conference Proceedings, 2011.
- [He et al., 2015] He, K., Zhang, X., Ren, S., Sun, J.: Delving deep into rectifiers: Surpassing human-level performance on imagenet classification. In, ICCV, 2015.
- [LeCun et al., 1998] LeCun, Y., Bottou, L., Orr, G., and Muller, K. (1998). Efficient backprop.
- [Maas et al., 2013] Andrew L Maas, Awni Y Hannun, and Andrew Y Ng. Rectifier nonlinearities improve neural network acoustic models. In International Conference on Machine Learning, volume 30, 2013.