Pada bahasan teori deep learning sebelumnya, sudah membahas mengenai langkah predict serta bahasan tentang dot product. Bahasan kali ini yaitu tentang langkah berikutnya, compare dan learn.

Compare

Tujuan dari melatih neural network adalah untuk menghasilkan prediksi yang akurat menggunakan data yang ada. Langkah berikut setelah melakukan prediksi adalah compare, yaitu membandingkan hasil prediksi dengan nilai aktualnya. Melanjutkan contoh pada kasus prediksi jumlah gol namun untuk menyederhanakan pemahaman, data input yang digunakan hanya tendangan_ke_gawang. Kodenya sebagai berikut:

import numpy as np

goals = [1,0.5,0.5]
weights = 0.5

def neural_network(input,weight):
  pred = input * weight
  return pred

tendangan_ke_gawang = np.array([0.7,0.2,0.3])

preds = []

for i in range(0,len(goals)):
  preds.append(neural_network(tendangan_ke_gawang[i],weights))

print(preds)

Hasil dari prediksi di atas adalah [0.35, 0.1, 0.15]. Untuk mengukur nilai errors salah satu metodenya adalah dengan menggunakan mean squared error. Selisih hasil prediksi dengan nilai aktual dipangkatkan 2 sehingga nilainya selalu positif.

Nilai error dibuat selalu positif berfungsi agar ketika ada nilai error yang hasilnya negatif dan positif tidak saling membatalkan perhitungan rata-rata dari error-nya. Misal pada prediksi data pertama nilai error-nya -1 dan prediksi data kedua nilai error-nya 1 maka ketika dihitung rata-ratanya maka error-nya menjadi 0 (model sangat akurat). Padahal kedua prediksi memiliki nilai error.

squared_errors = []
for i in range(0,len(goals)):
  squared_errors.append((preds[i]-goals[i])**2)
print(squared_errors)
print(np.mean(squared_errors))

Keluaran kodenya adalah [0.42250000000000004, 0.16000000000000003, 0.12249999999999998] untuk errors dan 0.235 untuk rata-ratanya. Dengan memangkatkan error maka akan semakin terlihat error yang besar dan kecil, sehingga bisa diprioritaskan dalam proses learn nanti.

Learn

Tujuan utama dari proses learn adalah untuk mengurangi error menuju nilai 0. Dari kode sebelumnya diambil contoh yang lebih sederhana lagi dengan hanya 1 data input sehingga kodenya:

tendangan_ke_gawang = 0.7
goal = 1
weight = 0.5

pred = tendangan_ke_gawang * weight
squared_error = (pred - goal) ** 2

print(pred)
print(squared_error)
# output kode:
0.35
0.42250000000000004

Kode perhitungan error di atas dapat diturunkan menjadi 1 baris dengan hasil nilai error yang sama.

squared_error = (0.7 * weight - 1) ** 2
print(squared_error)

Terlihat dari formula untuk menghitung error, ada beberapa variabel yang berpengaruh yaitu tendangan_ke_gawang (input), weight, goal (output), dan 2 sebagai fungsi pangkat dari error.

Apabila nilai variabel tendangan_ke_gawang (input) yang diubah, maka datanya yang berubah. Jika nilai variabel goal (output) yang diubah, maka yang dilakukan hanya menyesuaikan error sehingga prediksi tepat dengan nilai aktual. Bila yang dirubah nilai 2, hanya akan merubah rentang perbedaan error yang besar dan yang kecil saja, tidak merubah nilai error-nya. Variabel yang tersisa tinggal weight, itulah yang digunakan untuk melakukan proses learn / mengurangi error menuju 0.

Gradient Descent

Salah satu metode dalam proses learn untuk mengurangi error adalah dengan gradient descent, sebuah algoritma optimasi untuk menemukan arah dan jumlah weight dari sebuah fungsi untuk meminimalisasi error.

Dengan mengalikan selisih dari nilai prediksi dan nilai aktual dengan nilai input maka akan didapat selisih (delta) dari weight yang dapat digunakan untuk menentukan arah dan jumlah perubahan weight pada iterasi berikutnya. Untuk lebih jelasnya langsung ke kode :

tendangan_ke_gawang = 0.7
goal = 0.8
weight = 0.5
alpha = 0.1

for i in range(10):
  print('weight',weight)
  pred = tendangan_ke_gawang * weight
  squared_error = (pred - goal) ** 2
  delta = pred - goal
  weight_delta = delta * tendangan_ke_gawang

  weight -= weight_delta * alpha

  print('error',squared_error,'pred',pred)
  print('delta',delta,'weight_delta',weight_delta,'\n')

Keluaran dari kodenya:

weight 0.5
error 0.20250000000000007 pred 0.35
delta -0.45000000000000007 weight_delta -0.315 

weight 0.5315
error 0.1831412025000001 pred 0.37204999999999994
delta -0.4279500000000001 weight_delta -0.2995650000000001 

weight 0.5614565
error 0.16563308668220253 pred 0.39301955
delta -0.40698045000000005 weight_delta -0.284886315 

weight 0.5899451315
error 0.14979872922847065 pred 0.41296159205
delta -0.38703840795000005 weight_delta -0.270926885565 

weight 0.6170378200565001
error 0.13547812051295807 pred 0.43192647403955003
delta -0.36807352596045 weight_delta -0.257651468172315 

weight 0.6428029668737316
error 0.12252654767003977 pred 0.4499620768116121
delta -0.35003792318838794 weight_delta -0.24502654623187153 

weight 0.6673056214969187
error 0.11081313223933165 pred 0.4671139350478431
delta -0.33288606495215695 weight_delta -0.23302024546650985 

weight 0.6906076460435697
error 0.1002195076103838 pred 0.48342535223049876
delta -0.3165746477695013 weight_delta -0.2216022534386509 

weight 0.7127678713874348
error 0.0906386229023387 pred 0.49893750997120434
delta -0.3010624900287957 weight_delta -0.21074374302015697 

weight 0.7338422456894504
error 0.08197366119149803 pred 0.5136895719826153
delta -0.2863104280173847 weight_delta -0.20041729961216928 

Kode di atas menjalankan perulangan sebanyak 10 kali untuk melakukan prediksi dengan perubahan weight menggunakan gradient descent. Dapat dilihat pada setiap iterasi nilai error semakin mengecil dan prediksi semakin mendekati nilai aktual.

Variabel alpha digunakan untuk mengendalikan perubahan weight pada setiap iterasi agar tidak terlalu ekstrim. Fungsinya adalah misal nilai input terlalu besar, karena rumus dari prediksi = input * weight, maka perubahan weight sedikit saja akan merubah nilai prediksi yang besar. Akhirnya akan terjadi divergence, kondisi dimana nilai error yang semakin besar dari sebelumnya dan semakin menjauh dari nilai 0.

Demikian pembahasan tentang compare dan learn pada teori deep learning kali ini. Silakan mencoba untuk menjalankan kode gradient descent di atas dengan iterasi lebih banyak lagi ya. Terima kasih, semoga bermanfaat.

Tulisan ini merupakan seri dari catatan tentang teori deep learning:

Tinggalkan Balasan

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

You May Also Like