Thursday, August 02, 2018

Deep Learning: CNN

Tulisan ini adalah kelanjutan dari tulisan sebelumnya tentang Jaringan Syaraf Tiruan (JST) .

Deep learning (tidak hanya) terbagi menjadi dua cabang algoritma besar: CNN (Convolutional NN) dan RNN (Recurrent NN). Masih banyak metode lainnya, namun seolah tenggelam oleh dua algoritma tersebut. Perbedaan utama CNN dan RNN adalah sebagai berikut.

CNN:
  1. Input berupa tensor dengan ukuran tetap (e.g: image)
  2. Output juga berupa vector dengan ukuran tetap (e.g. probablitias dari beberapa kelas berbeda)
RNN:
  1. Beroperasi pada sekuen vector atau tensor
  2. Contoh aplikasi: Text translation, speech to text, speech recognition, text to speech.
Sederhanya, jika input bisa diubah dalam bentuk "image", kita pakai CNN, jika data berupa vektor kita pakai RNN. Contoh, data ujaran (speech) juga bisa ditraining dengan metode CNN dengan memberi input jaringan berupa "image" spectrogram.

Kembali ke CNN. Masalah tersbesar JST/NN. Jika sebuah image berukuran 50 x 50 pixel sebagai input, dan JST memiliki konfigurasi 2 hidden layer dengan layer pertama berisi 7500 neuron (node) dan layer kedua berisi 2000 node dan 2 ouput, maka jumlah weight (bobot) pada arsitektur JST tersebut:
$$ (7500 \times 2000) + (2000 \times 2) = 15004000 $$
Jumlah yang cukup "berat" untuk dijalankan dengan komputer spek standar. Sebagai solusinya, ditawarkan arsitektur JST yakni CNN yang bisa bekerja dengan mempelajari pola pada skala yang lebih kecil, dan menggunakannya untuk mengidentifikasi gambar yang lebih besar. Contohnya adalah apakah gambar input merupakan gambar singa atau macan. Dengan mempelajari sebagian kecil bagian gambar (misal: bagian mulut), maka informasi tersebut dapat digunakan untuk menentukan gambar yang diinputkan adalah singa atau macan.

Ilustrasi CNN untuk deteksi gambar macan/singa

Konvolusi

Ide dasar dari CNN adalah kovolusi itu sendiri. Jadi, setiap bagian pada image dikonvolusikan dengan kernal atau filter. Sebagai contoh, kita memiliki data image dengan ukuran 5 x 5 pixel, kemudian kita buat filter ukuran 2 x 2. Setiap bagian (2 x 2) pada data image dikonvolusikan dengan kernel atau filter 2 x 2 tadi. Lihat gambar berikut untuk lebih jelasnya.


Hasil dari operasi diatas (konvolusi image dengan kernel/filter) adalah sebuah feature map, sebuah "peta" yang berisi "fitur" baru yang kita ekstrak dari data image. Feature map output berukuran 4 x 4 (N-1) untuk stride 1 (geser satu langkah) seperti di bawah ini, jika menggunakan stride 2 (geser dua langkah) akan didapatkan 2 x 2. Untuk lebih jelasnya proses konvolusi dapat digambarkan secara detail pada gambar di bawah ini.

Lebih jelas lagi, proses untuk mendapatkan feature map adalah sebagai berikut:
$a_{11} = (1 \times 0) + (2 \times 1) + (2 \times 1) + (1 \times 2) = 6$
$a_{12} = (2 \times 0) + (1 \times 1) + (1 \times 1) + (1 \times 2) = 4$
$a_{21} = (2 \times 0) + (1 \times 1) + (2 \times 1) + (1 \times 2) = 5$
...
$a_{44} = (1 \times 0) + (1 \times 1) + (1 \times 1) + (1 \times 0) = 2$

