backpropagation step by step

Contoh Perhitungan Algoritma Backpropagation

Beberapa waktu lalu saya dapat kesempatan untuk mengasisteni kegiatan kemkominfo di UGM seputar AI. Salah satu topik yang dibicarakan adalah Backpropagation pada Jaringan Saraf Tiruan (JST). Di postingan ini saya akan mencontohkan perhitungan Backpropagation langkah per langkah, menggunakan arsitektur yang sederhana dan dilanjutkan implementasi menggunakan Python.

Sebelum memulai perhitungan, sebaiknya kita harus mengerti terlebih dahulu dasar-dasar untuk:

  • Menghitung turunan satu variabel suatu persamaan
  • Memahami cara perkalian antarmatriks

Jika masih dirasa banyak yang lupa, silakan refresh kembali materi tersebut.

Overview

model / arsitektur JST sederhana

Sebelum kita mulai, kita ingat kembali beberapa poin penting dalam JST pada ilustrasi di atas.

JST yang kita buat di atas terdiri dari 1 layer input (hijau) dan 1 layer output (biru). Layer input kita terdiri dari 4 neuron (disimbolkan dengan $x$) dan layer output kita terdiri dari 3 neuron (disimbolkan dengan $y$).

Layer input biasanya digunakan untuk menerima input berupa fitur suatu data. Sedangkan layer output biasanya merepresentasikan kelas dari data tersebut, pada contoh di atas, berarti terdapat 3 macam kelas data.

Contohnya, misalkan diketahui sebuah data $X$ memiliki nilai fitur sebagai berikut:

Fitur 1Fitur 2Fitur 3Fitur 4
1.02.00.52.0

dan diketahui juga data tersebut termasuk pada kategori kelas ke-“2”. Maka untuk menggunakannya pada JST:

  1. Kita petakan fitur-fitur tersebut pada $X$, sehingga diperoleh $x_1$=1.0, $x_2$=2.0, $x_3$=0.5, $x_4$=2.0
  2. Sedangkan untuk kelas atau label, kita perlu mengubah bentuknya menjadi one-hot encoding, yakni sebuah vektor yang semua isinya bernilai 0 kecuali pada kelasnya. Misalnya untuk data dengan tiga kelas, kelas pertamanya bernilai [1, 0, 0], kelas keduanya bernilai [0, 1, 0], dan kelas ketiganya [0, 0, 1], sehingga diperoleh $y_1$=0, $y_2$=1, $y_3$=0.

Ada dua bagian utama pada JST, yakni forward propagation dan backward propagation. pada forward propagation, JST akan mencoba menghasilkan nilai $y$, sedangkan pada backward propagation, JST akan memperbaiki dirinya sehingga pada forward propagation berikutnya diharap bisa menghasilkan nilai $y$ yang lebih baik atau lebih mendekati label aslinya.

Forward Propagation

Forward propagation adalah proses perhitungan secara “maju” dari input (disimbolkan $x$) hingga diperoleh output model (disimbolkan $y$). Misal pada ilustrasi di atas, nilai $y_1$, $y_2$, dan $y_3$ diperoleh dengan menghitung:

$$ \begin{eqnarray}
y_1 & = \sigma \left ( w_{11}x_{1} + w_{21}x_{2} + w_{31}x_{3} + w_{41}x_{4} + b_1 \right) \nonumber \\
y_2 & = \sigma \left ( w_{12}x_{1} + w_{22}x_{2} + w_{32}x_{3} + w_{42}x_{4} + b_2 \right) \nonumber \\
y_3 & = \sigma \left ( w_{13}x_{1} + w_{23}x_{2} + w_{33}x_{3} + w_{43}x_{4} + b_3 \right ) \nonumber \end{eqnarray}$$

atau bisa juga disingkat menjadi:

$$ y_j = \sigma \left( \sum_{i=1}^\text{4} w_{ij}x_i + b_j \right) $$

Rumus di atas, sangat penting untuk dipahami, untuk penjelasannya simbol-simbolnya:

  • Simbol $b_i$ menunjukkan nilai bias. Nilai bias ini mirip dengan nilai bobot hanya saja tidak dikalikan dengan input. Tujuannya agar garis persamaan bisa lebih kompleks (tidak selalu melewati titik origin).
  • Nilai bobot $w$ dan bias $b$ awalnya diberikan nilai random, dan diperbarui nilainya dengan proses backprop untuk meningkatkan kualitas model.
  • Angka 4 menunjukkan banyak neuron di layer sebelah kiri (layer input).
  • Simbol $\sigma()$ (sigma) adalah simbol dari fungsi aktivasi. Artinya, setelah proses perkalian input $x$ dan bobot $w$ lalu dilakukan penjumlahan semua, langkah selanjutnya adalah mengenai hasil perhitungan tersebut dengan fungsi aktivasi. Ada banyak fungsi aktivasi yang dapat dipilih salah satunya fungsi aktivasi sigmoid yang bentuknya seperti ini:

