Lensa ML

Cara Kerja Tensor

Langkah 1 dari 6: Apa Itu Tensor?

Dari scalar sampai array n-dimensi

2468Vector (rank 1)
Rank1

Rank

1

Shape

(4)

Elemen

4

Vector adalah array 1D dengan satu sumbu. Contohnya sebaris intensitas pixel atau sebuah word embedding.

Geser slider Rank dari 0 ke 3, lalu perhatikan shape dan jumlah elemennya. Jumlah elemen adalah hasil kali shape, jadi (2, 3, 4) berisi 24 angka. Di deep learning, "rank" berarti jumlah sumbu, yang juga disebut ndim. Ini berbeda dari rank matriks di aljabar linear, yang menghitung baris yang saling bebas. Jadi matriks 3×4 selalu punya dua sumbu, tetapi rank aljabar linearnya bisa 0, 1, 2, atau 3. Fisikawan memakai kata "tensor" dalam arti yang lebih ketat, untuk objek yang berubah dengan cara tertentu ketika koordinatnya diganti.

Langkah 2 dari 6: Shape Tensor

Dimensi menentukan bentuk geometris data

shape = (2, 3, 4)
dim 02
dim 13
dim 24

Shape

(2,3,4)

Total

24

Memori

96B

Tensor kecil: beberapa puluh nilai float32, kurang dari 100 byte.

Atur d0, d1, dan d2 antara 1 dan 8, lalu perhatikan kartu memori. Tiap float32 memakai 4 byte, jadi (2, 3, 4) bawaan memakai 96 byte dan yang terbesar, (8, 8, 8), memakai 2 KB. Model sungguhan jauh lebih besar: batch berisi 32 gambar RGB berukuran 224×224 punya sekitar 4,8 juta nilai, kira-kira 19 MB dalam float32. Mixed-precision training menyimpan banyak tensor dalam format 16-bit seperti bfloat16, sehingga memorinya berkurang separuh.

Langkah 3 dari 6: Reshaping

Data sama, sudut pandang baru

Lama: (2,3,4)→Baru: (4,6,1)
d04
d16

Shape lama

(2,3,4)

Shape baru

(4,6,1)

Valid?

Ya

Reshape ini valid: 4 x 6 x 1 = 24 elemen. Datanya sama, shape-nya baru. Tensor yang contiguous tidak perlu disalin.

Pilih ukuran target d0 dan d1, lalu lihat apakah reshape dari tensor (2, 3, 4) berhasil. Reshape mempertahankan urutan elemen di memori dan hanya mengubah cara indeksnya dibaca. Library mengizinkan kamu menulis −1 untuk satu dimensi agar ukurannya disimpulkan otomatis, jadi reshape(4, −1, 2) menghasilkan (4, 3, 2). Transpose berbeda: ia menyusun ulang sumbu, sehingga letak tiap elemen berubah. Setelah transpose, datanya tidak lagi contiguous. Itu sebabnya view() di PyTorch bisa gagal, sedangkan reshape() membuat salinan.

Langkah 4 dari 6: Broadcasting

Penyelarasan dimensi otomatis

A (3,4)B (1,4)+B dim0: 1 → 3Hasil (3,4)
A d03
A d14
B d01
B d14

Shape A

(3,4)

Shape B

(1,4)

Hasil

(3,4)

OK?

Ya

Broadcasting merentangkan dimensi berukuran 1 supaya cocok. dim0 B (1→3). Tidak ada data yang disalin: NumPy dan PyTorch memakai stride 0.

Atur keempat slider shape untuk A dan B, lalu cek apakah hasilnya valid. Broadcasting gaya NumPy membandingkan shape dari sumbu terakhir ke belakang: tiap pasang ukuran harus sama, atau salah satunya harus 1. Sumbu depan yang tidak ada dihitung sebagai 1, jadi vector bias (4,) bisa di-broadcast terhadap batch (3, 4). Begitulah y = xW + b menambahkan satu bias ke setiap baris. Bug yang sering muncul adalah broadcasting tensor (3,) terhadap tensor (3, 1), yang diam-diam menghasilkan (3, 3).

Langkah 5 dari 6: Element-wise vs Perkalian Matriks

Dua keluarga operasi dasar

A (3,3)+B (3,3)= Hasil (3,3)
OpTambah
Baris3
Kolom3

Shape A

(3,3)

Shape B

(3,3)

Hasil

(3,3)

Penjumlahan element-wise: A[i,j] + B[i,j]. Kedua tensor harus punya shape yang sama (atau bisa di-broadcast). Totalnya 9 operasi.

Geser slider Op ke Tambah, Kali, atau MatMul, lalu ubah Baris dan Kolom. Operasi element-wise membutuhkan satu operasi per elemen dan biasanya dibatasi oleh kecepatan memori. Perkalian matriks memakai ulang setiap input berkali-kali, jadi pembatasnya kecepatan aritmetika, dan inilah keunggulan utama GPU. Banyak operasi bisa ditulis dengan notasi Einstein: torch.einsum("ij,jk->ik", A, B) adalah matmul, dan "ij,ij->ij" adalah perkalian element-wise.

