ANN menggunakan package AMORE

Jaringan Syaraf Biologi

Otak manusia merupakan organ terpenting dan memiliki struktur yang sangat kompleks terdiri dari neuron-neuron serta penghubungnya yang disebut sinapsis. Neuron akan bekerja berdasarkan impuls atau sinyal yang diberikan padanya dan meneruskannya pada neuron lain.

Jaringan Syaraf Tiruan

Jaringan Syaraf Tiruan (JST) adalah sistem komputerisasi sebagai pemroses informasi yang memiliki karater mirip dengan jaringan syaraf biologi pada saat menangkap informasi dari ‘dunia luar’. Maksud sebenarnya dari JST adalah berusaha membuat sebuah model sistem komputasi informasi yang dapat menirukan rangkaian cara kerja jaringan syaraf biologis.

Alt text

Alt text

Jaringan Syaraf Tiruan ditentukan oleh 3 hal:

  1. Arsitektur jaringan, sebagai pola hubungan antar neuron.

  2. Algoritma, merupakan metode untuk menentukan bobot penghubung atau bisa juga disebut proses training/learning

  3. Fungsi aktivasi

Alt text

Alt text

Y menerima input dari neuron x1, x2 dan x3 dengan bobot hubungan adalah w1, w2 dan w3 secara berurutan. Ketiga impuls neuron yang ada dijumlahkan setelah setiap input dikalikan dengan bobotnya masing-masing.

           net = x1w1  + x2w2 + x3w3 

Sehingga besarnya impuls yang diterima oleh Y mengikuti fungsi aktivasi y = f(net). Jika nilai fungsi aktivasi ini cukup kuat, maka sinyal akan diteruskan. Nilai fungsi aktivasi sebagai output model jaringan ini nantinya juga dapat dipakai sebagai dasar untuk merubah bobot.

contoh, diberikan nilai input dan target seperti berikut,

Alt text

Alt text

Didalam R nilai input dan target kita buat dalam bentuk matriks dan dengan contoh menggunakan package AMORE

library(AMORE)

inputs <- matrix(0, 4, 2)
inputs[,1] <- c(-1, -1, 1, 1)
inputs[,2] <- c(-1, 1, -1, 1)
inputs
##      [,1] [,2]
## [1,]   -1   -1
## [2,]   -1    1
## [3,]    1   -1
## [4,]    1    1

dan targetnya,

target <- matrix(0, 4, 1)
target[,1] <- c(-1, 1, 1, -1)
target
##      [,1]
## [1,]   -1
## [2,]    1
## [3,]    1
## [4,]   -1

Dengan jaringan syaraf umpan maju akan dipersiapkan terlebih dahulu model jaringan yang akan digunakan, semisal diinginkan banyaknya neuron pada layar hidden adalah 3, beserta setiap argumen yang berhubungan dengan jaringan tersebut

net <- newff(n.neurons=c(2,3,1), learning.rate.global=0.1, 
momentum.global=0.5, error.criterium="LMS", Stao=NA,
hidden.layer="tansig", output.layer="tansig", method="ADAPTgdwm")

newff menyatakan fungsi untuk membuat jaringan syaraf umpan maju, n.neurons=c(2,3,1) adalah argumen untuk menyatakan jumlah neuron di layar input (2 buah), di layar tersembunyi ‘hidden’ (3 buah) serta di layar output atau target (1 buah), argumen learning.rate.global = 0.1 menyatakan tingkat pembelajaran yang digunakan pada setiap neuron, argumen momentum.global = 0.5 menyatakan momentum yang digunakan pada setiap neuron. Error.criterium adalah argumen yang digunakan untuk menghitung nilai kesalahan antara hasil keluaran pada layar output yang dibandingkan dengan targetnya. Kita dapat memilih dari ketiga metode dibawah ini : - LMS : Least Mean Squares atau kuadrat rata-rata terkecil. - LMLS : Least Mean Logarithm Squared atau kuadrat logaritma rata-rata terkecil - TAO : Error atau kesalahan TAO argumen Stao=NA, adalah parameter Stao untuk kriteria error TAO, jika argumen Error.criterium kita tidak memilih TAO error maka untuk argumen Stao kita letakkan pilihan NA (Not Available). Argumen hidden.layer dan output.layer adalah argumen yang diberikan pada jaringan untuk fungsi aktivasi yang akan digunakan pada masing-masing layar baik pada layar tersembunyi (hidden) ataupun pada layar output. Pilihannya adalah fungsi purelin, fungsi tansig, fungsi sigmoid, fungsi hardlim dan custom atau fungsi buatan kita sendiri. Terakhir adalah argumen method, digunakan sebagai metode training yang diinginkan, bisa berupa “ADAPTgd”, “ADAPTgdwm” yakni Adaptative gradient descend tanpa momentum dan dengan momentum, serta “BATCHgd” dengan “BATCHgdwm” yakni BATCH gradient descend dengan momentum atau tanpa momentum.

