SiLU (Sigmoid Linear Unit)
SiLU, также называемая Swish, умножает входное значение на его сигмоиду, формируя плавную функцию активации с саморегуляцией. Рассматриваются её математика, происхождение и сравнение с ReLU.
Линейный блок с сигмоидой (SiLU) — это функция активации, определяемая как SiLU(x) = x · σ(x), где σ — функция сигмоиды. Большие положительные значения она пропускает почти без изменений, большие отрицательные значения сводит почти к нулю, а между ними плавно меняется, достигая минимума около −0.278 при x ≈ −1.278. SiLU — та же функция, что и Swish при β = 1; эти названия используют как взаимозаменяемые. Она часто используется по умолчанию в свёрточных моделях компьютерного зрения, а в блоке SwiGLU также служит функцией активации в полносвязных слоях многих больших языковых моделей (LLM).
Определение и свойства#
SiLU умножает каждый вход на управляющий сигнал σ(x), который находится в диапазоне от 0 до 1 и вычисляется на основе самого входа. Поэтому функцию называют саморегулируемой. Её производная равна σ(x) · (1 + x · (1 − σ(x)); вместе они придают SiLU четыре свойства, отличающие её поведение при обучении от ReLU:
- Гладкость во всех точках: кривая и её производная непрерывны, без излома в нуле. Поэтому небольшие изменения весов вызывают небольшие изменения выходных значений, что подходит для градиентного спуска.
- Градиент для отрицательных входов: нейрон с отрицательным входом всё равно получает небольшой градиент и продолжает обучаться. Нейроны ReLU, входы которых остаются отрицательными, вообще не получают градиента и могут навсегда перестать обучаться. Это явление называют «умирающей ReLU».
- Немонотонность: при росте x от сильно отрицательных значений примерно до −1.28 выход немного уменьшается, а затем начинает расти. Поэтому функция немонотонна.
- Ограниченность снизу и неограниченность сверху: выходные значения не опускаются ниже примерно −0.278, а положительные входы проходят без насыщения, как и в ReLU. Это позволяет избежать исчезающего градиента, характерного для сигмоиды и tanh в глубоких сетях.
Приведённый ниже код на PyTorch вычисляет значения 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 градиент немного превышает 1.
Происхождение названия#
Хендрикс и Гимпель назвали x · σ(x) линейным блоком с сигмоидой в статье 2016 года, где представили GELU. В статье эта функция выступала как родственник GELU на основе сигмоиды: она работала хуже GELU, но обычно лучше ReLU и ELU. В 2017 году Элфвинг, Учибе и Доя применили SiLU для аппроксимации функций нейронными сетями в обучении с подкреплением. Позже в том же году исследователи Google независимо открыли x · σ(βx) с помощью автоматического поиска функций активации, назвали её Swish и сообщили, что замена ReLU на Swish повысила точность top-1 на ImageNet на 0,9% для Mobile NASNet-A и на 0,6% для Inception-ResNet-v2. В версии 1.7 PyTorch добавил nn.SiLU, используя прежнее название.
SiLU и другие функции активации#
- ReLU: max(0, x) вычисляется быстрее, выдаёт точные нули и имеет постоянный градиент 1 для положительных входов. SiLU требует вычисления одной сигмоиды на элемент, но обеспечивает гладкость и градиенты для отрицательных значений.
- GELU: x · Φ(x), где Φ — функция распределения стандартного нормального закона. Формы двух кривых одинаковы, а масштабированная SiLU x · σ(1.702x) аппроксимирует GELU с погрешностью около 0.02 или меньше во всех точках. GELU обычно используют в трансформерах, таких как BERT и ViT, а SiLU чаще встречается в детекторах на основе CNN.
- Сигмоида: σ(x) сама по себе сжимает входы в диапазон от 0 до 1 и насыщается на обоих концах, поэтому подходит для выходного слоя, который вычисляет вероятности. В SiLU сигмоида используется только как управляющий сигнал.
- Hard-Swish: x · ReLU6(x + 3) / 6 — аппроксимация SiLU, представленная вместе с MobileNetV3. Вместо сигмоидного управляющего сигнала здесь используется кусочно-линейная функция, которая позволяет избежать вычисления экспоненты на мобильном оборудовании.
- SwiGLU: управляемый линейный блок, который поэлементно умножает SiLU(xW) на вторую проекцию xV. Он образует полносвязный блок LLaMA и многих других LLM.
Где используется SiLU#
SiLU под названием Swish используется как функция активации во всей модели EfficientNet и часто встречается в современных детекторах объектов реального времени. Модели Ultralytics YOLO используют SiLU начиная с YOLOv5: в версии 4.0 в январе 2021 года она заменила LeakyReLU и Hardswish. В YOLO26 каждый блок Conv состоит из свёртки, пакетной нормализации и SiLU.










