Embedding și codificare pozițională

Modele Transformer cu PyTorch

James Chapman

Curriculum Manager, DataCamp

Embedding și codificare pozițională în transformere

 

  • Embedding: tokeni → vector de embedding
  • Codificare pozițională: poziție token + vector de embedding → codificare pozițională

Componentele de embedding al tokenilor și codificare pozițională evidențiate în arhitectura transformerului.

Modele Transformer cu PyTorch

Embedding secvențe

Trei tokeni: Hello, world și un semn de exclamare.

Modele Transformer cu PyTorch

Embedding secvențe

Cei trei tokeni convertiți în ID-uri de token pe baza vocabularului modelului.

Modele Transformer cu PyTorch

Embedding secvențe

ID-urile tokenilor transformate în vectori cu o anumită dimensionalitate.

Modele Transformer cu PyTorch
import torch
import math
import torch.nn as nn

class InputEmbeddings(nn.Module):

def __init__(self, vocab_size: int, d_model: int) -> None: super().__init__() self.d_model = d_model self.vocab_size = vocab_size self.embedding = nn.Embedding(vocab_size, d_model)
def forward(self, x): return self.embedding(x) * math.sqrt(self.d_model)
  • Practică standard: scalare cu $\sqrt{d_{model}}$
Modele Transformer cu PyTorch

Crearea embeddingurilor

embedding_layer = InputEmbeddings(vocab_size=10_000, d_model=512)

embedded_output = embedding_layer(torch.tensor([[1, 2, 3, 4], [5, 6, 7, 8]]))
print(embedded_output.shape)
torch.Size([2, 4, 512])
Modele Transformer cu PyTorch

Codificare pozițională

Embeddingurile token și poziționale sunt adăugate pentru a incorpora informația pozițională în embeddingurile de intrare.

Modele Transformer cu PyTorch

Codificare pozițională

Valorile impare ale codificării poziționale sunt calculate cu funcția sinus, iar cele pare cu funcția cosinus.

Modele Transformer cu PyTorch

sin(x)

Funcția sinus.

 

$$ PE_{(pos, 2i)}=\sin(\frac{pos}{10000^{2i/d_{model}}}) $$

cos(x)

Funcția cosinus.

 

$$ PE_{(pos, 2i+1)}=\cos(\frac{pos}{10000^{2i/d_{model}}}) $$

Modele Transformer cu PyTorch

Construirea unui encoder pozițional

class PositionalEncoding(nn.Module):
    def __init__(self, d_model, max_seq_length):
        super().__init__()

        pe = torch.zeros(max_seq_length, d_model)

position = torch.arange(0, max_seq_length, dtype=torch.float).unsqueeze(1)
div_term = torch.exp(torch.arange(0, d_model, 2, dtype=torch.float) * -(math.log(10000.0) / d_model)) pe[:, 0::2] = torch.sin(position * div_term) pe[:, 1::2] = torch.cos(position * div_term)
self.register_buffer('pe', pe.unsqueeze(0))
def forward(self, x): return x + self.pe[:, :x.size(1)]
Modele Transformer cu PyTorch

Crearea codificărilor poziționale

pos_encoding_layer = PositionalEncoding(d_model=512, max_seq_length=4)

pos_encoded_output = pos_encoding_layer(embedded_output)
print(pos_encoded_output.shape)
torch.Size([2, 4, 512])
Modele Transformer cu PyTorch

Să exersăm!

Modele Transformer cu PyTorch

Preparing Video For Download...