Epoch, Iteration, dan Stop Condition

Perkembangan Soft-computing menciptakan istilah-istilah baru yang sebelumnya belum pernah ada. Hal ini terjadi karena soft computing mengadopsi istilah-istilah lain. Sebagai contoh dalam algoritma genetika, istilah-istilah mutasi, kromosom, dan istilah-istilah yang berasal dari teori genetik dan evolusi menjadi istilah dalam ilmu komputer. Bahkan algoritma yang sudah sejak lama digunakan sudah bergeser ke arah metode. Metode lebih general dibanding algoritma yang lebih spesifik dan penerapan khusus. Jika Anda perhatikan algoritma genetika, beberapa tulisan menulisnya dalam bahasa Inggris dengan Genetic Algorithms dengan tambahan “s” di belakang algoritma. Hal ini karena algoritma genetika melibatkan beberapa algoritma seperti roulette wheel, encoding ke bits string dan sebaliknya (decoding), dan lain-lain. Namun beberapa buku tidak menambahkan “s” di belakang algoritma (Genetic Algorithm) dengan anggapan bahwa algoritma genetika adalah satu metode.

Beberapa rekan menanyakan istilah terkenal dalam machine learning yaitu “Epoch”. Banyak yang mengartikannya dengan iterasi. Tetapi mengapa tidak mengambil istilah iterasi saja? Jawabannya berasal dari training artificial neural network. Salah satu metode training, yaitu propagasi balik (backpropagation), menggunakan istilah epoch karena ketika melakukan satu kali iterasi dilakukan dengan rambatan balik. Untuk gampangnya, misalnya satu iterasi melibatkan proses a-b-c-d, maka epoch dalam satu “iterasi”-nya (dengan istilah satu kali epoch) melibatkan a-b-c-d-c-b-a. Dua iterasi: a-b-c-d-a-b-c-d, sementara dua epoch: a-b-c-d-c-b-a-b-c-d-c-b-a. Atau gampangnya iterasi itu epoch tanpa rambatan balik (hanya maju saja).

Beberapa rekan juga menanyakan metode yang cocok untuk stop condition. Untuk iterasi, sejak dulu kita sudah mengenal dengan error atau delta error. Jika error antara satu iterasi dengan iterasi berikutnya cukup kecil maka proses perhitungan berhenti. Error yang saat ini sering digunakan adalah Mean Square Error. Silahkan gunakan metode lain, misalnya Gradient Descent dengan prinsip kemiringan. Kemiringan diambil dari posisi saat ini dibanding epoch maupun iterasi sebelumnya. Jika masih besar selisihnya berarti masih miring. Ibaratnya kendaraan beroda jika masih miring masih bergerak turun, sementara jika sudah tidak begitu miring jalanan-nya, kendaraan itu bergerak perlahan, dan walaupun belum berhenti, dalam komputasi sudah dihentikan demi efisiensi. Untuk prakteknya perhatikan grafik hasil pelatihan jaringan syaraf tiruan di akhir prosesnya. Teringat saya ketika presentasi hasil penelitian di kampus. Karena reviewer adalah doktor dari FAI mempertanyakan mengapa perlu “pelatihan” karena buang-buang waktu dan biaya (dikiranya pelatihan JST itu: pelatihan/kursus/workshop).

Iklan

Melihat Data Network Hasil Training JST – Versi GUI

Pada postingan yang lalu telah dibahas cara mengetahui hasil training Jaringan Syaraf Tiruan (JST) dengan command window. Begitu juga bagaimana mengupdate salah satu parameternya, misalnya bias dan bias, sudah dibahas. Tetapi beberapa pembaca sepertinya agak kesulitan dengan instruksi-instruksi lewat command window. Oleh karena itu di sini akan dibahas cara yang jauh lebih mudah yaitu dengan “nntool”, salah satu GUI bawaan Matlab untuk merakit JST.

Sebenarnya masalah ini muncul ketika saya mencari kembali hasil training JST untuk peramalan (lihat post peramalan dengan JST di sini). Masalah yang sering dijumpai adalah “lupa”, karena banyaknya yang harus dikerjakan terkadang membuat seseorang lupa. Untungnya saya aktif menulis, tinggal masukan kata kunci di kolom “search” blog, catatan terdahulu yang dicari langsung ketemu. Jadi blog itu seperti catatan yang disimpan di “awan (cloud)” yang bisa diakses di mana saja dan kapan saja. Buka Matlab dan ketik nntool di command window.

