Activation Function
活性化関数とは、ニューロンが重み付き入力に適用する非線形関数であり、ネットワークが曲線的なパターンを学習できるようにします。一般的な関数を比較します。
活性化関数とは、ニューラルネットワーク(NN)のニューロンが入力の重み付き和に適用し、出力を生成する関数です。主な役割は非線形性を加えることです。これがなければ、層を何段重ねても単一の線形変換に帰着し、深さに意味はありません。活性化関数があれば、手書き数字の筆跡からカメラ映像内の歩行者の輪郭まで、曲線的な決定境界をネットワークで表現できます。活性化関数には2つの役割があります。隠れ層では、ReLU、SiLU、GELUなどの関数によってネットワークが特徴を構築します。出力層では、sigmoidやsoftmaxなどの関数によって生のスコアを確率に変換します。
ネットワークに非線形性が必要な理由#
活性化関数のない層ではWx + bが計算されます。このような層を2つ重ねるとW₂(W₁x + b₁) + b₂となり、これは(W₂W₁)x + (W₂b₁ + b₂)、すなわち別の1つの線形層と等価です。層の間に活性化関数を入れると、この単純化を防げます。普遍近似定理は、十分な数の非線形ユニットを持つ1つの隠れ層で、有界領域上の任意の連続関数を近似できることを示しています。
活性化関数は形状だけでなく、その導関数も重要です。逆伝播では、各層の導関数を次々に乗算するためです。sigmoidの導関数は0.25を超えず、tanhの導関数は入力が大きくなるほど0に近づきます。そのため、飽和する層を多く通ると勾配が小さくなる、勾配消失の問題が発生します。ReLUは正の入力に対する導関数が常に1であり、非常に深いネットワークの学習を実用的にした主な理由の1つです。
一般的な活性化関数#
- ReLU: max(0, x)。計算コストが低く、正の入力に対する勾配は1、負の入力に対する出力は正確に0です。2012年のAlexNet以降、CNNの隠れ層で標準的に使われていますが、負の入力しか受け取らないユニットは学習を停止します。
- Leaky ReLU: 負の入力に0.01や0.1などの小さな傾きを掛けるため、すべてのユニットで勾配が維持されます。
- SiLU(Swish): x · σ(x)。負の入力に対してわずかに0を下回る、滑らかな曲線です。効率的なCNNやリアルタイム検出器でよく使われます。
- GELU: x · Φ(x)。Φは標準正規累積分布関数です。BERT、GPT-2、ビジョントランスフォーマーで標準的に使われる活性化関数です。
- tanh: 入力をゼロ中心の−1から1の範囲に圧縮します。GRUなどのリカレントネットワークの隠れ状態を形成します。
- sigmoid: 入力を0から1の範囲に圧縮します。二値出力やマルチラベル出力、リカレントセルのゲートに適しています。
- softmax: スコアのベクトル全体を、合計が1になる確率分布に変換します。単一ラベル分類やアテンションの重みに使われます。
- SwiGLU: SiLUで活性化した射影に、学習可能な別の射影を掛け合わせるゲート付き層です。近年の多くの大規模言語モデル(LLM)で、フィードフォワード層の単純な活性化関数に取って代わりました。
PyTorchでは、各要素ごとの関数がtorch.nnのモジュールとして提供されているため、同じ入力で簡単に比較できます。
import torch
from torch import nn
x = torch.tensor([-3.0, -1.0, 0.0, 1.0, 3.0])
# Common activations, each applied element-wise to the same inputs
activations = {
"ReLU": nn.ReLU(),
"Leaky ReLU": nn.LeakyReLU(0.1),
"SiLU": nn.SiLU(),
"GELU": nn.GELU(),
"Tanh": nn.Tanh(),
"Sigmoid": nn.Sigmoid(),
}
for name, act in activations.items():
print(f"{name:>10}: {[round(v, 3) for v in act(x).tolist()]}")入力が−3、−1、0、1、3の場合、ReLUは[0.0, 0.0, 0.0, 1.0, 3.0]を、Leaky ReLUは[-0.3, -0.1, 0.0, 1.0, 3.0]を出力します。SiLUは[-0.142, -0.269, 0.0, 0.731, 2.858]、GELUは[-0.004, -0.159, 0.0, 0.841, 2.996]となり、どちらも小さな負の値を通し、大きな入力ではReLUに近づきます。tanhは[-0.995, -0.762, 0.0, 0.762, 0.995]、sigmoidは[0.047, 0.269, 0.5, 0.731, 0.953]となり、どちらも±3で平坦になります。この時点では勾配もすでに小さくなっています。
活性化関数の選び方#
隠れ層では通常、アーキテクチャファミリーの慣例に従い、出力層ではタスクに応じた関数を使います。各入力が必ず1つのクラスに属するタスクにはsoftmaxが適し、複数ラベルが同時に当てはまるタスクにはsigmoidが適しています。回帰出力では、任意の値を取れるように活性化関数を使いません。ハードウェアが選択を制約する場合もあります。エッジアクセラレーターの中には、ReLU、Leaky ReLU、Hard-Swishなどの単純な関数のみをネイティブに実行するものがあります。YOLO26は、すべてのConvブロックで畳み込みとバッチ正規化の後にSiLUを適用します。各検出クラスのスコアには独立したsigmoidを適用するため、1つのボックスのクラススコアの合計が1になる必要はありません。また、分類モデルでは、1,000個のImageNetクラスに対してsoftmaxを適用します。
活性化関数と関連用語の比較#
- 損失関数: フォワードパスでは活性化関数が各ニューロンの出力を整形し、損失関数はネットワークの最終予測とラベルを比較して評価します。数値安定性のため、ライブラリでは最後の活性化を損失関数に統合することがよくあります。たとえば、
CrossEntropyLossではsoftmaxを統合しています。 - バッチ正規化: バッチ正規化やレイヤー正規化では、統計量と学習可能なパラメーターを使って活性化を安定した範囲に再スケーリングします。通常は活性化関数の直前に配置され、活性化関数と隣接します。正規化自体は非線形性を加えません。
- 活性化: 複数形の名詞としての「活性化」は、層が生成する出力値を指します。「非線形性」と、以前から使われる「伝達関数」は、活性化関数の同義語です。学習中、フレームワークは逆伝播に備えて各層の活性化をメモリに保持します。勾配チェックポイントでは一部の活性化を破棄し、逆伝播中に再計算することでメモリを節約します。










