Algoritma RProp (Resilient Back-Propagation) 2


Algoritma RProp (Resilient Back-Propagation) adalah salah satu algoritma berbasis jaringan saraf yang dapat digunakan untuk pengambilan keputusan. Contoh yang dibahas kali ini adalah mengenai penentuan penerimaan pengajuan kredit sepeda motor baru berdasarkan kelompok data yang sudah ada.
Algoritma ini merupakan pengembangan lebih lanjut dari Algoritma Back-Propagation. Algoritma ini memiliki beberapa keuntungan dibandingkan algoritma pendahulunya. Pertama, proses perhitungan yang lebih cepat. Kedua, tidak memerlukan parameter apapun dalam perhitungannya, karena algoritma pendahulunya memerlukan 2 parameter, yaitu rasio pembelajaran, dan momentum. Kerugian algoritma ini ada 1, yaitu implementasinya yang cukup rumit.



Diasumsikan ada 8 data pelanggan yang sudah diketahui datanya, yaitu Pelanggan A,B,C,D,E,F,G,H
Masing-masing pelanggan memiliki kriteria, yaitu umur, jenis kelamin, skor kepribadian, dan memiliki nilai hasil yaitu Diterima / Ditolak
Diasumsikan 8 data tersebut adalah sebagai berikut:

PelangganUmurJenis KelaminSkor KepribadianHasil
Pelanggan A44Laki-laki3.55Diterima
Pelanggan B52Perempuan4.71Diterima
Pelanggan C60Perempuan6.56Ditolak
Pelanggan D56Laki-laki6.8Ditolak
Pelanggan E51Laki-laki6.94Ditolak
Pelanggan F46Perempuan6.52Ditolak
Pelanggan G48Laki-laki4.25Diterima
Pelanggan H58Perempuan5.71Diterima

Contoh data pelanggan awal adalah sebagai berikut:
Untuk Kriteria Jenis Kelamin:
Laki-laki dilambangkan dengan angka -1
Perempuan dilambangkan dengan angka +1
Untuk kriteria Nilai Hasil:
Terdapat 2 kolom untuk merepresentasikan kondisi Diterima dan Ditolak
Jika kondisi Diterima, maka inputan data kolom adalah 1, 0
Jika kondisi Ditolak, maka inputan data kolom adalah 0, 1

Dim data(9)() As Double
data(0) = New Double() {44, -1, 3.55, 1, 0}
data(1) = New Double() {52, +1, 4.71, 1, 0}
data(2) = New Double() {60, +1, 6.56, 0, 1}
data(3) = New Double() {56, -1, 6.8, 0, 1}
data(4) = New Double() {51, -1, 6.94, 0, 1}
data(5) = New Double() {46, +1, 6.52, 0, 1}
data(6) = New Double() {48, -1, 4.25, 1, 0}
data(7) = New Double() {58, +1, 5.71, 1, 0}



Selanjutnya ada 2 orang pelanggan baru yang mengajukan kredit sepeda motor
Maka tentukan pelanggan ini nantinya akan termasuk dalam kelompok Diterima / Ditolak
Diasumsikan data awalnya adalah sebagai berikut:

Pelanggan I47Perempuan6.05
Pelanggan J52Laki-Laki5

Contoh data pelanggan baru adalah sebagai berikut:
Untuk kriteria Nilai Hasil:
Terdapat 2 kolom untuk merepresentasikan kondisi Diterima dan Ditolak
Karena belum diketahui nilai hasilnya, maka semua inputan data adalah -1, -1

data(8) = New Double() {47, +1, 6.05, -1, -1}
data(9) = New Double() {52, -1, 5, -1, -1}

Langkah-langkah penggunaan algoritma ini adalah

1. Lakukan normalisasi data untuk kriteria Umur dan Skor Kepribadian
Penjelasan lebih lanjut dapat dilihat pada penjelasan skrip dibawah ini (poin 1a – 1c)

1a. Hitung nilai rata-rata tiap-tiap kolom
yaitu dengan rumus: jumlah semua data dibagi dengan jumlah datanya

Dim total As Double = 0.0
For r = 0 To jumlahBaris - 1
	total += data(r)(c)
Next r
Dim rata2 As Double = total / jumlahBaris
hasil(0)(c) = rata2

1b. Hitung nilai standar deviasi tiap-tiap kolom
yaitu dengan rumus: akar dari ((kuadrat dari (jumlah dari (data – rata-rata))) / jumlah data)

