Multi Layer Perceptron: 'Toytest' Neural Network dengan Fungsi Trigonometri


Well, saya akui saya sempat salah konsep dalam memahami neural network ini. Saya menganggap fungsi softmax adalah gabungan beberapa neuron, padahal itu cuma fungsi aktivasi yang mengubah vektor regresi linear menjadi vektor (yang mendekati) probabilitas. Karena kesalahan itu, sekarang saya lebih aware dari bentuk rancangan neural network. Untuk itu, saya benar-benar mengharapkan kritik dan saran bagi siapa saja yang membaca ini dan kebetulan ilmunya lebih dari saya. Yah menurutku, semua orang at certain level pasti ada salah pemahaman dibandingkan dengan pemahaman originalnya. Hmm, mungkin salah pemahaman bukan kata yang tepat, tapi sudut pandang yang berbeda. Awalnya kita bisa melihat layang-layang terbang, tapi beberapa menit kemudian kita tidak bisa melihatnya lagi karena layang-layangnya terbang di atas kepala kita yang mana terhalang oleh atap rumah tempat kita mengamati layang-layang itu.

Pada artikel sebelumnya, kita sudah pernah menyinggung tentang multi layer perceptron dan bagaimana kehebatannya bisa melakukan klasifikasi non-linear. Di situ kita juga sudah menyinggung tentang apa itu linear dan non-linear dalam konteks ini (uh-oh you know, terkadang saya kurang paham apa saja yang dianggap liner dan non-linear dalam matematika...terkadang saya merasa linear dan non-linear itu konteksnya berbeda dengan ini).

Inilah kekuatan sebenarnya dari neural network. Inilah alasan di kebanyakan kasus kenapa orang memakai neural network, yaitu untuk mencari relasi yang non linear. Kali ini kita akan melakukan testing neural network dengan cara yang cukup populer, yaitu dengan fungsi trignometri (yup, karena ini bukan merupakan fungsi yang linear dan sangat mudah dibuatkan scriptnya). Ya cuma testing, untuk contoh kasusnya akan dibahas lain kali. Fungsi trigonometri yang kumaksud di sini terdiri dari sin(x), cos(x), dan tan(x) Kita akan mencoba untuk memaping fungsi trigonometri (sinus, cosinus, tangent) ke angka aslinya.

(sin(x), cos(x), tan(x)) -> x

Pada kebanyakan kasus X disini dalam derajat atau koefisien dari π, tapi dalam kasus ini X hanyalah konstanta biasa dari 1 - 69.

Fungsi sinus

Fungsi cosinus

Fungsi tangent

Uwahh, lihat betapa chaosnya grafik itu, memangnya masih mungkin untuk mencari regresi linearnya? Dengan cara konvensional rasanya mustahil tapi dengan neural network, ini bisa dilakukan. Walaupun begitu, ANN (Artificial Neural Network) yang akan kita bangun ini tidak akan bisa memprediksi nilai X pada data parameter diluar data training (summary, tidak bisa digunakan ANN-nya) karena fungsi trigonometri ini adalah fungsi periodik. Artinya, seperti grafik diatas nilainya berosilasi

sin(0) = sin(π) = sin(2π) = sin(3π) = ... = 0

Karena itulah fungsi trigonometri ini hanya digunakan untuk mengetes jaringan ANN kita.

Berikut akan dijelaskan algoritma dari ANN untuk kasus ini. Pertama, dalam 'melatih' ANN, kita perlu data input dan truth datanya. Data input adalah sin(X), cos(X), dan tan(X) sedangkan truth datanya adalah X. Kita perlu menormalisasi keduanya dengan rumus


dimana:
N = nilai awal
N(bertopi -) = rata-rata nilai awal
S(N) = standar deviasi nilai awal

Sebagai konsekuensi dari menormalisasi semua data baik itu data input dan truth data, hasil dari regresi linear pada layer output harus di post processing lagi. Post processingnya adalah mengonversi nilai normalisasi menjadi nilai sebenarnya dengan membalik rumus normalisasi di atas.


Kemudian dalam fase training, loss function yang kita gunakan adalah MSE (Mean Squared Error) yang sudah pernah kita gunakan di artikel sebelumnya.


dimana:
n = banyaknya sampel
w1,2,3 = weight untuk hidden layer pada neuron 1,2,3
y1= Truth data ke-i
xi,1,2,3 = nilai dari fungsi sigmoid dari hidden layer pada neuron 1,2,3 untuk data ke-i
b = bias

