Sobes.tech
Middle — Senior

Como é que um transformador é construído e quais são os principais blocos nele?

sobes.tech IA

Resposta da IA

Um transformador é uma arquitetura de rede neural amplamente utilizada para processar sequências, como texto. A ideia principal do transformador é usar um mecanismo de atenção para ponderar a importância de diferentes partes dos dados de entrada sem camadas recorrentes ou convolucionais.

Os blocos principais do transformador:

  1. Representação de entrada (Embedding) — converte os tokens de entrada em representações vetoriais.

  2. Codificação posicional (Positional Encoding) — adiciona informações sobre a posição dos tokens na sequência, já que o mecanismo de atenção não considera a ordem.

  3. Mecanismo de atenção (Self-Attention) — calcula coeficientes de peso para cada token em relação a todos os outros, permitindo que o modelo foque nas partes relevantes da entrada.

  4. Atenção multi-cabeça (Multi-Head Attention) — aplica paralelamente vários mecanismos de atenção para capturar diferentes aspectos da dependência.

  5. Normalização e conexões residuais (Layer Normalization e Residual Connections) — ajudam a estabilizar o treinamento e melhorar o fluxo de gradientes.

  6. Camadas totalmente conectadas (Feed-Forward Network) — são aplicadas a cada elemento da sequência de forma independente para uma transformação não linear.

  7. Camada de saída — para tarefas de geração ou classificação.

Exemplo de estrutura simplificada de uma camada de transformador:

class TransformerLayer(nn.Module):
    def __init__(self, d_model, nhead):
        super().__init__()
        self.self_attn = nn.MultiheadAttention(d_model, nhead)
        self.linear1 = nn.Linear(d_model, d_model*4)
        self.linear2 = nn.Linear(d_model*4, d_model)
        self.norm1 = nn.LayerNorm(d_model)
        self.norm2 = nn.LayerNorm(d_model)

    def forward(self, x):
        attn_output, _ = self.self_attn(x, x, x)
        x = self.norm1(x + attn_output)
        ff_output = self.linear2(F.relu(self.linear1(x)))
        x = self.norm2(x + ff_output)
        return x

Dessa forma, o transformador é construído a partir de camadas repetidas, o que permite modelar de forma eficiente as dependências nos dados.