Embedding và mã hóa vị trí

Các mô hình Transformer với PyTorch

James Chapman

Curriculum Manager, DataCamp

Embedding và mã hóa vị trí trong transformer

 

  • Embedding: token → vector embedding
  • Mã hóa vị trí: Vị trí token + vector embedding → positional encoding

Thành phần token embedding và positional encoding được tô sáng trong kiến trúc transformer.

Các mô hình Transformer với PyTorch

Embedding chuỗi

Ba token: Hello, world, và một dấu chấm than.

Các mô hình Transformer với PyTorch

Embedding chuỗi

Ba token được chuyển thành ID theo từ vựng của mô hình.

Các mô hình Transformer với PyTorch

Embedding chuỗi

Các ID token được nhúng thành vector với số chiều nhất định.

Các mô hình Transformer với 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)
  • Thực hành chuẩn: nhân với $\sqrt{d_{model}}$
Các mô hình Transformer với PyTorch

Tạo embeddings

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])
Các mô hình Transformer với PyTorch

Mã hóa vị trí

Cộng token embedding và positional embedding để thêm thông tin vị trí vào input embeddings.

Các mô hình Transformer với PyTorch

Mã hóa vị trí

Giá trị vị trí lẻ dùng sin, giá trị vị trí chẵn dùng cosine.

Các mô hình Transformer với PyTorch

sin(x)

Hàm sin.

 

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

cos(x)

Hàm cosine.

 

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

Các mô hình Transformer với PyTorch

Xây dựng bộ mã hóa vị trí

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)]
Các mô hình Transformer với PyTorch

Tạo mã hóa vị trí

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])
Các mô hình Transformer với PyTorch

Ayo berlatih!

Các mô hình Transformer với PyTorch

Preparing Video For Download...