Membangun Multi Layer Perceptron (MLP) dengan Algoritma Optimasi Levenberg-Marquardt


Pada postingan terdahulu, kita sudah pernah membahas tentang cara membangun jaringan syaraf tiruan jenis MLP ini akan tetapi menggunakan optimasi gradient descent. Sekarang kita akan membangun MLP (lagi) tapi dengan algoritma optimasi yang berbeda, yaitu algoritma levenberg-marquardt (lm). Yang menjadi pertanyaannya, apa yang membedakan 2 algoritma optimasi ini?

Sederhananya, gradient descent melakukan optimasi berdasarkan gradient (turunan pertama) dari loss function (fungsi error seperti mean squared error) sementara algoritma lm berdasarkan dari turunan kedua. Mengapa ini penting? Terkadang kurva error dari loss function turunan pertama akan menjadi sangat rumit sehingga gradient descent akan tampak seperti 'berputar-putar' akibatnya akan sangat lama bagi dia untuk mengecilkan nilai erorrnya. Untuk melihat 'big picture' dari kurva error tersebut, kita carilah turunan keduanya (turunan gradient) sehingga hasil yang diharapkan fungsi optimasi lm ini tidak akan berputar-putar seperti gradient descent.

Untuk memahami apa yang dibicarakan pada alinea sebelum ini, pelajari terlebih dahulu tentang hubungan turunan pertama dan kedua dan grafik.




Saya biasanya memakai tensorflow untuk membangun berbagai macam jaringan syaraf tiruan, tapi untuk kasus ini saya tidak pakai itu. Ini karena tensorflow tidak menyediakan algoritma lm. Semua algoritma optimasi pada tensorflow hanya untuk turunan pertama. Well, di kebanyakan kasus, turuna pertama memang menyelesaikan masalah kita sih.

Kali ini kita akan memakai lib pyrenn untuk membangun MLP. Cara install pyrenn sangat mudah, yaitu cukup dengan


Setelah itu kita buat script python, lengkapnya ada dibawah ini


Spesifikasi dari MLP yang kita bangun berdasarkan script di atas adalah 1 input masukan, 20 neuron untuk hidden layer pertama dan 1 neuron output keluaran. Epoch yang dipakai adalah 5000. Dataset masukan (x) adalah bilangan 1 sampai 100, sedangkan y adalah suatu fungsi dengan masukan x, yaitu:


dengan alpha = 100 dan beta = 102. Ini hanyalah fungsi arbitary dengan konstanta arbitary pula, tidak terlalu penting, hanya sebagai toytest saja.

Hasilnya adalah grafik berikut ini


Seperti tipikal MLP yang biasanya, setiap kali running hasilnya akan sedikti berbeda karena weight yang di inisialisasi secara random. Berikut ini running yang kedua kalinya dengan script dan yang lainnya yang sama persis


Pyrenn sangat mudah digunakan, kita bisa mengubah spesifikasi MLP yang ingin dibangun hanya dengan mengubah script pada bagian


Konon pola yang rumit memerlukan neuron pada hidden layer yang banyak pula agar MLP bisa mempelajarinya. Untuk membuktikan itu, ayo kita sedikit bereksperimen dengan mengubah neuron pada hidden layer di script ini menjadi 5. Hasilnya adalah


Ups, error. Sepertinya karena scale factornya yang menjadi sangat kecil. Kita coba pakai 10 neuron, dan hasilnya adalah


Tidak terlalu bagus. Sekarang ayo kita tambah neuronnya menjadi 50, hasilnya adalah


Sempurna. Sehingga kesimpulan kita dari eksperimen kecil-kecilan ini adalah semakin banyak neuron maka semakin rumit pula pola yang bisa ditangkap oleh MLP kita.

Akan tetapi pada aplikasinya di dunia nyata, terlalu sempurna dalam fitting grafik data latih itu bisa buruk karena akan merujuk ke overfitting. Itulah mengapa ada regularization L1 dan L2 bahkan dropout layer, agar fitting yang dilakukan tidak terlalu 'pas'.

Sekian.

referensi:
https://en.wikipedia.org/wiki/Levenberg%E2%80%93Marquardt_algorithm#Choice_of_damping_parameter, di akses pada 6 Januari 2017

Komentar

Posting Komentar