Data sekuens

Teks, deret waktu, dan penanganan panjang yang bervariasi.

Daftar isi

Data sekuens adalah data yang urutannya bermakna, seperti teks, deret waktu, dan sinyal audio, dan tiga sifatnya membedakan penanganannya dari data citra maupun tabel. Topik ini mendefinisikan ketiga sifat tersebut, membangun kosakata tokenisasi untuk teks, dan menyelesaikan masalah panjang bervariasi dengan padding serta penyimpanan panjang asli. Setelah selesai, data sekuens dapat dipersiapkan menjadi tensor batch yang siap dipakai model sekuens.

Tiga sifat yang membedakan data sekuens#

Sifat pertama adalah ketergantungan urutan. Pertukaran dua elemen pada citra memindahkan isinya, sedangkan pertukaran dua kata pada kalimat sering mengubah artinya sepenuhnya, sehingga model sekuens harus peka terhadap susunan dan bukan sekadar kehadiran. Sifat kedua adalah panjang yang bervariasi, karena satu kalimat berisi tiga kata dan lainnya berisi tiga puluh, sementara tensor membutuhkan bentuk yang seragam. Sifat ketiga adalah ketergantungan jarak jauh, yaitu kata awal kalimat dapat menentukan makna kata akhirnya, dan jarak yang menyimpan relasi itu tidak tetap.

Ketiga sifat itu menjelaskan arsitektur yang menyusul pada modul ini. RNN menanggapi urutan dengan membawa keadaan antar langkah, LSTM dan GRU memperpanjang jangkauan memorinya, dan transformer memilih jalan berbeda dengan attention yang menghubungkan dua posisi berapa pun secara langsung. Yang dibutuhkan sebelum semua itu adalah representasi angka yang benar, dan itulah isi dua bagian berikutnya.

Tokenisasi dan kosakata#

Model tidak membaca huruf maupun kata sebagai teks, melainkan membaca indeks bilangan bulat yang disebut token. Tokenisasi tingkat kata memetakan setiap kata unik ke satu indeks lewat kamus kosakata, dan token khusus dilengkapi untuk posisi kosong maupun kata yang tidak dikenal. Ukuran kosakata adalah keputusan desain, karena kosakata besar menangkap lebih banyak kata tetapi membuat embedding-nya jarang, sedangkan kosakata kecil memaksa banyak kata jatuh ke token tak dikenal.

Kode berikut membangun kamus sederhana dari tiga kalimat latihan dan mengodekan kalimat baru menjadi indeks, sehingga alur teks menuju token terlihat utuh.

python Contoh: kosakata dan pengodean kalimat
import torch

kalimat = ["kucing tidur di sofa", "anjing berlari di taman", "kucing berlari cepat"]
kosakata = {"<pad>": 0, "<unk>": 1}
for s in kalimat:
    for kata in s.split():
        kosakata.setdefault(kata, len(kosakata))

def odekan(kalimat_baru):
    return torch.tensor([kosakata.get(k, 1) for k in kalimat_baru.split()])

print("ukuran kosakata :", len(kosakata))
print("indeks           :", {k: v for k, v in kosakata.items()})
print("kalimat baru     :", odekan("kucing berlari di taman").tolist())
print("kata asing       :", odekan("bebek berenang").tolist())
text Keluaran
ukuran kosakata : 10
indeks           : {'<pad>': 0, '<unk>': 1, 'kucing': 2, 'tidur': 3, 'di': 4, 'sofa': 5, 'anjing': 6, 'berlari': 7, 'taman': 8, 'cepat': 9}
kalimat baru     : [2, 7, 4, 8]
kata asing       : [1, 1]

Kalimat baru terodekan penuh karena semua katanya ada, sedangkan kata asing jatuh ke indeks 1 yang merupakan token <unk>. Perhatikan bahwa indeks 0 disiapkan untuk <pad>, dan pilihan ini bukan kebetulan, karena indeks padding yang tetap memudahkan topeng yang dibangun di atasnya.

Padding dan panjang asli#

