【深層学習】活性化関数と非線形関数の意味について



1. 活性化関数
活性化関数は、ニューラルネットワークの「非線形性」を加えるために使われます。これがないと、どれだけ層(レイヤー)を重ねても、線形な計算しかできず、層を重ねる意味がありません。非線形な活性化関数を用いることで、ネットワークは多様なデータやパターンを扱えるようになります。


1.1. 主な活性化関数の種類
代表的な活性化関数には以下のようなものがあります。
- シグモイド関数 (Sigmoid):出力を0から1の範囲に収める関数で、確率を表すような問題に適しています。しかし、値が0か1に近づくと勾配が小さくなる「勾配消失問題」が発生しやすいです。
- 双曲線正接関数 (Tanh):出力が-1から1の範囲に収まり、シグモイドよりも広い範囲で勾配が取れるため、勾配消失問題の軽減に役立ちます。ただし、完全に解決できるわけではありません。
- ReLU (Rectified Linear Unit):正の入力をそのまま出力し、負の入力は0にします。計算がシンプルで、深いネットワークでも学習が進みやすい特徴がありますが、負の入力が続くと「死んだReLU問題」と呼ばれる問題が発生することもあります。
- Leaky ReLU:ReLUの変種で、負の入力に対しても小さな傾きを持たせたものです。これにより、「死んだReLU問題」を軽減します。
- ソフトマックス関数 (Softmax):主に分類問題の最終層で使用され、出力が複数のクラスに対する確率として解釈できるようにします。出力値の合計が1になるようにスケーリングされます。
1.2. 活性化関数の選び方
活性化関数の選択は、解きたい問題やネットワークの構造によって異なります。例えば、隠れ層にはReLUやLeaky ReLUが使われることが多く、出力層には問題に応じて、分類問題の場合はシグモイドやソフトマックスが選ばれることが一般的です。


2. 非線形関数



2.1. なぜ線形関数は使われないのか?
非線形関数や活性化関数について理解するためには、まず線形関数の基本を知っておくことが大切です。線形関数は、言葉の通り「直線」を表す関数としてイメージされます。具体的には、例えば次のような式で表されます。
\[ h(x) = ax \]
ここで、\(a\) は定数です。この線形関数 \(h(x) = ax\) を繰り返し適用してみましょう。例えば、この関数を5回適用すると次のような形になります。
\[ h(h(h(h(h(x))))) = a^5 x \]
関数を何度重ねても、結局は線形関数の式になります。したがって、$a^5$は一層で表すことができるので、線形関数は活性化関数として利用されません。
2.2. もう少し詳しく
まず、線形活性化関数を使った場合の例を見てみましょう。ここで、線形関数 \( f(x) = x \) を活性化関数と仮定します。3層のニューラルネットワークの各層で行われる計算を以下のように表せます。
入力ベクトル \( x \) を重み行列 \( W_1 \) で変換し、バイアス \( b_1 \) を加えて隠れ層の出力 \( h \) を求めます。
\[ h = f(W_1 x + b_1) \]
このとき、 \( f(x) = x \) なので、実質的には
\[ h = W_1 x + b_1 \]
次に、隠れ層の出力 \( h \) を重み行列 \( W_2 \) で変換し、バイアス \( b_2 \) を加えて出力層の出力 \( y \) を求めます。
\[ y = f(W_2 h + b_2) \]
同様に \( f(x) = x \) なので、
\[ y = W_2 (W_1 x + b_1) + b_2 \]
これを展開すると、
\[ y = (W_2 W_1) x + (W_2 b_1 + b_2) \]
となります。ここで、 \( W_2 W_1 \) は新しい線形変換の重み行列、\( W_2 b_1 + b_2 \) は新しいバイアス項としてまとめられるので、これは先ほど説明したように1層で表すことができます。