活性化関数(activation function)[ディープラーニング向け]

1. 活性化関数とは [概要]

活性化関数(activation function)とは,ニューラルネットワーク中の1つのニューロンにおいて,複数ノードの和を入力として,その出力を最終決定する関数である.名前の通り「小さな入力値を活性化させて,大きな出力を得ること」が,活性化関数の主目的である.

この記事では,現代のディープニューラルネットワークで用いられる「活性化関数」について,その役割や機能をまとめる.また,活性化関数を以下の2種類に分類して述べる(※ Deep Learning Bookの2分類に揃えた):

  1. 隠れ層用:tanh関数や,ReLU型の活性化関数
  2. 出力層用:シグモイド関数softmax関数

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節 古典:ReLU登場以前の古典的な活性化関数(tanhやシグモイド)
    • 4節 現代:ReLUとその発展型 (PReLU, GELU, Mishなど)
  • 出力層用:
    1. 5節:softmaxやシグモイド関数(どういう出力の場合に用いるのか).
  • 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 隠れ層での目的と役割

活性化関数(activation function)の,隠れ層における役割.
図1 活性化関数(activation function)の,隠れ層における役割.

この節では,$j$番目の隠れ層の,出力$y_i$を担当するニューロンにおいて,シグモイド関数を活性化層に用いた場合(図1-a)を例として,「隠れ層における活性化層の目的(もとい役割)」について考えたい.

このとき,隠れ層の活性化関数は,以下の2つの目的を達成するために使用する:

  1. 押しつぶし】線形層で,各ノードの入力を,重み$w_{ji}$で掛けて和をとると大きい値になる(図1-a).それを,次の活性化関数により,$[0,1]$などの狭い単位長の出力範囲内に押し潰し(squashing)」をおこなう(図1-b).
    • 入力値の定義域全体を,グシャっと押しつぶして「入力値の範囲よりも狭い範囲」の出力値に押し込める(※ “squashing”で画像検索してもらうと,イメージがつかめる).
    • この目的で,tanh やシグモイド関数などの,押しつぶしが行える関数が用いられてきた.
  2. 識別力を高める】各ニューロン出力(活性化値)の2クラス識別性能を高め,隠れ層の特徴としての識別性能を向上させる.

例えば,3層MLPの隠れ層に,シグモイド関数を活性化関数で使用した場合を考える(図1).シグモイドは閾値$\theta = 0$と出力の中央値$0.5$を中心に,上下左右とも対称な関数である.よって,入力が閾値から離れるほど,飽和値である0か1の出力を取る.

また,押しつぶし効果により,入力の各値よりも,活性化された出力は,1付近と0付近の値に集中(漸近)するので,ニューロンユニットの2クラス分類性能が増す(図1-b).

2.1.1 「ステップ関数」を,微分可能な「S字形関数」で代替

活性化関数をステップ関数の代わりに使用
図2 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では,各ニューロンユニットの出力が,活性化関数を通るごとに非線形化され,高い表現力を持つ予測モデルになった(シグモイドとtanhの性質は3節で).

2.1.2 CNNにおける役割:入力の応答が強い箇所だけを,強調して出力.

CNNの隠れ層において,活性化関数(主にReLU系の関数)は,非極大値抑制 (Non-maximal Suppression,NMS)を実施していることに相当している.画像上・特徴マップ上において,tanhやReLUは「閾値以上の位置の出力」だけをそのまま・もしくは強めて出力し,他の箇所は0や-1の値に抑制して出力するからである.

この作用は,古典的なハフ変換Cannyエッジ検出で行われていた「画像フィルタリング後にNMS」という手順と,役割分担が同じである.すなわち,CNNでも「特徴マップ中から,畳み込みフィルタの応答が強かった位置だけを検出している」と考えると,直感的にイメージしやすい(ただし,ハフ変換などでは「極大値のローカル探索」によりNMSを実現しているので,NMSの方式は異なる).

この類似性から,CNNにおける活性化関数を,検出層(detector layer)と役割名で呼ぶ場合もあるが,ニューラルネット界隈だと,最近あまりこの呼び方は聞かない(Deep Learning Book だと,9.3節 Poolingの冒頭に書いてある.ただし,なぜそう呼ぶかまでは書いていない).

2.2 出力層での目的と役割

2.2.1 識別ニューラルネットワークの場合

識別問題向けニューラルネットワークでは,softmax関数や,シグモイド関数などを出力層で用いる.その使用目的も,基本的に前述の「隠れ層向けの2つの目的」(2.1節)と共通していて,出力を「ぺしゃんこ化」することにある.

ただし,識別問題の場合だと,以下の目的も追加される:

  1. 出力値をベルヌーイ・マルチヌーイ分布にする】各ニューロンの入力群に対して,softmax などで確率的分布出力化する(5節).

ロジスティック回帰や,識別モデル向けのニューラルネットワーク・CNNでは,「入出力の条件付き確率が,Kクラス構成のマルチヌーイ分布である」と仮定する.よって,そのためにsoftmax関数を出力層に用いて,出力ベクトルのマルチヌーイ分布化するのが通例である(詳しくはsoftmax関数の記事を参照).

2.2.2 識別ニューラルネットワークの場合

回帰問題向けでは,出力層ではとくに活性化関数を使わず,出力スカラーもしくは出力ベクトルを最小自乗誤差で学習することが多い.

