ÎncepețiÎncepe gratuit

Crearea encodărilor poziționale

Încorporarea tokenurilor este un bun punct de plecare, însă aceste încorporări nu conțin încă informații despre poziția fiecărui token în secvență. Pentru a remedia acest lucru, arhitectura transformer utilizează encodări poziționale, care integrează informațiile de poziție ale fiecărui token în încorporări.

Vei crea o clasă PositionalEncoding cu următorii parametri:

  • d_model: dimensionalitatea încorporărilor de intrare
  • max_seq_length: lungimea maximă a secvenței (sau lungimea secvenței, dacă toate secvențele au aceeași lungime)

Acest exercițiu face parte din cursul

Modele Transformer cu PyTorch

Vezi cursul

Instrucțiuni pentru exercițiu

  • Creează o matrice de zerouri cu dimensiunile max_seq_length pe d_model.
  • Efectuează calculele cu sinus și cosinus pe position * div_term pentru a genera valorile de încorporare pozițională cu indici pari, respectiv impari.
  • Asigură-te că pe nu este un parametru antrenabil în timpul antrenamentului.
  • Adaugă încorporările poziționale transformate la încorporările tokenurilor de intrare, x.

Exercițiu interactiv practic

Încearcă acest exercițiu completând acest cod de exemplu.

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])
Editează și rulează codul