Dari perintah diatas, kita telah mempersiapkan sebuah jaringan untuk persoalan yang diajukan, jika ingin dilihat model jaringan yang telah kita buat, dapat kita panggil kembali jaringan “net” tersebut,

Ketika kita ketikkan ‘net’ maka akan memberikan hasil yang cukup panjang, bisa juga untuk mempermudah pembacaan hasil bisa menggunakan perintah ‘str(net)’

Setelah model jaringan “net” kita persiapkan beserta nilai-nilai dari setiap argumennya, kita akan melatih jaringan dengan nilai input dan target dari persoalan diatas, fungsi untuk melatih jaringan adalah “train” yang akan memodifikasi bobot dan bias agar jaringan dapat melakukan pengenalan pola terhadap nilai input dan output (target) yang diberikan,

result <- train(net, inputs, target, error.criterium="LMS",
report=TRUE, show.step=50, n.shows=5)
## index.show: 1 LMS 0.000127350760105951 
## index.show: 2 LMS 2.73739307924476e-09 
## index.show: 3 LMS 6.35950637924912e-14 
## index.show: 4 LMS 1.47797957669416e-18 
## index.show: 5 LMS 3.43463673474023e-23

Agar lebih mudah dipahami pembacaan hasil maka dapat kita gunakan perintah “str” berikut,

