Come Impilare i Blocchi Transformer
Scorri per mostrare il menu
123456789101112131415161718192021222324252627282930313233343536373839404142434445import torch import torch.nn as nn class EncoderBlock(nn.Module): def __init__(self, embed_dim, num_heads, ff_dim): super().__init__() self.attn = nn.MultiheadAttention(embed_dim, num_heads, batch_first=True) self.norm1 = nn.LayerNorm(embed_dim) self.ff = nn.Sequential( nn.Linear(embed_dim, ff_dim), nn.ReLU(), nn.Linear(ff_dim, embed_dim) ) self.norm2 = nn.LayerNorm(embed_dim) def forward(self, x): attn_output, _ = self.attn(x, x, x) x = self.norm1(x + attn_output) ff_output = self.ff(x) x = self.norm2(x + ff_output) return x class StackedEncoder(nn.Module): def __init__(self, num_layers, embed_dim, num_heads, ff_dim): super().__init__() self.layers = nn.ModuleList([ EncoderBlock(embed_dim, num_heads, ff_dim) for _ in range(num_layers) ]) def forward(self, x): for layer in self.layers: x = layer(x) return x # Example usage: stack 4 encoder blocks for input text embeddings embed_dim = 64 num_heads = 4 ff_dim = 256 num_layers = 4 stacked_encoder = StackedEncoder(num_layers, embed_dim, num_heads, ff_dim) input_tensor = torch.rand(2, 10, embed_dim) # batch_size=2, seq_len=10 output = stacked_encoder(input_tensor) print("Stacked encoder output shape:", output.shape)
Quando si elabora il testo con un Transformer, spesso si utilizzano diversi blocchi encoder o decoder impilati uno sopra l'altro. Nel codice sopra, viene mostrato come creare una pila di blocchi encoder utilizzando PyTorch. Ogni EncoderBlock contiene self-attention multi-head, una rete feed-forward e una normalizzazione del layer. La classe StackedEncoder costruisce una sequenza di questi blocchi, passando l'output di un blocco come input al successivo. Questa impilazione consente al modello di apprendere rappresentazioni sempre più complesse del testo a ogni livello. Per i compiti di NLP, come la classificazione del testo o la traduzione, l'impilamento dei blocchi aiuta a catturare relazioni e contesti più profondi nei dati. L'input iniziale - testo convertito in embedding - attraversa ogni blocco encoder, con ciascun blocco che affina la rappresentazione sulla base sia dell'input sia del contesto appreso nei livelli precedenti.
Le architetture Transformer possono essere raggruppate in tre tipologie principali, ciascuna adatta a diversi compiti di NLP:
Modelli Solo Encoder
- Struttura: Composta da una pila di blocchi encoder.
- Casi d'Uso Tipici: Questi modelli sono ideali per comprendere o analizzare il testo. Applicazioni comuni includono classificazione del testo, analisi del sentiment e riconoscimento di entità nominate. Un esempio noto di questo tipo è BERT.
Modelli Solo Decoder
- Struttura: Composta da una pila di blocchi decoder.
- Casi d'Uso Tipici: Questi modelli sono progettati per generare testo, come nel language modeling e nei compiti di completamento del codice. GPT è un esempio importante di modello solo decoder.
Modelli Encoder-Decoder
- Struttura: Combinano blocchi encoder che elaborano l'input e blocchi decoder che generano l'output, con il flusso di informazioni dall'encoder al decoder.
- Casi d'Uso Tipici: Sono utilizzati per compiti sequence-to-sequence in cui sia l'input che l'output sono sequenze. Applicazioni includono traduzione automatica, sintesi e question answering. T5 e il Transformer originale sono esempi di architetture encoder-decoder.
In sintesi, la scelta dell'architettura determina i tipi di problemi NLP che si possono risolvere: modelli solo encoder per l'analisi, solo decoder per la generazione e encoder-decoder per compiti che richiedono la mappatura di una sequenza in un'altra.
Grazie per i tuoi commenti!
Chieda ad AI
Chieda ad AI
Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione