Softmax
Softmax converte um vetor de logits em probabilidades cuja soma é um. Aborda a fórmula, a temperatura, a estabilidade numérica, a atenção e o código.
Softmax é uma função que transforma um vetor de pontuações brutas, chamadas logits, em uma distribuição de probabilidade: cada valor de saída fica entre 0 e 1, e a soma das saídas é exatamente 1. Para um vetor z, ela calcula softmax(z)ᵢ = e^(zᵢ) / Σⱼ e^(zⱼ), aplicando a função exponencial a cada pontuação e dividindo pela soma de todas as exponenciais. Softmax é a camada de saída padrão das redes neurais que escolhem uma classe entre várias; transforma pontuações de similaridade em pesos dentro do mecanismo de atenção dos transformers e converte as pontuações de um modelo de linguagem sobre seu vocabulário em probabilidades do próximo token. Seu nome reflete que ela é uma versão suave e diferenciável de argmax, que atribuiria toda a probabilidade à maior pontuação.
Como funciona Softmax#
A função exponencial torna cada saída positiva e amplia as diferenças entre as pontuações, de modo que o maior logit recebe uma parcela desproporcional da probabilidade. Softmax preserva a ordem dos logits, então a maior pontuação sempre recebe a maior probabilidade. Só as diferenças entre os logits importam: adicionar a mesma constante a todos os logits não altera a saída. As bibliotecas usam essa propriedade para garantir estabilidade numérica, subtraindo o logit máximo antes de aplicar a função exponencial, pois e^1000 causa overflow em ponto flutuante de 32 bits.
Uma temperatura T controla o grau de concentração da distribuição: softmax(z / T). Valores de T abaixo de 1 tornam a distribuição mais concentrada na classe principal, enquanto valores acima de 1 a tornam mais uniforme. A mesma fórmula aparece na mecânica estatística como distribuição de Boltzmann, em que T é literalmente a temperatura. O trecho de código PyTorch abaixo mostra os dois efeitos:
import torch
logits = torch.tensor([2.0, 1.0, 0.1])
# Divide logits by a temperature before softmax: low sharpens, high flattens
for temperature in [0.5, 1.0, 2.0]:
probs = torch.softmax(logits / temperature, dim=0)
print(f"T={temperature}: {[round(p, 3) for p in probs.tolist()]}")
# Adding a constant leaves softmax unchanged, so libraries subtract the max to avoid overflow
big = logits + 1000
naive = big.exp() / big.exp().sum()
print(f"Naive: {naive.tolist()}, torch.softmax: {[round(p, 3) for p in torch.softmax(big, dim=0).tolist()]}")Com T = 1, os logits 2.0, 1.0 e 0.1 tornam-se [0.659, 0.242, 0.099]. Reduzir a temperatura pela metade torna a distribuição mais concentrada: [0.864, 0.117, 0.019]; dobrá-la a torna mais uniforme: [0.502, 0.304, 0.194]. Ao adicionar 1.000 a cada logit, a fórmula ingênua causa overflow e exibe [nan, nan, nan], enquanto torch.softmax ainda retorna [0.659, 0.242, 0.099].
Softmax no treinamento#
Os classificadores são treinados com softmax e perda de entropia cruzada em conjunto. A perda é −log(pᵧ), o logaritmo negativo da probabilidade atribuída à classe correta y, e seu gradiente em relação aos logits é simplesmente p − y: as probabilidades previstas menos o rótulo one-hot. Por isso, os frameworks fundem as duas operações: CrossEntropyLoss do PyTorch recebe logits brutos e calcula internamente o log-softmax, que é mais estável do que calcular o logaritmo de probabilidades calculadas separadamente. Um modelo treinado dessa maneira produz logits, e softmax só é aplicada quando as probabilidades são necessárias durante a inferência.
Onde Softmax é usada#
- Classificação de imagens: A camada final de um classificador produz um logit por classe, e softmax os transforma nas pontuações de confiança exibidas ao usuário.
- Atenção: Os Transformers calculam softmax(QKᵀ / √dₖ) sobre as pontuações de similaridade entre uma consulta e cada chave, de modo que os pesos de atenção de cada token somem 1. Dividir por √dₖ impede que as pontuações cresçam com a dimensão e saturem softmax.
- Geração de texto: Um modelo de linguagem grande (LLM) aplica softmax sobre um vocabulário de dezenas ou centenas de milhares de tokens em cada etapa, e a temperatura de amostragem é o T mencionado acima. A amostragem por núcleo seleciona então o menor conjunto de tokens cujas probabilidades atingem um limite.
- Aprendizado por reforço: Softmax aplicada aos valores das ações produz uma política que geralmente escolhe a melhor ação, mas continua explorando as demais, com a temperatura controlando o equilíbrio entre exploração e aproveitamento.
Os modelos de classificação YOLO26 aplicam softmax na cabeça de classificação durante a inferência, e o atributo probs de cada resultado contém a distribuição completa sobre as 1.000 classes do ImageNet:
from ultralytics import YOLO
# Load a YOLO26 classification model trained on ImageNet
model = YOLO("yolo26n-cls.pt")
results = model("https://ultralytics.com/images/bus.jpg")
# probs holds the softmax output of the classification head
probs = results[0].probs
for index, conf in zip(probs.top5, probs.top5conf.tolist()):
print(f"{results[0].names[index]}: {conf:.3f}")
print(f"Sum over all 1,000 classes: {probs.data.sum().item():.3f}")Ele exibe as cinco classes mais prováveis com suas probabilidades, e a soma das 1.000 classes aparece como 1.000 porque a cabeça retorna uma distribuição softmax.
Softmax e funções relacionadas#
- Sigmoid: Reduz cada pontuação de forma independente para um valor entre 0 e 1, então as saídas não precisam somar 1. Sigmoid é adequada para problemas binários e multirrótulo, como uma imagem que contém uma pessoa e uma mochila, e os detectores de objetos geralmente usam essa função para pontuar cada classe. Para duas classes, softmax equivale exatamente a sigmoid da diferença entre os dois logits.
- Argmax: Retorna o índice da maior pontuação, uma decisão rígida sem gradiente. Softmax mantém a mesma classificação, mas continua diferenciável, então pode ser treinada; além disso, aplicar argmax às probabilidades softmax produz o mesmo resultado que aplicar argmax aos logits.
- Log-softmax: O logaritmo de softmax, calculado diretamente para garantir estabilidade, que é usado pela perda de entropia cruzada.
- Escalonamento de temperatura: Um método de calibração que ajusta uma única temperatura aos dados de validação após o treinamento, para que as probabilidades softmax correspondam à frequência com que o modelo realmente acerta. Ele não altera a classe prevista, porque dividir todos os logits pelo mesmo T positivo preserva a ordem deles.










