Saturday, March 12, 2016

Implementasi Fungsi Aktifasi atau Fungsi Transfer

Kita akan segera mengunakan fungsi aktifasi atau fungsi transfer. Fungsi ini memberikan keluaran kepada neuron yang lain. Fungsi ini dipilih berdasarkan permasalahan yang akan dipecahkan. Dengan dibuatnya fungsi ini maka, kita menjalankan sebuah neuron. Sampai disini saya telah paham konsep dari neuron. Sehingga kemudian saya akan membuat class Neuron pada kesempatan berikutnya

Sekarang kita akan memasukkan fungsi aktifasi atau fungsi transfer kedalam program kita.


/*
<ANNInputWeightBias.java. The program performs summation for 
Input, Weight, and Bias .>
    Copyright (C) <2016>  <Joko Adianto>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/


class ActivationFunction {
    //Hard Limit
    public double hardLim(double s){
        if (s < 0) s=0.0;
        else s = 1.0;
        return s;
    }
   
    //Symmetric Hard Limit
    public double symHardLim(double s){
        if (s < 0) {
            s=-1.0;
            }
        else {
            s = 1.0;
            }
        return s;
    }
   
    //Linear
    public double lin(double s){
        return s;
    }
   
    //Saturated Linear
    public double satLin(double s){
        if (s < 0){
            s=0;
            }
        else if (s >=0 && s<=1){
            s = s;
            }
       
        else {
            s=1;
            }
        return s;
    }
   
    //Symmetric Saturated Linear
    public double symSatLin(double s){
        if (s < -1){
            s=-1;
            }
        else if (s >=-1 && s<=1){
            s = s;
            }
       
        else {
            s=1;
            }
        return s;
        }
   
   
     /**Log Sigmoid
     *
     * @param s
     * @return 1/(1+java.lang.Math.pow(java.lang.Math.E, -s)    
     */

    public static double logSig(double s){
        return 1/(1+java.lang.Math.pow(java.lang.Math.E, -s));
    }
   
    /**Hyperbolic Tangent Sigmoid
     *
     * @param s
     * @return s
     */
    public double tanSig(double s){
        return (java.lang.Math.pow(java.lang.Math.E, s)-
                java.lang.Math.pow(java.lang.Math.E, -s))/
                (java.lang.Math.pow(java.lang.Math.E, s)+
                java.lang.Math.pow(java.lang.Math.E, -s));
    }
   
}


public class ANNInputWeightBias {
/**
* @param p
* @param w
* @param o
* @return double
*/


public static double getSum( double[] p, double[][]w, double b ){
        double o =0; //o adalah akumulator
        int k = p.length; //panjang array p
        int j = 0; //pencacah
        for (j=0;j<k;j++){
                    o=o+p[j]*w[j][0];                   
                }
        o=o+b;
        return o;
    }
   
   
 /**
* @param args the command line arguments
*/
    public static void main(String[] args) {
        // TODO code application logic here
        ActivationFunction af = new ActivationFunction();
        double o=0;
        double b=1; //b adalah bias
        double[] p = {1,2,3}; //p adalah input
        double[][] w = {{2}, {4}, {6}}; //w adalah weight
       
        o=getSum(p,w,b);
        o=af.logSig(0);
        System.out.println(o);
       
    }
   
}

Friday, March 11, 2016

Java : Pemrograman Neuron dengan Banyak input.

Skenario :
  1. Saya akan menampilkan sebuah program yang diemulasikan memiliki banyak input, dan selanjutnya setiap pengolahan input akan diberi bias 1.
  2. Input dan weight digambarkan dalam bentuk array. Sedangkan bias digambarkan dalam bentuk skalar.
  3. Perhitungan yang dilakukan "sampai dengan - tidak lebih" dari persamaan  n = WP+b. Perhitungan lebih lanjut dengan fungsi aktifasi atau fungsi transfer akan dibahas kemudian.

