Mengapa konvolusi

Lokalitas, pembagian bobot, dan prior citra yang menjadikan konvolusi pilihan alami.

Daftar isi

Topik ini menjelaskan tiga alasan yang menjadikan konvolusi pilihan alami untuk data citra, yaitu lokalitas pola, pembagian bobot antara posisi, dan kevarianan terhadap translasi. Perbandingan jumlah parameter dengan layer dense disertakan sebagai bukti angka. Setelah membacanya, pemilihan Conv2d daripada Linear untuk data citra dapat diputuskan dengan dasar yang jelas.

Biaya parameter layer dense pada citra#

Layer dense, yakni layer yang menghubungkan setiap masukan ke setiap keluaran secara langsung, adalah pilihan bawaan ketika data berbentuk vektor. Citra grayscale 28x28 dapat diratakan menjadi vektor 784 nilai, sehingga satu layer nn.Linear(784, 128) menuntut 100352 bobot ditambah 128 bias. Total 100480 parameter itu baru untuk satu layer dengan satu kanal masukan, dan angkanya tumbuh seiring luas citra serta jumlah kanal warnanya.

Struktur tersebut mengabaikan susunan spasial citra. Piksel yang bertetangga diperlakukan sama seperti piksel yang berjauhan, karena setiap posisi vektor mempunyai bobot yang berdiri sendiri. Akibatnya, geseran pola beberapa piksel mengubah kombinasi bobot yang aktif, padahal isi citranya tidak berubah. Dua kelemahan inilah yang ditangani konvolusi.

StrukturBobotBiasTotal parameter
nn.Linear(784, 128)100352128100480
nn.Conv2d(1, 16, 3)14416160

Angka pada tabel dihitung ulang dengan program pada bagian berikutnya, sehingga kecocokannya dapat diperiksa.

Tiga sifat konvolusi yang cocok untuk citra#

Konvolusi mengganti hubungan penuh antara masukan dan keluaran dengan jendela kecil yang digeser ke seluruh posisi citra. Jendela itu disebut kernel, yakni matriks bobot kecil, misalnya tiga kali tiga, yang dikalikan dengan piksel di bawahnya untuk menghasilkan satu nilai keluaran. Kumpulan nilai keluaran untuk satu kernel disebut feature map, yakni peta aktivasi per posisi jendela. Diagram berikut memperlihatkan jendela kernel 3x3 yang bergerak di atas citra dan feature map yang dihasilkannya.

citra masukan 6x6dua posisi jendela kernel 3x3konvolusifeature map 4x4Jendela kernel 3x3 bergeser ke seluruh posisi,sehingga setiap nilai keluaran hanya melihattiga kali tiga piksel tetangganya: lokalitas.Bobot kernel yang sama digunakan ulang di semuaposisi: pembagian bobot dan kevarianan translasi.
Jendela kernel 3x3 bergeser di atas citra dan menghasilkan feature map 4x4

Kernel yang sama digunakan ulang di setiap posisi, sehingga tiga sifat muncul sekaligus.

  • Lokalitas. Pola visual seperti garis, sudut, dan tekstur hanya melibatkan piksel yang saling berdekatan. Jendela kecil sudah cukup untuk mengenalinya tanpa perlu menghubungkan seluruh citra.
  • Pembagian bobot (parameter sharing). Satu set bobot kernel melayani semua posisi. Detektor garis yang dipelajari di pojok kiri atas juga bekerja di pojok kanan bawah, sehingga jumlah parameter tidak lagi bergantung pada ukuran citra.
  • Kevarianan terhadap translasi (translation invariance). Karena bobotnya sama di semua posisi, pola yang digeser tetap terdeteksi, hanya pada posisi keluaran yang ikut berpindah. Layer dense tidak memiliki sifat ini karena setiap posisi masukan mempunyai bobot sendiri.

Istilah filter sering dipertukarkan dengan kernel. Pada jalur ini, satu filter berarti satu set kernel untuk semua kanal masukan yang menghasilkan satu kanal feature map, sehingga layer dengan 16 filter menghasilkan 16 kanal keluaran.

