Embedding adalah tabel pencarian yang memetakan setiap token diskret menjadi vektor padat yang dipelajari, dan nn.Embedding adalah wujudnya di PyTorch. Topik ini menjelaskan mengapa vektor padat menggantikan one-hot, menunjukkan bahwa embedding hanyalah perkalian matriks dengan indeks, dan memeriksa struktur geometris yang muncul setelah dipelajari. Setelah selesai, lapisan pertama setiap model bahasa terbaca sebagai keputusan yang berdasar.
Dari one-hot ke vektor padat#
Representasi one-hot menyatakan token berkosakata sebagai vektor panjang yang seluruhnya nol kecuali satu, dan representasi ini punya dua kelemahan yang tumbuh bersama kosakata. Pertama, ukurannya membengkak, karena kosakata lima puluh ribu token menuntut vektor lima puluh ribu elemen per token. Kedua, semua token sama jauh satu sama lain, karena dua vektor one-hot berbeda selalu ortogonal, sehingga model tidak diberi petunjuk apa pun bahwa kucing dan anjing lebih mirip daripada kucing dan kunci.
Embedding menggantinya dengan tabel berukuran yang setiap barisnya menjadi wajah vektor satu token, dan yang dipilih jauh lebih kecil dari . Vektor-vektornya dipelajari dari data, sehingga token yang berperilaku mirip dalam konteks cenderung menempati wilayah yang berdekatan, dan itulah informasi relasional yang tidak pernah dimiliki one-hot. Operasi pencariannya secara matematis adalah perkalian matriks dengan vektor one-hot, tetapi diimplementasikan sebagai indeks baris karena perkalian itu hanya menyalin satu baris.
nn.Embedding sebagai tabel pencarian#
nn.Embedding(num_embeddings, embedding_dim) memuat tabel tersebut sebagai parameter, dan pemanggilannya dengan indeks mengembalikan baris yang sesuai. Kode berikut membangun tabel kecil, mencari tiga token, dan menunjukkan identitas antara pencarian langsung dengan perkalian matriks one-hot yang setara.
import torch
import torch.nn as nn
torch.manual_seed(0)
emb = nn.Embedding(num_embeddings=6, embedding_dim=4)
indeks = torch.tensor([0, 2, 5])
hasil = emb(indeks)
one_hot = torch.nn.functional.one_hot(indeks, num_classes=6).float()
via_matriks = one_hot @ emb.weight
print("bentuk tabel :", tuple(emb.weight.shape))
print("bentuk hasil :", tuple(hasil.shape))
print("pencarian == matriks one-hot:", torch.allclose(hasil, via_matriks))bentuk tabel : (6, 4)
bentuk hasil : (3, 4)
pencarian == matriks one-hot: TrueTabel enam token berdimensi empat menyimpan 24 parameter, dan hasil pencarian tiga indeks berbentuk 3x4 persis sama dengan perkalian matriks one-hot terhadap tabelnya. Identitas ini menjelaskan dua hal sekaligus, yaitu embedding belajar dengan cara yang sama seperti layer linier karena gradiennya mengalir ke baris yang dipilih, dan biaya komputasinya tetap murah karena tidak pernah ada vektor one-hot yang benar-benar dibangun.
Struktur geometris yang dipelajari#
Struktur yang muncul pada embedding yang dilatih sering mengikuti fungsi kata dalam kalimat. Kata-kata dengan distribusi konteks yang mirip menempati wilayah yang berdekatan, dan arah tertentu menyatakan hubungan yang konsisten, contoh klasiknya arah gender pada embedding kata bahasa Inggris yang menyusun pasangan seperti man dan woman sejajar dengan pasangan lain. Sifat ini tidak diperintahkan siapa pun, melainkan konsekuensi dari tujuan pelatihan yang menghukum prediksi konteks yang salah.
Struktur yang sama dapat disimulasikan pada embedding yang dipelajari dari data kecil. Kode berikut melatih tabel mini dengan tujuan sederhana, memprediksi apakah konteksnya berasal dari kelompok A atau B, lalu mengukur jarak antar token yang dilatihnya.
import torch
import torch.nn as nn
torch.manual_seed(0)
emb = nn.Embedding(4, 2)
klasifikasi = nn.Linear(2, 1)
opt = torch.optim.Adam(list(emb.parameters()) + list(klasifikasi.parameters()), lr=0.1)
token = torch.tensor([0, 1, 2, 3])
kelompok = torch.tensor([[0.0], [0.0], [1.0], [1.0]])
for _ in range(300):
opt.zero_grad()
loss = ((klasifikasi(emb(token))) - kelompok) ** 2
loss.mean().backward()
opt.step()
with torch.no_grad():
W = emb.weight
def jarak(a, b):
return round(float((W[a] - W[b]).norm()), 3)
print("jarak 0-1 (satu kelompok):", jarak(0, 1))
print("jarak 2-3 (satu kelompok):", jarak(2, 3))
print("jarak 0-2 (beda kelompok):", jarak(0, 2))jarak 0-1 (satu kelompok): 2.547
jarak 2-3 (satu kelompok): 0.163
jarak 0-2 (beda kelompok): 4.016Setelah tiga ratus langkah, dua token dari kelompok yang sama menempatkan vektornya berdekatan, sedangkan token dari kelompok berlawanan menjauh, karena hanya konfigurasi itu yang menurunkan loss. Pada skala jutaan token dengan tujuan prediksi konteks, mekanika yang sama menghasilkan struktur semantik yang jauh lebih kaya, dan tabel besar itulah yang dipakai kembali oleh model-model pada modul Transfer learning.
Menyatukan embedding ke model sekuens#
Embedding menempati posisi lapisan pertama pada arsitektur sekuens, yaitu token berbentuk batch dan panjang menjadi tensor berbentuk batch, panjang, dan dimensi embedding, lalu diteruskan ke RNN maupun transformer. Token padding memperoleh vektornya sendiri di tabel, dan praktik yang baik adalah meneruskan topeng dari topik Data sekuens agar posisi padding tidak ikut memengaruhi keadaan, sebagaimana pack_padded_sequence melakukannya untuk RNN.
Satu keputusan penutup menyangkut pembekuan. Pada transfer learning, tabel embedding pretrained dapat dipakai langsung, diselesaikan, atau diperbarui sebagian, dan masing-masing pilihan adalah bagian dari strategi fine-tuning yang dibahas pada topik Fine-tuning. Untuk saat ini, yang penting dipahami adalah tabelnya dipelajari seperti parameter lain, dan kualitas strukturnya ditentukan oleh tujuan pelatihannya.
Ringkasan#
- Embedding mengganti one-hot dengan tabel yang barisnya dipelajari, sehingga token yang mirip konteks berdekatan secara geometris.
- Pencarian embedding setara perkalian one-hot dengan tabel, tetapi dijalankan sebagai indeks baris yang murah.
- Struktur kelompok muncul hanya dari tujuan pelatihan, sebagaimana ditunjukkan jarak antar token yang dilatih pada kelompok berbeda.
- Embedding menempati lapisan pertama model sekuens dengan keluaran batch, panjang, dan dimensi, dan topeng padding tetap mengikatnya.
Referensi#
- torch.nn.Embedding — PyTorch — Dokumentasi tabel embedding beserta aturan indeks dan bentuknya.
- Word Embeddings — Dive into Deep Learning — Bab word2vec yang menurunkan tujuan pelatihan embedding dari konteks.
- Efficient Estimation of Word Representations — arXiv — Makalah Mikolov dkk. yang memperkenalkan word2vec dan strukturnya.