SiLU (Sigmoid Linear Unit)
SiLU, também chamada Swish, multiplica uma entrada pela sua sigmoide para produzir uma ativação suave com autorregulação. Aborda sua matemática, origem e comparação com ReLU.
A Unidade Linear Sigmoide (SiLU) é uma função de ativação definida como SiLU(x) = x · σ(x), em que σ é a função sigmoide. Ela deixa passar entradas positivas grandes quase sem alterações, mapeia entradas negativas grandes para valores próximos de zero e faz uma transição suave entre elas, atingindo um mínimo de cerca de −0.278 em x ≈ −1.278. SiLU é a mesma função que Swish com β = 1, e os dois nomes são usados de forma intercambiável. É uma opção padrão comum em modelos convolucionais de visão e, dentro do bloco SwiGLU, também alimenta as camadas feed-forward de muitos modelos de linguagem grandes (LLMs).
Definição e propriedades#
A SiLU multiplica cada entrada por um gate, σ(x), cujo valor fica entre 0 e 1 e é calculado a partir da própria entrada; por isso, ela é chamada de auto-guiada. Sua derivada é σ(x) · (1 + x · (1 − σ(x))), e, em conjunto, elas conferem à SiLU quatro propriedades que diferenciam seu comportamento durante o treinamento do da ReLU:
- Suave em todos os pontos: A curva e sua derivada são contínuas, sem descontinuidade em zero, então pequenas alterações nos pesos causam pequenas alterações na saída, o que favorece o gradiente descendente.
- Gradiente para entradas negativas: Uma unidade cuja entrada é negativa ainda recebe um gradiente pequeno, então continua aprendendo. As unidades ReLU cujas entradas permanecem negativas não recebem nenhum gradiente e podem parar de aprender para sempre; essa falha é conhecida como ReLU morta.
- Não monotônica: A saída diminui um pouco à medida que x aumenta de valores muito negativos até cerca de −1.28 e aumenta a partir daí, portanto a função não é monotônica.
- Limitada inferiormente e ilimitada superiormente: As saídas nunca ficam abaixo de cerca de −0.278, e as entradas positivas passam sem saturar, como na ReLU, o que evita o comportamento de gradiente evanescente da sigmoide e da tanh em redes profundas.
O código PyTorch abaixo calcula a SiLU e os gradientes da SiLU e da ReLU em cinco pontos.
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), comparada com ReLU nas mesmas entradas
silu = F.silu(x)
relu = F.relu(x)
# Gradiente de cada ativação em relação à sua entrada
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())Imprime as saídas da SiLU [-0.0719, -0.2785, 0.0, 0.7311, 3.9281], os gradientes da SiLU [-0.0527, -0.0003, 0.5, 0.9277, 1.0527] e os gradientes da ReLU [0.0, 0.0, 0.0, 1.0, 1.0]. Em −4, a ReLU produz 0 e não transmite gradiente, enquanto a SiLU ainda transmite −0.0527. Em −1.28, a SiLU está em seu mínimo de −0.2785, com um gradiente quase exatamente igual a 0, e em 4 seu gradiente é ligeiramente maior que 1.
Origem do nome#
Hendrycks e Gimpel chamaram x · σ(x) de Unidade Linear Sigmoide em seu artigo de 2016, que apresentou a GELU, onde ela surgiu como uma variante da GELU baseada em sigmoide que tinha desempenho inferior ao da GELU, mas geralmente superior ao da ReLU e da ELU. Em 2017, Elfwing, Uchibe e Doya usaram a SiLU para aproximar funções de redes neurais em aprendizado por reforço. Mais tarde naquele ano, pesquisadores do Google redescobriram x · σ(βx) por meio de uma busca automatizada por funções de ativação, deram a ela o nome Swish e relataram que substituir ReLU por essa função aumentou a acurácia top-1 no ImageNet em 0.9% para a Mobile NASNet-A e em 0.6% para a Inception-ResNet-v2. O PyTorch adicionou nn.SiLU na versão 1.7, usando o nome anterior.
SiLU versus outras funções de ativação#
- ReLU: max(0, x) é mais barata de calcular, produz zeros exatos e tem um gradiente constante de 1 para entradas positivas. A SiLU adiciona uma sigmoide por elemento em troca de suavidade e gradientes no lado negativo.
- GELU: x · Φ(x), em que Φ é a função de distribuição cumulativa normal padrão. As duas curvas têm o mesmo formato, e a SiLU escalonada x · σ(1.702x) aproxima a GELU com diferença inferior a cerca de 0.02 em todos os pontos. A GELU é a opção habitual em Transformers como BERT e ViT, enquanto a SiLU é mais comum em detectores baseados em CNN.
- Sigmoide: σ(x), sozinha, comprime as entradas no intervalo de 0 a 1 e satura nas duas extremidades, por isso é usada como camada de saída para probabilidades. A SiLU a usa apenas como gate.
- Hard-Swish: x · ReLU6(x + 3) / 6, uma aproximação da SiLU apresentada com a MobileNetV3 que substitui o gate sigmoide por um gate linear por partes, evitando a exponencial em hardware móvel.
- SwiGLU: Uma unidade linear com gate que multiplica SiLU(xW), elemento a elemento, por uma segunda projeção xV. Ela forma o bloco feed-forward da LLaMA e de muitos outros LLMs.
Onde a SiLU é usada#
A SiLU, com o nome Swish, é a ativação usada em toda a EfficientNet e é comum em detectores de objetos em tempo real modernos. Os modelos Ultralytics YOLO usam SiLU desde que a versão 4.0 da YOLOv5 substituiu LeakyReLU e Hardswish por ela, em janeiro de 2021; no YOLO26, cada bloco Conv consiste em uma convolução, normalização em lote e SiLU.