Dim totalKuadrat As Double = 0.0
For r = 0 To jumlahBaris - 1
	totalKuadrat += (data(r)(c) - rata2) * (data(r)(c) - rata2)
Next r
Dim stdDev As Double = Math.Sqrt(totalKuadrat / jumlahBaris)
hasil(1)(c) = stdDev

1c. Normalisasi data dihitung dengan rumus (data – (rata-rata kriteria tersebut)) / standar deviasi kriteria tersebut

For c = 0 To kolom.Length - 1
	Dim j As Integer = kolom(c)
	Dim rata2 As Double = hasil(0)(j)
	Dim stdDev As Double = hasil(1)(j)

	For i = 0 To jumlahBaris - 1
		data(i)(j) = (data(i)(j) - rata2) / stdDev
	Next i
Next c

2. Tentukan skema awal untuk algoritma ini.
Algoritma ini dapat digunakan untuk melakukan perhitungan yang memiliki banyak input dan menghasilkan banyak output
Diasumsikan dalam kasus ini, skema yang digunakan adalah 3 – 4 – 2, dimana:

  • 3 adalah jumlah saraf input, karena ada 3 kriteria awal, yaitu Umur, Jenis Kelamin, dan Skor Kepribadian
  • 4 adalah jumlah saraf tersembunyi yang digunakan. Jumlah saraf tersembunyi harus lebih dari jumlah saraf input

dalam kasus ini bisa lebih dari 4, tetapi hanya digunakan 4 saja untuk mempercepat perhitungan

  • 2 adalah jumlah saraf output, Karena kriteria nilai hasil bergantung pada nilai 2 kolom, yaitu 1,0 jika diterima dan 0,1 jika ditolak
Const jumlahSarafInput As Integer = 3
Const jumlahSarafTersembunyi As Integer = 4
Const jumlahSarafOutput As Integer = 2
Dim jst As New JaringanSaraf(jumlahSarafInput, jumlahSarafTersembunyi, jumlahSarafOutput)

* Diperlukan sebuah class untuk menyimpan semua matriks data untuk digunakan dalam perhitungan algoritma ini. Class ini dinamakan class JaringanSaraf. Deklarasi awal untuk setiap pengisian data adalah sebagai berikut

Public Class JaringanSaraf
    Private rnd As Random

    Private jumlahSarafInput As Integer
    Private jumlahSarafTersembunyi As Integer
    Private jumlahSarafOutput As Integer

    Private inputs As Double()

    'Matriks data untuk perhitungan jaringan saraf input-tersembunyi
    Private ihBobot As Double()()                   'Nilai bobot pada jaringan saraf input-tersembunyi
    Private hBias As Double()                       'Nilai bias pada jaringan saraf tersembunyi
    Private hOutput As Double()                     'Nilai output sementara pada jaringan saraf tersembunyi

    'Matriks data untuk perhitungan jaringan saraf tersembunyi-output
    Private hoBobot As Double()()                   'Nilai bobot pada jaringan tersembunyi-output
    Private oBias As Double()                       'Nilai bias pada jaringan saraf output

    Private outputs As Double()

    Public Sub New(jumlahSarafInput As Integer, jumlahSarafTersembunyi As Integer, jumlahSarafOutput As Integer)
        rnd = New Random(0)
        Me.jumlahSarafInput = jumlahSarafInput
        Me.jumlahSarafTersembunyi = jumlahSarafTersembunyi
        Me.jumlahSarafOutput = jumlahSarafOutput

        Me.inputs = New Double(jumlahSarafInput - 1) {}

        Dim ihBobot As Double()() = New Double(jumlahSarafInput - 1)() {}
        For r As Integer = 0 To ihBobot.Length - 1
            ihBobot(r) = New Double(jumlahSarafTersembunyi - 1) {}
        Next
        Me.ihBobot = ihBobot
        Me.hBias = New Double(jumlahSarafTersembunyi - 1) {}
        Me.hOutput = New Double(jumlahSarafTersembunyi - 1) {}

        Dim hoBobot As Double()() = New Double(jumlahSarafTersembunyi - 1)() {}
        For r As Integer = 0 To hoBobot.Length - 1
            hoBobot(r) = New Double(jumlahSarafOutput - 1) {}
        Next
        Me.hoBobot = hoBobot
        Me.oBias = New Double(jumlahSarafOutput - 1) {}

        Me.outputs = New Double(jumlahSarafOutput - 1) {}
    End Sub
	
	. . .
End Class