Sebelumnya load terlebih dahulu Mat-file hasil training yang berisi variabel-variabel network. Di sini saya ada 7 variabel network yang saya sendiri lupa konfigurasinya. Setelah menekan “Import” di nntool maka muncul pilihan variabel yang akan dilihat. Ambil salah satu variabel hasil loading yang ada di workspace Matlab, dilanjutkan dengan kembali menekan Import setelah memilihnya.

Tekan Ok ketika ada informasi bahwa netwok telah berhasil diimpor. Tutup lagi sementara jendela Import to network/Data Manger. Perhatikan nntool kini telah muncul Network1 hasil impor. Untuk melihat isi dari variabel itu dobel klik saja di variabel tersebut.

Sebenarnya gambar di atas sudah cukup untuk mengetahui struktur JST yang telah dilatih dahulu. Misalnya input yang berjumlah 4 variabel dengan 1 keluaran. Hidden layer yang terletak di tengah tampak berjumlah sembilan. Gambar di atas khusus untuk Matlab versi 2013 ke atas, sementara Matlab versi yang terdahulu tidak memunculkan informasi tentang neuron-neuronnya. Silahkan tekan View/Edit Weights jika ingin melihat konfigurasi bobot-bobotnya. Kebetulan saya memiliki 4 variabel data yang akan dicoba prediksi dengan JST tersebut. Atau jika tidak ada, buat saja sendiri di command window. Tambahkan data input di nntool.

Tekan tombol Simulate pada network untuk memprediksi. Cara ini bisa juga dengan command window lewat instruksi sim.

Ada pesan untuk melihat nntool karena hasilnya dikirim ke sana. Jika sudah kembali ke nntool, tekan dua kali Output. Tampak hasilnya.

Sepertinya dengan nntool tidak banyak mengetik, alias tinggal klak-klik mouse saja. Jadi dengan empat masukan pada data akan menghasilkan satu keluaran (0.48). Di sini sebaiknya kita menggunakan normalisasi data, kalau bisa normal Euclidean, karena matrix yang dibuat dengan normal euclidean ortogonal yang disukai JST.

Fungsi Keanggotaan (Membership Function)

Fuzzy Inference System (FIS) memiliki fungsi keanggotaan (MF) ketika mengarahkan masukan ke keluaran tertentu. MF yang banyak digunakan adalah linear (purelin), tangen sigmoid (tansig), atau logaritmic sigmoid (logsig). MF yang tersedia di matlab tersebut digunakan juga untuk Jaringan Syaraf Tiruan (JST). Oiya, yang benar “syaraf” atau “saraf” ya?

Untuk mengetahui persamaan matematis MF tersebut, ketik saja “help tansig“, “help logsig” atau “help purelin”, sesuai dengan MF yang akan dipelajari.

Tansig merupakan fungsi eksponensial denga nilai maksimal 1 (kondisi jenuh). Coba plot fungsi dengan kode yang dicontohkan oleh “help” tadi. Berikut merupakan hasil running-nya.

Jika skripsi/tesis dibebaskan memilih fungsi keanggotaan, lebih mudah menggunakan fungsi purelin atau berbentuk segitiga karena lebih mudah menghitungnya secara manual yang terkadang diminta membandingkan antara hitungan manual dengan program. Jika akan diimplementasikan, sebaiknya gunakan logsig atau tansig.

Menghitung Keluaran Fuzzy

Jika sebelumnya telah dibahas perhitungan keluaran JST, sekarang akan kita coba bahas perhitungan keluaran Fuzzy, atau sering disebut Fuzzy Inference System (FIS). Mungkin soal ujian akhir mata kuliah AI & Neuro-Fuzzy berikut ini bisa dijadikan pelajaran bagaimana menghitung keluaran FIS. Terutama bagaimana menghitung besar fungsi keanggotaannya.

SOAL:

