Linear Regression dengan Konsep Gradient Descent

By | July 30, 2024
3,207 Views

Belajar konsep machine learning tidak terlepas dari gradient descent dengan penjabaran fungsi turunan/derivatif. Konsep turunan pernah kita pelajari setidaknya di SMA yaitu matematika kalkulus. Saya akan mencoba menjabarkan sedikit aturan mengenai turunan dari sebuah fungsi berikut . Oiya saya pakai octave untuk menulis kodenya biar ringkas, kalian bisa beli buku saya disini . Kalau belum paham pembahasan sebelumnya, bisa kalian pelajari disini mengenai konsep gradient descent.

Mulai dari persamaan kuadrat berikut

Perhatikan persamaan kuadrat berikut, akan dicari turunan pertama /derivatif nya

    \[ \frac{dy(x)}{dx} = (2x+10)^2 \]

Jika ditemui kasus tersebut, ingatlah aturan turunan dari

    \[ f(x) = h (g(x)) \]

maka turunannya yaitu

    \[ f'(x)=h' (g(x)) \cdot g'(x) \]

Jadi turunan dari

    \[ \frac{dy(x)}{dx} = (2x+10)^2 \]

yaitu

(1)   \begin{equation*}  \begin{split} h(g(x)) & = (2x+10)^2\\ h'(g(x)) & = 2(2x+10)\\ \end{split} \end{equation*}

selanjutnya

(2)   \begin{equation*}  \begin{split} g(x) & = 2x+10\\ g'(x) & = 2\\ \end{split} \end{equation*}

Jadi kita kalikan menjadi

(3)   \begin{equation*}  \begin{split} f'(x) & =h' (g(x)) \cdot g'(x) \\ &= 2(2x+10) \cdot 2 \\ & = 8x+40 \end{split} \end{equation*}

Kita coba selesaikan jika y(x)=0 untuk melihat, apakah rumus diatas sudah betul? Yuk kita lanjutkan

(4)   \begin{equation*}  \begin{split} y'(x) & = 8x+40 \\ 0 & = 8x+40 \\ -40 &= 8x \\ x &= \frac{40}{8} \\ x & = -5 \end{split} \end{equation*}

artinya bahwa persamaan diatas akan mencapai titik minimalnya ketika x=-5, yuk lihat grafik berikut

Saya pakai Octave saja buat nulis kode diatas, bosan pakai Python… heee. heee, kalian beli saja buku saya mengenai octave disini

clc;clear all;close all;
x = -10:0.1:5;
y = (2*x+10).^2;

figure,
plot(x,y)
ylim([-10,20])
xlim([-10,10])
grid on

 

See also  Tensorflow 2.0 - Gradient-based Optimization bagian 2

Konsep Perhitungan Mean Square Error

Kalian tahu donk rumus untuk menghitung mean square error

(5)   \begin{equation*}  \begin{split} MSE & = \frac{1}{N} \sum_{i=1}^{N} (y_i - \hat y_i)^2 \end{split} \end{equation*}

dengan

  1. N adalah jumlah data
  2. y adalah nilai faktual atau nilai target
  3. \hat y adalah nilai aktual atau nilai prediksi

Kemudian saya akan jabarkan mengenai variabel \hat y yang merupakan rumus dari persamaan regresi linear

(6)   \begin{equation*}  \begin{split} \hat y_i & = mx_i+b \end{split} \end{equation*}

*kalau ditulisan ini dibuat rumus y = ax+b tapi intinya adalah sama! cuman beda penamaan variabel saja. Persamaan (6) akan dimasukan kedalam persamaan (5) menjadi berikut

(7)   \begin{equation*}  \begin{split} MSE & = \frac{1}{N} \sum_{i=1}^{N} (y - (mx+b))^2 \end{split} \end{equation*}

Kemudian persamaan diatas ada 2 variabel penting yang perlu dicari yaitu m dan b sehingga saya perjelas sebagai berikut

(8)   \begin{equation*}  \begin{split} MSE(m,b) & = \frac{1}{N} \sum_{i=1}^{N} (y - (mx+b))^2 \end{split} \end{equation*}

Yuk kita cari turunan pada persamaan (7) diatas untuk m dan b

Mencari turunan m

Karena fokus terhadap variabel m maka variabel yang lain dianggap konstanta!

(9)   \begin{equation*}  \begin{split} MSE(m,b) & = \frac{1}{N} \sum_{i=1}^{N} (y - (mx+b))^2 \\ \frac{df(m,b)}{dm} & = \frac{1}{N} \sum_{i=1}^{N} (y - (mx+b))^2 \end{split} \end{equation*}

Perhatikan bahwa persamaan (9) diatas akan diturunkan untuk variabel m, ingat ya pembahasan diawal, kita perjelas lagi biar ringkas

(10)   \begin{equation*}  \begin{split} \frac{df}{dm} & = \frac{1}{N} \sum_{i=1}^{N} (y - (mx+b))^2 \end{split} \end{equation*}

turunan dari  h'g(x)) yaitu

(11)   \begin{equation*}  \begin{split} \frac{df}{dm} & = (y - (mx+b))^2 \\ & = 2(y-(mx+b)) \end{split} \end{equation*}

turunan dari  g'(x) yaitu

(12)   \begin{equation*}  \begin{split} \frac{df}{dm} & = (y - (mx+b)) \\ & = (0-(x+o)) \\ & = -x \end{split} \end{equation*}

Jadi kita kalikan menjadi

(13)   \begin{equation*}  \begin{split} f'(x) & =h' (g(x)) \cdot g'(x) \\ &= 2(y-(mx+b)) \cdot -x \\ & = -2x(y-(mx+b)) \end{split} \end{equation*}

sehingga turunan dari

(14)   \begin{equation*}  \begin{split} \frac{df}{dm} & = \frac{1}{N} \sum_{i=1}^{N} (y - (mx+b))^2 \\ & = \frac{1}{N} \sum_{i=1}^{N} -2x(y-(mx+b)) \end{split} \end{equation*}

Mencari turunan b

Karena fokus terhadap variabel b maka variabel yang lain dianggap konstanta!

(15)   \begin{equation*}  \begin{split} MSE(m,b) & = \frac{1}{N} \sum_{i=1}^{N} (y - (mx+b))^2 \\ \frac{df(m,b)}{db} & = \frac{1}{N} \sum_{i=1}^{N} (y - (mx+b))^2 \end{split} \end{equation*}

Saya anggap kalian sudah paham mengenai cara turunan diatas, maka berikut turunan

turunan dari  h'g(x)) yaitu

(16)   \begin{equation*}  \begin{split} \frac{df}{db} & = (y - (mx+b))^2 \\ & = 2(y-(mx+b)) \end{split} \end{equation*}

turunan dari  g'(x) yaitu

(17)   \begin{equation*}  \begin{split} \frac{df}{db} & = (y - (mx+b)) \\ & = (0-(0+1)) \\ & = -1 \end{split} \end{equation*}

Jadi kita kalikan menjadi

(18)   \begin{equation*}  \begin{split} f'(x) & =h' (g(x)) \cdot g'(x) \\ &= 2(y-(mx+b)) \cdot -1 \\ & = -2x(y-(mx+b)) \end{split} \end{equation*}

sehingga turunan dari

(19)   \begin{equation*}  \begin{split} \frac{df}{db} & = \frac{1}{N} \sum_{i=1}^{N} (y - (mx+b))^2 \\ & = \frac{1}{N} \sum_{i=1}^{N} -2(y-(mx+b)) \end{split} \end{equation*}

Berdasarkan persamaan 14 dan 19, saya akan persingkat saja dari persamaan

    \[ y-(mx+b) \]

menjadi fungsi w yaitu

    \[ w = y-(mx+b) \]

sehingga persamaan 14 atau turunan dari m akan menjadi

(20)   \begin{equation*}  \begin{split} \frac{df}{dm} & = \frac{1}{N} \sum_{i=1}^{N} (y - (mx+b))^2 \\ & = \frac{1}{N} \sum_{i=1}^{N} -2x(y-(mx+b)) \\ & = \frac{1}{N} \sum_{i=1}^{N} -2x w \\ \end{split} \end{equation*}

sehingga persamaan 19 atau turunan dari b akan menjadi

(21)   \begin{equation*}  \begin{split} \frac{df}{db} & = \frac{1}{N} \sum_{i=1}^{N} (y - (mx+b))^2 \\ & = \frac{1}{N} \sum_{i=1}^{N} -2(y-(mx+b)) \\ & = \frac{1}{N} \sum_{i=1}^{N} -2w \end{split} \end{equation*}

 

Update Nilai m dan b

Untuk melakukan update m dan b, kita butuh nilai \alpha atau disebut dengan learning rate

See also  Pytorch - Apa itu Operasi Linear, Bobot, dan Bias pada Algoritma CNN

    \[ m = m-\alpha*m \]

    \[ b = b-\alpha*b \]

Nilai \alpha mempunyai kisaran nilai 0 < \alpha < 1

Menulis kode untuk w

Yuk kita tulis persamaan sebelumnya yaitu

    \[ w = y-(mx+b) \]

kedalam kode Octave, saya sebut dengan fungsi_bobot

fungsi_bobot = @(x,y,m,b) y-(m*x+b);

Menulis kode untuk turunan m

    \[ \frac{df}{dm}  = \frac{1}{N} \sum_{i=1}^{N} -2x w \]

saya sebut dengan fungsi_m_gradient

fungsi_m_gradient = @(x,w,N) (1/N) * - 2*dot(x,w);

 

Menulis kode untuk turunan b

    \[ \frac{df}{db}  = \frac{1}{N} \sum_{i=1}^{N} -2w \]

saya sebut dengan fungsi_b_gradient

fungsi_b_gradient = @(w,N) (1/N) * - 2*sum(w(:));

Saatnya melakukan iterasi untuk perbaikan m dan b berdasarkan nilai \alpha

Iterasi dilakukan untuk perbaikan m dan b berdasarkan laju pembelajaran, lumayan ya rumus-rumusnya! Kalau kalian belum paham mengenai derivatif/turunan, silahkan saja baca-baca pelajaran/mata kuliah mengenai matematika kalkulus! Namun kalau ada yang belum paham mengenai bahasa pemrograman Octave, kalian jangan lupa beli buku nya disini

Sedangkan dataset yang digunakan disini

Yuk kita lanjutkan mengenai iterasi, Oiya karena kodenya makin banyak, saya buat khusus function yaitu step_gradient

function [m_new,b_new] = step_gradient(x,y,alpha,m_current,b_current)
  fungsi_bobot = @(x,y,m,b) y-(m*x+b);
  fungsi_m_gradient = @(x,w,N) (1/N) * - 2*dot(x,w);
  fungsi_b_gradient = @(w,N) (1/N) * - 2*sum(w(:));

  b_gradient = 0;
  m_gradient = 0;
  N = size(x,1);
  w = fungsi_bobot(x,y,m_current,b_current);
  
  m_gradient = fungsi_m_gradient(x,w,N);
  b_gradient = fungsi_b_gradient(w,N);
  
  m_new = m_current - (alpha*m_gradient);
  b_new = b_current - (alpha*b_gradient); 
endfunction

Disitu kalian bisa melihat ada perbaikan m dan b dengan melibatkan nilai \alpha, adapun untuk memanggil function tersebut yaitu

m = 1;
b = -10;
alpha = 0.001;
for iterasi=1:100000
   [m,b] = step_gradient(x,y,alpha,m,b);
  
endfor

Yup dibutuhkan sebuah initial value untuk m dan b , saya set nilai \alpha sangat kecil sekali dengan iterasi sebanyak 100 ribu kali. Mari kita lihat hasil iterasi melalui gambar berikut.

Pada iterasi ke 1

Kalian bisa melihat gambar dibawah ini, garis dari rumus y =mx+b masih jauh dari sempurna

Lanjut ke iterasi 500

Kita lanjutkan regresi linear dengan teknik gradient descent nya, pada iterasi ke 500. Hem… kurang OK nampaknya

Lanjut saja ke 100 ribu iterasi

Nah kalau sudah ke 100ribu kali, agak lama sih! namanya juga machine learning sehingga mesin kudu belajar dulu biar pinter, dan…..Wow menarik sekali. Ternyata machine nya benar-benar belajar dari kesalahan sebelumnya dan memperbaiki diri pada iterasi 100ribu kali!

See also  Pytorch - Membuat Function Loss

Kalian penasaran bukan? yuk lihat saja grafik error untuk tiap iterasi yang tervisualisasi dengan baik pada plot dibawah ini, pantesan saja machine learning belajar setiap kali ada iterasi! ditandai dengan error nya yang semakin turun!

Masih kurang puas hasil diatas, lakukan iterasi saja sampai jutaan kali, Oiya sebagai informasi saja berikut hasil untuk m dan b setelah mencapai 100ribu iterasi.

  1. nilai m = 1.3959
  2. nilai b = -23.110

Bisa kalian bandingkan pada artikel disini yang menyebutkan nilai tersebut yaitu

  1. nilai m = 1.4498
  2. nilai b = -24.381

Mirip-mirip lah hasilnya kan!  kurang dikit sekali, tinggal kalian iterasi sebanyak -banyaknya saja, tapi intinya adalah konsep gradient descent merupakan behind the scene of machine learning. Oiya asal kalian memahami algoritma diatas, maka bahasa apapun tidak akan menjadi kendala, itulah mengapa saya lebih suka menggunakan Octave biar simple. Ssstt jangan lupa beli buku nya yaaa, disini

Masih kurang paham?

Kalau kurang paham, ya kirim saja email kesini