* Setelah melakukan inisialisasi diatas, maka akan dilakukan inisialisasi matriks bobot dan bias yang digunakan

  • jumlah nilai bobot pada jaringan saraf input-tersembunyi adalah jumlah saraf input * jumlah saraf tersembunyi (3 * 4 = 12 buah)
  • jumlah nilai bias pada jaringan saraf input-tersembunyi adalah jumlah saraf tersembunyi (4 buah)
  • jumlah nilai bobot pada jaringan saraf tersembunyi-output adalah jumlah saraf tersembunyi * jumlah saraf output (4 * 2 = 8 buah)
  • jumlah nilai bias pada jaringan saraf tersembunyi-output adalah jumlah saraf output (2 buah)

Sehingga, jumlah bobot yang diperlukan adalah 12 + 4 + 8 + 2 = 26 buah data
Kemudian pada masing-masing bobot, beri nilai awal dengan nilai acak yang sangat kecil (antara 0.001 sampai dengan 0.0001)

Dim jumlahBobot As Integer = (jumlahSarafInput * jumlahSarafTersembunyi) + (jumlahSarafTersembunyi * jumlahSarafOutput) + jumlahSarafTersembunyi + jumlahSarafOutput
Dim bobot As Double() = New Double(jumlahBobot - 1) {}
Dim lo As Double = 0.0001
Dim hi As Double = 0.001
For i As Integer = 0 To bobot.Length - 1
	bobot(i) = (hi - lo) * rnd.NextDouble() + lo
Next
Me.setBobot(bobot)

* Gunakan fungsi ini untuk memasukkan matriks bobot awal kedalam 4 matriks data yaitu matriks ihBobot, hBias, hoBobot, oBias
ihBobot adalah matriks bobot pada jaringan saraf input-tersembunyi, dengan jumlah data = jumlah saraf input * jumlah saraf tersembunyi (3 * 4 = 12 buah)
hBias adalah matriks nilai bias pada jaringan saraf input-tersembunyi, dengan jumlah data = jumlah saraf tersembunyi (4 buah)
hoBobot adalah matriks bobot pada jaringan saraf tersembunyi-output, dengan jumlah data = jumlah saraf tersembunyi * jumlah saraf output (4 * 2 = 8 buah)
oBias adalah matriks nilai bias pada jaringan saraf tersembunyi-output, dengan jumlah data = jumlah saraf output (2 buah)

Public Sub setBobot(bobot As Double())
	If bobot.Length <> jumlahBobot Then
		Throw New Exception("Pada fungsi SetBobotAwal, panjang matriks bobot: " & bobot.Length & " tidak sama dengan jumlah bobot yang seharusnya, yaitu " & jumlahBobot)
	End If

	Dim k As Integer = 0
	For i As Integer = 0 To jumlahSarafInput - 1
		For j As Integer = 0 To jumlahSarafTersembunyi - 1
			ihBobot(i)(j) = bobot(k)
			k += 1
		Next
	Next
	For i As Integer = 0 To jumlahSarafTersembunyi - 1
		hBias(i) = bobot(k)
		k += 1
	Next
	For i As Integer = 0 To jumlahSarafTersembunyi - 1
		For j As Integer = 0 To jumlahSarafOutput - 1
			hoBobot(i)(j) = bobot(k)
			k += 1
		Next
	Next
	For i As Integer = 0 To jumlahSarafOutput - 1
		oBias(i) = bobot(k)
		k += 1
	Next
End Sub

3. Tentukan parameter-parameter yang digunakan dalam perhitungan

3a. Tentukan jumlah maksimal perulangan / epoch yang digunakan dalam perhitungan
Diasumsikan dalam kasus ini, jumlah maksimal perulangan adalah 100 kali

Const maksEpoch As Integer = 100

4. Lakukan proses pencarian nilai bobot dan bias terbaik
Metode yang digunakan adalah RProp (Resilient Back-Propagation)
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini (poin 4a – 4b)

jst.RProp(contohData, maksEpoch)

Memasuki perhitungan pada fungsi RProp

4a. Tentukan etaPlus, etaMinus, deltaMax, dan deltaMin
etaPlus adalah konstanta untuk menaikkan nilai delta bobot / bias ketika perhitungan berjalan kearah yang cocok
etaMinus adalah konstanta untuk menurukan nilai delta bobot / bias ketika terjadi ketidakcocokan antara perhitungan sebelumnya dan perhitungan sekarang
deltaMax dan deltaMin adalah rentang nilai delta, agar nilai perhitungan delta tidak terlalu rendah atau tinggi
Nilai-nilai yang dipakai disini adalah nilai-nilai yang direkomendasikan dalam jurnal penelitian

