Algoritma RBM (Restricted Boltzmann Machine) 4


Algoritma RBM (Restricted Boltzmann Machine) adalah salah satu algoritma berbasis jaringan yang dapat digunakan untuk pengambilan keputusan. Contoh yang dibahas kali ini adalah mengenai penentuan penyakit berdasarkan gejala yang tersedia.
Algoritma ini memiliki kemiripan dengan algoritma berbasis jaringan saraf pada umumnya, hanya saja dalam struktur jaringan ini tidak ada istilah input dan output, hal ini disebabkan karena arus perpindahan data terjadi secara 2 arah. Oleh sebab itu dalam struktur jaringannya hanya terdapat 2 macam node, yaitu node terlihat / tampak, dan node tidak terlihat / tersembunyi. Karena arus datanya terjadi secara 2 arah, apabila input A menghasilkan output B, maka apabila nilai B dimasukkan sebagai output dan dilacak balik, maka akan hampir selalu menghasilkan input A.



Diketahui terdapat 2 jenis penyakit, yaitu penyakit A dan B
Penyakit A memiliki gejala batuk, pilek, demam
Penyakit B memiliki gejala pusing, mual, diare
Diasumsikan terdapat 10 data gejala yang dialami pasien dengan data sebagai berikut

Nama PasienBatukPilekDemamPusingMualDiare
Pasien A111000
Pasien B000111
Pasien C110000
Pasien D000011
Pasien E101010
Pasien F010101
Pasien G111001
Pasien H100111
Pasien I001000
Pasien J000100

Contoh data awal adalah sebagai berikut:

Dim contohData()() As Integer = New Integer()() { _
		New Integer() {1, 1, 1, 0, 0, 0},
		New Integer() {0, 0, 0, 1, 1, 1},
		New Integer() {1, 1, 0, 0, 0, 0},
		New Integer() {0, 0, 0, 0, 1, 1},
		New Integer() {1, 0, 1, 0, 1, 0},
		New Integer() {0, 1, 0, 1, 0, 1},
		New Integer() {1, 1, 1, 0, 0, 1},
		New Integer() {1, 0, 0, 1, 1, 1},
		New Integer() {0, 0, 1, 0, 0, 0},
		New Integer() {0, 0, 0, 1, 0, 0}
	}



Selanjutnya ada 2 orang pasien baru yang memiliki gejala yang berbeda dengan data yang tersedia
Maka tentukan jenis penyakit untuk pasien ini
Diasumsikan data pasien tersebut adalah sebagai berikut:

Nama PasienBatukPilekDemamPusingMualDiare
Pasien K111000
Pasien L000111

Contoh data baru adalah sebagai berikut:

Dim dataBaru()() As Integer = New Integer()() { _
		New Integer() {1, 0, 0, 1, 0, 0},
		New Integer() {1, 0, 0, 0, 0, 1}
	}



Sebelum masuk kedalam langkah-langkah pembahasan algoritma, ada beberapa konstanta atau parameter yang harus diketahui, yaitu:
* Tentukan Jumlah node tampak yang digunakan dalam sistem RBM
Diasumsikan dalam kasus ini jumlah node tampak adalah 6 node karena mengikuti jumlah gejala yang tersedia

Dim jumlahNodeTampak As Integer = 6

* Tentukan Jumlah node tersembunyi yang digunakan dalam sistem RBM
Diasumsikan dalam kasus ini jumlah node tersembunyi adalah 2 node karena mengikuti jumlah penyakit yang tersedia

Dim jumlahNodeTersembunyi As Integer = 2

* Tentukan rasio pembelajaran yang digunakan pada saat tahap pelatihan
Diasumsikan dalam kasus ini nilai rasio pembelajaran adalah 0.01
Semakin rendah nilainya, maka proses pelatihan akan membutuhkan waktu yang semakin lama,
Tetapi semakin tinggi nilainya, maka proses pelatihan tidak akan dapat menemukan nilai yang diperkirakan bisa lebih baik

Dim rasioPembelajaran As Double = 0.01

* Tentukan jumlah iterasi yang digunakan pada saat tahap pelatihan
Diasumsikan dalam kasus ini jumlah iterasi adalah 1000

Dim jumlahIterasi As Integer = 1000

Langkah-langkah penggunaan algoritma ini adalah

1. Lakukan proses pencarian nilai bobot dan bias terbaik
Metode yang digunakan adalah RBM (Restricted Boltzmann Machine) dengan teknik pelatihan menggunakan algoritma CD-1 (Contrastive Divergence, single-step)
Penjelasan lebih detail tentang fungsi pelatihan akan dijelaskan pada perhitungan dibawah ini

Dim rbm As New RBM(jumlahNodeTampak, jumlahNodeTersembunyi)
rbm.prosesPelatihan(contohData, rasioPembelajaran, jumlahIterasi)

Memasuki perhitungan utama dari proses pelatihan RBM

1a. Inisialisasi indeks urutan data