str(result)
## List of 2
##  $ net   :List of 7
##   ..$ layers        :List of 3
##   .. ..$ : int [1:2] -1 -2
##   .. ..$ : int [1:3] 1 2 3
##   .. ..$ : int 4
##   ..$ neurons       :List of 4
##   .. ..$ :List of 14
##   .. .. ..$ id                  : int 1
##   .. .. ..$ type                : chr "hidden"
##   .. .. ..$ activation.function : int 1
##   .. .. ..$ output.links        : int 4
##   .. .. ..$ output.aims         : int 1
##   .. .. ..$ input.links         : int [1:2] -1 -2
##   .. .. ..$ weights             : num [1:2] -1.54 -1.45
##   .. .. ..$ bias                : num -0.915
##   .. .. ..$ v0                  : num -1.7
##   .. .. ..$ v1                  : num 0.0247
##   .. .. ..$ f0                  :function (v)  
##   .. .. ..$ f1                  :function (v)  
##   .. .. ..$ method              : chr "ADAPTgdwm"
##   .. .. ..$ method.dep.variables:List of 5
##   .. .. .. ..$ delta               : num -2.32e-13
##   .. .. .. ..$ learning.rate       : num 0.1
##   .. .. .. ..$ momentum            : num 0.5
##   .. .. .. ..$ former.weight.change: num [1:2] -6.61e-14 4.71e-14
##   .. .. .. ..$ former.bias.change  : num 0
##   .. .. ..- attr(*, "class")= chr "neuron"
##   .. ..$ :List of 14
##   .. .. ..$ id                  : int 2
##   .. .. ..$ type                : chr "hidden"
##   .. .. ..$ activation.function : int 1
##   .. .. ..$ output.links        : int 4
##   .. .. ..$ output.aims         : int 2
##   .. .. ..$ input.links         : int [1:2] -1 -2
##   .. .. ..$ weights             : num [1:2] -1.5 -1.49
##   .. .. ..$ bias                : num 0.817
##   .. .. ..$ v0                  : num -1.54
##   .. .. ..$ v1                  : num 0.226
##   .. .. ..$ f0                  :function (v)  
##   .. .. ..$ f1                  :function (v)  
##   .. .. ..$ method              : chr "ADAPTgdwm"
##   .. .. ..$ method.dep.variables:List of 5
##   .. .. .. ..$ delta               : num 2.05e-12
##   .. .. .. ..$ learning.rate       : num 0.1
##   .. .. .. ..$ momentum            : num 0.5
##   .. .. .. ..$ former.weight.change: num [1:2] -1.44e-13 -2.89e-13
##   .. .. .. ..$ former.bias.change  : num 0
##   .. .. ..- attr(*, "class")= chr "neuron"
##   .. ..$ :List of 14
##   .. .. ..$ id                  : int 3
##   .. .. ..$ type                : chr "hidden"
##   .. .. ..$ activation.function : int 1
##   .. .. ..$ output.links        : int 4
##   .. .. ..$ output.aims         : int 3
##   .. .. ..$ input.links         : int [1:2] -1 -2
##   .. .. ..$ weights             : num [1:2] 0.874 -0.233
##   .. .. ..$ bias                : num 0.046
##   .. .. ..$ v0                  : num 0.735
##   .. .. ..$ v1                  : num 0.934
##   .. .. ..$ f0                  :function (v)  
##   .. .. ..$ f1                  :function (v)  
##   .. .. ..$ method              : chr "ADAPTgdwm"
##   .. .. ..$ method.dep.variables:List of 5
##   .. .. .. ..$ delta               : num -4.54e-13
##   .. .. .. ..$ learning.rate       : num 0.1
##   .. .. .. ..$ momentum            : num 0.5
##   .. .. .. ..$ former.weight.change: num [1:2] 3.92e-14 4.46e-14
##   .. .. .. ..$ former.bias.change  : num 0
##   .. .. ..- attr(*, "class")= chr "neuron"
##   .. ..$ :List of 14
##   .. .. ..$ id                  : int 4
##   .. .. ..$ type                : chr "output"
##   .. .. ..$ activation.function : int 1
##   .. .. ..$ output.links        : int NA
##   .. .. ..$ output.aims         : int 1
##   .. .. ..$ input.links         : int [1:3] 1 2 3
##   .. .. ..$ weights             : num [1:3] -1.2569 1.2205 -0.0653
##   .. .. ..$ bias                : num -1.21
##   .. .. ..$ v0                  : num -1
##   .. .. ..$ v1                  : num 0.755
##   .. .. ..$ f0                  :function (v)  
##   .. .. ..$ f1                  :function (v)  
##   .. .. ..$ method              : chr "ADAPTgdwm"
##   .. .. ..$ method.dep.variables:List of 5
##   .. .. .. ..$ delta               : num 7.45e-12
##   .. .. .. ..$ learning.rate       : num 0.1
##   .. .. .. ..$ momentum            : num 0.5
##   .. .. .. ..$ former.weight.change: num [1:3] 1.02e-12 1.20e-12 -4.41e-13
##   .. .. .. ..$ former.bias.change  : num 0
##   .. .. ..- attr(*, "class")= chr "neuron"
##   ..$ input         : num [1:2] 0 0
##   ..$ output        : num 0
##   ..$ target        : num 0
##   ..$ deltaE        :List of 3
##   .. ..$ fname: int 1
##   .. ..$ f    :function (arguments)  
##   .. ..$ Stao : num NA
##   ..$ other.elements:List of 1
##   .. ..$ Stao: logi NA
##   ..- attr(*, "class")= chr "MLPnet"
##  $ Merror: num [1:5, 1] 1.27e-04 2.74e-09 6.36e-14 1.48e-18 3.43e-23

Jaringan telah dilatih untuk mengenali pola, kemudian akan dicoba untuk mengenali pola input lagi dengan menggunakan fungsi “sim”,

y <- sim(result$net, inputs) 

y
##      [,1]
## [1,]   -1
## [2,]    1
## [3,]    1
## [4,]   -1

Didapatkan untuk input yang diberikan ternyata jaringan telah memberikan nilai target yang sesuai dengan target yang sebenarnya, kemudian dicoba agar jaringan dapat mengenali pola untuk nilai input yang berbeda,

Alt text

Alt text

input2 <- matrix(0, 4, 2)
input2[,1] <- c(-1, -1, 1, 1)
input2[,2] <- c(-1, -1, -1, 1)
input2
##      [,1] [,2]
## [1,]   -1   -1
## [2,]   -1   -1
## [3,]    1   -1
## [4,]    1    1
y2<-sim(result$net,input2)

y2
##      [,1]
## [1,]   -1
## [2,]   -1
## [3,]    1
## [4,]   -1

sehingga hasilnya dapat kita masukkan ke dalam tabel berikut,

Alt text

Alt text

semoga bermanfaat,

salam,

RB Fajriya Hakim

email : hakimf@uii.ac.id

Department of Statistika Universitas Islam Indonesia