Zacznij terazZacznij za darmo

Tworzenie kodowań pozycyjnych

Osadzenie tokenów to dobry początek, ale takim osadzeniom (embeddings) nadal brakuje informacji o pozycji każdego tokenu w sekwencji. Aby to naprawić, architektura transformera korzysta z kodowań pozycyjnych, które wplatają informację o pozycji każdego tokenu bezpośrednio w osadzenia.

Stworzysz klasę PositionalEncoding z następującymi parametrami:

  • d_model: wymiarowość wejściowych osadzeń
  • max_seq_length: maksymalna długość sekwencji (lub długość sekwencji, jeśli wszystkie sekwencje mają tę samą długość)

To ćwiczenie jest częścią kursu

Modele Transformer w PyTorch

Zobacz kurs

Instrukcje do ćwiczenia

  • Utwórz macierz zer o wymiarach max_seq_length na d_model.
  • Wykonaj obliczenia sinus i cosinus na position * div_term, aby uzyskać parzyste i nieparzyste wartości osadzeń pozycyjnych.
  • Upewnij się, że pe nie jest parametrem uczonym podczas treningu.
  • Dodaj przekształcone osadzenia pozycyjne do wejściowych osadzeń tokenów x.

Interaktywne ćwiczenie praktyczne

Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.

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])
Edytuj i uruchom kod