Gradient | Attention mechanism, Multi Head Attention | Text Generation | I.A
- Gradient | Attention mechanism, Multi Head Attention | Text Generation | I.A
- Gradiente (Gradient) no contexto de Attention e Transformers
O que é gradiente, em termos simples
O gradiente é o mecanismo que permite ao modelo aprender.
Ele indica como e quanto os parâmetros internos do modelo devem ser ajustados para reduzir o erro cometido durante o treinamento.
Em termos práticos, o gradiente responde à pergunta:
“Quais pesos precisam mudar para que o modelo produza uma saída melhor?”
Sem gradiente, um modelo executa cálculos, mas não aprende.
Onde o gradiente entra no Transformer
No Transformer, o gradiente atua durante o treinamento, após o modelo produzir uma saída e calcular um erro (loss).
O processo ocorre em três etapas principais:
- O texto passa pelas camadas de atenção (forward pass)
- O modelo gera uma previsão e calcula o erro
- O erro é propagado para trás (backpropagation), gerando gradientes
Esses gradientes são usados para atualizar os pesos do modelo.
O que exatamente aprende na Attention
O cálculo da atenção em si é fixo. O que o modelo aprende são os parâmetros que geram a atenção.
Em especial:
- os pesos que transformam embeddings em Query (Q)
- os pesos que geram Key (K)
- os pesos que geram Value (V)
- os pesos da projeção final que combina as heads
Esses pesos determinam como o modelo compara palavras e onde ele decide focar.
É o gradiente que ajusta esses parâmetros ao longo do treinamento.
Gradiente e Multi-Head Attention
No Multi-Head Attention, cada head possui seus próprios pesos.
Durante o treinamento:
- cada head aprende a focar em padrões diferentes
- o gradiente ajusta os pesos de cada head de forma independente
- heads que contribuem mais para reduzir o erro são reforçadas
Com o tempo, isso faz com que diferentes heads se especializem em diferentes tipos de relações linguísticas.
Quando o gradiente é usado
O gradiente é utilizado quando o modelo está sendo treinado ou ajustado.
Isso inclui:
- treinamento do modelo do zero
- fine-tuning de um modelo pré-treinado
- ajuste de embeddings ou camadas específicas
Nesses casos, o cálculo de gradiente é indispensável.
Quando o gradiente não é usado
Durante inferência, o modelo apenas executa os cálculos para gerar saídas.
Exemplos:
- geração de texto
- criação de embeddings
- uso de modelos em produção
- pipelines de RAG sem fine-tuning
Nessas situações, os pesos já estão definidos e não devem ser alterados.
Por isso, o cálculo de gradientes é desativado.
Conexão com código
Em frameworks como PyTorch, isso é explicitado no código.
Durante inferência:
with torch.no_grad():
output = model(input)
Durante treinamento:
output = model(input)
loss = criterion(output, target)
loss.backward() # cálculo do gradiente
optimizer.step() # atualização dos pesos
O mesmo modelo pode operar em ambos os contextos; o que muda é se o gradiente está ativo ou não.