Const etaPlus As Double = 1.2
Const etaMinus As Double = 0.5
Const deltaMax As Double = 50.0
Const deltaMin As Double = 0.000001

4b. Lakukan perhitungan sebanyak parameter maksEpoch (poin 4b1 – 4b5)

* Pada setiap kali perulangan, akan ada 2 perhitungan utama, yaitu perhitungan nilai gradient dan proses update nilai matriks bobot

4b1. Sebelum memasuki perhitungan nilai gradient, maka kosongkan dulu semua akumulasi nilai gradient bobot dan bias

For i As Integer = 0 To hoAkumulasiBobotGradient.Length - 1
	For j As Integer = 0 To hoAkumulasiBobotGradient(i).Length - 1
		hoAkumulasiBobotGradient(i)(j) = 0.0
	Next
Next
For i As Integer = 0 To ihAkumulasiBobotGradient.Length - 1
	For j As Integer = 0 To ihAkumulasiBobotGradient(i).Length - 1
		ihAkumulasiBobotGradient(i)(j) = 0.0
	Next
Next
For i As Integer = 0 To oAkumulasiBiasGradient.Length - 1
	oAkumulasiBiasGradient(i) = 0.0
Next
For i As Integer = 0 To hAkumulasiBiasGradient.Length - 1
	hAkumulasiBiasGradient(i) = 0.0
Next

* Lakukan proses perhitungan gradient (poin 4b2)

4b2. Lakukan perhitungan pada masing-masing contoh data (poin 4b2a – 4b2g)

For row As Integer = 0 To contohData.Length - 1
. . .

4b2a. Lakukan perulangan pada setiap baris data
Ambil matriks data kolom kriteria dan kolom hasil sesuai urutan baris data yang sudah ditentukan sebelumnya
Kemudian hitung nilai output dari matriks data kolom kriteria

Array.Copy(contohData(row), contohDataKolomKriteria, jumlahSarafInput)
Array.Copy(contohData(row), jumlahSarafInput, contohDataKolomHasil, 0, jumlahSarafOutput)
hitungNilaiOutput(contohDataKolomKriteria)

4b2b. Tentukan nilai komponen gradient untuk jaringan saraf output
Yaitu turunan fungsi Softmax * (selisih nilai output dengan nilai data sebenarnya)
turunan fungsi Softmax dihitung dengan rumus (1 – y) * y

For i As Integer = 0 To jumlahSarafOutput - 1
	Dim turunanFungsiSoftmax As Double = (1 - outputs(i)) * outputs(i)
	oKomponenGradient(i) = turunanFungsiSoftmax * (outputs(i) - contohDataKolomHasil(i))
Next

4b2c. Tentukan nilai komponen gradient untuk jaringan saraf tersembunyi
Yaitu turunan fungsi HyperTan * jumlah komponen gradient
turunan fungsi HyperTan dihitung dengan rumus (1 – y) * (1 + y)
Jumlah komponen gradient dihitung dengan rumus jumlah dari perkalian antara baris oKomponenGradient dengan hoBobot

For i As Integer = 0 To jumlahSarafTersembunyi - 1
	Dim turunanFungsiHyperTan As Double = (1 - hOutput(i)) * (1 + hOutput(i))
	Dim jumlahKonponenGradient As Double = 0.0
	For j As Integer = 0 To jumlahSarafOutput - 1
		Dim x As Double = oKomponenGradient(j) * hoBobot(i)(j)
		jumlahKonponenGradient += x
	Next
	hKomponenGradient(i) = turunanFungsiHyperTan * jumlahKonponenGradient
Next

4b2d. Hitung nilai bobot gradient yaitu jumlah dari perkalian antara baris oKomponenGradient dengan hOutput
Kemudian simpan nilai akumulasi nilai bobot gradient nya

For i As Integer = 0 To jumlahSarafTersembunyi - 1
	For j As Integer = 0 To jumlahSarafOutput - 1
		Dim grad As Double = oKomponenGradient(j) * hOutput(i)
		hoAkumulasiBobotGradient(i)(j) += grad
	Next
Next

4b2e. Hitung nilai bias gradient yaitu jumlah dari perkalian antara baris oKomponenGradient dengan 1
Kemudian simpan nilai akumulasi nilai bias gradient nya

For i As Integer = 0 To jumlahSarafOutput - 1
	Dim grad As Double = oKomponenGradient(i) * 1.0
	oAkumulasiBiasGradient(i) += grad
Next

