Step-by-step Backpropagation Menggunakan Python

Pada artikel sebelumnya, kita telah melihat step-by-step perhitungan backpropagation. Pada artikel ini kita kan mengimplementasikan backpropagation menggunakan Python

Kita akan mengimplementasikan backpropagation berdasarkan contoh perhitungan pada artikel sebelumnya. Karenanya perlu diingat kembali arsitektur dan variabel-variabel yang kita miliki. Berikut arsitektur jaringan saraf tiruannya:

Variabel $x$ menunjukkan input dari jaringan saraf tiruan kita. Pada contoh ini kita hanya akan menerima sebuah input yang memiliki 3 fitur, yang bernilai $x_1=1.0$, $x_2=2.0$, dan $x_3=0.5 $ atau dapat kita tulis sebagai berikut:

$$ X = [1.0, 2.0, 0.5] $$

Untuk bobot jaringan, jika diperhatikan terdapat 6 bobot $w$ yang menghubungkan neuron input dengan neuron output. Untuk memudahkan penamaan, kita simbolkan $w_{ij}$ berarti bobot yang menghubungkan neuron input nomor $i$ ke neuron output nomor $j$. Penamaan ini kita ikuti dari artikel sebelumnya. Jika dituliskan dalam bentuk matriks dengan $i$ menjadi nomor baris dan $j$ menjadi nomor kolom maka tampak seperti berikut:

$$ \begin{bmatrix}
w_{11} = 0.2 & w_{12} = 0.3 \\
w_{21} = 0.3 & w_{22} = 0.1 \\
w_{31} = 0.3 & w_{32} = 0.2
\end{bmatrix} $$

atau bisa dituliskan:

$$ W = \begin{bmatrix}
0.2 & 0.3 \
0.3 & 0.1 \
0.3 & 0.2
\end{bmatrix} $$

Nilai bias b pada latihan ini kita beri nilai 0 untuk $b_1$ dan $b_2$:

$$ B = [0, 0]$$

Jangan lupa juga kita buatkan variabel $T$ yang merupakan label/target asli dari data (groundtruth) dengan nilai $t_1=0$ dan $t_2=1$ (sesuai dengan artikel sebelumnya). Nantinya hasil prediksi $Y$ dari model akan dibandingkan dengan variabel ini.

Pada proses di atas kita melakukan yang namanya vektorisasi atau mengubah representasi nilai menjadi vektor atau matriks. Nantinya ini akan memudahkan perhitungan kedepannya. Di Python proses deklarasi variabel-variabel tersebut dapat dituliskan sebagai berikut:

X = [1, 2, 0.5]
W = [[0.2, 0.3],
    [0.3, 0.1],
    [0.3, 0.2]]
b = [0, 0]
T = [0, 1]

Forward Propagation #1

Pada artikel sebelumnya dituliskan langkah pertama pada saat forward propagation adalah menghitung nilai $Z$. Perhitungan untuk masing-masing nilai Z adalah sebagai berikut:

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

$$ z_2 = w_{12}x_{1} + w_{22}x_{2} + w_{32}x_{3} + b_2 $$

Dari rumus di atas bisa dilihat proses mencari nilai Z bisa dilakukan menggunakan perkalian matriks seperti berikut:

$$ XW + B = Z $$

$$ \begin{bmatrix}x_1 & x_2 & x_3 \end{bmatrix} \begin{bmatrix}
w_{11} & w_{12} \\
w_{21} & w_{22} \\
w_{31} & w_{32} \\
\end{bmatrix} + \begin{bmatrix}b_1 & b_2\end{bmatrix} = \begin{bmatrix}z_1 & z_2\end{bmatrix}$$

$$ \begin{bmatrix}1.0 & 2.0 & 0.5\end{bmatrix} \begin{bmatrix}
0.2 & 0.3 \\
0.3 & 0.1 \\
0.3 & 0.2
\end{bmatrix} + \begin{bmatrix}0 & 0\end{bmatrix} = \begin{bmatrix}z_1 & z_2\end{bmatrix}$$

atau dalam Python dapat dilakukan menggunakan operasi perkalian matriks dari Numpy:

import numpy as np

Z = np.dot(X, W) + b
print(Z)
# output: [0.95 0.6 ]