Untuk membuat program berdasarkan skenario diatas, Saya menggunakn bahasa Java. Untuk program ini kita tidak menggunakan konsep-konsep lanjutan didalam pemrograman berorientasi object. Berikut ini adalah kerangka dasar pemrograman dari skenario diatas :
  1. Membuat method untuk melakukan perkalian matriks
  2. Membuat method untuk melakukan penjumlahan hasil perkalian matriks Input dan Weight dengan bias.
  3. Matriks input berdimensi 1 x 2
  4. Matrik weight berdimensi 2 x 1
  5. Jika  matriks input dikalikan dengan matriks weight maka hasilnya adalah skalar.
  6. Masukan yang diberikan dalam bentuk matriks. 
  7. KITA MENGGUNAKAN SATU BUAH NEURON
Kerangka program diatas menggunakan perkalian matriks Berikut ini adalah potongan program dari kerangka program diatas :

/*
<ANNInputWeightBias.java. The program performs summation for 
Input, Weight, and Bias .>
    Copyright (C) <2016>  <Joko Adianto>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

public class ANNInputWeightBias {
/**
     * @param p
     * @param w
     * @param o
     * @return double
     */
    public static double getSum( double[] p, double[][]w, double b ){
        double o =0; //o adalah akumulator
        int k = p.length; //panjang array p
        int j = 0; //pencacah
        for (j=0;j<k;j++){
                    o=o+p[j]*w[j][0];                   
                }
        o=o+b;
        return o;
    }
   
   
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
       
        double o=0;
        double b=1; //b adalah bias
        double[] p = {1,2,3}; //p adalah input
        double[][] w = {{2}, {4}, {6}}; //w adalah weight
       
        o=getSum(p,w,b);
        System.out.println(o);
       
    }
   
}

keluaran dari program diatas adalah 29. Kita dapat melihat program diatas sebagai sebuah persamaan linear n = WP + b dimana :
  • W adalah kostanta
  • P adalah variable dan merupakan sumbu horizontal
  • b adalah pergeseran pada sumbu P
  • dan n adalah sumbu tegak lurus.
Yang patut diperhatikan adalah nantinya nilai W dan b akan berubah-ubah.perubahan ini terjadi karena adanya proses pembelajaran dari neuron. Penyesuaian ini dilakukan selama pembelajaran sampai mendapatkan Weight dan b yang paling cocok.








Perkalian Matriks

Kita memiliki 2 buah matriks, yaitu A dan B. maka kita dapat melakukan perkalian ke dua buah matriks tersebut jika :
  • Jumlah kolom A sama dengan jumlah baris kolom B
  • Hasil perkalian adalah C yang memiliki dimensi baris A dan kolom B jika A adalah matriks kolom dan  B adalah matriks baris.
  • Hasil perkalian adalah skalar c jika B dikalikan A
Kita berkepentingan dengan perkalian yang memberikan nilai skalar.Berarti adalah perkalian B*A dimana A adalah matriks baris dan B adalah matriks kolom.

Berikut ini adalah contoh dari perkalian matriks yang akan kita gunakan pada perkalian input dan weight.

/*
<MatrixMultiplication.java. The program multiplies 2 matrices.>
    Copyright (C) <2016>  <Joko Adianto>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/


/**
 *
 * @author joko
 */
public class MatrixMultiplication {

    /**
     * @param p
     * @param w
     * @return double
     */
    public static double getSum( double[] p, double[][]w ){
        double o =0;
        int k = p.length;
        int j = 0;
        for (j=0;j<k;j++){
                    o=o+p[j]*w[j][0];                   
                }
        return o;
    }
   
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
                int j,k;
                double o=0;
                double[] p = {1,2,3};
                double[][] w = {{2}, {4}, {6}};
                o=getSum(p,w);
                   
                System.out.println(o);
       
    }
   
}

