Back Propagation
Keterbatasan Jaringan Syaraf Tiruan ketika hanya menggunakan layar tunggal dalam mengenali pola merupakan satu kekurangan dari jaringan dengan arsitektur tersebut. Kekurangan ini kemudian bisa ditanggulangi dengan menambahkan lagi beberapa layar tersembunyi diantara layar input dan output. Penambahan satu atau lebih layar tersembunyi membuat jaringan memiliki kemampuan untuk menyesuaikan bobot-bobot namun menyebabkan pelatihannya memerlukan waktu yang lebih lama. Maka sebaiknya mencoba dengan mengawali menambahkan satu layar tersembunyi lebih dahulu.
Backpropagation merupakan algoritma pembelajaran terawasi atau yang memiliki target dengan mengubah dan menyesuaikan nilai pada bobot-bobot yang terhubung dengan neuron-neuron yang ada pada lapisan tersembunyinya. Algoritma backpropagation melakukan perambatan maju (feed forward propagation) seperti pada perceptron terlebih dahulu, neuron-neuron diaktifkan dengan menggunakan fungsi aktivasi yang bisa dideferensiasikan, sehingga kemudian didapatkan error atau selisih antara nilai setelah diaktivasi atau output dengan target dan kemudian menggunakan error output ini untuk mengubah nilai bobot-bobotnya dalam arah mundur (backward propagation).
Alt text
Kita akan menggunakan contoh pada “example” dalam paket nnet
library(nnet)
ir <- rbind(iris3[,,1],iris3[,,2],iris3[,,3])
targets <- class.ind( c(rep(“s”, 50), rep(“c”, 50), rep(“v”, 50)) )
samp <- c(sample(1:50,25), sample(51:100,25), sample(101:150,25))
ir1 <- nnet(ir[samp,], targets[samp,], size = 2, rang = 0.1,
decay = 5e-4, maxit = 200)test.cl <- function(true, pred) {
true <- max.col(true)
cres <- max.col(pred)
table(true, cres)
}
test.cl(targets[-samp,], predict(ir1, ir[-samp,]))
kemudian dapat kita bahas skrip diatas perbaris, di dalam R ada beberapa dataset yang sudah menjadi bawaannya, contohnya bunga iris, didalam R terdapat dua jenis data bunga iris. yang pertama adalah ‘iris’ saja dan yang berikutnya ‘iris3’. Data pada ‘iris’ tersusun perbaris dengan 5 variabel, sedangkan pada data ‘iris3’ tersusun sesuai kelompok Spesiesnya.
library(nnet)
data(iris)
head(iris)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
data(iris3)
iris3
## , , Setosa
##
## Sepal L. Sepal W. Petal L. Petal W.
## [1,] 5.1 3.5 1.4 0.2
## [2,] 4.9 3.0 1.4 0.2
## [3,] 4.7 3.2 1.3 0.2
## [4,] 4.6 3.1 1.5 0.2
## [5,] 5.0 3.6 1.4 0.2
## [6,] 5.4 3.9 1.7 0.4
## [7,] 4.6 3.4 1.4 0.3
## [8,] 5.0 3.4 1.5 0.2
## [9,] 4.4 2.9 1.4 0.2
## [10,] 4.9 3.1 1.5 0.1
## [11,] 5.4 3.7 1.5 0.2
## [12,] 4.8 3.4 1.6 0.2
## [13,] 4.8 3.0 1.4 0.1
## [14,] 4.3 3.0 1.1 0.1
## [15,] 5.8 4.0 1.2 0.2
## [16,] 5.7 4.4 1.5 0.4
## [17,] 5.4 3.9 1.3 0.4
## [18,] 5.1 3.5 1.4 0.3
## [19,] 5.7 3.8 1.7 0.3
## [20,] 5.1 3.8 1.5 0.3
## [21,] 5.4 3.4 1.7 0.2
## [22,] 5.1 3.7 1.5 0.4
## [23,] 4.6 3.6 1.0 0.2
## [24,] 5.1 3.3 1.7 0.5
## [25,] 4.8 3.4 1.9 0.2
## [26,] 5.0 3.0 1.6 0.2
## [27,] 5.0 3.4 1.6 0.4
## [28,] 5.2 3.5 1.5 0.2
## [29,] 5.2 3.4 1.4 0.2
## [30,] 4.7 3.2 1.6 0.2
## [31,] 4.8 3.1 1.6 0.2
## [32,] 5.4 3.4 1.5 0.4
## [33,] 5.2 4.1 1.5 0.1
## [34,] 5.5 4.2 1.4 0.2
## [35,] 4.9 3.1 1.5 0.2
## [36,] 5.0 3.2 1.2 0.2
## [37,] 5.5 3.5 1.3 0.2
## [38,] 4.9 3.6 1.4 0.1
## [39,] 4.4 3.0 1.3 0.2
## [40,] 5.1 3.4 1.5 0.2
## [41,] 5.0 3.5 1.3 0.3
## [42,] 4.5 2.3 1.3 0.3
## [43,] 4.4 3.2 1.3 0.2
## [44,] 5.0 3.5 1.6 0.6
## [45,] 5.1 3.8 1.9 0.4
## [46,] 4.8 3.0 1.4 0.3
## [47,] 5.1 3.8 1.6 0.2
## [48,] 4.6 3.2 1.4 0.2
## [49,] 5.3 3.7 1.5 0.2
## [50,] 5.0 3.3 1.4 0.2
##
## , , Versicolor
##
## Sepal L. Sepal W. Petal L. Petal W.
## [1,] 7.0 3.2 4.7 1.4
## [2,] 6.4 3.2 4.5 1.5
## [3,] 6.9 3.1 4.9 1.5
## [4,] 5.5 2.3 4.0 1.3
## [5,] 6.5 2.8 4.6 1.5
## [6,] 5.7 2.8 4.5 1.3
## [7,] 6.3 3.3 4.7 1.6
## [8,] 4.9 2.4 3.3 1.0
## [9,] 6.6 2.9 4.6 1.3
## [10,] 5.2 2.7 3.9 1.4
## [11,] 5.0 2.0 3.5 1.0
## [12,] 5.9 3.0 4.2 1.5
## [13,] 6.0 2.2 4.0 1.0
## [14,] 6.1 2.9 4.7 1.4
## [15,] 5.6 2.9 3.6 1.3
## [16,] 6.7 3.1 4.4 1.4
## [17,] 5.6 3.0 4.5 1.5
## [18,] 5.8 2.7 4.1 1.0
## [19,] 6.2 2.2 4.5 1.5
## [20,] 5.6 2.5 3.9 1.1
## [21,] 5.9 3.2 4.8 1.8
## [22,] 6.1 2.8 4.0 1.3
## [23,] 6.3 2.5 4.9 1.5
## [24,] 6.1 2.8 4.7 1.2
## [25,] 6.4 2.9 4.3 1.3
## [26,] 6.6 3.0 4.4 1.4
## [27,] 6.8 2.8 4.8 1.4
## [28,] 6.7 3.0 5.0 1.7
## [29,] 6.0 2.9 4.5 1.5
## [30,] 5.7 2.6 3.5 1.0
## [31,] 5.5 2.4 3.8 1.1
## [32,] 5.5 2.4 3.7 1.0
## [33,] 5.8 2.7 3.9 1.2
## [34,] 6.0 2.7 5.1 1.6
## [35,] 5.4 3.0 4.5 1.5
## [36,] 6.0 3.4 4.5 1.6
## [37,] 6.7 3.1 4.7 1.5
## [38,] 6.3 2.3 4.4 1.3
## [39,] 5.6 3.0 4.1 1.3
## [40,] 5.5 2.5 4.0 1.3
## [41,] 5.5 2.6 4.4 1.2
## [42,] 6.1 3.0 4.6 1.4
## [43,] 5.8 2.6 4.0 1.2
## [44,] 5.0 2.3 3.3 1.0
## [45,] 5.6 2.7 4.2 1.3
## [46,] 5.7 3.0 4.2 1.2
## [47,] 5.7 2.9 4.2 1.3
## [48,] 6.2 2.9 4.3 1.3
## [49,] 5.1 2.5 3.0 1.1
## [50,] 5.7 2.8 4.1 1.3
##
## , , Virginica
##
## Sepal L. Sepal W. Petal L. Petal W.
## [1,] 6.3 3.3 6.0 2.5
## [2,] 5.8 2.7 5.1 1.9
## [3,] 7.1 3.0 5.9 2.1
## [4,] 6.3 2.9 5.6 1.8
## [5,] 6.5 3.0 5.8 2.2
## [6,] 7.6 3.0 6.6 2.1
## [7,] 4.9 2.5 4.5 1.7
## [8,] 7.3 2.9 6.3 1.8
## [9,] 6.7 2.5 5.8 1.8
## [10,] 7.2 3.6 6.1 2.5
## [11,] 6.5 3.2 5.1 2.0
## [12,] 6.4 2.7 5.3 1.9
## [13,] 6.8 3.0 5.5 2.1
## [14,] 5.7 2.5 5.0 2.0
## [15,] 5.8 2.8 5.1 2.4
## [16,] 6.4 3.2 5.3 2.3
## [17,] 6.5 3.0 5.5 1.8
## [18,] 7.7 3.8 6.7 2.2
## [19,] 7.7 2.6 6.9 2.3
## [20,] 6.0 2.2 5.0 1.5
## [21,] 6.9 3.2 5.7 2.3
## [22,] 5.6 2.8 4.9 2.0
## [23,] 7.7 2.8 6.7 2.0
## [24,] 6.3 2.7 4.9 1.8
## [25,] 6.7 3.3 5.7 2.1
## [26,] 7.2 3.2 6.0 1.8
## [27,] 6.2 2.8 4.8 1.8
## [28,] 6.1 3.0 4.9 1.8
## [29,] 6.4 2.8 5.6 2.1
## [30,] 7.2 3.0 5.8 1.6
## [31,] 7.4 2.8 6.1 1.9
## [32,] 7.9 3.8 6.4 2.0
## [33,] 6.4 2.8 5.6 2.2
## [34,] 6.3 2.8 5.1 1.5
## [35,] 6.1 2.6 5.6 1.4
## [36,] 7.7 3.0 6.1 2.3
## [37,] 6.3 3.4 5.6 2.4
## [38,] 6.4 3.1 5.5 1.8
## [39,] 6.0 3.0 4.8 1.8
## [40,] 6.9 3.1 5.4 2.1
## [41,] 6.7 3.1 5.6 2.4
## [42,] 6.9 3.1 5.1 2.3
## [43,] 5.8 2.7 5.1 1.9
## [44,] 6.8 3.2 5.9 2.3
## [45,] 6.7 3.3 5.7 2.5
## [46,] 6.7 3.0 5.2 2.3
## [47,] 6.3 2.5 5.0 1.9
## [48,] 6.5 3.0 5.2 2.0
## [49,] 6.2 3.4 5.4 2.3
## [50,] 5.9 3.0 5.1 1.8
sehingga nampak perbedaan susunan pada data ‘iris’ dan ‘iris3’
kemudian pada contoh kali ini digunakan gabungan (rbind) dari data iris3[,,1], iris3[,,2] dan iris3[,,3] yang berarti menggabungkan semua data iris dalam barisan yang terurut dengan tidak menyertakan ‘spesiesnya’. Gabungan data tersebut sebanyak 150 baris dengan empat variabel diberi nama baru yakni ‘ir’.
head(iris3[,,1])
## Sepal L. Sepal W. Petal L. Petal W.
## [1,] 5.1 3.5 1.4 0.2
## [2,] 4.9 3.0 1.4 0.2
## [3,] 4.7 3.2 1.3 0.2
## [4,] 4.6 3.1 1.5 0.2
## [5,] 5.0 3.6 1.4 0.2
## [6,] 5.4 3.9 1.7 0.4
ir <- rbind(iris3[,,1],iris3[,,2],iris3[,,3])
head(ir)
## Sepal L. Sepal W. Petal L. Petal W.
## [1,] 5.1 3.5 1.4 0.2
## [2,] 4.9 3.0 1.4 0.2
## [3,] 4.7 3.2 1.3 0.2
## [4,] 4.6 3.1 1.5 0.2
## [5,] 5.0 3.6 1.4 0.2
## [6,] 5.4 3.9 1.7 0.4
tail(ir)
## Sepal L. Sepal W. Petal L. Petal W.
## [145,] 6.7 3.3 5.7 2.5
## [146,] 6.7 3.0 5.2 2.3
## [147,] 6.3 2.5 5.0 1.9
## [148,] 6.5 3.0 5.2 2.0
## [149,] 6.2 3.4 5.4 2.3
## [150,] 5.9 3.0 5.1 1.8
data ‘ir’ tersebut dianggap sebagai 4 node input dalam jaringan. Kemudian kita susun data target sebagai node outputnya.
targets <- class.ind( c(rep("s", 50), rep("c", 50), rep("v", 50)) )
target disini disusun dengan huruf s sebanyak 50 baris, huruf c sebanyak 50 baris dan huruf v sebanyak 50 baris, masing-masing mewakili spesiesnya. Jadi node ouputnya sebanyak 3 node dengan masing-masing node mewakili huruf s, c, dan v.
head(targets)
## c s v
## [1,] 0 1 0
## [2,] 0 1 0
## [3,] 0 1 0
## [4,] 0 1 0
## [5,] 0 1 0
## [6,] 0 1 0
tail(targets)
## c s v
## [145,] 0 0 1
## [146,] 0 0 1
## [147,] 0 0 1
## [148,] 0 0 1
## [149,] 0 0 1
## [150,] 0 0 1
kemudian dalam neural network dipergunakan konsep ‘data latih’ dan ‘data uji’ artinya sebagian data asli digunakan unuk melatih jaringan agar dapat mengenali pola dan sebagian lagi digunakan sebagai data uji dari jaringan yang telah dilatih tersebut. Jumlah data yang digunakan untuk latih dan uji berbeda-beda, ada beberapa yang menggunakan konsep 80% data digunakan untuk latih dan 20% nya digunakan untuk data uji. Dalam contoh kali ini akan digunakan 50% data latih dan 50% data uji.
samp <- c(sample(1:50,25), sample(51:100,25), sample(101:150,25))
Contoh perintah pada ‘sample(1:50,25)’ adalah memilih sebanyak 25 data secara acak dari data nomor urut 1 sampai 50.
sample(1:50,25)
## [1] 39 13 43 20 34 18 28 41 49 22 37 23 47 36 46 3 4 35 44 45 8 19 11
## [24] 7 25
tentunya hasilnya akan berbeda-beda karena sistem melakukan pengambilan secara acak. Sehingga total akan didapatkan data sebanyak 75 dari masing-masing spesies. Data tersebut diberi nama ‘samp’.
Dengan data latih dan targetnya sebanyak 75 baris, maka kemudian kita bisa melatih jaringan untuk mengenali pola setiap spesies dengan menggunakan library(nnet) dengan perintah ‘nnet’ dan menyimpannya dengan nama ‘ir1’.
ir1 <- nnet(ir[samp,], targets[samp,], size = 2, rang = 0.1,
decay = 5e-4, maxit = 200)
## # weights: 19
## initial value 55.733820
## iter 10 value 48.497468
## iter 20 value 28.857696
## iter 30 value 26.236688
## iter 40 value 26.207610
## iter 50 value 26.162149
## iter 60 value 26.103700
## iter 70 value 21.617969
## iter 80 value 17.460119
## iter 90 value 17.337671
## iter 100 value 2.884610
## iter 110 value 1.496395
## iter 120 value 1.217720
## iter 130 value 0.878850
## iter 140 value 0.644271
## iter 150 value 0.570435
## iter 160 value 0.488337
## iter 170 value 0.459668
## iter 180 value 0.455806
## iter 190 value 0.452383
## iter 200 value 0.451526
## final value 0.451526
## stopped after 200 iterations
jika kita ingin melihat hasil dari perintah ‘nnet’ maka kita bisa ketikkan ‘ir1’
ir1
## a 4-2-3 network with 19 weights
## options were - decay=5e-04
str(ir1)
## List of 15
## $ n : num [1:3] 4 2 3
## $ nunits : int 10
## $ nconn : num [1:11] 0 0 0 0 0 0 5 10 13 16 ...
## $ conn : num [1:19] 0 1 2 3 4 0 1 2 3 4 ...
## $ nsunits : int 10
## $ decay : num 5e-04
## $ entropy : logi FALSE
## $ softmax : logi FALSE
## $ censored : logi FALSE
## $ value : num 0.452
## $ wts : num [1:19] -0.479 -2.792 -9.272 5.292 11.238 ...
## $ convergence : int 1
## $ fitted.values: num [1:75, 1:3] 0.0139 0.0147 0.0149 0.0135 0.0149 ...
## ..- attr(*, "dimnames")=List of 2
## .. ..$ : NULL
## .. ..$ : chr [1:3] "c" "s" "v"
## $ residuals : num [1:75, 1:3] -0.0139 -0.0147 -0.0149 -0.0135 -0.0149 ...
## ..- attr(*, "dimnames")=List of 2
## .. ..$ : NULL
## .. ..$ : chr [1:3] "c" "s" "v"
## $ call : language nnet.default(x = ir[samp, ], y = targets[samp, ], size = 2, rang = 0.1, decay = 5e-04, maxit = 200)
## - attr(*, "class")= chr "nnet"
kemudian kita ingin melihat hasil prediksi antara data asli dengan sisa dari data latih atau data uji yang ingin kita prediksikan dengan membuat sebuah fungsi yang memberikan hasil berupa tabel antara data asli dengan hasil prediksi
test.cl <- function(true, pred) {
true <- max.col(true)
cres <- max.col(pred)
table(true, cres)
}
kemudian sisa data latih (samp) dipakai sebagai data uji atau prediksi yakni (-samp)
test.cl(targets[-samp,], predict(ir1, ir[-samp,]))
## cres
## true 1 2 3
## 1 22 0 3
## 2 0 25 0
## 3 2 0 23
dari hasil tabel ini sangat mempermudah kita dalam mengambil keputusan, bahwa jaringan dapat mengenali pola atau prediksi data baru yang dimasukkan. Kesalahan klasifikasi dapat juga dilihat sebesar 5 data yang salah dalam penempatan dibagi dengan jumlah total observasi yakni 75 (=5/75 * 100% = 66.7%)
salam,
R. Bagus Fajriya Hakim email : hakimf@uii.ac.id
Department of Statistics Universias Islam Indonesia