4b2f. Hitung nilai bobot gradient yaitu jumlah dari perkalian antara baris hKomponenGradient dengan inputs
Kemudian simpan nilai akumulasi nilai bobot gradient nya

For i As Integer = 0 To jumlahSarafInput - 1
	For j As Integer = 0 To jumlahSarafTersembunyi - 1
		Dim grad As Double = hKomponenGradient(j) * inputs(i)
		ihAkumulasiBobotGradient(i)(j) += grad
	Next
Next

4b2g. Hitung nilai bias gradient yaitu jumlah dari perkalian antara baris hKomponenGradient dengan 1
Kemudian simpan nilai akumulasi nilai bias gradient nya

For i As Integer = 0 To jumlahSarafTersembunyi - 1
	Dim grad As Double = hKomponenGradient(i) * 1.0
	hAkumulasiBiasGradient(i) += grad
Next

* Setelah menentukan nilai akumulasi gradient, maka lakukan proses update nilai matriks bobot (poin 4b3 – 4b4)

4b3. Lakukan update nilai matriks bobot pada jaringan saraf input-tersembunyi (poin 4b3a – 4b3b)

4b3a. Bandingkan akumulasi bobot gradient pada perulangan sebelumnya dengan perulangan sekarang (poin 4b3a1 – 4b3a3)

4b3a1. Apabila nilai sebelumnya dengan nilai sekarang tidak mengalami perubahan tanda positif ke negatif / negatif ke positif,
Maka naikkan nilai delta, yaitu delta bobot sebelumnya * konstanta etaPlus
Jika nilai delta berada diluar rentang nilai delta, maka kembalikan agar tetap dalam rentang nilai delta
Kemudian hitung nilai bobot dengan rumus (-1 atau +1) * delta * -1, dengan (-1 atau +1) adalah penentu apakah nilai akumulasi bobot gradient positif atau negatif

If ihAkumulasiBobotGradientSebelumnya(i)(j) * ihAkumulasiBobotGradient(i)(j) > 0 Then
	delta = ihDeltaBobotSebelumnya(i)(j) * etaPlus
	If delta > deltaMax Then delta = deltaMax
	Dim tmp As Double = -Math.Sign(ihAkumulasiBobotGradient(i)(j)) * delta
	ihBobot(i)(j) += tmp
	
. . .

4b3a2. Apabila nilai sebelumnya dengan nilai sekarang mengalami perubahan tanda positif ke negatif / negatif ke positif,
Maka turunkan nilai delta, yaitu delta bobot sebelumnya * konstanta etaMinus
Jika nilai delta berada diluar rentang nilai delta, maka kembalikan agar tetap dalam rentang nilai delta
Kemudian kembalikan nilai bobot sekarang menjadi nilai bobot sebelumnya
Dan hapus nilai akumulasi bobot gradientnya, agar pada perhitungan berikutnya masuk kedalam kondisi poin dibawah ini

ElseIf ihAkumulasiBobotGradientSebelumnya(i)(j) * ihAkumulasiBobotGradient(i)(j) < 0 Then
	delta = ihDeltaBobotSebelumnya(i)(j) * etaMinus
	If delta < deltaMin Then delta = deltaMin
	ihBobot(i)(j) -= ihDeltaBobotSebelumnya(i)(j)
	ihAkumulasiBobotGradient(i)(j) = 0
. . .

4b3a3. Pada perulangan berikutnya setelah poin diatas dilakukan,
Ambil nilai delta bobot sebelumnya sebagai nilai delta
Kemudian hitung nilai bobot dengan rumus (-1 atau +1) * delta * -1, dengan (-1 atau +1) adalah penentu apakah nilai akumulasi bobot gradient positif atau negatif

Else
	delta = ihDeltaBobotSebelumnya(i)(j)
	Dim tmp As Double = -Math.Sign(ihAkumulasiBobotGradient(i)(j)) * delta
	ihBobot(i)(j) += tmp
End If

4b3b. Setelah membandingkan nilai akumulasi bobot gradient pada perulangan sebelumnya dengan perulangan sekarang,
maka simpan nilai delta bobot sekarang dan akumulasi bobot gradient sekarang sebagai nilai sebelumnya untuk digunakan pada perulangan berikutnya

ihDeltaBobotSebelumnya(i)(j) = delta
ihAkumulasiBobotGradientSebelumnya(i)(j) = ihAkumulasiBobotGradient(i)(j)

4b4. Lakukan update nilai matriks bias pada jaringan saraf tersembunyi (poin 4b4a – 4b4b)

