SiLU (Sigmoid Linear Unit)
SiLUはSwishとも呼ばれ、入力にそのシグモイドを掛け合わせることで、滑らかで自己ゲート型の活性化関数になります。数式、由来、ReLUとの比較について解説します。
シグモイド線形ユニット (SiLU) は、SiLU(x) = x · σ(x) と定義される活性化関数です。σはシグモイド関数です。大きな正の入力はほぼそのまま通し、大きな負の入力はほぼゼロにし、その間を滑らかにつなぎます。また、x ≈ −1.278で約−0.278の最小値まで下がります。SiLUはβ = 1のSwishと同じ関数で、2つの名称は同じ意味で使われます。畳み込み型ビジョンモデルで一般的なデフォルトであり、SwiGLUブロックでは、多くの大規模言語モデル (LLM)のフィードフォワード層にも使用されています。
定義と特性#
SiLUは各入力にゲートσ(x)を乗算します。σ(x)は0から1の範囲にあり、入力自体から計算されるため、自己ゲート型と呼ばれます。その導関数はσ(x) · (1 + x · (1 − σ(x)))です。この関数と導関数によって、SiLUにはReLUとは異なる学習時の特性が4つ備わっています。
- 全域で滑らか: 曲線とその導関数は連続しており、ゼロで折れ曲がりません。そのため、小さな重みの変化は小さな出力の変化につながり、勾配降下法に適しています。
- 負の入力でも勾配がある: 入力が負のユニットにも小さな勾配が伝わるため、学習を続けられます。入力が負のままのReLUユニットには勾配がまったく伝わらず、学習が永久に止まることがあります。この問題はdying ReLUと呼ばれます。
- 非単調: xが大きな負の値から約−1.28まで増加すると出力はわずかに低下し、その後は上昇するため、単調な関数ではありません。
- 下限はあるが上限はない: 出力は約−0.278を下回らず、ReLUと同様に正の入力は飽和せずに通過します。これにより、深いネットワークにおけるシグモイドやtanhの勾配消失を回避できます。
以下のPyTorchコードは、5つの点におけるSiLUとSiLUおよびReLUの勾配を計算します。
import torch
import torch.nn.functional as F
x = torch.tensor([-4.0, -1.28, 0.0, 1.0, 4.0], requires_grad=True)
# 同じ入力に対するSiLU(x) = x * sigmoid(x)とReLUの比較
silu = F.silu(x)
relu = F.relu(x)
# 各活性化関数の入力に対する勾配
silu_grad = torch.autograd.grad(silu.sum(), x)[0]
relu_grad = torch.autograd.grad(relu.sum(), x)[0]
print("SiLU output: ", [round(v, 4) for v in silu.tolist()])
print("SiLU gradient:", [round(v, 4) for v in silu_grad.tolist()])
print("ReLU gradient:", relu_grad.tolist())出力にはSiLUの値[-0.0719, -0.2785, 0.0, 0.7311, 3.9281]、SiLUの勾配[-0.0527, -0.0003, 0.5, 0.9277, 1.0527]、ReLUの勾配[0.0, 0.0, 0.0, 1.0, 1.0]が表示されます。−4ではReLUの出力は0で勾配も伝わりませんが、SiLUは−0.0527の勾配を伝えます。−1.28ではSiLUは−0.2785の最小値にあり、勾配はほぼ正確に0です。4ではSiLUの勾配はわずかに1を超えます。
名称の由来#
HendrycksとGimpelは、GELUを紹介した2016年の論文で、x · σ(x)をシグモイド線形ユニットと名付けました。この論文では、GELUより性能は低いものの、通常はReLUやELUより優れた、シグモイドに基づくGELUの類似関数として登場しました。続いてElfwing、Uchibe、Doyaは2017年に、強化学習におけるニューラルネットワークの関数近似にSiLUを使用しました。同年後半、Googleの研究者は活性化関数の自動探索を通じてx · σ(βx)を再発見し、Swishと名付けました。また、ReLUをSwishに置き換えると、Mobile NASNet-AのImageNetトップ1 精度が0.9%、Inception-ResNet-v2では0.6%向上すると報告しました。PyTorchはバージョン1.7で、以前の名称を使ってnn.SiLUを追加しました。
SiLUと他の活性化関数の比較#
- ReLU: max(0, x)は計算コストが低く、厳密なゼロを出力し、正の入力に対して勾配は常に1です。SiLUは、滑らかさと負の領域での勾配を得る代わりに、要素ごとにシグモイドを1回追加します。
- GELU: x · Φ(x)です。Φは標準正規累積分布関数を表します。2つの曲線は同じ形状で、スケーリングしたSiLUであるx · σ(1.702x)は、どの点でもGELUを約0.02以内で近似します。BERTやViTなどのTransformerではGELUが一般的であり、CNNベースの検出器ではSiLUのほうがよく使われます。
- シグモイド: σ(x)単独では入力を0から1の範囲に圧縮し、両端で飽和するため、確率を出力する層として使われます。SiLUではゲートとしてのみ使われます。
- Hard-Swish: x · ReLU6(x + 3) / 6です。MobileNetV3とともに導入されたSiLUの近似で、シグモイドゲートを区分線形のゲートに置き換え、モバイルハードウェアで指数関数を使わずに済むようにします。
- SwiGLU: SiLU(xW)に2つ目の射影xVを要素ごとに乗算するゲート付き線形ユニットです。LLaMAや多くのLLMのフィードフォワードブロックを構成します。
SiLUの使用例#
Swishという名称で使われるSiLUは、EfficientNet全体で採用されており、最新のリアルタイム物体検出器でも一般的です。Ultralytics YOLOモデルは、2021年1月にYOLOv5 v4.0でLeakyReLUとHardswishをSiLUに置き換えて以来、SiLUを使用しています。YOLO26では、すべてのConvブロックが畳み込み、バッチ正規化、SiLUで構成されています。