In a simple fuzzy-servo control of a DC motor, only relative position error is used to calculate for the required relative average voltage of PWM signal from motor driver. Assume relative position error and relative average voltage of PWM signal, both varying from –1 to 1, are classified into 5 levels; Negative Big (NB), Negative Small (NS), Zero (Z), Positive Small (PS), and Positive Big (PB), when membership functions are shown in the below figures.

Tentukan Relative Average Voltage (RAV) ketika relative position error (RPE) menjadi 0.2, asumsikan fuzzy inference rule mengikuti hubungan berikut ini:

Relative Position Error         NB NS Z PS PB

Relative Average Voltage     PB PS Z NS NB

JAWAB:

Berdasarkan soal, relative position error yang 0.2 dijumlahkan secara grafis dan dihubungkan dengan rule yang disebutkan dalam soal.

Gambar di bagian atas, garis tebal 0.2 tidak memotong NB dan dengan demikian tidak ada nilai PB di sebelah kanan (menurut rule NB rpe= PB rav). Garis tebal 0.2 berikutnya memotong NS di titik vertikal lalu diarahkan ke grafik kanan membentuk luasan gambar PS yang diarsir (menurut rule NS rpe = PS rav). Dan diteruskan hingga fungsi keanggotaan RPE terakhir (paling kanan) yaitu PB.

Berikutnya dijumlah luasan RAV dari atas ke bawah membentuk gabungan bangun segitiga dan persegipanjang. Untuk menghitung luas dan titik berat perlu mengetahui luas tiap komponen serta titik berat dari bangun segitiga dan persegipanjang.

Hasilnya kira-kira sebagai berikut.

Titik Berat (Center of Gravity) berdasarkan rumus adalah ∑ (area x titik berat) / ∑ (area) akan menghasilkan titik berat itu sendiri. Cukup rumit juga menghitung manual, apalagi jika fungsi keanggotaannya bukan garis lurus melainkan gauss atau bell. Tetapi untuk prakteknya ya tidak dihitung manual. Gunakan saja fuzzy di Matlab untuk mengecek jawaban jika ingin berlatih. Bagaimana untuk rule yang memiliki operasi AND dan OR? Mudah saja, AND ambil yang terkecil, sementara OR ambil yang terbesar dari fungsi keanggotaan yang dioperasikan (AND atau OR).

Jadi lebih ribet menghitung Fuzzy dibanding JST menurut saya. Semoga bermanfaat.

Mengekspor Bobot dan Bias ke Network JST

Cukup lama juga tulisan saya tentang “Seputar Jaringan Syaraf Tiruan” yaitu enam tahun yang lalu. Salah satu komentar yang cukup menarik adalah tentang bagaimana komponen JST yang berfungsi training mengirimkan hasil trainingnya (bobot dan bias) ke network JST agar bisa dipergunakan oleh aplikasi web-based yang memiliki JST di dalamnya. Sedikit berbeda dengan publikasi saya tentang Web-GIS yang baik training maupun simulating berada di desktop-GIS (Fig.1).

Dengan memanfaatkan fasilitas training JST Matlab, kita dapat mengetahui bobot dan bias hasil training yang telah dilakukan (lihat postingan sebelumnya mengenai cara membaca hasil pelatihan JST). Dengan memanfaatkan cara membaca bias dan bobot, kita dapat mengirimkannya ke JST yang telah dirakit terlebih dahulu. Postingan kali ini bermaksud sama-sama berdiskusi mengenai teknik untuk mengirimkan bias dan bobot hasil training ke JST yang ada.

A. Training JST dengan fungsi newff

Agar lebih gampang, contoh training dapat dilihat di help matlab (ketik saja help newff di command window Matlab). Atau copas script berikut ini:

  • load simplefit_dataset
  • net = newff(simplefitInputs,simplefitTargets,20);
  • net = train(net,simplefitInputs,simplefitTargets);
  • simplefitOutputs = sim(net,simplefitInputs);

Setelah enter ditekan, jendela pelatihan akan muncul seperti gambar di bawah ini. Tunggu sesaat hingga proses pelatihan selesai dijalankan.

B. Latihan Meng-update bobot JST Hasil Pelatihan

Untuk melihat variabel-variabel hasil pelatihan, kita dapat lakukan dengan menekan net di command window (jika variabel JST-nya “net” dan jika tidak, sesuai dengan namanya, biasanya network1 (default) jika dibuat di nntool).

  • sim(net,94)
  • ans =
  • 4.9494
  • Jawaban1=ans

