Sobes.tech
Middle — Senior

Come è costruito un trasformatore e quali sono i suoi blocchi principali?

sobes.tech AI

Risposta dell'AI

Un trasformatore è un'architettura di rete neurale ampiamente utilizzata per elaborare sequenze, come il testo. L'idea principale del trasformatore è utilizzare un meccanismo di attenzione per pesare l'importanza delle diverse parti dei dati di input senza strati ricorrenti o convoluzionali.

I blocchi principali del trasformatore:

  1. Rappresentazione di input (Embedding) — trasforma i token di input in rappresentazioni vettoriali.

  2. Codifica posizionale (Positional Encoding) — aggiunge informazioni sulla posizione dei token nella sequenza, poiché il meccanismo di attenzione non considera l'ordine.

  3. Meccanismo di attenzione (Self-Attention) — calcola coefficienti di peso per ogni token rispetto a tutti gli altri, permettendo al modello di concentrarsi sulle parti rilevanti dell'input.

  4. Attenzione multi-testa (Multi-Head Attention) — applica più meccanismi di attenzione in parallelo per catturare diversi aspetti della dipendenza.

  5. Normalizzazione e connessioni residue (Layer Normalization e Residual Connections) — aiutano a stabilizzare l'apprendimento e migliorare il flusso di gradiente.

  6. Strati completamente connessi (Feed-Forward Network) — vengono applicati a ogni elemento della sequenza separatamente per una trasformazione non lineare.

  7. Strato di output — per compiti di generazione o classificazione.

Esempio di struttura semplificata di uno strato di trasformatore:

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

In questo modo, il trasformatore è costruito da strati ripetuti, che consentono di modellare efficacemente le dipendenze nei dati.