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-Embeddingsmax_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>Übungsanweisungen
- Erzeuge eine Nullmatrix mit den Dimensionen
max_seq_lengthmald_model. - Führe Sinus- und Kosinus-Berechnungen auf
position * div_termdurch, um die geraden und ungeraden Positions-Embedding-Werte zu erzeugen. - Sorge dafür, dass
pewä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])