ComeçarComece de graça

Criando codificações posicionais

Fazer o embedding dos tokens é um bom começo, mas esses embeddings ainda não trazem informação sobre a posição de cada token na sequência. Para resolver isso, a arquitetura transformer usa codificações posicionais, que incorporam a informação de posição de cada token aos embeddings.

Você vai criar uma classe PositionalEncoding com os seguintes parâmetros:

  • d_model: a dimensionalidade dos embeddings de entrada
  • max_seq_length: o tamanho máximo da sequência (ou o tamanho da sequência, se todas tiverem o mesmo comprimento)

Este exercício faz parte do curso

Modelos Transformer com PyTorch

Ver curso

Instruções do exercício

  • Crie uma matriz de zeros com dimensões max_seq_length por d_model.
  • Faça os cálculos de seno e cosseno em position * div_term para criar os valores pares e ímpares do embedding posicional.
  • Garanta que pe não seja um parâmetro treinável durante o treinamento.
  • Some os embeddings posicionais transformados aos embeddings de tokens de entrada, x.

Exercício interativo prático

Experimente este exercício completando este código de exemplo.

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])
Editar e executar o código