Embedding และ Positional Encoding

Transformer Models ด้วย PyTorch

James Chapman

Curriculum Manager, DataCamp

Embedding และ Positional Encoding ใน Transformer

 

  • Embedding: โทเคน → เวกเตอร์ Embedding
  • Positional encoding: ตำแหน่งโทเคน + เวกเตอร์ Embedding → Positional Encoding

ส่วนประกอบ Token Embedding และ Positional Encoding ที่ถูกไฮไลต์บนสถาปัตยกรรม Transformer

Transformer Models ด้วย PyTorch

การ Embed ลำดับโทเคน

โทเคน 3 ตัว ได้แก่ Hello, world และเครื่องหมายอัศเจรีย์

Transformer Models ด้วย PyTorch

การ Embed ลำดับโทเคน

โทเคนทั้งสามตัวถูกแปลงเป็น Token ID ตามคำศัพท์ของโมเดล

Transformer Models ด้วย PyTorch

การ Embed ลำดับโทเคน

Token ID ถูก Embed เป็นเวกเตอร์ที่มีมิติที่กำหนด

Transformer Models ด้วย 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)
  • แนวปฏิบัติมาตรฐาน: ปรับสเกลด้วย $\sqrt{d_{model}}$
Transformer Models ด้วย PyTorch

การสร้าง 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])
Transformer Models ด้วย PyTorch

Positional Encoding

Token Embedding และ Positional Embedding ถูกนำมาบวกกันเพื่อเพิ่มข้อมูลตำแหน่งเข้าสู่ Input Embedding

Transformer Models ด้วย PyTorch

Positional Encoding

ค่า Positional Embedding ลำดับคี่คำนวณด้วยฟังก์ชัน sin และลำดับคู่คำนวณด้วยฟังก์ชัน cosine

Transformer Models ด้วย PyTorch

sin(x)

ฟังก์ชัน sin

 

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

cos(x)

ฟังก์ชัน cosine

 

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

Transformer Models ด้วย PyTorch

การสร้าง 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)]
Transformer Models ด้วย PyTorch

การสร้าง 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])
Transformer Models ด้วย PyTorch

มาฝึกกันเถอะ!

Transformer Models ด้วย PyTorch

Preparing Video For Download...