Pada contoh diatas p adalah array berdimesi 1 baris dan 3 kolom, sedangkan W adalah array berdimensi 3 baris dan 1 kolom. Jika dijalankan akan menampilkan sebuah skalar 28, jika ditambah dengan bias akan memberikan nilai 28.0 yang merupakan hasil perkalian matriks berbaris satu dan berkolom 3 dan matriks berbaris 3 tetapi berkolom 1.

Pada implementasi nantinya kita mungkin tidak menggunakan array-array seperti diatas, tetapi dapat menggunakan array 1 dimensi.Yang penting adalah pemahaman kita tentang penggunaan matriks untuk mengalikan sejumlah input dengan sejumlah weight, yang tentunya dimensinya harus cocok.

    Thursday, March 10, 2016

    Multiple Input Neuron

    Biasanya sebuah neuron memiliki masukan lebih dari satu. Masukannya terdiri dari banyak baris (row). Karena itu secara konsep masukkannya merupakan sebuah matrik baris berkolom 1. Sehingga bobotnya pun merupakan sebuah matrik kolom berbaris 1. Sehingga jika dikalikan hasilnya merupakan sebuah skalar (Ingat pelajaran matematika SMA).
    Jika W adalah matrik bobot, P merupakan matrik masukan, dan b merupakan bias, dan n merupakan hasil perkalian matriks tambah bias maka gambaran perkalian matriksnya adalah sebagai berikut : a=f(WP+b) .

    Yang menjadi perhatian dari persamaan diatas adalah :
    a=f(WP+b) sama dengan a=f(n) karena n=WP+b.

    Operasi  matrik tersebut dapat dilakukan secara programatis.  Yang pertama-tama dibahas adalah operasi n=WP+b. Operasi ini merupakan operasi perkalian matriks dan penjumlahan skalar.

    Operasi kedua adalah fungsi aktifasi atau fungsi transfer. Operasi
    a=f(n) merupakan operasi penggunaan fungsi-fungsi baik yang linear maupun non linear.

    Sebuah neuron dalam operasinya kurang lebih memiliki operasi sebagai berikut :
    • Baca masukan P yang terdiri dari beberapa baris (karena inputnya lebih dari satu.
    • Baca weight W yang jumlah anggotanya harus persis sama dengan jumlah anggota masukan P.
    • Bacalah bias b.
    • Kalikanlah matrik W dan matrik P lalu jumlahkan dengan bias b hasilnya disimpan sebagai hasil aritmatika n.
    • Selanjutnya n menjadi masukan bagi fungsi aktifasi atau fungsi transfer.
    • keluaran a bagi fungsi transfer menjadi masukan bagi neuron yang lain atau sebagai keluaran akhir.
    Untuk memahami arti fungsi aktifasi atau fungsi transfer bacalah bagian yang berhubungan dengannya.    


    Activation Function atau Transfer Function

    Didalam pembahasan mengenai Neuron Tunggal activation function akan menentukan besarnya keluaran a dari sebuah neuron. Activation function dapat berjenis linear maupun bukan linear.

    Activation Function Linear :
    1. Hard Limit
    2. Symmetrical Hard Limit
    3. Linear
    4. Saturating Linear
    5. Symmetric Saturating Linear
    6. Positive Linear
    7. Competitive.
    Activation Function Bukan Linear
    1. Log Sigmoid
    2. Hyperbolic Tangent Sigmoid

    Hard Limit
    Hard limit cara bekerjanya adalah sebagai berikut :
    • nilai keluaran a adalah 0 jika nilai n kurang dari 0,
    • nilai keluaran a adalah 1 jika nilai n lebih dari 1,
    Fungsi ini akan digunakan untuk melakukan klasifikasi biner atau klasifikasi kedalam 2 kategori yang berbeda, seperti laki-laki dan perempuan, diatas dan dibawah batas, dll

    Linear
    Linear cara bekerjanya adalah sebagai berikut :
    • keluaran a diberi nilai n. tanpa dilakukan operasi aritmatik apapun
    Neuron dengan fungsi aktivasi atau fungsi transfer ini digunakan didalam jaringan ADALINE.   

    Log-Sigmoid 
    Fungsi ini digunakan untuk implementasi pada jaringan syaraf yang terdiri dari banyak neuron dan memiliki lebih dari satu lapisan (multilayer). Cara bekerjanya adalah dengan menggunakan persamaan berikut :
    • a = i/(1 + e-n) 
    Pada persamaan diatas e nilai aproksimasinya adalah 2.71828

    Fungsi lainnya saya belum dapat membahasnya 


    Pendahuluan Artificial Neural Network : SIngle Neuron

    Pada dasarnya ANN adalah jaringan tiruan yang mengikuti cara bekerjanya jaringan syaraf biologis. Konsepnya adalah meniru cara bekerjanya jaringan syaraf biologis dan implementasinya secara elektronis dengan komputer.

    Gambar 1. Neuron didalam Cerebral Cortex 
    (Diambil dari https://commons.wikimedia.org/wiki/File:Smi32neuron.jpg)


    Sebelum kita membicarakan implementasinya,kita akan melihat dasar-dasar pemikiran dari ANN. Kita akan menggunakan skalar, vektor, dan matrik dalam penerapan ANN.

    Model dasarnya adalah syaraf atau neuron. Bahasan pertamanya adalah bagaimana arsitektur dari neuron.

    Neuron Tunggal dengan Input Tunggal
    Dalam bahasan ini kita memiliki sebuah sistem yang hanya terdiri dari sebuah neuron. Kita memiliki sebuah input, sebuah weight dan sebuah bias :
    1. Weight adalah pembobotan yang akan dikalikan dengan input.
    2. bias adalah pembobotan yang dijumlahkan dengan hasil perkaliah weight dengan input
    3. Hasil dari weight x input + bias akan menjadi masukan bagi actifation function.
    4. Weight merupakan muatan dari synapse.
    5. Bias merupakan konstanta yang ditambahkan kepada hasil perkalian weight dan input.
    6. Badan syaraf merupakan gabungan dari fungsi penjumlahan dan fungsi aktifasi.
    Jika :
    1. masukan disimbolkan dengan p
    2. bobot disimbolkan dengan w, dan 
    3. bias disimbolkan dengan b
    4. keluaran dari fungsi penjumlahan disimbolkan dengan n
    5. fungsi aktifasi disimbolkan dengan f, dan 
    6. keluaran akhir fungsi aktifasi  dengan a 
    maka gambaran arsitekturnya, adalah sebagai berikut :
    a = f(wp+b)
    Nilai a tergantung kepada fungsi aktifasi f yang digunakan.  Nilai w dan b akan berubah-ubah sesuai dengan aturan pembelajaran (learning rule) yang dilakukan oleh sistem.

    Fungsi aktifasi dapat bersifat linear atau bukan linear.  Selanjutnya kita akan membahas activation function atau disebut juga transfer function.

    Istilah Dalam ANN

    Istilah matematis
    1. Scalar : Adalah bilangan nyata atau sebuah besaran yang bisa diukur dengan bilangan nyata. Suhu, panjang, dan berat adalah contoh dari scallar. Diwakili oleh huruf kecil miring.
    2. Matrik :  Adalah susunan scalar dalam bentuk baris dan kolom, segi empat. Diwakili huruf besar.
    3. Vektor : Sebuah elemen didalam ruang vektor. Sebuah vektor memiliki besaran dan arah. Diwakili huruf kecil tebal.
    Istilah Neural Network
    1. Axon : Saluran keluaran dari badan cell syaraf
    2. Dendrite : Saluran untuk menerima masukan kedalam badan cell syaraf
    3. Synapse : Cabang dari Axon cell syaraf, yang berhubungan dengan banyak dendrite dari banyak cell syaraf lainnya.