$$ \sigma(x) = \frac{1}{1 + e^{-x}} $$

Contoh Forward Propagation

Misalkan diketahui input $X = [1, 2, 0.5, 2]$ dengan nilai bobot dan bias di awal adalah sebagai berikut (nilai random, saya susun seperti matrix agar mudah):

$$ \begin{bmatrix}
w_{11} = 0.1 & w_{12} = 0.2 & w_{13} = 0.3 \\
w_{21} = 0.2 & w_{22} = 0.1 & w_{23} = 0.3 \\
w_{31} = 0.1 & w_{32} = 0.3 & w_{33} = 0.2 \\
w_{41} = 0.2 & w_{42} = 0.3 & w_{43} = 0.1
\end{bmatrix} $$

$$ [b_1=0, b_2 = 1, b_3=2]$$

Maka dapat kita hitung nilai $y_1$ adalah:

$$\begin{eqnarray}
& y_1 & = \sigma \left( w_{11}x_{1} + w_{21}x_{2} + w_{31}x_{3} + w_{41}x_{4} + b_1 \right) \nonumber \\
& & = \sigma \left(0.1 \times 1 + 0.2 \times 2 + 0.1 \times 0.5 + 0.2 \times 2 + 0 \right) \nonumber \\
& & = \sigma \left( 0.95 \right) \nonumber \\
& & = 0.72 \nonumber \\
\end{eqnarray}$$

Dengan cara perhitungan yang sama dapat diperoleh juga nilai $y_2$ adalah $0.89$ dan nilai $y_3$ adalah $0.96$

Error

Dari perhitungan sebelumnya diperoleh nilai sebagai berikut:

$$ [y_1=0.72, y_2=0.89, y_3=0.96 ] $$

Nilai tersebut adalah nilai prediksi, atau nilai yang dihasilkan oleh model JST kita. Seperti disebutkan sebelumnya setiap data yang masuk memiliki label atau nilai $y$ yang diharapkan, misalnya untuk data $X$ kita ingin model kita seharusnya bernilai berikut (disebut dengan label atau nilai target, untuk membedakan dengan $y$ kita beri simbol $t$):

$$ [t_1=0, t_2=1, t_3=0 ] $$

Dari sana tampak betapa bedanya nilai prediksi kita dengan nilai target. Kita bisa menghitung seberapa melenceng prediksi kita menggunakan rumus untuk menghitung error. Yang paling sederhana adalah dengan rumus Mean Square Error:

$$ error = \frac{1}{3}\sum_{i=1}^3 (target_i – prediksi_i)^2$$

sederhananya rumus tersebut menghitung selisih nilai target dan prediksi, mengkuadratkannya, lalu merata-rata dari ketiga nilai tersebut (angka “3” diperoleh dari arsitektur JST kita yang akan mengklasifikasikan data ke 3 kelas)

Sehingga untuk perhitungan kita di atas, dapat dihitung error $E$ yang dihasilkan adalah sebesar:

$$\begin{eqnarray}
& E & = \frac{1}{3} \sum_{i=1}^3 (target_i – prediksi_i)^2 \nonumber \\
& & = \frac{1}{3}((t_1 – y_1)^2+(t_2 – y_2)^2+(t_3- y_3)^2) \nonumber \\
& & = \frac{1}{3}((0 – 0.72)^2+(1 – 0.89)^2+(0- 0.96)^2) \nonumber \\
& & = \frac{1}{3}(0.518+0.012+ 0.921) \nonumber \\
& & = 0.483 \nonumber \
\end{eqnarray}$$

Karena tujuan JST adalah untuk menghasikan nilai prediksi $y$ yang semirip mungkin dengan $t$, maka dapat disebut juga tujuan dari JST adalah meminimalkan nilai error $E$.

Backpropagation

