Crear codificaciones posicionales
Hacer el embedding de los tokens es un buen comienzo, pero estos embeddings aún no incluyen información sobre la posición de cada token en la secuencia. Para solucionarlo, la arquitectura transformer utiliza codificaciones posicionales, que incorporan la información de posición de cada token dentro de los embeddings.
Vas a crear una clase PositionalEncoding con los siguientes parámetros:
d_model: la dimensionalidad de los embeddings de entradamax_seq_length: la longitud máxima de la secuencia (o la longitud de la secuencia si todas tienen la misma longitud)
Este ejercicio forma parte del curso
Modelos Transformer con PyTorch
Instrucciones del ejercicio
- Crea una matriz de ceros de dimensiones
max_seq_lengthpord_model. - Realiza los cálculos de seno y coseno sobre
position * div_termpara generar los valores de embedding posicional pares e impares. - Asegúrate de que
peno sea un parámetro entrenable durante el entrenamiento. - Suma los embeddings posicionales transformados a los embeddings de tokens de entrada,
x.
Ejercicio interactivo práctico
Prueba este ejercicio y completa el código de muestra.
class PositionalEncoding(nn.Module):
def __init__(self, d_model, max_seq_length):
super().__init__()
# Create a matrix of zeros of dimensions max_seq_length by d_model
pe = ____
position = torch.arange(0, max_seq_length, dtype=torch.float).unsqueeze(1)
div_term = torch.exp(torch.arange(0, d_model, 2).float() * -(math.log(10000.0) / d_model))
# Perform the sine and cosine calculations
pe[:, 0::2] = torch.____(position * div_term)
pe[:, 1::2] = torch.____(position * div_term)
# Ensure pe isn't a learnable parameter during training
self.____('____', pe.unsqueeze(0))
def forward(self, x):
# Add the positional embeddings to the token embeddings
return ____ + ____[:, :x.size(1)]
pos_encoding_layer = PositionalEncoding(d_model=512, max_seq_length=4)
output = pos_encoding_layer(token_embeddings)
print(output.shape)
print(output[0][0][:10])