Dim idxAcak(dataLatih.Length - 1) As Integer
For i = 0 To idxAcak.Length - 1
	idxAcak(i) = i
Next i

* Lakukan perhitungan sebanyak jumlah iterasi

Dim epoch As Integer = 0
Do While epoch < jumlahIterasi
    . . .

1b. Lakukan pengacakan indeks urutan data
agar data yang diambil tidak selalu berurutan dari awal sampai akhir

For i = 0 To idxAcak.Length - 1
	Dim ri As Integer = rnd.Next(i, idxAcak.Length)
	Dim tmp As Integer = idxAcak(i)
	idxAcak(i) = idxAcak(ri)
	idxAcak(ri) = tmp
Next i

* Lakukan perhitungan sesuai dengan urutan data yang telah diacak

For idx = 0 To idxAcak.Length - 1
	Dim i As Integer = idxAcak(idx)
	. . .

1c. Masukkan nilai dari data latih terpilih ke dalam node tampak

For j = 0 To jumlahNodeTampak - 1
	daftarNilaiNodeTampak(j) = dataLatih(i)(j)
Next j

1d. Hitung masing-masing nilai node tersembunyi apabila menggunakan nilai input node tampak
* Hitung total perkalian antara node tampak dengan bobotTT nya
* Tambahkan nilai bias
* Dapatkan nilai probabilitas dengan menggunakan fungsi sigmoid
* Bangkitkan nilai acak dan tentukan nilai jawaban berdasarkan probabilitas tersebut

For h = 0 To jumlahNodeTersembunyi - 1
	Dim total As Double = 0.0
	For v = 0 To jumlahNodeTampak - 1
		total += daftarNilaiNodeTampak(v) * bobotTT(v)(h)
	Next

	total += daftarBiasNodeTersembunyi(h)

	daftarProbabilitasNodeTersembunyi(h) = Sigmoid(total)

	Dim prob As Double = rnd.NextDouble
	If daftarProbabilitasNodeTersembunyi(h) > prob Then
		daftarNilaiNodeTersembunyi(h) = 1
	Else
		daftarNilaiNodeTersembunyi(h) = 0
	End If
Next h

* Gunakan fungsi ini untuk menghitung nilai fungsi Sigmoid, yang diperoleh dengan rumus:
f(x) = 1.0 / (1.0 + Exp(-x))

Public Function Sigmoid(ByVal x As Double) As Double
	If x < -20.0 Then
		Return 0.0000000001
	ElseIf x > 20.0 Then
		Return 0.9999999999
	Else
		Return 1.0 / (1.0 + Math.Exp(-x))
	End If
End Function

1e. Hitung nilai gradien positif, yaitu operasi outer product dari node tampak dan node tersembunyi

Dim gradienPositif()() As Integer = OperasiOuterProduct(daftarNilaiNodeTampak, daftarNilaiNodeTersembunyi)

* Gunakan fungsi ini untuk melakukan operasi Outer Product

Public Shared Function OperasiOuterProduct(ByVal nilaiNodeTampak() As Integer, ByVal nilaiNodeTersembunyi() As Integer) As Integer()()
	Dim jumlahBaris As Integer = nilaiNodeTampak.Length
	Dim jumlahKolom As Integer = nilaiNodeTersembunyi.Length

	Dim hasil(jumlahBaris - 1)() As Integer
	For i = 0 To jumlahBaris - 1
		hasil(i) = New Integer(jumlahKolom - 1) {}
	Next i

	For i = 0 To jumlahBaris - 1
		For j = 0 To jumlahKolom - 1
			hasil(i)(j) = nilaiNodeTampak(i) * nilaiNodeTersembunyi(j)
		Next j
	Next i

	Return hasil
End Function

1f. Lakukan perhitungan nilai node tampak apabila menggunakan nilai node tersembunyi yang baru saja didapatkan
* Hitung total perkalian antara node tersembunyi dengan bobotTT nya
* Tambahkan nilai bias
* Dapatkan nilai probabilitas dengan menggunakan fungsi sigmoid
* Bangkitkan nilai acak dan tentukan nilai jawaban berdasarkan probabilitas tersebut

Dim vPrime(jumlahNodeTampak - 1) As Integer
For v = 0 To jumlahNodeTampak - 1
	Dim total As Double = 0.0
	For h = 0 To jumlahNodeTersembunyi - 1
		total += daftarNilaiNodeTersembunyi(h) * bobotTT(v)(h)
	Next h

	total += daftarBiasNodeTampak(v)

	Dim probAktif As Double = Sigmoid(total)

	Dim prob As Double = rnd.NextDouble
	If probAktif > prob Then
		vPrime(v) = 1
	Else
		vPrime(v) = 0
	End If
Next v

1g. Lakukan perhitungan nilai node tersembunyi apabila menggunakan nilai node tampak yang baru saja didapatkan
* Hitung total perkalian antara node tampak’ dengan bobotTT nya
* Tambahkan nilai bias
* Dapatkan nilai probabilitas dengan menggunakan fungsi sigmoid
* Bangkitkan nilai acak dan tentukan nilai jawaban berdasarkan probabilitas tersebut