Setelah mendapatkan nilai error, kita bisa mulai memperbaiki JST kita dengan backpropagation. Sebenarnya istilah memperbaiki JST ini kurang tepat jika menyebutnya Backpropagation, lebih tepatnya adalah Gradient Descent. Tapi ya di Indonesia lebih umum menyebutnya Backpropagation kadang disingkat Backprop.

Rumus utamanya untuk memperbaiki suatu bobot $w$ berdasarkan error $E$ adalah:

$$ w_{new} = w_{old} – \alpha \frac{\partial E}{\partial w} $$

Rumus Ini juga berlaku untuk memperbaiki nilai bias:

$$ b_{new} = b_{old} – \alpha \frac{\partial E}{\partial b} $$

Simbol $\alpha$ pada rumus di atas adalah learning rate, sebuah konstanta (biasanya antara 0-1) yang menentukan seberapa cepat proses pembelajaran model dilakukan. Di artikel ini kita akan menggunakan nilai $\alpha = 0.5$. Sedangkan simbol $ \frac{\partial E}{\partial w} $ atau dibaca “turunan parsial $E$ terhadap $w$” adalah proses mencari nilai turunan $E$ terhadap variabel yang akan diperbarui, dalam contoh ini $w$. Proses mencari turunan inilah yang baru lebih tepat disebut backpropagation. Karena ada banyak nilai $w$, kita akan spesifikkan untuk mengupdate nilai $w_{11}$ terlebih dulu.

Konsep chaining

Untuk menghitung $ \frac{\partial E}{\partial w} $, pertama-tama kita coba berjalan mundur dulu. Dari mana nilai $E$ didapatkan dan apa hubungannya dengan $w_{11}$.

Nilai $E$ diperoleh dari rumus Mean Square Error:

$$ E = \frac{1}{3}((t_1 – y_1)^2+(t_2 – y_2)^2+(t_3- y_3)^2) $$

dari rumus di atas tidak ada variabel $w_{11}$ tetapi kita bisa coba “jalan mundur” lagi. Kita ingat-ingat lagi dari mana nilai setiap variabel $y$ berasal.

$$ \begin{eqnarray}
y_1 & = \sigma \left ( w_{11}x_{1} + w_{21}x_{2} + w_{31}x_{3} + w_{41}x_{4} + b_1 \right) \nonumber \\
y_2 & = \sigma \left ( w_{12}x_{1} + w_{22}x_{2} + w_{32}x_{3} + w_{42}x_{4} + b_2 \right) \nonumber \\
y_3 & = \sigma \left ( w_{13}x_{1} + w_{23}x_{2} + w_{33}x_{3} + w_{43}x_{4} + b_3 \right ) \nonumber \end{eqnarray}$$

dari sini terlihat variabel $w_{11}$ ada di perhitungan $y_1$ yang secara tidak langsung berpengaruh ke nilai $E$. Hal ini yang disebut dengan chaining atau rantaian.

Dasar turunan

Setelah kita memahami hubungan $E$ dan $w_{11}$ langkah selanjutnya adalah kita pahami bagaimana dasar menghitung turunannya. Disini kita menggunakan turunan parsial yang bedanya dengan turunan biasa adalah fungsi bisa mengandung lebih dari satu variabel. Selain itu, kita tidak menggunakan simbol $d$ tetapi turunan parsial menggunakan simbol $\partial$. Dari sekian banyak materi turunan jaman SMA kita cukup mengingat beberapa aturan saja (aturan no. 5 tidak diajarkan di SMA):

  1. jika $f(x) = x^n$ maka $\frac{\partial f(x)}{\partial x} = nx^{n-1}$
  2. jika $f(x) = u(x) + v(x)$ maka $\frac{\partial f(x)}{\partial x} = \frac{\partial u(x)}{\partial x} + \frac{\partial v(x)}{\partial x}$
  3. jika $f(x, y) = u(x) + v(y)$ maka $\frac{\partial f(x)}{\partial x} = \frac{\partial u(x)}{\partial x} + 0$
  4. jika $f(x) = f(g(x))$ maka $\frac{\partial f(x)}{\partial x} = \frac{\partial f(x)}{\partial g(x)} \times \frac{\partial g(x)}{\partial x}$
  5. jika $f(x) = \sigma(x)$ dengan $\sigma(x)$ adalah fungsi sigmoid, maka $\frac{\partial f(x)}{\partial x} = f(x)(1- f(x))$

Menghitung turunan

Nah, mari kita menghitung nilai $ \frac{\partial E}{\partial w} $ dengan beberapa langkah menggunakan aturan perhitungan yang disebutkan sebelumnya.

