Cómo Apilar Bloques de Transformadores
Desliza para mostrar el menú
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)
Al procesar texto con un Transformer, a menudo se utilizan varios bloques de codificador o decodificador apilados uno sobre otro. En el código anterior, se muestra cómo crear una pila de bloques de codificador utilizando PyTorch. Cada EncoderBlock contiene atención multi-cabeza, una red feed-forward y normalización de capas. La clase StackedEncoder construye una secuencia de estos bloques, pasando la salida de un bloque como entrada al siguiente. Esta apilación permite que el modelo aprenda representaciones cada vez más complejas del texto en cada capa. Para tareas de PLN, como clasificación de texto o traducción, apilar bloques ayuda a capturar relaciones y contexto más profundos en los datos. La entrada inicial —el texto convertido en embeddings— fluye a través de cada bloque codificador, y cada bloque refina la representación en función tanto de la entrada como del contexto aprendido en las capas anteriores.
Las arquitecturas Transformer pueden agruparse en tres tipos principales, cada uno adecuado para diferentes tareas de PLN:
Modelos solo codificador
- Estructura: Compuestos por una pila de bloques de codificador.
- Casos de uso típicos: Estos modelos son ideales para comprender o analizar texto. Las aplicaciones comunes incluyen clasificación de texto, análisis de sentimiento y reconocimiento de entidades nombradas. Un ejemplo conocido de este tipo es BERT.
Modelos solo decodificador
- Estructura: Compuestos por una pila de bloques de decodificador.
- Casos de uso típicos: Estos modelos están diseñados para generar texto, como en tareas de modelado de lenguaje y autocompletado de código. GPT es un ejemplo destacado de modelo solo decodificador.
Modelos codificador-decodificador
- Estructura: Combinan bloques de codificador que procesan la entrada y bloques de decodificador que generan la salida, con información que fluye del codificador al decodificador.
- Casos de uso típicos: Se utilizan para tareas de secuencia a secuencia donde tanto la entrada como la salida son secuencias. Las aplicaciones incluyen traducción automática, resumen y respuesta a preguntas. T5 y el Transformer original son ejemplos de arquitecturas codificador-decodificador.
En resumen, la elección de la arquitectura determina los tipos de problemas de PLN que se pueden resolver: modelos solo codificador para análisis, modelos solo decodificador para generación y modelos codificador-decodificador para tareas que requieren mapear una secuencia a otra.
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla