Kursus Matematika untuk AI · Pelajaran 5 dari 180
Indeks Tensor untuk AI: Membaca Sampel, Token, dan Fitur
Pelajari cara membaca subskrip tensor, menerjemahkan alamat batch-token-fitur ke NumPy, dan menemukan kesalahan sumbu yang tampak valid dalam kode AI.
Sebuah program AI membaca X[1, 2, 0] dan mengembalikan 0.8. Ekspresi di dekatnya, X[1, 0, 2], mengembalikan 0.3. Kedua alamat valid. Hanya satu yang berarti “fitur pertama dari token terakhir pada contoh kedua.”
Perbedaannya adalah indeks: posisi yang digunakan untuk menemukan nilai di dalam struktur berurutan. Indeks adalah bagian kecil dari notasi, tetapi menentukan contoh, token, fitur, piksel, atau keluaran model mana yang benar-benar digunakan dalam perhitungan. Karena itu, indeks yang keliru dapat menghasilkan angka yang tampak masuk akal alih-alih kesalahan yang membantu.
Di akhir pelajaran ini, Anda akan mampu membaca sampel dan koordinat berindeks, mengikuti alamat tensor batch-token-fitur, menerjemahkan subskrip matematika ke NumPy, dan mendeteksi alamat yang angkanya legal tetapi makna sumbunya keliru. Pelajaran ini menambahkan urutan pada koleksi dataset dari Pelajaran 4. Situs pendamping resmi Mathematics for Machine Learning menempatkan notasi ini pada jalur dari data numerik menuju vektor, matriks, dan model yang digunakan nanti dalam kursus.
Indeks menjawab “posisi yang mana?”
Misalkan sebuah dataset berurutan berisi tiga contoh:
Subskrip dalam berarti “pilih contoh pada posisi 2.” Itu tidak berarti nilai contoh tersebut adalah 2. Jika contoh kedua adalah pasangan , maka menamai seluruh pasangan itu.
Tambahkan subskrip kedua untuk memilih koordinat di dalam contoh tersebut:
Baca dari kiri ke kanan: pilih contoh 2, lalu koordinat 1. Indeks membentuk alamat; angka yang tersimpan di alamat itu adalah nilainya.
Ini juga memisahkan posisi dari identitas. Memindahkan sampel dari posisi 2 ke posisi 7 mengubah indeksnya meskipun ID stabil, piksel gambar, dan labelnya tidak berubah. Indeks adalah alamat yang berguna, bukan nama permanen untuk objek dunia nyata.
Setiap subskrip memilih satu sumbu
Sumbu adalah satu arah tempat array diorganisasi. Tabel memiliki sumbu baris dan sumbu kolom. Di sini, tensor adalah array multidimensi: tensor dapat memiliki kedua sumbu tersebut atau menambahkan sumbu lain untuk konsep seperti batch dan token.
Pertimbangkan tensor aktivasi
dengan:
- adalah jumlah contoh dalam batch;
- adalah jumlah posisi token per contoh; dan
- adalah jumlah fitur yang disimpan untuk setiap token.
Notasi menyatakan bahwa setiap entri adalah bilangan real dan tensor memiliki bentuk . Satu entri skalar adalah
yang berarti: pilih posisi batch , posisi token , dan posisi fitur , dalam urutan tersebut.
Untuk tensor dengan bentuk , konvensi matematika yang dimulai dari satu memungkinkan
Bentuk menyediakan rentang setiap indeks. Nama sumbu menyediakan maknanya. Tidak satu pun fakta menggantikan fakta lainnya.
Satu alamat, ditelusuri sampai menjadi nilai
Gunakan tensor dua batch berikut. Setiap item batch berisi tiga baris token, dan setiap token memiliki empat nilai fitur.
| Token | Fitur 1 | Fitur 2 | Fitur 3 | Fitur 4 |
|---|---|---|---|---|
| 1 | 0.2 | 0.8 | -0.1 | 0.4 |
| 2 | 1.1 | -0.3 | 0.5 | 0.0 |
| 3 | 0.7 | 0.6 | 0.2 | -0.4 |
| Token | Fitur 1 | Fitur 2 | Fitur 3 | Fitur 4 |
|---|---|---|---|---|
| 1 | -0.2 | 0.9 | 0.3 | 0.1 |
| 2 | 0.4 | -0.7 | 1.2 | 0.5 |
| 3 | 0.8 | 0.1 | -0.6 | 1.5 |
Pembacaan bertahap ini lebih penting daripada menghafal urutan huruf. Proyek lain mungkin menyimpan token sebelum batch, atau menggunakan sumbu tinggi, lebar, dan kanal untuk gambar. Kode dan dokumentasi harus menyatakan kontraknya.
NumPy dimulai dari nol
Banyak teks matematika memberi label posisi mulai dari 1. Python dan NumPy menggunakan pengindeksan berbasis nol, jadi posisi pertama adalah 0. Panduan pengindeksan resmi NumPy juga mengonfirmasi bahwa satu bilangan bulat per dimensi memilih satu elemen dan bahwa indeks nonnegatif yang valid untuk sumbu berukuran memenuhi .
| Posisi yang dimaksud | Matematika berbasis satu | NumPy berbasis nol |
|---|---|---|
| Item batch 2 | b = 1 | |
| Token 3 | t = 2 | |
| Fitur 1 | f = 0 | |
| Alamat lengkap | X[1, 2, 0] |
Berikut tensor lengkap dan beberapa pilihan yang telah diverifikasi:
import numpy as np
X = np.array([
[[ 0.2, 0.8, -0.1, 0.4],
[ 1.1, -0.3, 0.5, 0.0],
[ 0.7, 0.6, 0.2, -0.4]],
[[-0.2, 0.9, 0.3, 0.1],
[ 0.4, -0.7, 1.2, 0.5],
[ 0.8, 0.1, -0.6, 1.5]],
])
print("shape:", X.shape)
print("one activation:", X[1, 2, 0])
print("last token of example 2:", X[1, 2])
print("feature 1 of every last token:", X[:, 2, 0])
shape: (2, 3, 4)
one activation: 0.8
last token of example 2: [ 0.8 0.1 -0.6 1.5]
feature 1 of every last token: [0.7 0.8]
Titik dua dalam X[:, 2, 0] berarti “pertahankan setiap posisi pada sumbu ini.” Sumbu pertama tetap dipertahankan, sedangkan token dan fitur menerima indeks spesifik, sehingga hasilnya berisi satu nilai untuk masing-masing dari dua item batch.
Atribut shape melaporkan (2, 3, 4), tetapi tuple itu sendiri tidak mengatakan “batch, token, fitur.” Nama-nama tersebut berasal dari kontrak data program.
Alamat yang legal masih dapat menyatakan pertanyaan yang salah
Kembali ke ekspresi pembuka:
X[1, 2, 0] # 0.8: batch 2, token 3, feature 1
X[1, 0, 2] # 0.3: batch 2, token 1, feature 3
Kedua alamat cocok dengan bentuk tersebut. NumPy tidak tahu bahwa baris kedua menukar makna token dan fitur. Ini adalah bug pengindeksan semantik: program mengambil entri nyata, tetapi bukan entri yang dimaksudkan perhitungan.
Pertahanan yang berguna mencakup menamai kontrak sumbu di samping tensor, memeriksa bentuk di batas-batas, dan memberi nama deskriptif pada variabel indeks:
batch_index = 1
token_index = 2
feature_index = 0
activation = X[batch_index, token_index, feature_index]
assert X.shape == (2, 3, 4)
assert activation == 0.8
Assertion memeriksa contoh ini. Variabel deskriptif mempertahankan penalaran yang menghasilkan alamat tersebut.
Kesalahan batas lebih aman daripada kesalahan sumbu yang diam-diam
Untuk bentuk berbasis nol (2, 3, 4), alamat nonnegatif terakhir adalah X[1, 2, 3]. X[2, 0, 0] tidak valid karena indeks batch 2 meminta item ketiga dari sumbu yang hanya berisi dua item. NumPy memunculkan IndexError, bukan mengembalikan nilai yang dibuat-buat.
Indeks negatif adalah konvensi Python: -1 memilih posisi terakhir pada suatu sumbu, jadi X[-1, -1, -1] adalah cara lain untuk membaca X[1, 2, 3]. Kode itu valid, tetapi tidak boleh diterjemahkan diam-diam menjadi subskrip matematika berbasis satu. Nyatakan konvensinya setiap kali perbedaannya penting.
Pelajaran berikutnya akan menggunakan alamat ini di dalam penjumlahan. Setelah jelas berarti contoh ke- dan berarti loss-nya, simbol seperti menjadi instruksi ringkas untuk mengunjungi setiap loss berindeks dan menggabungkan nilainya.
Uji pemahaman
Pertanyaan 1
Jika x₄ = (2.5, −1.0, 0.3), apa yang dirujuk oleh x₄ dan x₄,₂?
Tampilkan solusi langkah demi langkah
Pertama, baca jumlah subskripnya.
- memiliki satu indeks, jadi memilih seluruh contoh pada posisi 4.
- Contoh yang diberikan adalah nilai dengan tiga koordinat .
- menambahkan indeks koordinat, jadi memilih koordinat 2 di dalam contoh tersebut.
Karena itu,
Subskrip 4 adalah alamat, bukan nilai yang disimpan.
Pertanyaan 2
Gunakan visual untuk menghitung X₂,₂,₃. Tunjukkan setiap pilihan sumbu.
Tampilkan solusi langkah demi langkah
Ikuti indeks dalam urutan batch-token-fitur yang telah dinyatakan.
- memilih item batch 2.
- memilih baris token kedua: .
- memilih koordinat ketiga dari baris itu.
Jadi,
Memilih fitur 3 sebelum token 2 akan mengubah pertanyaannya karena sumbu-sumbu memiliki urutan.
Pertanyaan 3
Terjemahkan alamat matematika berbasis satu X₂,₃,₄ ke NumPy berbasis nol dan temukan nilainya.
Tampilkan solusi langkah demi langkah
Kurangi 1 dari setiap posisi ketika berpindah dari konvensi berbasis satu yang dinyatakan ke NumPy:
Alamat kodenya adalah X[1, 2, 3]. Pada item batch 2, token 3 adalah , dan fitur 4 adalah . Jadi
Pertanyaan 4
Untuk tensor berbasis nol dengan bentuk (2, 3, 4), klasifikasikan X[0, 2, 3], X[1, 3, 0], dan X[2, 0, 0] sebagai berada dalam batas atau di luar batas.
Tampilkan solusi langkah demi langkah
Terjemahkan bentuk itu menjadi rentang nonnegatif yang valid:
X[0, 2, 3]berada dalam batas karena setiap indeks termasuk dalam rentangnya.X[1, 3, 0]berada di luar batas karena indeks token 3 tidak termasuk dalam .X[2, 0, 0]berada di luar batas karena indeks batch 2 tidak termasuk dalam .
Sumbu pertama yang gagal sudah cukup bagi NumPy untuk menolak alamat lengkapnya.
Pertanyaan 5
Developer bermaksud batch 2, token 3, fitur 1 tetapi menulis X[1, 0, 2]. Mengapa tidak terjadi kesalahan batas, dan bagaimana baris tersebut harus diperbaiki?
Tampilkan solusi langkah demi langkah
Untuk bentuk (2, 3, 4), indeks (1, 0, 2) valid secara mekanis:
Karena itu NumPy mengembalikan nilai pada batch 2, token 1, fitur 3, yaitu . Pustaka tidak dapat menyimpulkan makna sumbu yang dimaksudkan.
Konversikan posisi berbasis satu yang dimaksudkan ke posisi berbasis nol $(1,2,0)`. Baris yang diperbaiki adalah:
activation = X[1, 2, 0] # 0.8Ini adalah bug semantik, bukan bug batas, sehingga nama variabel deskriptif dan kontrak sumbu yang eksplisit merupakan pertahanan yang berguna.
Pertanyaan 6
Apa yang dipilih oleh X[-1, -1, -1], dan mengapa −1 bukan identitas permanen untuk nilai tersebut?
Tampilkan solusi langkah demi langkah
Dalam NumPy, -1 berarti “posisi terakhir pada sumbu ini.” Untuk bentuk (2, 3, 4), posisi berbasis nol terakhir adalah (1, 2, 3). Karena itu,
Maknanya bergantung pada bentuk dan urutan saat ini. Jika item batch atau token lain ditambahkan, -1 akan menunjuk ke tempat lain. Itu adalah alamat relatif, bukan ID stabil yang melekat pada nilai tersimpan.