Langkah 6 dari 6: Tensor di Deep Learning

Batch × Channels × H × W

(B, C, H, W) = (4, 3, 8, 8)batch 0batch 1batch 2+1B=4 · C=3 · H=8 · W=8
Batch4
Channels3

Shape

(4,3,8,8)

Total

768

Memori

3.0KB

3 channel: umum untuk gambar input RGB. Batch size 4 berarti 4 gambar diproses paralel di GPU.

Ubah Batch dari 1 ke 16 dan Channels dari 1 ke 8 untuk feature map 8×8. Bawaan (4, 3, 8, 8) berisi 768 nilai. PyTorch mengurutkan tensor gambar sebagai (N, C, H, W), yaitu batch lebih dulu dan channel kedua, sedangkan TensorFlow secara default memakai (N, H, W, C). Convolution layer mengubah jumlah channel lewat jumlah filter-nya dan biasanya mengecilkan H dan W. Transformer justru memakai (batch, panjang sequence, ukuran embedding), dan attention score menambahkan sumbu head.

Apa itu tensor di deep learning?

Di deep learning, tensor adalah array angka multidimensi dengan shape yang tetap. Scalar tidak punya sumbu, vector punya satu, matriks punya dua, dan tensor ber-rank lebih tinggi punya tiga sumbu atau lebih. Operasi tensor mencakup reshape, aritmetika element-wise, broadcast, dan perkalian matriks yang mengubah array ini.

Semua input, weight, aktivasi, dan gradient di PyTorch, TensorFlow, atau JAX adalah tensor. Batch gambar adalah tensor 4D, batch token embedding adalah tensor 3D, dan attention weight juga tensor 4D. Sebagian besar bug di kode model adalah bug shape, jadi kemampuan membaca dan menebak shape tensor termasuk keterampilan paling praktis di deep learning.

Ide utama

  • Tensor adalah array n-dimensi, dan shape-nya mencatat ukuran tiap sumbu.
  • Jumlah elemen adalah hasil kali ukuran-ukuran di shape.
  • Reshaping mengubah shape tanpa mengubah elemen maupun urutannya.
  • Broadcasting merentangkan sumbu berukuran 1 agar tensor dengan shape berbeda bisa digabung secara element-wise.
  • Operasi element-wise butuh shape yang sama atau bisa di-broadcast, sedangkan perkalian matriks butuh ukuran bagian dalam yang cocok.
  • Batch gambar adalah tensor 4D, dan urutan sumbunya berbeda antar-framework.

Pertanyaan umum

Apa bedanya array NumPy dan tensor PyTorch?

Keduanya array n-dimensi dengan aturan pengindeksan dan broadcasting yang hampir sama. Tensor PyTorch juga bisa berada di GPU dan bisa merekam operasi untuk automatic differentiation. torch.from_numpy dan tensor.numpy() mengonversi di antara keduanya, dan memorinya dipakai bersama ketika tensor berada di CPU.

Apa fungsi squeeze dan unsqueeze?

squeeze menghapus sumbu berukuran 1, jadi (1, 3, 1, 4) menjadi (3, 4). unsqueeze menyisipkan sumbu berukuran 1 di posisi yang dipilih, jadi tensor (3, 4) menjadi (1, 3, 4). Keduanya terutama dipakai untuk menyiapkan broadcasting atau menambahkan sumbu batch ke satu contoh.

Apa bedanya torch.mm, torch.matmul, dan operator @?

torch.mm hanya mengalikan dua matriks 2D. torch.matmul, yang dipanggil oleh @, juga menangani vector dan batch: untuk input 3D dengan shape (b, n, m) dan (b, m, p), ia menjalankan b perkalian matriks terpisah. Ia juga mem-broadcast sumbu batch, dan dengan cara itulah attention mengalikan query dan key untuk setiap head sekaligus.

Bagaimana cara men-debug error shape tensor?

Cetak .shape di setiap langkah dan bandingkan dengan shape yang kamu harapkan, sambil menulis shape yang diharapkan itu sebagai komentar. Sebagian besar error berasal dari sumbu batch yang hilang, sumbu yang tertukar setelah transpose, atau broadcasting yang tidak disengaja. Library seperti einops membuat shape terlihat jelas di kode, misalnya rearrange(x, "b c h w -> b (h w) c").

Penjelasan terkait

Referensi

  1. Goodfellow, Bengio & Courville, "Deep Learning", ch. 2 Linear Algebra
  2. Zhang et al., "Dive into Deep Learning", section 2.1 Data Manipulation
  3. NumPy documentation, "Broadcasting"

Terakhir diperbarui