Embedding dan positional encoding

Model Transformer dengan PyTorch

James Chapman

Curriculum Manager, DataCamp

Embedding dan positional encoding pada transformer

 

  • Embedding: token → vektor embedding
  • Positional encoding: Posisi token + vektor embedding → encoding posisi

Komponen embedding token dan positional encoding disorot pada arsitektur transformer.

Model Transformer dengan PyTorch

Meng-embedding sekuens

Tiga token: Hello, world, dan tanda seru.

Model Transformer dengan PyTorch

Meng-embedding sekuens

Tiga token diubah menjadi ID token berdasarkan kosakata model.

Model Transformer dengan PyTorch

Meng-embedding sekuens

ID token di-embed menjadi vektor berdimensi tertentu.

Model Transformer dengan 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)
  • Praktik standar: penskalaan dengan $\sqrt{d_{model}}$
Model Transformer dengan PyTorch

Membuat embedding

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])
Model Transformer dengan PyTorch

Positional encoding

Embedding token dan positional dijumlahkan untuk menambahkan informasi posisi ke input embedding.

Model Transformer dengan PyTorch

Positional encoding

Nilai embedding posisi ganjil dihitung dengan fungsi sinus, dan nilai genap dengan fungsi cosinus.

Model Transformer dengan PyTorch

sin(x)

Fungsi sinus.

 

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

cos(x)

Fungsi cosinus.

 

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

Model Transformer dengan PyTorch

Membangun positional encoder

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)]
Model Transformer dengan PyTorch

Membuat positional encoding

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])
Model Transformer dengan PyTorch

Ayo berlatih!

Model Transformer dengan PyTorch

Preparing Video For Download...