Kode di atas adalah hasil awal JST ketika diberi masukan “94”, yaitu sebesar 4.9494. Berikutnya kita misalnya telah melakukan training lagi dengan data yang lebih baru dan akan meng-update dengan data baru. Sementara data yang lama adalah sebagai berikut:

  • >> net.IW
  • ans =
  • [20×1 double]
    • []
  • >> cell2mat(ans)
  • ans =
  • 28.3617
  • 27.9082
  • -27.8863
  • 26.6165
  • 23.2698
  • -15.0705
  • -20.3582
  • 22.0298
  • 28.3998
  • 28.0369
  • -27.9783
  • 27.8605
  • 27.8120
  • -27.7361
  • 28.0819
  • -28.8486
  • -29.2218
  • 26.3938
  • 26.8540
  • 28.1526
  • IWW=ans;

Di sini kita bisa mencoba melatih JST dengan data latih baru. Tetapi untuk gampangnya, sebagai perbandingan saja, misalnya IW di baris pertama misalnya “nol” (berwarna merah pada IW di atas). Insert dengan kode berikut:

  • IWW(1,1)=0

Sehingga baris pertama IW menjadi nol. Kembalikan variabel “mat” di atas menjadi “cell” mengingat bobot di Matlab adalah dalam bentuk cell.

  • IWWnew=mat2cell(IWW)
  • net.IW(1,1)=IWWnew

Di sini variabel baru IWWnew (konversi mat menjadi cell) disisipkan di net.IW yang merupakan bobot input JST.

  • >> sim(net,94)
  • ans =
  • 4.0079
  • Jawaban2=ans

Di sini kita uji dengan data test yang sama dengan sebelumnya (“94”), hasilnya ternyata berbeda dengan sebelumnya.

  • >> [jawaban1;jawaban2]
  • ans =
  • 4.9494
  • 4.0079

Perhatikan Jawaban1 dan Jawaban2 yang berbeda. Artinya JST sudah berubah karena update bobot di bagian input (net.IW). Untuk bias dan bobot sisi hidden layer dapat dilakukan dengan cara yang sama. Untuk mengirimkannya lewat mekanisme database, ada baiknya membaca buku yang telah kami tulis sebelumnya. Selamat mencoba.

Perbandingan NARXNET dengan NNTOOL untuk Peramalan Data Time-Series

Narnet merupakan penerapan neural network untuk prediksi data time series. Berbeda dengan prediksi data biasa yang mengandalkan atribut/variabel, prediksi data time series, atau dikenal dengan istilah proyeksi (projection), hanya mengandalkan riwayat data sebelumnya (historical data). Maka neural network untuk prediksi menjadikan data sebelumnya sebagai atribut yang digunakan saat pelatihan (training) maupun prediksi (simulating). Sementara itu, muncul Narxnet dengan istilah “x” yang berarti variabel eksternal (external). Variabel ini oleh matlab diberi istilah “external input” atau ada juga yang menyebut dengan istilah “intervention indicators” (lihat situs ini). Variabel ini tidak terlibat sebagai variabel yang berasal dari time series tetapi dijadikan variabel prediksi. Postingan yang lalu sepertinya cukup baik menjelaskan teknik ini.

Matlab telah memberikan layanan toolbox untuk penerapan Narxnet baik yang berbasis GUI maupun command. Yang berbasis command sepertinya lebih baik karena dapat digunakan untuk data berukuran kurang dari lima. Masalah yang sering muncul adalah akurasi hasil pelatihan ketika memprediksi data ke depan. Memang dapat dilakukan pelatihan ulang, tetapi tetap saja menjadi ragu-ragu untuk diterapkan, apalagi kesalahan yang terjadi bukan hanya dari sisi besaran melainkan arahnya (harusnya naik malah turun). Coba kita praktekan dengan data sederhana agar lebih mudah diketahui error-nya.