Langkah 1
Menggunakan aturan no. 4 di atas kita bisa mengubah $ \frac{\partial E}{\partial w_{11}} $ menjadi berikut:

$$ \frac{\partial E}{\partial w_{11}} = \frac{\partial E}{\partial y_1} \times \frac{\partial y_1}{\partial w_{11}}$$

Kita selesaikan bagian pertamanya, menggunakan aturan no. 3 dan no. 4 di atas, maka:

$$ \begin{eqnarray}
& E &= \frac{1}{3}((t_1 – y_1)^2+(t_2 – y_2)^2+(t_3- y_3)^2) \nonumber \\
& \frac{\partial E}{\partial y_1} & = 2 \frac{1}{3}(t_1 – y_1)^{2-1}-1+ 0 + 0 \nonumber \\
& & = – \frac{2}{3}(t_1 – y_1) \nonumber \end{eqnarray}$$

Langkah 2
Untuk bagian keduanya kita lihat kembali rumus asli untuk menghitung $y_1$. Fungsi sigma di sini bisa kita pecah menjadi fungsi yang lain. Misalnya kita definisikan $z_1$ adalah sebagai berikut:

$$ z_1 = w_{11}x_{1} + w_{21}x_{2} + w_{31}x_{3} + w_{41}x_{4} + b_1 $$

maka fungsi $y_1$ menjadi

$$ y_1 = \sigma(z_1) $$

Dengan aturan no. 4 kita bisa memecah kembali $\frac{\partial y_1}{\partial w_{11}}$ menjadi:

$$ \frac{\partial y_1}{\partial w_{11}} = \frac{\partial y_1}{\partial z_1} \times \frac{\partial z_1}{\partial w_{11}}$$

Kita selesaikan bagian $\frac{\partial y_1}{\partial z_1}$ dengan aturan no. 5:

$$ \begin{eqnarray}
& y_1 &= \sigma(z_1) \nonumber \\
& \frac{\partial y_1}{\partial z_1} &= y_1 ( 1 – y _1) \end{eqnarray}$$

lalu untuk bagian $\frac{\partial z_1}{\partial w_{11}}$ kita selesaikan menggunakan aturan no. 2 dan no. 3, menjadi:

$$ \begin{eqnarray}
& z_1 &= w_{11}x_{1} + w_{21}x_{2} + w_{31}x_{3} + w_{41}x_{4} + b_1 \nonumber \\
& \frac{\partial z_1}{\partial w_{11}} &= x_{1} + 0 + 0 + 0 + 0 \nonumber \\
& &= x_1 \end{eqnarray}$$

Gabungkan semua
Secara ringkas dari perhitungan-perhitungan di atas, maka nilai dari $ \frac{\partial E}{\partial w_{11}} $ adalah:

$$ \begin{eqnarray}
& \frac{\partial E}{\partial w_{11}} &= \frac{\partial E}{\partial y_{1}} \times \frac{\partial y_1}{\partial z_{1}} \times \frac{\partial z_1}{\partial w_{11}} \nonumber \\
& &= – \frac{2}{3}(t_1 – y_1) \times y_1 ( 1 – y _1) \times x_1
\end{eqnarray}$$

Jika diinputkan dengan angka maka:

$$ \begin{eqnarray}
& \frac{\partial E}{\partial w_{11}} &= \frac{2}{3}(t_1 – y_1) \times y_1 ( 1 – y _1) \times x_1 \nonumber \\
& & = – \frac{2}{3}(0 – 0.72) \times 0.72 ( 1 – 0.72) \times 1 \\
& & = 0.0967 \end{eqnarray}$$

Sehingga untuk memperbarui bobot $w_{11}$ nilai yang baru dengan nilai $\alpha=0.5$ (contoh) adalah:

$$ \begin{eqnarray}
& w_{11new} &= w_{11old} – \alpha \frac{\partial E}{\partial w_{11}} \nonumber \\
& &= 0.1 – (0.5)(0.0967) \nonumber \\
& &= 0.0516 \end{eqnarray}$$

Mengupdate semua bobot

INGAT! perhitungan diatas belum selesai memperbarui semua bobot dan bias, proses ini kita lakukan ke semua bobot $w$ dan bias $b$.

Tetapi jangan takut, karena sudah dapat rumus turunannya, kita bisa langsung lihat pola rumusnya. Misalnya untuk $w_{21}$ kita bisa cukup mengubah bagian nilai $\frac{\partial z_1}{\partial w_{21}}$ ketika menghitung turunan (karena $w_{21}$ masih sama-sama bagian dari $y_1$).

