Kursus Matematika untuk AI · Pelajaran 20 dari 180
Perkalian Matriks-Matriks untuk AI: Menyusun Transformasi dan Batch
Periksa bentuk matriks, hitung perkalian matriks kecil, lalu baca kontraksi yang sama sebagai pemetaan tersusun atau perhitungan lapisan padat secara batch.
Lapisan padat melakukan jenis perhitungan yang sama untuk satu input maupun banyak input sekaligus. Untuk satu input, perkalian matriks-vektor menggabungkan satu baris bobot dengan vektor fitur. Untuk sebuah batch, baris-baris matriks input digabungkan dengan setiap aturan keluaran. Perkalian matriks-matriks adalah notasi ringkas yang memungkinkan penggunaan ulang ini.
Di akhir pelajaran ini, Anda akan dapat memeriksa bentuk yang kompatibel, menghitung perkalian matriks kecil, menjelaskan dimensi keluaran, dan menafsirkan perkalian yang sama sebagai transformasi tersusun atau batch dari perkalian matriks-vektor.
Hasil pembelajaran: Memeriksa bentuk yang kompatibel, menghitung perkalian matriks kecil, menjelaskan dimensi keluaran, dan menafsirkan perkalian yang sama sebagai transformasi tersusun atau batch dari perkalian matriks-vektor.
Pelajaran 19: Perkalian matriks-vektor sebagai jumlah berbobot membahas satu input pada satu waktu. Situs pendamping resmi Mathematics for Machine Learning mengembangkan perkalian matriks di Bagian 2.2 buku tersebut. Contoh, kode, visual, dan asesmen di sini merupakan penerapan orisinal dari definisi itu.
Dimensi dalam menentukan apakah suatu perkalian ada
Misalkan
Perkalian terdefinisi karena jumlah kolom pada sama dengan jumlah baris pada . Bentuknya mempertahankan dua dimensi terluar:
Dimensi bersama memberi tahu kita berapa banyak pasangan yang sejajar dikalikan dan dijumlahkan untuk setiap entri keluaran. Dimensi terluar dan memberi tahu berapa banyak baris dan kolom yang dimiliki hasilnya. Dengan kata lain, bentuk keluaran adalah , bukan dan bukan .
Aturan ini merupakan kontraksi pada sumbu bersama. Aturan ini bukan instruksi untuk mengalikan entri pada posisi yang sama. Perbedaan itu penting dalam kode: NumPy mendokumentasikan numpy.matmul sebagai perkalian matriks dan menggunakan @ sebagai singkatan operatornya untuk kasus dua dimensi biasa (dokumentasi).
Simulator aliran bentuk membuat sumbu tetap terlihat
Visual berikut dimulai dengan perkalian yang lengkap dan kompatibel. Pilih preset lain untuk melihat bentuk terluar valid yang berbeda, beralih antara pembacaan langsung baris-kali-kolom dan pembacaan batch, atau gunakan kontrol bawaan untuk menelusuri satu entri keluaran. Setiap keadaan juga memiliki tabel semantik di bawahnya, sehingga perhitungannya tetap mudah dibaca tanpa JavaScript, warna, atau animasi.
Matriks kiri × Matriks kanan → Matriks keluaran
Penelusuran baris-kali-kolom
C11 = 1 × 2 + (-1) × 3 + 2 × 0 = -1
Total berjalan: -1 · hasil kali titik lengkap
| Entri keluaran | Baris kiri | Kolom kanan | Hasil kali titik |
|---|---|---|---|
| C11 (baris 1, kolom 1) | [1, -1, 2] | [2, 3, 0] | -1 |
| C12 (baris 1, kolom 2) | [1, -1, 2] | [1, -1, 4] | 10 |
| C21 (baris 2, kolom 1) | [2, 0, 1] | [2, 3, 0] | 4 |
| C22 (baris 2, kolom 2) | [2, 0, 1] | [1, -1, 4] | 6 |
| Baris batch | Baris input (kolom matriks kanan) | Baris keluaran |
|---|---|---|
| 1 | [2, 3, 0] | [-1, 4] |
| 2 | [1, -1, 4] | [10, 6] |
Tabel-tabel ini dirender bersama pelajaran dan tetap terlihat tanpa JavaScript. Kontrol yang difokuskan, label teks, dan bintang yang disorot menyediakan petunjuk untuk keadaan interaktif tanpa bergantung pada warna.
Keadaan pertama yang dirender server menampilkan perkalian lengkap sebelum interaksi sisi klien opsional terlihat. Penggeser menampilkan jumlah parsial, bukan matematika baru: penggeser hanya menentukan berapa banyak suku dari hasil kali titik yang sama yang sedang ditampilkan. Dalam mode batch, baris yang ditampilkan adalah contoh lengkap, dan tabel menjadi fallback permanen untuk semuanya.
Perkalian kecil memperlihatkan empat hasil kali titik
Pertimbangkan matriks asli
Pemeriksaan bentuk dilakukan terlebih dahulu:
Kedua dimensi dalam sama-sama , sehingga perkalian tersebut ada. Dua dimensi terluar memprediksi empat entri keluaran, yang masing-masing dibentuk dari tiga perkalian skalar.
Lokasi setiap jawaban merupakan bagian dari hasilnya. Misalnya, bukan “perkalian kedua” dalam daftar yang diratakan; entri ini berada pada baris , kolom , dan selalu memasangkan baris dari dengan kolom dari .
Perkalian yang sama menyusun transformasi dalam urutan tetap
Bentuk matriks juga menjelaskan domain dan kodomain. Di sini memetakan ke , sedangkan memetakan ke :
Karena itu, adalah satu matriks untuk “terapkan , lalu terapkan .” Untuk
vektor perantaranya adalah
Menerapkan berikutnya memberikan
Perkalian matriks memberikan titik akhir yang sama tanpa mewujudkan vektor tengah:
Urutan ini bukan hiasan. Perkalian terbalik valid di sini, tetapi memiliki bentuk dan makna yang berbeda:
memetakan ke , sehingga tidak dapat menggantikan pada vektor dua koordinat . Bagian 2.2 buku tersebut juga menekankan bahwa perkalian matriks pada umumnya tidak komutatif; gambaran domain dan kodomain menjelaskan mengapa pertukaran urutan mengubah perhitungan (PDF buku).
Kontraksi ini adalah batch dari perkalian matriks-vektor
Misalkan ada tiga contoh dan masing-masing memiliki tiga fitur. Letakkan satu contoh di setiap baris:
Gunakan sebelumnya sebagai matriks bobot lapisan padat dan sebut matriks itu . Bentuknya : tiga fitur input dan dua skor keluaran. Perhitungan batch yang berorientasi baris memerlukan transpose :
Perhitungan bentuknya adalah
Dimensi pertama, , adalah jumlah contoh. Dimensi kedua, , adalah jumlah skor keluaran per contoh. Menambahkan vektor bias
ke setiap baris memberikan
Aturan broadcasting NumPy memungkinkan bias berbentuk sejajar dengan sumbu terakhir setiap baris berbentuk (dokumentasi broadcasting). Perkalian matriks itu sendiri tetap merupakan kontraksi; penambahan bias adalah operasi elementwise yang terpisah.
Konvensi batch per baris ini juga merupakan konvensi yang digunakan oleh torch.nn.Linear: dengan in_features=3 dan out_features=2, PyTorch menyimpan bobot berbentuk dan menghitung . Karena itu, input berbentuk dikembalikan dengan bentuk . Transpose menjembatani konvensi vektor kolom matematis dan konvensi implementasi yang menjadikan setiap sampel sebagai baris. Untuk tensor dengan lebih banyak dimensi batch, torch.matmul mempertahankan dua sumbu terakhir untuk perkalian matriks dan melakukan broadcasting pada sumbu batch awal yang kompatibel.
Ada cara lain untuk melihat hasil yang sama. Kolom-kolom adalah dua input dengan tiga koordinat untuk pemetaan . Letakkan input-input tersebut ke dalam baris dengan mentranspose :
Setiap baris adalah satu kolom , dan setiap baris adalah keluaran yang bersesuaian untuk input tersebut. Identitas menjadi jembatan antara “kolom sebagai input terpisah” dan “baris sebagai batch.”
NumPy membuat kontraksi ini dapat diuji
Program kecil berikut menuliskan tiga loop bersarang secara eksplisit dan membandingkannya dengan NumPy. Program ini juga memeriksa identitas batch dan membuat operator elementwise tetap terlihat terpisah. Quickstart NumPy memperkenalkan pembedaan yang sama antara operasi elementwise dan perkalian matriks.
import numpy as np
A = np.array([[1, -1, 2], [2, 0, 1]])
B = np.array([[2, 1], [3, -1], [0, 4]])
def matrix_product_by_loops(left, right):
if left.shape[1] != right.shape[0]:
raise ValueError("inner dimensions do not match")
result = np.zeros((left.shape[0], right.shape[1]), dtype=int)
for i in range(left.shape[0]):
for j in range(right.shape[1]):
for ell in range(left.shape[1]):
result[i, j] += left[i, ell] * right[ell, j]
return result
C_by_loops = matrix_product_by_loops(A, B)
C = A @ B
np.testing.assert_array_equal(C_by_loops, C)
np.testing.assert_array_equal(B.T @ A.T, C.T)
print(C)
print("elementwise A * B.T has shape", (A * B.T).shape)
try:
A @ np.ones((2, 2), dtype=int)
except ValueError as error:
print(type(error).__name__, "for incompatible inner dimensions")
Program mencetak
[[-1 10]
[ 4 6]]
elementwise A * B.T has shape (2, 3)
ValueError for incompatible inner dimensions
Pemanggilan yang tidak valid gagal karena memiliki tiga kolom, sedangkan operan kedua memiliki dua baris. Ekspresi elementwise A * B.T tidak gagal di sini karena kedua array berbentuk ; ekspresi ini menghasilkan
yang tidak memiliki penjumlahan baris-dengan-kolom atas tiga suku. NumPy mendokumentasikan multiply sebagai perkalian element-by-element (referensi). Fakta bahwa dua operator menerima operan yang sama bukan bukti bahwa keduanya mewakili operasi matematika yang sama.
Hasil identitas dan nol adalah kasus batas yang berguna
Dua kasus batas memperjelas aturan bentuk. Pertama, matriks identitas yang kompatibel tidak mengubah nilai:
Identitas di sebelah kiri harus memiliki dua baris dan dua kolom di sini karena berbentuk . Secara umum, untuk dan jika dimensinya sesuai. Matriks identitas mempertahankan perkalian yang valid; matriks ini tidak memperbaiki perkalian yang tidak valid.
Kedua, perkalian yang valid dapat seluruhnya bernilai nol karena suku-sukunya saling meniadakan. Misalkan
Maka
Dimensi dalamnya cocok, sehingga hasil nol adalah hasil perhitungan, bukan kesalahan bentuk. Saat men-debug lapisan padat, periksa kedua jenis bukti: kontrak bentuk memberi tahu apakah operasi itu sah, sedangkan nilai aktual memberi tahu apakah pembatalan, bobot nol, atau masalah data menjelaskan keluarannya.
Kebiasaan yang dapat digunakan ulang ini singkat: sebutkan bentuk kiri, sebutkan bentuk kanan, cocokkan dimensi dalam, pertahankan dimensi luar, lalu hitung setiap entri keluaran dari baris kiri dan kolom kanan. Kebiasaan itu dapat berkembang dari contoh kecil yang dikerjakan ke X @ W.T + b, ke komposisi pemetaan yang dipelajari, dan ke operasi tensor batch yang lebih besar.
Uji pemahaman Anda
Pertanyaan 1
Jika L berbentuk 4 × 3 dan R berbentuk 3 × 5, apa bentuk LR, dan berapa banyak perkalian skalar yang diperlukan untuk seluruh hasil kali?
Tampilkan solusi langkah demi langkah
Langkah 1: periksa sumbu bersama. Matriks kiri memiliki 3 kolom dan matriks kanan memiliki 3 baris, sehingga dimensi dalamnya cocok.
Langkah 2: pertahankan sumbu luar. Perkalian tersebut berbentuk .
Langkah 3: hitung pekerjaannya. Ada entri keluaran. Masing-masing menggunakan hasil kali titik dengan panjang 3, sehingga perhitungan langsung menggunakan perkalian skalar.
Pertanyaan 2
Hitung P Q untuk P = [[1, 0, −2], [2, 1, 1]] dan Q = [[3, 1], [0, −2], [4, 2]].
Tampilkan solusi langkah demi langkah
Langkah 1: prediksi bentuknya. Bentuknya adalah dan , jadi hasilnya harus berbentuk .
Langkah 2: hitung baris 1. Entrinya adalah dan .
Langkah 3: hitung baris 2. Entrinya adalah dan .
Jadi
Pertanyaan 3
Sebuah lapisan padat menyimpan W berbentuk (2, 3), menerima X berbentuk (4, 3), dan memiliki bias b berbentuk (2,). Perkalian dan bentuk keluaran apa yang harus digunakan?
Tampilkan solusi langkah demi langkah
Langkah 1: jembatani kedua konvensi. Karena contoh-contoh disusun sebagai baris, transpose matriks bobot: berbentuk .
Langkah 2: kalikan batch. berbentuk .
Langkah 3: tambahkan bias per baris. Bias memiliki dua entri yang cocok dengan dua fitur keluaran, sehingga tetap berbentuk . Angka 4 di depan menghitung contoh; angka itu bukan bagian dari bentuk bobot yang dipelajari.
Pertanyaan 4
Untuk A dan B pada pelajaran ini, mengapa Bᵀ Aᵀ sama dengan (A B)ᵀ, dan apa yang direpresentasikan oleh setiap baris Bᵀ?
Tampilkan solusi langkah demi langkah
Langkah 1: transpose faktor dalam urutan terbalik. Mentranspose menghasilkan .
Langkah 2: identifikasi barisnya. Setiap baris adalah satu kolom , sehingga baris itu merupakan input tiga koordinat untuk pemetaan .
Langkah 3: baca keluarannya. Setiap baris yang bersesuaian dari adalah keluaran untuk input tersebut menurut konvensi batch per baris. Secara numerik,
Pertanyaan 5
Dengan menggunakan A, B, dan x = [1, 2]ᵀ pada pelajaran ini, pemetaan mana yang bekerja lebih dahulu dalam (A B)x, dan apa vektor akhirnya?
Tampilkan solusi langkah demi langkah
Langkah 1: baca urutannya. Faktor paling kanan bekerja lebih dahulu, jadi hitung sebelum menerapkan .
Langkah 2: hitung vektor perantara.
Langkah 3: terapkan pemetaan kedua.
Jadi berarti “ terlebih dahulu, lalu ,” dan vektor akhirnya adalah .
Pertanyaan 6
Mengapa A * Bᵀ bukan operasi yang sama dengan A B, meskipun kedua ekspresi tersebut diterima untuk array pada pelajaran ini?
Tampilkan solusi langkah demi langkah
Langkah 1: bandingkan bentuknya. dan sama-sama berbentuk .
Langkah 2: identifikasi operatornya.* adalah perkalian elementwise, sehingga operator ini mengalikan enam pasangan yang sejajar dan mempertahankan bentuk . Operator ini tidak memasangkan satu baris dengan satu kolom lalu menjumlahkan tiga suku.
Langkah 3: bandingkan dengan perkalian matriks.A @ B menggunakan bentuk dan , mengontraksikan dimensi bersama, dan mengembalikan . Untuk nilai-nilai ini, , sedangkan .
Pertanyaan 7
A berbentuk (2, 3) dan D berbentuk (2, 2). Mengapa A @ D gagal, dan apakah D @ A valid?
Tampilkan solusi langkah demi langkah
Langkah 1: uji . Dimensi dalamnya akan menjadi 3 dan 2. Keduanya berbeda, sehingga tidak ada baris yang dapat dipasangkan dengan satu kolom lengkap menggunakan aturan perkalian matriks; A @ D tidak valid.
Langkah 2: uji . Sekarang dimensi dalamnya adalah 2 dan 2, sehingga perkalian valid dan memiliki bentuk luar .
Langkah 3: pertahankan urutannya. Pembalikan dapat mengubah keabsahan dan selalu mengubah pemetaan yang direpresentasikan. Menukar faktor sampai bentuknya kebetulan cocok bukanlah perbaikan umum.
Pertanyaan 8
Untuk P = [[1, −1], [0, 0]] dan Q = [[3, 3], [3, 3]], mengapa P Q dapat menjadi matriks nol meskipun perkaliannya valid? Apa yang dilakukan I₂ C?
Tampilkan solusi langkah demi langkah
Langkah 1: periksa perkaliannya. Kedua matriks berbentuk , sehingga dimensi dalamnya cocok.
Langkah 2: jelaskan angka nolnya. Setiap entri pada baris keluaran pertama adalah , dan baris kedua langsung menghasilkan nol. Jadi bernilai nol karena pembatalan dan entri nol, bukan karena bentuknya tidak kompatibel.
Langkah 3: terapkan identitas. Dengan dan bentuk , berlaku . Matriks identitas mempertahankan perkalian yang kompatibel; matriks ini tidak mengubah nilai atau memperbaiki ketidakcocokan.
Pertanyaan 9
Untuk torch.nn.Linear(3, 2), sebuah batch berbentuk (5, 3). Nyatakan bentuk bobot, bentuk bias, bentuk keluaran, dan rumus batch per baris.
Tampilkan solusi langkah demi langkah
Langkah 1: baca parameter lapisan.in_features=3 dan out_features=2 berarti bobot yang dipelajari berbentuk dan bias berbentuk .
Langkah 2: transpose untuk input berbentuk baris. Batch yang terdiri dari lima baris berbentuk , sehingga perkalian dengan menggunakan .
Langkah 3: nyatakan hasilnya. Keluaran berbentuk dan rumusnya adalah . Angka lima tetap menjadi dimensi batch; setiap baris menerima dua fitur keluaran dan bias dengan dua entri ditambahkan ke setiap baris.
Sumber
- Mathematics for Machine Learning companion website
- Mathematics for Machine Learning book PDF
- NumPy documentation: numpy.matmul
- NumPy documentation: numpy.multiply
- NumPy quickstart: elementwise and matrix products
- NumPy documentation: broadcasting
- PyTorch documentation: torch.nn.Linear
- PyTorch documentation: torch.matmul