LoslegenKostenlos starten

Positionale Encodings erstellen

Tokens zu embeddieren ist ein guter Anfang, aber diesen Embeddings fehlt noch die Information über die Position jedes Tokens in der Sequenz. Um das auszugleichen, nutzt die Transformer-Architektur sogenannte positional encodings. Dadurch wird Positionsinformation jedes Tokens in die Embeddings eingebettet.

Du erstellst eine PositionalEncoding-Klasse mit folgenden Parametern:

  • d_model: die Dimensionalität der Eingabe-Embeddings
  • max_seq_length: die maximale Sequenzlänge (oder die Sequenzlänge, wenn alle Sequenzen gleich lang sind)

Diese Übung ist Teil des Kurses

<Kurs>Transformer-Modelle mit PyTorch</Kurs>
Kurs ansehen

Übungsanweisungen

  • Erzeuge eine Nullmatrix mit den Dimensionen max_seq_length mal d_model.
  • Führe Sinus- und Kosinus-Berechnungen auf position * div_term durch, um die geraden und ungeraden Positions-Embedding-Werte zu erzeugen.
  • Sorge dafür, dass pe während des Trainings kein lernbarer Parameter ist.
  • Addiere die transformierten positional embeddings zu den Token-Embeddings der Eingabe, x.

Interaktive praktische Übung

Versuche dich an dieser Übung, indem du diesen Beispielcode vervollständigst.

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])
Code bearbeiten und ausführen