逆に言うと,出力のバラつきや範囲が大きい場合,出力層では調整しないことになる.よって,入力データの正規化・スケーリングや,隠れ層での調整などで,出力層以前の層で値の範囲を調整することが大事になるとも言える.

3. 隠れ層用:ReLU登場以前の古典的な活性化関数

2節までで,概要と使用目的がつかめたと思うので,ここからは,代表的な隠れ層を列挙していく.3節ではReLU登場以前の3層MLPやRNNでよく用いられてきた,2つの活性化関数(シグモイドとtanh)について述べる.

3.1 シグモイド関数

シグモイド活性化関数とその微分
図3 シグモイド活性化関数(左)とその微分(右)

シグモイド関数(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)が起きやすい問題もある.多層のディープニューラルネットワークの活性化関数には,使いづらい面があった.その意味で,次節のtanhのような「ゼロ中心の活性化関数」のほうが有効であるので [Lecun 98],3層MLPやLSTMなどではtanhが使われるようになっていった

3.2 tanh 関数(Hyperbolic tangent function,双曲線正接関数)

子記事:tanh関数

tanh 活性化関数とその微分
図4 tanh 活性化関数とその微分

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−右)より大きいので,たくさん勾配を逆伝搬でき,学習が速くなる利点がある.

tanhは,ディープラーニングの時代に入って活性化関数がReLU(次節)中心になってからも,LSTMGRUなどのRNNでは,構成部品として変わらずに用いられてきた.自己回帰型生成モデルであるWaveNetで,ゲート機構付きtanhユニット(GTU)が活性化関数に採用され,WaveNet界隈でtanhはよく使用されることになった(詳しくは子記事で).

4. 隠れ層用(現代):ReLUとその発展型の活性化関数

4.1 ReLUの基本型

ReLU 活性化関数とその微分
図5 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ではある).

ディープニューラルネットワーク(DNN)の 学習の収束時間が早くなるというのが,ReLUが隠れ層の活性化関数として定番化した第一の理由である.収束が早くなる理由は,図5-右のように「正の範囲で微分値が全て1」だからである.シグモイドやtanhのように「勾配が0に飽和して学習が進行しなくなる」こともなく,勾配消失も生じない.深いDNNでも,逆伝搬時にしっかりとした量の勾配を,序盤の層まで流すことができる.

計算時間が早いのも利点である.ReLUの単純な $\max$ 関数だと,3節のシグモイドやtanhのような指数関数 $\exp(\cdot)$ の計算が生じないので,ReLUのほうが計算時間がかからない.

また [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$も同時に学習させるReLU型関数である.傾きも学習することで,過学習のリスクも減り,著者らが目指している非常に層の深いネットワーク($l \leq 13$) に対応できるようになった.

一方,「ReLUに似た関数形だが,非線形な微分可能関数を使おう」という提案が出てきはじめた.GELU (Gaussian Error Linear Units) [Hendrycks and Gimpel et al., 2016] は,その代表的な提案である.GELUは,ReLUに似た関数形の以下の関数を,ガウス誤差関数で近似計算する関数である.GELUは,ドロップアウトのように「確率的な正則化」の性質も合わせ持つ.よって,学習も高速に進めつつ,過学習を抑制して正則化も達成できる.大規模なモデルに対して,これらの性質が効いてくることから,Transformerで採用され,一般化言語モデルの BERT [Devlin et al., 2019] でも使用されることとなった.

また,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章「ベイズ推定」が,簡潔でわかりやすいので,オススメしておく.

また,きちんとベイズ確率モデルの文脈で,ディープラーニング以前の機械学習の基礎をしっかり勉強したい場合は,MLAPPが現状(2022)ではベストのテキストである.ただし,MLAPPは,内容こそ読みやすいものの,大学院で機械学習の講義を受ける時に使う用の,プロの教員に教えて貰うとき用のテキストであり,独学用ではないことに注意されたい.

5.3 回帰NN向け:恒等関数(= 活性化層なしで,そのまま出力):

回帰向けのディープニューラルネットワークでは,教師データの正解ベクトル$\bm{y}_i$を,出力層に活性化は使わず,そのまま学習する.その際,入出力間の条件付き分布には,ガウス分布が仮定されていると言える.

6. 活性化関数のまとめ

「活性化関数」について,主な関数をディープラーニングの視点で,隠れ層向けと出力層向けに分類して紹介した.活性化関数はニューラルネットワークの隠れ層もしくは出力において,「押しつぶし(squashing)」による出力範囲の調整,および非線形変換による表現力の向上を担当する.

また,活性化関数の関数形およびその微分関数の形次第で,学習の安定度や速度が向上する.したがって,目的に適した活性化関数を選択することが,短い学習時間で,なおかつ学習全域解に収束させるためには大切である.

DNNの隠れ層では,ReLU型の活性化関数を主に用いる.近年はReLUの改善版である,SwishやGELUなどが,オリジナルのReLUの代わりに使われるようになってきている.

また,DNNの出力層では,多クラス識別モデルの場合にはsoftmax層を使い,回帰モデルの場合には何も出力層を使わないパターンが典型的である(関連記事:CNNの損失関数(Loss Function) その(1): 交差エントロピーとMSE).

関連書籍

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.

参照外部リンク

関連記事