Dim hPrime(jumlahNodeTersembunyi - 1) As Integer
For h = 0 To jumlahNodeTersembunyi - 1
	Dim total As Double = 0.0
	For v = 0 To jumlahNodeTampak - 1
		total += vPrime(v) * bobotTT(v)(h)
	Next v

	total += daftarBiasNodeTersembunyi(h)

	Dim probAktif As Double = Sigmoid(total)

	Dim prob As Double = rnd.NextDouble
	If probAktif > prob Then
		hPrime(h) = 1
	Else
		hPrime(h) = 0
	End If
Next h

1h. Hitung nilai gradien negatif, yaitu operasi outer product dari node tampak’ dan node tersembunyi’

Dim gradienNegatif()() As Integer = OperasiOuterProduct(vPrime, hPrime)

1i. Lakukan update nilai bobot dengan menggunakan rasio pembelajaran dan selisih antara nilai gradien positif dan negatif

For row = 0 To jumlahNodeTampak - 1
	For col = 0 To jumlahNodeTersembunyi - 1
		bobotTT(row)(col) += rasioPembelajaran * (gradienPositif(row)(col) - gradienNegatif(row)(col))
	Next col
Next row

1j. Lakukan update nilai bias node tampak dengan menggunakan rasio pembelajaran dan selisih antara nilai node tampak dan node tampak’

For v = 0 To jumlahNodeTampak - 1
	daftarBiasNodeTampak(v) += rasioPembelajaran * (daftarNilaiNodeTampak(v) - vPrime(v))
Next v

1k. Lakukan update nilai bias node tersembunyi dengan menggunakan rasio pembelajaran dan selisih antara nilai node tersembunyi dan node tersembunyi’

For h = 0 To jumlahNodeTersembunyi - 1
	daftarBiasNodeTersembunyi(h) += rasioPembelajaran * (daftarNilaiNodeTersembunyi(h) - hPrime(h))
Next h

* Setelah mendapatkan nilai bobot dan bias, maka lakukan perhitungan untuk masing-masing data baru

2. Lakukan perhitungan dari masing-masing data baru menggunakan nilai bobot dan bias yang sudah ditemukan
Penjelasan tentang fungsi ini akan dijelaskan pada perhitungan dibawah ini

Dim output() As Integer = rbm.hitungNodeTersembunyiDariNodeTampak(input)

* Gunakan fungsi ini untuk menghitung nilai node tersembunyi apabila menggunakan nilai node tampak

Public Function hitungNodeTersembunyiDariNodeTampak(ByVal nilaiNodeTampak() As Integer) As Integer()
	Dim hasil(jumlahNodeTersembunyi - 1) As Integer
	For h = 0 To jumlahNodeTersembunyi - 1
		Dim total As Double = 0.0
		For v = 0 To jumlahNodeTampak - 1
			total += nilaiNodeTampak(v) * bobotTT(v)(h)
		Next v

		total += daftarBiasNodeTersembunyi(h)

		Dim probAktif As Double = Sigmoid(total)

		Dim prob As Double = rnd.NextDouble
		If probAktif > prob Then
			hasil(h) = 1
		Else
			hasil(h) = 0
		End If
	Next h
	Return hasil
End Function

3. Hitung jumlah kriteria antara penyakit A dan B
Jika jumlah kriteria penyakit A lebih dari penyakit B, maka jawaban penyakit adalah penyakit B
Jika jumlah kriteria penyakit B lebih dari penyakit A, maka jawaban penyakit adalah penyakit A
Jika jumlah kriteria penyakit A sama dengan penyakit B, maka jawaban penyakit adalah penyakit A dan B
Selain itu, maka jawaban penyakit adalah tidak diketahui

Dim jumlahA As Integer = 0, jumlahB As Integer = 0
For j = 0 To output.Length - 1
	Console.Write("  " & output(j))

	If output(j) > 0 Then
		If j <= output.Length / 2 - 1 Then
			jumlahA += 1
		Else
			jumlahB += 1
		End If
	End If
Next j
Console.Write("   ")

If jumlahA > jumlahB Then
	Console.Write("-> Penyakit A")
ElseIf jumlahB > jumlahA Then
	Console.Write("-> Penyakit B")
ElseIf jumlahA > 0 & jumlahB > 0 Then
	Console.Write("-> Penyakit A dan B")
Else
	Console.Write("-> Tidak Diketahui")
End If
Console.WriteLine("")

Hasil akhir adalah: (klik untuk perbesar gambar)

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 *

4 pemikiran di “Algoritma RBM (Restricted Boltzmann Machine)

    • pip Penulis

      Saya tidak memiliki contoh skrip dalam bahasa python, tetapi jika saya melihat alur kerja skrip yang saya bagikan diatas, seharusnya tidak ada masalah apabila dikonversi ke dalam bahasa lain termasuk python karena implementasi tidak bergantung pada library atau plugin tertentu.