4b4a. Bandingkan akumulasi bias gradient pada perulangan sebelumnya dengan perulangan sekarang (poin 4b4a1 – 4b4a3)

4b4a1. Apabila nilai sebelumnya dengan nilai sekarang tidak mengalami perubahan tanda positif ke negatif / negatif ke positif,
Maka naikkan nilai delta, yaitu delta bias sebelumnya * konstanta etaPlus
Jika nilai delta berada diluar rentang nilai delta, maka kembalikan agar tetap dalam rentang nilai delta
Kemudian hitung nilai bias dengan rumus (-1 atau +1) * delta * -1, dengan (-1 atau +1) adalah penentu apakah nilai akumulasi bias gradient positif atau negatif

If hAkumulasiBiasGradientSebelumnya(i) * hAkumulasiBiasGradient(i) > 0 Then
	delta = hDeltaBiasSebelumnya(i) * etaPlus
	If delta > deltaMax Then delta = deltaMax
	Dim tmp As Double = -Math.Sign(hAkumulasiBiasGradient(i)) * delta
	hBias(i) += tmp
. . .

4b4a2. Apabila nilai sebelumnya dengan nilai sekarang mengalami perubahan tanda positif ke negatif / negatif ke positif,
Maka turunkan nilai delta, yaitu delta bias sebelumnya * konstanta etaMinus
Jika nilai delta berada diluar rentang nilai delta, maka kembalikan agar tetap dalam rentang nilai delta
Kemudian kembalikan nilai bias sekarang menjadi nilai bias sebelumnya
Dan hapus nilai akumulasi bias gradientnya, agar pada perhitungan berikutnya masuk kedalam kondisi poin dibawah ini

ElseIf hAkumulasiBiasGradientSebelumnya(i) * hAkumulasiBiasGradient(i) < 0 Then
	delta = hDeltaBiasSebelumnya(i) * etaMinus
	If delta < deltaMin Then delta = deltaMin
	hBias(i) -= hDeltaBiasSebelumnya(i)
	hAkumulasiBiasGradient(i) = 0
. . .

4b4a3. Pada perulangan berikutnya setelah poin diatas dilakukan,
Ambil nilai delta bias sebelumnya sebagai nilai delta
Kemudian hitung nilai bias dengan rumus (-1 atau +1) * delta * -1, dengan (-1 atau +1) adalah penentu apakah nilai akumulasi bias gradient positif atau negatif

Else
	delta = hDeltaBiasSebelumnya(i)
	Dim tmp As Double = -Math.Sign(hAkumulasiBiasGradient(i)) * delta
	hBias(i) += tmp
End If

4b4b. Setelah membandingkan nilai akumulasi bias gradient pada perulangan sebelumnya dengan perulangan sekarang,
maka simpan nilai delta bias sekarang dan akumulasi bias gradient sekarang sebagai nilai sebelumnya untuk digunakan pada perulangan berikutnya

hDeltaBiasSebelumnya(i) = delta
hAkumulasiBiasGradientSebelumnya(i) = hAkumulasiBiasGradient(i)

4b5. Lakukan perhitungan yang sama (poin 4b3a dan 4b3b) untuk melakukan proses update nilai matriks bobot dan bias pada jaringan saraf tersembunyi-output

For i As Integer = 0 To jumlahSarafTersembunyi - 1
	For j As Integer = 0 To jumlahSarafOutput - 1
		If hoAkumulasiBobotGradientSebelumnya(i)(j) * hoAkumulasiBobotGradient(i)(j) > 0 Then
			delta = hoDeltaBobotSebelumnya(i)(j) * etaPlus
			If delta > deltaMax Then delta = deltaMax
			Dim tmp As Double = -Math.Sign(hoAkumulasiBobotGradient(i)(j)) * delta
			hoBobot(i)(j) += tmp
		ElseIf hoAkumulasiBobotGradientSebelumnya(i)(j) * hoAkumulasiBobotGradient(i)(j) < 0 Then
			delta = hoDeltaBobotSebelumnya(i)(j) * etaMinus
			If delta < deltaMin Then delta = deltaMin
			hoBobot(i)(j) -= hoDeltaBobotSebelumnya(i)(j)
			hoAkumulasiBobotGradient(i)(j) = 0
		Else
			delta = hoDeltaBobotSebelumnya(i)(j)
			Dim tmp As Double = -Math.Sign(hoAkumulasiBobotGradient(i)(j)) * delta
			hoBobot(i)(j) += tmp
		End If
		hoDeltaBobotSebelumnya(i)(j) = delta
		hoAkumulasiBobotGradientSebelumnya(i)(j) = hoAkumulasiBobotGradient(i)(j)
	Next