Yup, berbeda dengan pembahasan sebelumnya, yang mana weight pada loss function diambil langsung dari input layer, disini weight diambil dari hidden layer pada neuron yang menggunakan fungsi aktivasi sigmoid. Lebih jelasnya, bisa dilihat bagan dari ANN rancangan kita


Weight dan nilai dari input layer dikalikan dan dijumlahkan semuanya lalu diteruskan ke hidden layer untuk diproses dengan fungsi sigmoid. Oleh karena itu, masing-masing neuron pada input layer mempunyai weight sebanyak hidden layer di depannya, dalam kasus ini 3. Sedangkan pada hidden layer hanya punya 1 weight karena neuron pada output layer hanya ada 1. Ya, garis-garis yang menghubungkan neuron kita (lingkaran pada ilustrasi di atas) bisa dianggap sebagai weight.

Pretty daunting kelihatannya tapi sebenarnya, operasi yang dilakukan dalam ANN ini hanya operasi matrix biasa yang mana kolom dan barisnya menggambarkan banyaknya data input/neuron pada layer itu (bisa input layer atau hidden layer) dan layer setelahnya. Pada kasus ini dan kebanyakan kasus, hidden layer hanya terdiri dari 1 layer. Hidden layer sebenarnya bisa ditambah menjadi beberapa lapis untuk menambah akurasi dari ANN. Begitu juga banyaknya neuron dalam 1 hidden layer, bisa ditambah sesuka hati untuk menambah keakuratan. Untuk menambah neuron dalam layer, cukup dengan menambah kolom atau baris pada operasi matrix yang dilakukan dalam ANN. Sedangkan untuk menambah layer berarti menambah banyaknya operasi regresi linear dan fungsi aktivasi sebelum diteruskan ke neuron output layer. Konsekuensi dari menambah layer atau neuron ini tentu saja membuat beban komputasi semakin banyak.

Dalam prosesnya, weight dan bias dalam ANN akan mengalami pembaruan sebanyak iterasi yang ditentukan atau sampai loss function menjadi sekecil yang dinginkan. Selanjutnya kita bisa melihat performa dari prediksi ANN kita dengan menggunakan data test dari data training yang sebelumnya. Data test di luar data training tidak akan bekeja seperti yang sudah disebutkan sebelumnya. Untuk memprediksi sesuatu yang periodik seperti ini, bisa dengan ANN LSTM (Long Short Term Memory) yang tidak kita bahas di sini.

Script untuk artikel ini bisa di download di sini.

Grafik truth data dan prediksinya

Kalau diperhatikan, plot garis di atas bukan garis lurus karena ada sedikit berkelok-kelok. Semakin lurus dan diagonal pas membelah grafik ini garis itu maka semakin tinggu juga akurasinya.

Selanjutnya kita tinjau akurasi dari ANN kita per iterasi. Defaultnya, iterasi yang dilakukan 17000x, dengan learning rate 0.05.


Yang unik dari grafik error tersebut adalah mulai dari iterasi sekitar 2500 - 5000 terjadi osilasi error. Ini terjadi karena learning rate terlalu besar untuk ukuran iterasi yang sangat banyak. Sekarang kira coba perkecil learning ratenya menjadi 0.0009, maka


Sepertinya lebih proporsional. Tapi iterasi 17000x itu terlalu banyak. Mari kita kurangi iterasinya menjadi 3000x (pada grafik pertama tadi osilasi error terjadi disekitar sini) dengan learning rate sama seperti defaultnya.


Hmm, lebih baik. Learning rate yang besar mengizinkan kita mengambil iterasi lebih sedikit a.k.a beban komputasi lebih ringan (sayangi komputer kalian gaes). Prediksi dari settingan ini kurang lebih sama seperti sebelumnya



Sayangnya, sebenarnya ukuran akurasi dari grafik di atas tidak menggambarkan keakurasian yang sebenarnya karena test data yang kita pakai sama dengan data training. Terlalu tingginya akurasi pada data training justru pertanda buruk pada kasus sehari-harinya, ini pertanda besar terjadi overfitting.

Sekian pembahasan kali ini. Di pembahasan selanjutnya, mungkin kita akan membahas tentang aplikasi dunia nyata dari MLP ini. Sekian.

referensi:
www.cs.stir.ac.uk/courses/ITNP4B/lectures/kms/4-MLP.pdf, diakses pada 28 Juni 2017
https://www.quora.com/Does-the-fact-that-neural-nets-cant-properly-predict-periodic-functions-mean-neural-nets-dont-actually-represent-the-way-how-the-human-brain-works, di akses pada 29 Juni 2017

Komentar