Leaky ReLU
Leaky ReLU пропускает отрицательные входные значения с небольшим наклоном, обычно 0.01, благодаря чему градиенты продолжают проходить и нейроны избегают проблемы «умирающего ReLU».
Leaky ReLU (негерметичная выпрямленная линейная функция) — это функция активации, которая возвращает вход без изменений, если он положительный, и умножает его на небольшой фиксированный наклон, например 0.01, если он отрицательный. Она изменяет стандартную функцию ReLU, которая выдаёт ноль для любого отрицательного входа: отрицательные значения по-прежнему дают небольшой выход и, что важнее, ненулевой градиент при обратном распространении ошибки. Эндрю Маас, Авни Ханнун и Эндрю Ын описали эту функцию в исследовании 2013 года, посвящённом выпрямляющим активациям в акустических моделях распознавания речи; они использовали наклон 0.01. Её применяют в моделях глубокого обучения, где важен поток градиента, — от дискриминаторов генеративных состязательных сетей до ранних детекторов объектов YOLO и нейропроцессоров, запускающих квантованные модели с кусочно-линейными активациями.
Как работает Leaky ReLU#
Leaky ReLU вычисляет f(x) = x для x > 0 и f(x) = αx для x ≤ 0, где отрицательный наклон α — фиксированный гиперпараметр от 0 до 1. Производная равна 1 для положительных входов и α для отрицательных, поэтому каждому входу соответствует некоторый градиент, который возвращается к породившим его весам. Стандартный наклон зависит от библиотеки и фреймворка: nn.LeakyReLU в PyTorch по умолчанию равен 0.01, tf.nn.leaky_relu в TensorFlow — 0.2, а у слоя LeakyReLU в Keras — 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 = NoneКод выводит ReLU(): 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 отличается от проблемы затухающего градиента, при которой градиенты постепенно уменьшаются, проходя через множество слоёв с насыщаемыми функциями, такими как sigmoid или tanh.
Leaky ReLU и родственные функции активации#
- ReLU: Выдаёт точный ноль для отрицательных входов, что делает активации разреженными и удешевляет вычисления, но может приводить к отмиранию нейронов. Leaky ReLU отказывается от точной разреженности, чтобы градиент оставался ненулевым везде.
- Parametric ReLU (PReLU): Вместо фиксированного значения обучает отрицательный наклон, обычно отдельный для каждого канала. Каимин Хе и его коллеги задали начальное значение наклона 0.25; это также значение по умолчанию для
nn.PReLUв PyTorch. - SiLU и GELU: Плавные кривые, которые для отрицательных входов немного опускаются ниже нуля и не имеют резкого угла в нуле. SiLU используется по умолчанию в современных моделях YOLO, а GELU часто встречается в Transformer. Обе функции требуют вычисления экспоненты для каждого значения, тогда как Leaky ReLU нужны только сравнение и умножение.
Где применяется Leaky ReLU#
- Дискриминаторы DCGAN: В архитектуре DCGAN Leaky ReLU с наклоном 0.2 использовалась в каждом слое дискриминатора. Благодаря этому генератор получает полезные градиенты даже для изображений, которые дискриминатор отвергает; такой подход сохранили многие последующие GAN.
- Ранние детекторы YOLO: В оригинальной YOLO Leaky ReLU с наклоном 0.1 использовалась во всех слоях, кроме последнего. То же было в YOLOv2 и YOLOv3; в YOLOv5 её применяли до выпуска версии 4.0 в январе 2021 года, когда заменили на SiLU.
- Графовые сети внимания: Эти графовые нейронные сети используют Leaky ReLU с наклоном 0.2, оценивая, насколько сильно каждый узел должен учитывать соседей.
- Ускорители периферийного ИИ: Целочисленные нейропроцессоры, запускающие квантованные модели, могут объединить кусочно-линейную функцию активации с предыдущей свёрткой. DPU от AMD Xilinx делает это для ReLU и Leaky ReLU, но запускает sigmoid, а значит и SiLU, на основном CPU.
YAML-файлы моделей Ultralytics YOLO принимают ключ activation, который заменяет SiLU по умолчанию во всех стандартных свёрточных блоках. Поэтому YOLO26 можно обучать с параметром activation: nn.LeakyReLU(0.1015625), чтобы соответствовать фиксированному наклону DPU, равному 26/256.










