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:
- Bagian 1, Predict
- Bagian 2, Dot Product
- Bagian 3, Compare and Learn