Setiap model deep learning pada dasarnya menjalankan rangkaian operasi aljabar linear: data masuk sebagai vektor dan matriks, bobot model disimpan sebagai matriks, dan prediksi dihitung melalui perkalian keduanya. Kerangka kerja seperti NumPy, PyTorch, dan TensorFlow menyediakan fungsi perkalian matriks yang sudah dioptimalkan, sehingga memahami operasi dasarnya berarti memahami inti model itu sendiri. Pada chapter ini kita pelajari empat konsep inti secara berurutan: vektor sebagai wadah fitur, matriks sebagai wadah batch data dan bobot, dot product sebagai perhitungan di dalam satu neuron, serta norma sebagai pengukur besar vektor. Seluruh contoh dijalankan dengan NumPy murni dan angka kecil, sehingga kita bisa membedah hasilnya satu per satu.
Vektor sebagai Wadah Fitur #
Vektor adalah daftar bilangan berurutan dengan panjang tertentu. Dalam deep learning, satu contoh data direpresentasikan sebagai satu vektor fitur. Sebuah rumah bisa direpresentasikan sebagai [72, 3, 10] yang berarti luas 72 m², 3 kamar tidur, dan berumur 10 tahun. Beberapa contoh representasi vektor yang umum:
- Fitur tabular:
[luas, jumlah_kamar, umur_rumah]untuk data properti. - Piksel gambar: gambar grayscale 28×28 diratakan menjadi vektor dengan 784 elemen.
- Embedding kata: satu kata direpresentasikan sebagai vektor 300 angka yang menangkap maknanya.
Ukuran vektor menentukan lebar lapisan masukan (input layer) dari model. Model yang menerima vektor 3 fitur perlu bobot sepanjang 3 angka pula.
Matriks untuk Batch dan Bobot #
Jika vektor menyimpan satu contoh data, matriks menyimpan banyak contoh sekaligus. Konvensi yang dipakai hampir semua kerangka deep learning: satu baris matriks adalah satu contoh data, satu kolom adalah satu fitur. Matriks 3×3 menampung tiga rumah yang masing-masing punya tiga fitur. Selain data, bobot (weight) satu layer juga disimpan sebagai matriks: layer dengan 3 masukan dan 2 neuron menyimpan bobot berbentuk matriks 3×2.
Dot Product: Inti Perhitungan Neuron #
Dot product mengalikan dua vektor secara berpasangan lalu menjumlahkan seluruh hasilnya. Persis perhitungan inilah yang terjadi di dalam satu neuron: setiap fitur dikalikan bobotnya, dijumlahkan, lalu ditambah bias. Berkas neuron_dot_product.py berikut membuat satu neuron untuk menilai satu rumah.
"""Satu neuron sederhana: dot product fitur dan bobot, ditambah bias."""
import numpy as np
fitur = np.array([72.0, 3.0, 10.0]) # [luas m2, jumlah kamar, umur tahun]
bobot = np.array([0.5, 8.0, -0.4]) # bobot tiap fitur (nilai contoh)
bias = 2.0 # geseran tetap milik neuron
dot = np.dot(fitur, bobot) # jumlah tertimbang semua fitur
skor = dot + bias # nilai masukan sebelum aktivasi
print("Fitur :", fitur)
print("Bobot :", bobot)
print("Dot product :", dot)
print("Skor neuron :", skor)
manual = 72.0 * 0.5 + 3.0 * 8.0 + 10.0 * (-0.4) # hitung ulang manual
print("Manual :", manual)Output yang Dihasilkan:
Fitur : [72. 3. 10.]
Bobot : [ 0.5 8. -0.4]
Dot product : 56.0
Skor neuron : 58.0
Manual : 56.0Mari kita telaah kode di atas baris per baris:
- Baris 5 (
fitur = np.array(...)): membuat vektor NumPy berisi tiga fitur satu rumah — luas, jumlah kamar, dan umur. - Baris 6-7 (
bobot,bias): bobot menentukan seberapa penting tiap fitur bagi neuron; bobot positif menaikkan skor, bobot negatif menurunkannya. Nilai contoh ini belum dilatih, hanya angka pilihan. - Baris 9 (
dot = np.dot(fitur, bobot)): menghitung72×0.5 + 3×8 + 10×(−0.4)=36 + 24 − 4=56. - Baris 10 (
skor = dot + bias): menambahkan konstanta geser2.0, menghasilkan skor akhir58.0— nilai masukan neuron sebelum fungsi aktivasi. - Baris 17 (
manual = ...): menghitung ulang tanpanp.dotdan hasilnya sama persis, membuktikan dot product hanyalah perkalian berpasangan plus penjumlahan.
Perkalian Matriks: Menghitung Satu Layer Sekaligus #
Menghitung neuron satu per satu akan lambat. Perkalian matriks menggabungkan seluruh perhitungan neuron dalam satu operasi: Z = X @ W + b memproses semua contoh data pada semua neuron sekaligus. Elemen Z[i, j] adalah dot product antara contoh data ke-i dan vektor bobot neuron ke-j. Berkas layer_matriks.py mendemonstrasikan layer kecil dengan 3 masukan dan 2 neuron.
"""Satu layer penuh: perkalian matriks batch X dengan matriks bobot W."""
import numpy as np
X = np.array([
[72.0, 3.0, 10.0], # rumah Budi: luas, kamar, umur
[120.0, 4.0, 2.0], # rumah Siti
[55.0, 2.0, 25.0], # rumah Andi
])
W = np.array([
[0.5, -0.2], # bobot fitur luas untuk 2 neuron
[8.0, 0.1], # bobot fitur kamar untuk 2 neuron
[-0.4, 3.0], # bobot fitur umur untuk 2 neuron
])
b = np.array([2.0, -1.0])
Z = X @ W + b # seluruh layer, semua rumah sekaligus
print("Shape X:", X.shape, "| Shape W:", W.shape, "| Shape Z:", Z.shape)
print("Z =")
print(Z)
norma_neuron_1 = np.linalg.norm(W[:, 0]) # panjang kolom bobot neuron 1
norma_neuron_2 = np.linalg.norm(W[:, 1]) # panjang kolom bobot neuron 2
print("Norma L2 bobot neuron 1:", round(norma_neuron_1, 4))
print("Norma L2 bobot neuron 2:", round(norma_neuron_2, 4))Output yang Dihasilkan:
Shape X: (3, 3) | Shape W: (3, 2) | Shape Z: (3, 2)
Z =
[[ 58. 14.9]
[ 93.2 -18.6]
[ 35.5 63.2]]
Norma L2 bobot neuron 1: 8.0256
Norma L2 bobot neuron 2: 3.0083Mari kita telaah kode di atas baris per baris:
- Baris 5-9 (
X = np.array(...)): matriks batch berukuran(3, 3)— tiga rumah, tiga fitur per rumah. Baris pertama sama dengan vektor pada contoh sebelumnya. - Baris 11-16 (
W,b): bobot layer berukuran(3, 2)— tiga masukan, dua neuron. Kolom pertama adalah vektor bobot neuron pertama[0.5, 8.0, -0.4], sama seperti contoh neuron tunggal. - Baris 18 (
Z = X @ W + b): operator@menjalankan perkalian matriks, lalu bias ditambahkan ke setiap baris lewat broadcasting. Hasilnya berukuran(3, 2): tiga rumah, dua skor per rumah. - Baris 20 (
print(... .shape ...)): memverifikasi aturan bentuk(3, 3) @ (3, 2) → (3, 2)— barisXmenjadi barisZ, kolomWmenjadi kolomZ. - Baris 24-25 (
np.linalg.norm(...)): menghitung norma L2 setiap kolomW, yaitu akar dari jumlah kuadrat elemen kolom tersebut.
Nilai Z[0, 0] = 58.0 sama persis dengan skor neuron tunggal pada contoh pertama karena baris pertama X dan kolom pertama W memang pasangan yang sama. Perkalian matriks hanya mengulang pola dot product untuk semua kombinasi baris-kolom. Dokumentasi NumPy merinci operator @ / numpy.matmul
beserta aturan bentuknya.
Norma: Mengukur Besar Vektor #
Norma L2 mengukur “panjang” vektor: ||w|| = sqrt(jumlah kuadrat elemen). Neuron pertama pada contoh punya norma 8.0256 — jauh lebih besar dari neuron kedua (3.0083), artinya bobot neuron pertama secara keseluruhan lebih kuat mengubah skor. Norma bobot dipakai pada teknik regularisasi weight decay yang menekan bobot besar agar model tidak terlalu bergantung pada satu fitur. Selain itu, besarnya gradient sering dipantau lewat normanya untuk mendeteksi training yang tidak sehat. Detailnya bisa dibaca pada dokumentasi numpy.linalg.norm
.
Peta Operasi NumPy untuk Deep Learning #
Tabel berikut merangkum operasi aljabar linear yang paling sering muncul di kode deep learning sehari-hari:
| Operasi | Fungsi NumPy | Peran di Deep Learning |
|---|---|---|
| Dot product | np.dot(a, b) atau a @ b | Jumlah tertimbang di dalam satu neuron |
| Perkalian matriks | A @ B, np.matmul(A, B) | Menghitung seluruh layer untuk satu batch |
| Transpose | A.T, np.transpose(A) | Menyesuaikan orientasi data dan bobot |
| Norma | np.linalg.norm(v) | Regularisasi bobot dan pemantauan gradient |
| Perkalian elementwise | A * B | Mengalikan gradient dengan learning rate |
| Penjumlahan per sumbu | A.sum(axis=0) | Reduksi loss rata-rata pada satu batch |
Dengan vektor, matriks, dot product, dan norma, kita kini punya bahasa untuk menyusun dan menghitung sebuah model statis. Namun model yang baik tidak lahir dari bobot pilihan manual — bobot harus disesuaikan otomatis dari data. Proses penyesuaian itu membutuhkan kalkulus, khususnya turunan dan aturan rantai, yang menjadi fokus chapter berikutnya.