Menghitung selisih parameternya#

Kedua layer pada tabel sebelumnya dapat dihitung ulang dengan program sederhana. Program berikut menghitung jumlah parameter nn.Linear(784, 128) dan nn.Conv2d(1, 16, 3) beserta rinciannya, tanpa pelatihan apa pun.

python hitung-parameter.py
import torch
import torch.nn as nn

# layer dense: setiap dari 784 masukan terhubung ke seluruh 128 neuron
dense = nn.Linear(784, 128)
print(f"dense 784 -> 128          : {sum(p.numel() for p in dense.parameters())} parameter")
print(f"  bobot {tuple(dense.weight.shape)} = {dense.weight.numel()}")
print(f"  bias  {tuple(dense.bias.shape)}  = {dense.bias.numel()}")

# layer konvolusi: 16 filter 3x3 dipakai berulang di seluruh posisi citra
conv = nn.Conv2d(in_channels=1, out_channels=16, kernel_size=3)
print(f"conv 3x3, 1 -> 16 kanal   : {sum(p.numel() for p in conv.parameters())} parameter")
print(f"  bobot {tuple(conv.weight.shape)}     = {conv.weight.numel()}")
print(f"  bias  {tuple(conv.bias.shape)}      = {conv.bias.numel()}")

n_dense = sum(p.numel() for p in dense.parameters())
n_conv = sum(p.numel() for p in conv.parameters())
print(f"rasio dense terhadap conv : {n_dense / n_conv:.0f} kali")
text Keluaran
dense 784 -> 128          : 100480 parameter
  bobot (128, 784) = 100352
  bias  (128,)  = 128
conv 3x3, 1 -> 16 kanal   : 160 parameter
  bobot (16, 1, 3, 3)     = 144
  bias  (16,)      = 16
rasio dense terhadap conv : 628 kali

Keluarannya menegaskan angka pada tabel. Perbandingannya tidak sepenuhnya setara karena jumlah keluarannya berbeda, 128 neuron berbanding 16 kanal, tetapi urutan besaran selisihnya tetap. Yang lebih penting, jumlah parameter konvolusi hanya bergantung pada ukuran kernel dan jumlah filter, yaitu 16 dikalikan 9 bobot ditambah 16 bias, sehingga mengganti citra 28x28 dengan citra 224x224 tidak mengubah angka 160 sama sekali. Pada layer dense, ukuran masukan yang berubah menuntut layer yang sama sekali baru.

Kesalahan umum#

Kesalahan pertama adalah mengira kehematan parameter datang dari citra yang diperkecil. Konvolusi dengan padding=1 dan kernel 3 mempertahankan bentuk 28x28, dan tetap jauh lebih hemat daripada layer dense. Penghematan berasal dari jendela kecil yang bobotnya dibagi antara posisi, bukan dari perubahan ukuran citra.

Kesalahan kedua adalah melupakan bias saat menghitung parameter secara manual. Rumus per filter adalah k×k×Cin+1k \times k \times C_{in} + 1, dengan kk ukuran kernel dan CinC_{in} jumlah kanal masukan. Untuk 16 filter 3x3 dengan satu kanal masukan, hitungannya 16 dikalikan 9 ditambah 16, yaitu 160. Angka 144 yang muncul tanpa bias tampak wajar, tetapi tidak cocok dengan keluaran program.

Ringkasan#

  • Layer dense pada citra 28x28 yang diratakan menuntut 100480 parameter untuk 128 keluaran, dan angkanya tumbuh seiring luas citra.
  • Konvolusi 3x3 dengan 16 filter hanya menuntut 160 parameter karena bobot kernel digunakan ulang di semua posisi.
  • Tiga sifat yang menjadikan konvolusi pilihan alami untuk citra adalah lokalitas pola, pembagian bobot, dan kevarianan terhadap translasi.
  • Perubahan ukuran citra tidak mengubah jumlah parameter konvolusi, sedangkan layer dense harus dibuat ulang.

Referensi#