Next

For i As Integer = 0 To jumlahSarafOutput - 1
	If oAkumulasiBiasGradientSebelumnya(i) * oAkumulasiBiasGradient(i) > 0 Then
		delta = oDeltaBiasSebelumnya(i) * etaPlus
		If delta > deltaMax Then delta = deltaMax
		Dim tmp As Double = -Math.Sign(oAkumulasiBiasGradient(i)) * delta
		oBias(i) += tmp
	ElseIf oAkumulasiBiasGradientSebelumnya(i) * oAkumulasiBiasGradient(i) < 0 Then
		delta = oDeltaBiasSebelumnya(i) * etaMinus
		If delta < deltaMin Then delta = deltaMin
		oBias(i) -= oDeltaBiasSebelumnya(i)
		oAkumulasiBiasGradient(i) = 0
	Else
		delta = oDeltaBiasSebelumnya(i)
		Dim tmp As Double = -Math.Sign(hAkumulasiBiasGradient(i)) * delta
		oBias(i) += tmp
	End If
	oDeltaBiasSebelumnya(i) = delta
	oAkumulasiBiasGradientSebelumnya(i) = oAkumulasiBiasGradient(i)
Next

5. Lakukan perhitungan dari masing-masing contoh data menggunakan nilai bobot dan nilai bias yang sudah ditemukan
Penjelasan tentang fungsi ini akan dijelaskan pada perhitungan dibawah ini (poin 5a – 5g)

Dim output() As Double = jst.hitungNilaiOutput(input)

Memasuki perhitungan utama pada fungsi hitungNilaiOutput

5a. Beri nilai matriks input sesuai array input

For i = 0 To input.Length - 1
	Me.inputs(i) = input(i)
Next i

5b. Hitung matriks ihJumlahBobotDanBias dengan cara perkalian matriks antara matriks input dan matriks ihBobot

For j = 0 To jumlahSarafTersembunyi - 1
	For i = 0 To jumlahSarafInput - 1
		ihJumlahBobotDanBias(j) += Me.inputs(i) * ihBobot(i)(j)
	Next i
Next j

5c. Kemudian masukkan nilai bias pada matriks ihJumlahBobotDanBias

For i = 0 To jumlahSarafTersembunyi - 1
	ihJumlahBobotDanBias(i) += hBias(i)
Next i

5d. Hitung nilai output sementara dengan menggunakan fungsi HyperTan untuk masing-masing data pada matriks hJumlahBobotDanBias
Penjelasan tentang fungsi HyperTan akan dijelaskan pada perhitungan dibawah ini

For i As Integer = 0 To jumlahSarafTersembunyi - 1
	Me.hOutput(i) = HyperTan(hJumlahBobotDanBias(i))
Next

* Gunakan fungsi ini untuk menghitung nilai fungsi HyperTan (tanh)

Private Shared Function HyperTan(x As Double) As Double
	If x < -20.0 Then
		Return -1.0
	ElseIf x > 20.0 Then
		Return 1.0
	Else
		Return Math.Tanh(x)
	End If
End Function

5e. Hitung matriks hoJumlahBobotDanBias dengan cara perkalian matriks antara matriks output sementara dan matriks hoBobot

For j = 0 To jumlahSarafOutput - 1
	For i = 0 To jumlahSarafTersembunyi - 1
		hoJumlahBobotDanBias(j) += hOutput(i) * hoBobot(i)(j)
	Next i
Next j

5f. Kemudian masukkan nilai bias pada matriks hoJumlahBobotDanBias

For i = 0 To jumlahSarafOutput - 1
	hoJumlahBobotDanBias(i) += oBias(i)
Next i

5g. Hitung nilai output akhir dengan menggunakan fungsi Softmax untuk masing-masing data pada matriks hoJumlahBobotDanBias
Penjelasan tentang fungsi Softmax akan dijelaskan pada perhitungan dibawah ini (poin 5g1 – 5g3)

Dim hasil() As Double = Softmax(hoJumlahBobotDanBias)
hasil.CopyTo(Me.outputs, 0)
Return hasil

Memasuki perhitungan utama pada fungsi Softmax

5g1. Cari nilai maksimal data

Dim maksData As Double = hoJumlahBobotDanBias(0)
For i = 0 To hoJumlahBobotDanBias.Length - 1
	If hoJumlahBobotDanBias(i) > maksData Then
		maksData = hoJumlahBobotDanBias(i)
	End If