Setelah diperoleh nilai $Z$ langkah selanjutnya adalah kita hitung nilai $Y$ sebagai berikut:

Untuk kerapian penulisan, di Python bisa kita buatkan fungsi `sigmoid()` terlebih dahulu.

def sigmoid(n):
    return 1 / (1 + np.exp(-n))

Y = sigmoid(Z)
print(Y)
# Output: [0.72111518 0.64565631]

Menghitung Error

Hasil dari $Y$ kita bandingkan dengan target $T$, kita hitung perbedaan nilai ini menggunakan MSE (Mean Squared Error)

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

dengan Python bisa dituliskan sebagai berikut:

E = 1/2 * sum((T-Y)**2)
print(E)
# output: 0.32278

Backpropagation menggunakan Python

Rumus untuk mengupdate bobot menggunakan backpropagation adalah sebagai berikut

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

Jadi kita perlu menghitung rumus tersebut untuk semua $w$. Sebagai awalan kita coba tuliskan rumus $\frac{\partial E}{\partial w}$ untuk semua nilai $w$ berdasarkan perhitungan di artikel sebelumnya.

$$\begin{eqnarray}
\frac{\partial E}{\partial w_{11}} &= – (t_1 – y_1) \cdot y_1 ( 1 – y _1) \cdot x_1 \nonumber \\
\frac{\partial E}{\partial w_{21}} &= – (t_1 – y_1) \cdot y_1 ( 1 – y _1) \cdot x_2 \nonumber \\
\frac{\partial E}{\partial w_{31}} &= – (t_1 – y_1) \cdot y_1 ( 1 – y _1) \cdot x_3 \nonumber \\
\frac{\partial E}{\partial w_{12}} &= – (t_2 – y_2) \cdot y_2 ( 1 – y _2) \cdot x_1 \nonumber \\
\frac{\partial E}{\partial w_{22}} &= – (t_2 – y_2) \cdot y_2 ( 1 – y _2) \cdot x_2 \nonumber \\
\frac{\partial E}{\partial w_{32}} &= – (t_2 – y_2) \cdot y_2 ( 1 – y _2) \cdot x_3 \nonumber
\end{eqnarray}$$

Dari rumus-rumus tersebut akan terlihat ada pola yang bisa digunakan, sehingga bisa dibuat perulangan sebagai berikut (sudah termasuk update bobot):

alpha = 0.5
for c in range(2): # neuron output
    for r in range(3): # neuron input
        # menghitung turunan
        delta = -1 * (T[c] - Y[c]) * Y[c] * (1 - Y[c]) * X[r]
        # update bobot
        W[r][c] = W[r][c] - alpha * delta

Dengan cara yang sama, kita bisa adaptasi perulangan tersebut untuk menghitung update dari bias. Perlu diingat, hanya ada satu bias untuk satu neuron output sehingga tidak perlu ada iterasi r.

alpha = 0.5
for c in range(2): # neuron output
    delta = -1 * (T[c] - Y[c]) * Y[c] * (1 - Y[c]) * 1
    b[c] = b[c] - alpha * delta

Setelah dua sintaks di atas dijalankan, maka nilai bobot W dan b akan sudah diupdate berdasarkan eror yang muncul.

Forward Propagation #2

Setelah diupdate, kita bisa cek kembali apakah bobot yang telah di update dapat menghasilkan eror yang lebih kecil. Kita ulangi proses forward propagation di atas.

Z = np.dot(X, W) + b
Y = sigmoid(Z)
E = 1/2 * sum((T-Y)**2)
print(E)
# output: 0.2318

Dari output error di atas, tampak error model sudah menurun dibanding error sebelumnya yang menandakan proses backpropagation telah berhasil! 🙂 kode lengkap tutorial ini bisa diakses di Google Colab ini

Penutup

Semoga artikel ini bermanfaat! nah selanjutnya jika ingin lebih mendalami jaringan saraf tiruan, silakan untuk mencoba implementasi jaringan saraf tiruan dengan package-package yang sudah ada:


Featured image credits: Flickr

About the author

Rian Adam

Lecturer at Universitas Islam Indonesia; Machine Learning Enthusiast

View all posts

Leave a Reply