Begitu seterusnya sampai semua bagian pada data input dikonvolusikan dengan kernel. $a_{11}$ merupakan elemen pertama output feature map pada kolom pertama baris pertama, $a_{12}$ merupakan elemen pada baris pertama kolom kedua, dst sampai $a_{44}$ elemen feature map pada baris ke empat kolom ke empat (terakhir). Dengan cara ini kita bisa mereduksi jumlah bobot, misalnya dengan menggunakan 4 hidden layer konvolusi, masing-masing hidden layer 64 node (neurons). Maka jumlah bobot yang diperlukan/diperhitungkan adalah
$$(2 \times 2) \times 64 \times 4 = 1024$$
Bandingkan dengan 15 juta bobot pada arsitektur JST konvensional yang dijelaskan di awal tulisan ini.

Fungsi Aktivasi

Setiap output dari konvolusi akan disaring untuk untuk menghasilkan output yang menjadi input bagi layer selanjutnya. Output yang diharapkan pada tahap ini adalah output yang monoton, yakni linear pada daerah tengah, dan saturasi pada daerah ekstrim, batas atas dan batas bawah. Fungsi yang dipakai disini biasanya adalah fungsi sigmoid atau tan hiperbolik (tanh) karena memang bentuknya seperti yang diharapkan tadi.
Fungsi tanh

Selain fungsi tersebut, fungsi yang kini banyak dipakai adalah fungsi-fungsi non-linear lainnya, misalnya ReLU (rectified linear unit). ReLU me-nol-kan nilai negatif dan melinearkan nilai positif, sehingga membantu NN untuk menghindari permasalahan seperti "gradient saturation" yang terjadi pada sigmoid.
Fungsi ReLU

(Max) Pooling

Output dari konvolusi di atas, yakni feature map memberikan detail fitur pada setiap piksel. Bagaimanapun, kita tidak membutuhkan detail tersebut. Misal gambar singa atau macan sebagai input tidak selelu di tengah, bisa di bagian atas, bawah atau agak ke kiri atau ke kanan. Sehingga, kita hanya perlu mengambil sebagian nilai dari feature map tersebut untuk menyederhanakan komputasi. Teknik pooling membantu kita untuk menjejak gambar singa/atau macan yang bervariasi ini (tidak selalu di tengah atau persis dengan data training).

Salah satu teknik pooling yang paling sederhana adalah dengan mengambil nilai maksimal dari sebuah ukuran feature map. Misalnya dari feature map ukuran 4 x 4 kita ambil nilai maksimalnya untuk setiap bagian 2 x 2, maka hasil dari max pooling dari feature map tadi akan menghasilkan data ukuran 2 x 2.




Dropout

Dropout digunakan untuk menurukan jumlah unit (node/neuron). Apa perlunya mengurangi unit? Untuk menghindari overfitting. Jaringan yang dilatih terus-menerus, besar kemungkinan terjadi overfitting kaerna unitnya tepat, sedangkan performansinya diharapkan naik. Untuk itu, jumlah unit dikurangi, misalnya dengan menggunakan nilan dropout=0.25, maka pada layer tersebut hanya digunakan 75% unit dari total unit sebelumnya.

Selanjutnya...

Tulisan ini hanya menyajikan ide dasar konvolusi CNN. Banyak hal yang bisa dieksplorasi, misalnya fitur apa yang diingin digunakan (sangat menentukan hasil). Dalam DNN (deep neural network), high level feature (fitur yang sangat detil) akan memberikan hasil yang lebih baik daripada fitur umum dengan banyak layer. Hal lain yang bisa diexplorasi adalah fully connected layer. Misal pada contoh di atas, kita hanya mengekstrak bagian mulut singa/macan. Bagaimana kalau kita mengekstrak bentuk mata, telinga, dll kemudian fitur-fitur tersebut kita gabungkan untuk menentukan hasil akhir apakah gambar tersebut gambar singa atau macan, inilah yang disebut fully connected layer (lihar gambar 1).

Referensi:
  1. https://shafeentejani.github.io/2016-12-20/convolutional-neural-nets/
Related Posts Plugin for WordPress, Blogger...