Leaky ReLU
Leaky ReLUは、負の入力に小さな傾き(多くの場合0.01)を適用するため、勾配が流れ続け、ReLUが不活性化する問題を回避できます。
Leaky ReLU(漏れのある正規化線形ユニット)は活性化関数の一種です。入力が正のときは入力をそのまま返し、負のときは0.01などの小さな固定傾きを掛けます。負の入力に対してゼロを出力する標準のReLUを変更し、負の値にも小さな出力を与えることで、より重要な点として誤差逆伝播中にゼロでない勾配を生み出します。Andrew Maas、Awni Hannun、Andrew Ngは2013年の音声認識音響モデルにおける整流活性化関数の研究でこの関数を説明し、傾きに0.01を使用しました。勾配の流れが重要なディープラーニングモデルで使われており、敵対的生成ネットワークの識別器、旧世代YOLOの物体検出器、区分線形活性化を使って量子化モデルを実行するニューラルプロセッシングユニットなどに採用されています。
Leaky ReLUの仕組み#
Leaky ReLUは、f(x) = xの場合にx > 0を、f(x) = αxの場合にx ≤ 0を計算します。負の傾きαは、0から1の範囲で固定するハイパーパラメーターです。導関数は正の入力に対して1、負の入力に対してαとなるため、すべての入力から、その入力を生成した重みに勾配の一部が戻ります。一般的な傾きは情報源やフレームワークによって異なります。PyTorchのnn.LeakyReLUのデフォルトは0.01、TensorFlowのtf.nn.leaky_reluは0.2、KerasのLeakyReLUレイヤーは0.3です。次のコードは、負の入力をReLUとLeaky ReLUに通し、それぞれの勾配を計算します。
import torch
from torch import nn
# Negative pre-activations, the inputs a ReLU unit turns into zeros
x = torch.tensor([-3.0, -1.0, -0.5], requires_grad=True)
for activation in (nn.ReLU(), nn.LeakyReLU(negative_slope=0.01)):
y = activation(x)
y.sum().backward() # gradient that flows back toward the weights
print(f"{activation}: output {y.detach().numpy()}, gradient {x.grad.numpy()}")
x.grad = NoneReLU(): output [0. 0. 0.], gradient [0. 0. 0.]とLeakyReLU(negative_slope=0.01): output [-0.03 -0.01 -0.005], gradient [0.01 0.01 0.01]が出力されます。ReLUではこれらの入力から勾配が戻らないため、勾配降下法でそれらの入力を生成した重みを変更できません。一方、Leaky ReLUでは上流の勾配の1%が戻ります。
ReLUのニューロンが死ぬ問題#
学習データのすべての入力で事前活性化が負になるほど重みとバイアスが変化すると、ReLUニューロンは機能を失います。出力も勾配も常にゼロとなり、入力側の重みが更新されなくなるため、そのニューロンはニューラルネットワークから永久に失われます。学習率が高い場合や、バイアスが大きく負方向に更新された場合に、この問題が起きやすくなります。Leaky ReLUは負の側にも小さな勾配を保つため、負の領域に移動したニューロンを引き戻すことができます。
ReLUが機能を失う問題は、勾配消失問題とは異なります。勾配消失では、シグモイドやtanhなどの飽和関数を通過する際に、勾配が多くの層を経て徐々に小さくなります。
Leaky ReLUと関連する活性化関数の比較#
- ReLU: 負の入力に対して厳密にゼロを出力します。これにより活性化がスパースになり計算が軽くなりますが、ニューロンが機能を失う可能性があります。Leaky ReLUは、どの入力にも勾配を与える代わりに、厳密なスパース性を失います。
- Parametric ReLU(PReLU): 負の傾きを固定せずに学習し、通常はチャネルごとに1つの値を設定します。Kaiming Heらは傾きを0.25で初期化しました。これはPyTorchの
nn.PReLUのデフォルト値でもあります。 - SiLUとGELU: 負の入力に対してわずかにゼロを下回り、ゼロで鋭い折れ曲がりがない滑らかな曲線です。SiLUは最新のYOLOモデルでデフォルトとして使われ、GELUはTransformerでよく使われます。どちらも値ごとに指数関数の計算が必要ですが、Leaky ReLUは比較と乗算だけで済みます。
Leaky ReLUの用途#
- DCGANの識別器: DCGANアーキテクチャでは、すべての識別器レイヤーに傾き0.2のLeaky ReLUを使用します。これにより、識別器が画像を拒否した場合でも生成器に有用な勾配が伝わります。その後の多くのGANでも、この選択が引き継がれています。
- 初期のYOLO検出器: オリジナルのYOLOは、最終レイヤーを除くすべてのレイヤーに傾き0.1のLeaky ReLUを使っていました。YOLOv2とYOLOv3も同様です。YOLOv5では、2021年1月のv4.0リリースでSiLUに置き換えるまで使われていました。
- グラフ注意ネットワーク: これらのグラフニューラルネットワークでは、各ノードが近傍ノードにどれだけ注意を向けるかをスコアリングする際に、傾き0.2のLeaky ReLUを適用します。
- エッジAIアクセラレーター: 量子化モデルを実行する整数演算のニューラルプロセッシングユニットでは、区分線形活性化関数を先行する畳み込みに統合できます。AMDのXilinx DPUは、ReLUとLeaky ReLUについてこれを行いますが、シグモイド、つまりSiLUはホストCPU上で実行します。
Ultralytics YOLOのモデルYAMLファイルは、標準の畳み込みブロックすべてでデフォルトのSiLUを置き換えるactivationキーに対応しています。そのため、YOLO26をactivation: nn.LeakyReLU(0.1015625)で学習させ、DPUの固定傾きである26/256に合わせられます。










