10 March 2010

Algortima Pelatihan Perseptron

Algortima Pelatihan Perseptron 

Model JST perseptron ditemukan oleh Rosenblatt (1962) dan Minsky – Papert (1969). Model ini merupakan model yang memiliki aplikasi dan pelatihan yang lebih baik pada era tersebut. 

Arsitektur Jaringan

Arsitektur jaringan perseptron mirip dengan arsitektur jaringan Hebbian 


Jaringan terdiri dari beberapa unit masukan dan sebuah bias, dan memiliki sebuah unit keluaran. Hanya saja fungsi aktivasinya bukan merupakan fungsi biner atau bipolar, tetapi memiliki kemungkinan nilai -1, 0 dan 1:
Untuk suatu harga threshold θ yang ditentukan :



Secara geometris, fungsi aktivasi membentuk 2 garis sekaligus (memisahkan daerah positif dan daerah negatif.
Garis pemisah antara daerah positif dan daerah nol memiliki pertidaksamaan :
x1w1 + .....+ xnwn + b > θ
Garis pemisah antara daerah negatif dan daerah nol memiliki pertidaksamaan :
 x1w1 + .....+ xnwn + b < - θ
Algortima Pelatihan Perseptron
Misalkan :
s vektor masukan dan t adalah target keluaran
α adalah laju pembelajaran/pemahaman (learning rate) yang ditentukan
θ adalah threshold yang ditentukan
Algoritma sbb:
0. Inisialisasi semua bobot dan bias (umumnya wi = b =0 )
Set laju pembelajaran α ( 0 < α ≤ 1) (untuk penyederhanaan set α =1)
1. Selama kondisi berhenti benilai FALSE atau selama ada elemen vektor masukan yang respon unit keluarannya tidak sama dengan target (y ≠ t), lakukan langkah-langkah 2 – 6
2. Untuk setiap pasangan (s,t), kerjakan langkah 3 – 5:
3. Set aktivasi unit masukan xi = si (i = 1, ..., n)
4. Hitung respon untuk unit output:


5. Perbaiki bobot dan bias pola jika terjadi kesalahan
Jika y ≠ t, maka:
wi (baru) = wi (lama) + Δ wi (i = 1...n); dengan Δ wi = α t xi
b (baru) = b (lama) + Δb dengan Δ b = α t
Jika y = t maka:
wi (baru) = wi (lama)
b (baru) = b (lama)

6. Test kondisi berhenti: jika tidak terjadi perubahan bobot pada (i) maka kondisi berhenti TRUE, namun jika masih terjadi perubahan maka kondisi berhenti FALSE
Ada beberapa hal yang perlu diperhatikan dalam algoritma tersebut:
a. Interasi terus dilakukan hingga semua pola memiliki keluaran jaringan yang sama dengan targetnya (jaringan sudah memahami pola). Iterasi TIDAK berhenti setelah semua pola dimasukan seperti yang terjadi pada model Hebbian
b. Pada langkah 5, perubahan bobot hanya dilakukan pada pola yang mengandung kesalahan (keluaran jaringan ≠ target). Perubahan tersebut merupakan hasil kali unit masukan dengan target dan laju pembelajaran. Perubahan bobot hanya akan terjadi jika unit masukan ≠ 0
c. Kecepatan iterasi ditentukan oleh laju pembelajaran α ( dengan 0 < α ≤ 1) yang dipakai. Semakin besar α, semakin sedikit iterasi yang diperlukan. Akan tetapi jika α terlalu besar, maka akan merusak pola yang sudah benar sehingga pembelajaran menjadi lambat
Algoritma pelatihan perseptron lebih baik dibandingkan model Hebbian karena:
a. Setiap kali pola dimasukkan, hasil keluaran jaringan dibandingkan dengan target yang sesungguhnya. Jika terdapat perbedaan, maka bobot akan dimodifikasi. Jadi tidak semua bobot selalu dimodifikasi dalam setiap iterasinya
b. Modifikasi bobot tidak hanya ditentukan oleh perkalia antara target dan masukan, tetapi juga melibatkan suatu laju pembelajaran yang besar dapat diatur.
c. Pelatihan dilakukan berulang-ulang untuk semua kemungkinan pola yang ada hingga jaringan dapat mengerti polanya (ditandai dengan samanya semua keluaran jaringan dengan target keluaran yang diiinginkan). Satu siklus pelatihan yang melibatkan semua pola disebut Epoch. Dalam jaringan Hebbian, pelatihan hanya dilakukan dalam satu Epoch saja.
d. Teorema konvergensi perseptron menyatakan bahwa apabila ada bobot yang tepat, maka proses pelatihan akan konvergen ke bobot yang tepat tersebut.

Program Perceptron
Nama File : Perceptron.java

public class Perceptron {
    private int[][] x;
    private int[] w;
    private int[] t;
    private int b;
    private int lRate;
    private int y;
    private int epoch;
    private int net;
    private boolean stop;
    private boolean[] bobotBerubah;

    public Perceptron(){
        initial();
        printInput();
        learning();
    }

    private void printInput(){
        System.out.println("Bobot awal dan bias: "+w[0]+" "+w[1]+" "+b);
        System.out.println("Input data:  x1 x2 target");
        for(int i=0;i<4;i++){
            System.out.println("Data ke-"+i+": "+x[i][0]+" "+x[i][1]+"  "+t[i]);
        }
    }

    private void initial(){
        System.out.print("Initialing process....................\n");
        // initial input
        x = new int[4][2];
        x[0][0] = 1;
        x[0][1] = 1;
        x[1][0] = 1;
        x[1][1] = -1;
        x[2][0] = -1;;
        x[2][1] = 1;
        x[3][0] = -1;
        x[3][1] = -1;

        // initial bobot;
        w = new int[2];
        w[0] = 0;
        w[1] = 0;

        // initial bias
        b = 0;

        // initial target;
        t = new int[4];
        t[0] = 1;
        t[1] = -1;
        t[2] = -1;
        t[3] = -1;

        // initial hasil(y) dan learning rate (alfa)
        lRate = 1;
        y = 0;

        // initial bobot berubah
        bobotBerubah = new boolean[4];
        for(int i=0;i<4;i++){
            bobotBerubah[i] = false;
        }
    }

    private void learning(){
        System.out.print("Learning process...............\n");
        stop = false;
        epoch = 0;
        while(stop == false){
            epoch++;
            System.out.print("Epoch ke-"+epoch+"\n");
            for(int i=0;i<4;i++){
                net = x[i][0] * w[0] + x[i][1] * w[1] + b;
                y = f(net);
                if (y != t[i]) {
                    perbaikiBobot(i);
                    bobotBerubah[i] = true;
                }else{
                    bobotBerubah[i] = false;
                }
                System.out.print("data ke-"+i+" w1 w2 dan b: "+w[0]+" "+w[1]+" "+b+"\n");
            }           
            if(checkStop())stop = true;
        }
    }

    private boolean checkStop(){
        if(bobotBerubah[0])return false;
        if(bobotBerubah[1])return false;
        if(bobotBerubah[2])return false;
        if(bobotBerubah[3])return false;
        else return true;
    }

    private int f(int net){
        if(net > 0) return 1;
        else if(net == 0) return 0;
        else return -1;
    }

    private void perbaikiBobot(int i){
        w[0] = w[0] + lRate * t[i] * x[i][0];
        w[1] = w[1] + lRate * t[i] * x[i][1];
        b = b + lRate * t[i];
    }

    public void paternRecognize(int x1, int x2){
        System.out.println("Pengenalan pola");
        int net = x1 * w[0] + x2 * w[1] + b;
        System.out.println("Input [x1 x2]: ["+x1+" "+x2+"] gerbang 'AND' dikenal dengan nilai "+f(net));
    }
}

Nama File : Main.java

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
       
        Perceptron p = new Perceptron();
        p.paternRecognize(1, 1);
        p.paternRecognize(1, -1);
        p.paternRecognize(-1, 1);
        p.paternRecognize(-1, -1);
    }
}





Artikel Terkait:

2 komentar:

Rock said...

Artikel yang sangat bermanfaat kawand...

Farhan Hariri said...

Thnks kawannn..

Post a Comment

Tinggalkan Komentarmu Sob.

Sedikit Tentang Aye

Cari di Blog ini

Sobat Aye

Pesan Sobat

 
Copyright © Blognya Farhan