$$ \begin{eqnarray}
& \frac{\partial E}{\partial w_{21}} &= \frac{\partial E}{\partial y_{1}} \times \frac{\partial y_1}{\partial z_{1}} \times \frac{\partial z_1}{\partial w_{21}} \nonumber \\
& &= \frac{2}{3}(t_1 – y_1) \times y_1 ( 1 – y _1) \times x_2 \nonumber \\
& & = -\frac{2}{3}(0 – 0.72) \times 0.72 ( 1 – 0.72) \times 2 \\
& & = 0.1934 \end{eqnarray}$$

$$ \begin{eqnarray}
& w_{21new} &= w_{21old} – \alpha \frac{\partial E}{\partial w_{21}} \nonumber \\
& &= 0.2 – (0.5)(0.1934) \nonumber \\
& &= 0.1033 \end{eqnarray}$$

Namun, agak berbeda jika kita ingin memperbarui nilai $w_{12}$ hal ini karena jika diperhatikan $w_{12}$ tidak ikut membangun nilai $y_1$ tetapi berada dipembentukan $y_2$. Maka untuk menghitung turunannya menjadi beda:

$$ \begin{eqnarray}
& \frac{\partial E}{\partial w_{12}} &= \frac{\partial E}{\partial y_{2}} \times \frac{\partial y_2}{\partial z_{2}} \times \frac{\partial z_2}{\partial w_{12}} \nonumber \\
& &= \frac{2}{3}(t_2 – y_2) \times y_2 ( 1 – y _2) \times x_1 \nonumber \\
& & = -\frac{2}{3}(1 – 0.89) \times 0.89 ( 1 – 0.89) \times 1 \\
& & = -0.0071 \end{eqnarray}$$

$$ \begin{eqnarray}
& w_{12new} &= w_{12old} – \alpha \frac{\partial E}{\partial w_{12}} \nonumber \\
& &= 0.2 – (0.5)(-0.0071) \nonumber \\
& &= 0.2035 \end{eqnarray}$$

Evaluasi

Setelah melakukan backpropagation untuk semua bobot dan bias, maka akan diperoleh hasil bobot sebagai berikut:

$$ \begin{bmatrix}
w_{11} = 0.051 & w_{12} = 0.203 & w_{13} = 0.287 \\
w_{21} = 0.103 & w_{22} = 0.106 & w_{23} = 0.275 \\
w_{31} = 0.075 & w_{32} = 0.301 & w_{33} = 0.193 \\
w_{41} = 0.103 & w_{42} = 0.306 & w_{43} = 0.075
\end{bmatrix} $$

$$ [b_1=-0.19, b_2 = 1.01, b_3=1.95]$$

Untuk mengevaluasi kita bisa mengecek kembali hasilnya dengan forward propagation (tanpa perlu backpropagation). Jika kita lakukan forward propagation, maka akan diperoleh nilai $y$ sebagai berikut:

$$ [y_1=0.57, y_2 = 0.89, y_3=0.95]$$

Jika kita hitung errornya maka akan terjadi perubahan nilai dari sebelum dilakukan backpropagation. Nilai error telah menjadi lebih kecil dari sebelumnya (error sebelumnya 0.483):

$$\begin{eqnarray}
& E & = \frac{1}{3} \sum_{i=1}^3 (target_i – prediksi_i)^2 \nonumber \\
& & = \frac{1}{3}((t_1 – y_1)^2+(t_2 – y_2)^2+(t_3- y_3)^2) \nonumber \\
& & = \frac{1}{3}((0 – 0.57)^2+(1 – 0.89)^2+(0- 0.95)^2) \nonumber \\
& & = 0.413 \nonumber \
\end{eqnarray}$$

Hal tersebut menandakan backpropagation kita telah berhasil 🙂

Proses diatas adalah proses iterasi 1 kali backpropagation. Pada kenyataannya proses ini dilakukan berulang kali untuk mendapatkan hasil yang optimal.

Proses implementasi akan dibahas di post selanjutnya insyaAllah. Sekian, jika ada yang ditanyakan seputar rumus atau perhitungannya, silakan bertanya di kolom komentar 😉 Terima kasih

Sumber gambar: flickr
artikel ini terinspirasi dari artikel Matt Mazur

About the author

Rian Adam

View all posts

Leave a Reply