Data di atas merupakan data yang terdiri dari data time series dari satu sampai lima dan external input dari seribu hingga 1060. Kita diminta membuat Narxnet, melatihnya, dan memprediksi data setelah lima (tentu saja hasilnya dapat ditebak yaitu 6 dan 7). Listing berikut menggunakan toolbox Narxnet di Matlab. Atau buka panduannya dengan mengetik help narxnet di command window dan isi data time series dengan nama variabel t dan external input dengan nama variabel x. Jangan lupa tipe data yang digunakan adalah sequence.

  • t={1 2 3 4 5};
  • x={1000 1010 1020 1030 1040};
  • net = narxnet(1:2,1:2,10);
  • [X,Xi,Ai,T] = preparets(net,x,{},t);
  • net = train(net,X,T,Xi,Ai);
  • view(net)
  • Y = net(X,Xi,Ai)
  • perf = perform(net,Y,T)

Hasil training dapat dilihat pada gambar berikut (kiri) dan tampilan hasil Narxnet (kanan). Ada 7 plot yang tersedia untuk melihat kinerja pelatihan antara lain: performance, training state, error histogram, regression, time series response, error autocorrelation, dan input-error cross-correlation.

Step-Ahead Form

Step-Ahead form sering digunakan pada Nernet yang tanpa menggunakan External input. Perhatikan kode yang dicetak tebal di atas. Delay yang digunakan pada gambar di atas adalah 1 langkah. Fungsi yang diperlukan adalah fungsi Remove delay.

  • nets = removedelay(net);
  • view(net)
  • [Xs,Xis,Ais,Ts] = preparets(nets,x,{},t);
  • Ys = nets(Xs,Xis,Ais)
  • Ys =
  • [3.0000] [4.0000] [5.0000] [4.2465]

Hasilnya kurang menggembirakan, seharusnya 6.0000 tapi malah turun (4.2465). Salah satu cara untuk memperbaikinya adalah melakukan pelatihan ulang hingga diperoleh hasil yang memuaskan.

Multistep Prediction

Untuk Narxnet, ada pilihan lain yaitu Multistep prediction. Metode ini mengandalkan keunggulan dari external input. Makin banyak external input makin baik tetapi tentu saja persoalan berubah dari proyeksi menjadi prediksi biasa, dan data time series jadi tidak signifikan lagi manfaatnya.

Prinsip kerjanya adalah menggunakan lingkar terbuka (open loop) untuk merakit Narxnet dari data yang tersedia kemudian merubahnya menjadi lingkar tertutup (closed loop). Narxnet yang sudah dalam bentuk lingkar tertutup kemudian digunakan untuk memprediksi hanya berdasarkan data external input. Kembali ke kasus di atas, dengan Multistep prediction Narxnet dibagi menjadi dua segmen yaitu segmen dengan target/output yang diketahui dan yang hanya diketahui external input-nya saja (x). Di sini time stap yang tersedia hanya dua yaitu data keenam (1050) dan ketujuh (1060). Gunakan t yang sama dengan kasus sebelumnya, tetapi dengan x yang ditambah dengan dua data sebagai dasar patokan untuk memprediksi t.

  • x={1000 1010 1020 1030 1040 1050 1060};
  • numTimesteps = size(x,2);
  • knownOutputTimesteps = 1:(numTimesteps-5);
  • predictOutputTimesteps = (numTimesteps-4):numTimesteps;
  • x1 = x(1,knownOutputTimesteps);
  • t1 = t(1,knownOutputTimesteps);
  • x2 = x(1,predictOutputTimesteps);

Perhatikan penggunaan fungsi closeloop untuk membuat lingkar tertutup dari network yang telah dilatih sebelumnya.

  • [Xo,Xio,Aio,To] = preparets(net,x1,{},t1);
  • [Y1,Xfo,Afo] = net(Xo,Xio,Aio);
  • [netc,Xic,Aic] = closeloop(net,Xfo,Afo);
  • [Y2,Xfc,Afc] = netc(x2,Xic,Aic);

Hasilnya disimpan dalam variabel Y2 yakni [4.2465] dan [0.2789]. Sangat tidak akurat dan harus dilatih ulang. Untuk mengulangnya tinggal copy-paste lagi kode-kode di atas. Berikut untuk training kedua:

  • Y2 =
  • [3.0000] [4.0000] [5.0000] [7.2076] [8.8717]

Masih kurang akurat (terlalu besar). Berikut ini akan dicoba tidak dengan Narxnet melainkan NNTOOL seperti biasa apakah hasilnya lebih baik?

