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 terbesar 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 kernel atau filter.  Kedua istilah tersebut, filter dan kernel size, pada Keras/Tensorflow dibedakan, filter sebagai representasi banyaknya feature map hasil konvolusi, dan kernel sebagai peng-konvolusi. 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 selalu 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 menurunkan jumlah unit (node/neuron). Apa perlunya mengurangi unit? Untuk menghindari overfitting. Jaringan yang dilatih terus-menerus, besar kemungkinan terjadi overfitting karena unitnya tetap, sedangkan performansinya diharapkan naik. Untuk itu, jumlah unit dikurangi, misalnya dengan menggunakan nilai dropout=0.25, maka pada layer tersebut hanya digunakan 75% unit dari total unit sebelumnya. Untuk mengetahui overfitting tidaknya, teknik berikut dapat digunakan:

  • Jika training loss jauh jauh lebih kecil daripada validation loss --> overfitting
  • Jika training loss jauh lebih besar daripada validation loss --> underfitting (jarang terjadi)
  • Jika training loss hampir sama dengan validation loss --> just fitting (good).

Selain dengan menggunakan dropout, overfitting bisa dihindari/dikurangi dengan menurunkan jumlah unit/nodes pada hidden layer. Penentuan jumlah unit dan layer ini sangat mempengaruhi overfitting/tidaknya.

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, kebanyakan berbasis statistik) 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). Fully connected (FC) sering juga disebut dengan Dense layer. Jaringan dense ini biasanya dipakai untuk menggabungkan (arsitektur) jaringan-jaringanya lainnya (Saya memakainya untuk menggabungkan speech dengan text).

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