Next i

5g2. Cari nilai skala

Dim skala As Double = 0.0
For i = 0 To hoJumlahBobotDanBias.Length - 1
	skala += Math.Exp(hoJumlahBobotDanBias(i) - maksData)
Next i

5g3. Hitung hasil akhir
Sehingga semua jumlah bobot pada parameter matriks hoJumlahBobotDanBias akan bernilai 1

Dim hasil(hoJumlahBobotDanBias.Length - 1) As Double
For i = 0 To hoJumlahBobotDanBias.Length - 1
	hasil(i) = Math.Exp(hoJumlahBobotDanBias(i) - maksData) / skala
Next i

6. Jika nilai output bernilai kurang dari 0.5 maka pelanggan tersebut memiliki nilai hasil Ditolak
Jika nilai output bernilai lebih dari 0.5 maka pelanggan tersebut memiliki nilai hasil Diterima
Kemudian bandingkan nilai output dengan nilai hasil pada contoh data
Jika hasilnya sudah sama, maka catat data ini kedalam jumlah data benar
Jika hasilnya tidak sama, maka catat data ini kedalam jumlah data salah

If output(0) < output(1) Then
	Console.Write("-> Ditolak   ")
	If contohData(i)(jumlahKolom - 2) < contohData(i)(jumlahKolom - 1) Then
		jumlahBenar += 1
		Console.WriteLine("Benar")
	ElseIf contohData(i)(jumlahKolom - 2) > contohData(i)(jumlahKolom - 1) Then
		jumlahSalah += 1
		Console.WriteLine("Salah")
	End If
Else
	Console.Write("-> Diterima  ")
	If contohData(i)(jumlahKolom - 2) < contohData(i)(jumlahKolom - 1) Then
		jumlahSalah += 1
		Console.WriteLine("Salah")
	ElseIf contohData(i)(jumlahKolom - 2) > contohData(i)(jumlahKolom - 1) Then
		jumlahBenar += 1
		Console.WriteLine("Benar")
	End If
End If

7. Catat tingkat kecocokan perhitungan data dengan hasil awal pada data
Langkah ini tidak wajib, hanya untuk mengetahui seberapa besar tingkat kecocokan perhitungan untuk data baru yang akan dihitung selanjutnya

Console.WriteLine("Jumlah perhitungan benar = " & jumlahBenar & ", jumlah perhitungan salah = " & jumlahSalah)
Console.WriteLine("Tingkat kecocokan perhitungan dengan hasil data adalah " & (jumlahBenar / (jumlahBenar + jumlahSalah)).ToString("F2"))

8. Lakukan perhitungan yang sama (poin 5 dan 6) untuk masing-masing data baru

For i As Integer = 0 To dataBaru.Length - 1
	Console.Write("Pelanggan " & Chr(i + 65 + 8) & "  ")

	Dim input(jumlahKolom - 3) As Double
	Array.Copy(dataBaru(i), input, jumlahKolom - 2)
	For j = 0 To input.Length - 1
		Console.Write(IIf(input(j) >= 0, " ", "") & input(j).ToString("F2") & " ")
	Next j
	Console.Write(" ")

	Dim output() As Double = jst.hitungNilaiOutput(input)
	For j = 0 To output.Length - 1
		Console.Write(output(j).ToString("F2") & " ")
	Next j
	Console.Write(" ")

	If output(0) < output(1) Then
		Console.Write("-> Ditolak ")
	Else
		Console.Write("-> Diterima")
	End If
	Console.WriteLine("")
Next

Hasil akhir adalah: (klik untuk perbesar gambar)

cmd54a

Contoh modul / source code dalam bahasa VB (Visual Basic) dapat didownload disini:



Jika membutuhkan jasa kami dalam pembuatan program, keterangan selanjutnya dapat dilihat di Fasilitas dan Harga
Jika ada yang kurang paham dengan langkah-langkah algoritma diatas, silahkan berikan komentar Anda.
Selamat mencoba.


Tinggalkan sebuah komentar

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *

2 pemikiran di “Algoritma RProp (Resilient Back-Propagation)

  • Lisa

    Halo kak apa sudah cocok ya jika saya pakai metode JST RPROP ini lalu studi kasus nya itu ingin klasifikasi magnitudo gempa bumi tektonik skala 1 prov kak.

    • pip Penulis

      Untuk mengetahui tingkat kecocokan maka saya harus melihat terlebih dahulu bentuk dari data yang digunakan. Silahkan memberikan contoh data dari sistem tersebut.