Menyatukan sekuens berpanjang berbeda ke dalam satu tensor dilakukan dengan padding, yaitu menambahkan nilai 0 sampai semua baris menyamai yang terpanjang. Padding yang diperlakukan seperti data sungguhan menyesatkan model, sehingga panjang asli setiap baris disimpan dan model memakainya untuk mengabaikan posisi palsu, baik lewat pack_padded_sequence pada RNN maupun topeng boolean pada transformer.

python Contoh: padding batch sekuens dan topengnya
import torch
from torch.nn.utils.rnn import pad_sequence

a = torch.tensor([5, 8, 2])
b = torch.tensor([7, 3])
batch = pad_sequence([a, b], batch_first=True, padding_value=0.0)
panjang = torch.tensor([len(a), len(b)])
topeng = torch.arange(batch.size(1))[None, :] < panjang[:, None]
print("batch terpadatkan:", batch.tolist())
print("panjang asli     :", panjang.tolist())
print("topeng           :", topeng.tolist())
text Keluaran
batch terpadatkan: [[5, 8, 2], [7, 3, 0]]
panjang asli     : [3, 2]
topeng           : [[True, True, True], [True, True, False]]

Batch terpadatkan berbentuk persegi 2x3 dengan baris kedua berisi dua nilai asli dan satu padding, dan topeng boolean menyatakan posisi mana yang sah. Pola data plus panjang plus topeng inilah konvensi yang dipakai seluruh modul sekuens, dan urutan kerjanya selalu sama, yaitu simpan panjang sebelum memadatkan, lalu bangun topeng dari panjang tersebut.

Deret waktu dan jendela geser#

Deret waktu memakai sifat yang sama dengan teks tetapi menghadapi dua keputusan tambahan. Pertama, sampling yang seragam menjadi syarat, karena jarak antar langkah yang tak seragam membingungkan model yang menghitung ketergantungan per langkah. Kedua, masalah prediksinya dinyatakan sebagai jendela geser, yaitu k langkah terakhir menjadi masukan dan langkah berikutnya menjadi target, sehingga satu deret panjang menghasilkan banyak contoh pelatihan.

Pembangkitan jendela adalah operasi indeks murni yang dapat diverifikasi angkanya, dan kode berikut memotong deret tujuh langkah menjadi empat jendela berukuran masukan tiga dan target satu.

python Contoh: jendela geser pada deret waktu
import torch

deret = torch.tensor([1.0, 2.0, 4.0, 7.0, 11.0, 16.0, 22.0])
k = 3
X = torch.stack([deret[i:i + k] for i in range(len(deret) - k)])
t = torch.tensor([deret[i + k] for i in range(len(deret) - k)])
print("bentuk masukan:", tuple(X.shape))
print("pasangan pertama:", X[0].tolist(), "->", t[0].item())
print("pasangan terakhir:", X[-1].tolist(), "->", t[-1].item())
text Keluaran
bentuk masukan: (4, 3)
pasangan pertama: [1.0, 2.0, 4.0] -> 7.0
pasangan terakhir: [7.0, 11.0, 16.0] -> 22.0

Jumlah jendela yang dihasilkan tepat n−k n - k untuk deret sepanjang n n , dan setiap pasangan memuat tiga langkah masa lalu menuju satu langkah masa depan. Pola ini menutup persiapan data sekuens, dan sisa modul memakai data yang telah dibentuk seperti ini untuk membangun modelnya, dimulai dari topik RNN.

Ringkasan#

  • Data sekuens peka urutan, berpanjang bervariasi, dan memuat ketergantungan jarak jauh, dan ketiganya membentuk kebutuhan arsitekturnya.
  • Tokenisasi mengubah teks menjadi indeks dengan kamus kosakata, dengan token <pad> dan <unk> yang perannya tetap.
  • Padding menyatukan panjang, panjang asli disimpan, dan topeng boolean dibangun dari panjang tersebut agar posisi palsu diabaikan.
  • Deret waktu dikonversi menjadi contoh lewat jendela geser dengan jumlah jendela n−k n - k untuk deret sepanjang n n .

Referensi#