Prediksi Data Time Series dengan NNTOOL

Seperti dibahas di awal, data deret waktu yang lampau dijadikan variabel untuk memprediksi data berikutnya. Variabel external input ditambahkan sebagai data eksternal. Gunakan data berikut ini untuk training. Terus terang saya agak kagok dengan format kolom nntool, saya lebih suka format baris seperti tabel biasa, jadi saya menggunakan transpose setelah memasukan data dengan format baris agar berganti kolom yang sesuai dengan nntool.

  • data=[1 2 1020; 2 3 1030; 3 4 1040];
  • data=transpose(data);
  • target=[3;4;5];
  • target=transpose(target);

Panggil fungsi nntool untuk membuka GUI perancangan neural network (lebih jelasnya lihat postingan JST). Perhatikan penggunaan fungsi PURELIN agar neural network mampu memprediksi nilai yang diluar rentang data pelatihan.

Hasil pelatihan disimpan dengan nama network1 yang akan digunakan untuk memprediksi data yang akan datang. Dengan menggeser (shifting window) satu persatu, diperoleh data keenam dan ketujuh sebagai berikut.

  • dataenam=[4 5 1050];
  • dataenam=transpose(dataenam);
  • proj6=sim(network1,dataenam)
  • proj6 =
  • 6.0000
  • datatujuh=[5 6.0000 1060];
  • datatujuh=transpose(datatujuh);
  • proj7=sim(network1,datatujuh)
  • proj7 =
  • 7.0000

Perhatikan, hasilnya sangat akurat yaitu data keenam dan ketujuh berturut-turut 6.0000 dan 7.0000 hanya dengan sekali proses pelatihan. Itulah mengapa saya lebih suka menggunakan NNTOOL untuk meramalkan data baik dengan maupun yang tanpa external input. Problem ini sudah saya coba baik dengan Matlab 2008b maupun Matlab 2013. Mohon masukan dari pembaca.

NARNET Untuk Data Kecil (Non-GUI)

Untuk data yang besar, GUI pada NARNET, lihat tulisan sebelumnya, dapat dijadikan andalah untuk peramalan data deret waktu (time series). Tetapi jika data kurang dari sepuluh, GUI menolak untuk memprosesnya. Untungnya NARNET dengan command window masih dapat dilakukan meskipun datanya berukuran kecil. Siapkan data berikut ini:

  • T=[1845005 1873470 1882869 2334142 2733030];
  • T=con2seq(T);

Data yang digunakan berjumlah lima buah. Data ini kemudian dikonversi menjadi data sequence dengan instruksi con2seq. Siapkan network dengan nama misalnya, “net” dengan fungsi narnet. Jumlah neuron yang digunakan misalnya 10 dan delay 2. Fungsi preparets dan train berturut-turut berfungsi untuk menyiapkan parameter-parameter pelatihan dan melatih network yang sudah disiapkan sebelumnya.

  • net=narnet(1:2,10);
  • [x,xi,ai,t] = preparets(net,{},{},T);
  • net = train(net,x,t,xi,ai);

Latih ulang jika hasil pelatihan di atas dirasa kurang memuaskan. Selain melihat performance sebaiknya lihat grafiknya dengan menekan tab performance dan juga regression. Contohnya adalah hasil regresi pada grafik berikut ini menunjukan data yang “fit” dengan persamaan regresi bentukan NARNET.

Berikutnya adalah memprediksi data keenam dan seterusnya. Fungsi yang digunakan adalah removedelay sebagai berikut:

  • nets = removedelay(net);
  • [xs,xis,ais,ts] = preparets(nets,{},{},T);
  • ys = nets(xs,xis,ais);
  • format longg
  • ys
  • ys =

    [2140750.10017932] [2174736.34212479] [2732810.26058797] [2846162.67542468]

Variabel ys memunculkan empat data dimana data yang terakhir adalah data prediksi. Format longg sengaja digunakan agar format angkanya tidak berpangkat. Bila ragu dengan hasil peramalan, latih dan prediksi lagi saja. Berikutnya untuk memperoleh data ketujuh, libatkan data keenam pada pelatihan NARNET. Selamat mencoba.