Pengenalan Deep Learning Part 3 : BackPropagation Algorithm

Samuel Sena
9 min readNov 3, 2017

--

Pada Part 1 kita sudah sedikit disinggung tentang cara melakukan training pada neural network. Proses training terdiri dari 2 bagian utama yaitu Forward Pass dan Backward Pass. Panah biru dibawah ini adalah Forward Pass dan panah merah adalah backward pass.

Neural Network Training

Dalam Supervised Learning, training data terdiri dari input dan output/target. Pada saat forward pass, input akan di-”propagate” menuju output layer dan hasil prediksi output akan dibandingakan dengan target dengan menggunakan sebuah fungsi yang biasa disebut dengan Loss Function.

Lalu untuk apa loss function itu? Secara simple loss function digunakan untuk mengukur seberapa bagus performa dari neural network kita dalam melakukan prediksi terhadap target.

Ada berbagai macam loss function, namun yang paling sering digunakan adalah Squared Error (L2 Loss) untuk regresi. Sedangkan untuk klasifikasi yang biasa digunakan adalah Cross Entropy.

Backward Pass (Back-Propagation)

Simplenya proses ini bermaksud untuk menyesuaikan kembali tiap weight dan bias berdasarkan error yang didapat pada saat forward pass. Tahapan dari backprop adalah sebagai berikut :

  • Hitung gradient dari loss function terhadap semua parameter yang ada dengan cara mencari partial derivative (turunan parsial) dari fungsi tersebut. Disini kita bisa menggunakan metode Chain Rule (Kalkulus…:D). Untuk yang masih bingung apa itu gradient, mungkin ilustrasi dibawah ini bisa membantu.
By en:User:Dino, User:Lfahlberg — English Wikipedia, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=27661406
  • Update semua parameter (weight dan bias) menggunakan Stochastic Gradient Descent (SGD) dengan mengurangi atau menambahkan nilai weight lama dengan “sebagian” (learning rate) dari nilai gradient yang sudah kita dapat.

Siapkan kertas dan calculator. Yuk kita lihat contoh dibawah ini biar lebih jelas….

Neural network diatas terdiri dari 2 hidden layer. Hidden layer pertama menggunakan ReLU, hidden layer kedua menggunakan sigmoid dan terakhir output layer menggunakan linear sebagai activation function. Bias pada diagram diatas sebenarnya ada tetapi tidak digambarkan.

Terdapat 4 weight dan 4 bias diantara input layer dan hidden layer pertama, 8 weight dan 2 bias diantara hidden layer pertama dan kedua, 2 weight dan 1 bias diantara hidden layer kedua dan output layer. Sehingga total ada 21 parameter yang harus diupdate.

Kita akan mencoba untuk melakukan prediksi terhadap suatu nilai. Untuk initial weight dan bias, saya tentukan sendiri dengan nilai angka yang lebih enak dilihat :D

Forward Pass (Input -> Hidden Layer 1)

Disini kita akan melakukan forward pass data input menuju hidden layer 1. Yang dilakukan adalah melakukan perkalian (dot product) dan penjumlahan matrix antara input, weight dan bias.

Nilai diatas adalah input dari tiap node pada hidden layer 1. Semua nilai tersebut akan dikeluarkan setelah melalui activation function. Pada hidden layer 1 activation function yang kita gunakan adalah ReLU => f(x) = max(0, x). Sehingga output dari hidden layer 1 adalah sebagai berikut :

Forward Pass (Hidden Layer 1 -> Hidden Layer 2)

Sama seperti forward pass pada layer sebelumnya, output dari tiap neuron pada ReLU layer akan mengalir ke semua neuron pada Sigmoid layer.

Setelah activation function :

Forward Pass (Hidden Layer 2 -> Output)

Sama seperti forward pass pada layer sebelumnya, output dari tiap neuron pada Sigmoid layer akan mengalir ke neuron pada Linear layer (Output).

Setelah activation function :

Kita sudah sampai pada output layer dan sudah mendapatkan nilai prediksi output. Selanjutnya kita akan mencari loss dengan menggunakan squared error (L2 Loss).

Kenapa kok dikali 1/2? Nanti akan dijelaskan lebih lanjut

Activation Function Derivatives

Sebelum membahas tentang backward pass ada baiknya kalau kita mencari dulu turunun tiap activation function yang kita pakai.

ReLU Derivatives
Sigmoid Derivatives
Linear Derivatives

Backward Pass (Output -> Hidden Layer 2)

Hampir sama seperti pada forward pass, pada backward pass, loss akan mengalir menuju semua node pada hidden layer untuk dicari gradient nya. terhadap parameter yang akan diupdate. Misalkan kita ingin mengupdate parameter Wk1o, maka kita bisa gunakan chain rule seperti dibawah ini.

Chain Rule

Pertama kita akan mencari berapa besar perubahan Loss berdasarkan output. Sehingga kita harus mencari turunan parsial (partial derivative) dari loss function terhadap output, kita juga bisa menyebutnya sebagai gradient loss function terhadap output. Pada persamaan dibawah, loss akan dikalikan dengan 1/2, sebenarnya tujuannya agar saat diturunkan, fungsi loss akan menjadi 1 kali Loss (menetralisir turunan fungsi kuadrat).

Gradient Loss terhadap Oout

Selanjutnya kita akan mencari gradient dari Oout terhadap Oin. Karena activation function yang digunakan adalah Linear, maka turunannya sangat mudah dicari.

Gradient Oout terhadap Oin

Setelah itu kita akan cari gradient dari Oin terhadap Wk1o, Wk2o dan bias (bo). Perhatikan persamaan dibawah ini:

Terakhir kita akan menerapkan chain rule untuk mencari gradient loss terhadap weight dan bias.

Gradient Loss terhadap Weight Hidden Layer 2
Gradient Loss terhadap Bias0

Stochastic Gradient Descent (SGD) Update

SGD adalah algoritma yang digunakan untuk mengupdate parameter dalam hal ini weight dan bias. Algoritmanya cukup sederhana, pada dasarnya kita hanya mengurangi initial weight dengan “sebagian” dari nilai gradient yang sudah kita dapat.

Sebagian disini diwakili oleh hyper-parameter bernama learning rate (alpha). Sebagai contoh saja, kita gunakan 0.25 sebagai learning rate meskipun pada prakteknya learning rate 0.25 itu tidak ideal. (Nanti akan dibahas tentang setting hyper-parameter).

Parameter baru setelah diupdate

Cukup panjang memang kalau diruntut satu-satu. Tapi gpp biar lebih jelas aja :D. Kita lanjutkan lagi backprop untuk layer selanjutnya.

Backward Pass (Hidden Layer 2 -> Hidden Layer 1)

Kita bisa ulangi setiap step yang kita lakukan pada backward pass pada layer sebelumnya. Hanya saja kita harus lebih hati-hati karena relatif lebih rumit daripada backward pass pada layer sebelumnya. Hang on guys… :D

Chain Rule again :D

Untuk mencari gradient loss terhadap Wj1k1, lagi-lagi kita akan gunakan chain rule. Pertama kita akan mencari gradient loss terhadap K1out.

Lalu kita akan cari gradient K1out terhadap K1in. Kali ini kita menggunakan turunan dari sigmoid yang sudah kita cari diawal tadi.

Selanjutnya kita akan cari gradient K1in terhadap Wj1k1.

Sekarang kita bisa menghitung gradient loss terhadap Wj1k1 dengan menerapkan chain rule yang tadi.

Akhirnya kita mendapatkan gradientnya, perhatikan yang warna merah. Gradient dari sigmoid sudah cukup kecil yaitu 0.00249 dan setelah chain rule hasilnya tambah kecil lagi yaitu -0.00188

Fenomena inilah yang disebut dengan Vanishing Gradient dan merupakan alasan mengapa sigmoid sudah jarang digunakan lagi.

Perhitungan yang barusan kita lakukan tadi setelah diterapkan untuk semua parameter maka akan didapat semua gradient yang dibutuhkan untuk melakukan update.

Kita bisa lihat dibawah ini kalau gradientnya sangat kecil (vanish), sehingga semakin dekat sebuah node dengan input layer, maka semakin lama pula waktu yang dibutuhkan untuk melakukan training, karena gradient yang digunakan untuk melakukan update sangat kecil dan akan bertambah kecil lagi setelah dikalikan dengan learning rate :)

SGD Update (Hidden Layer 2 -> Hidden Layer 1)

Weight dan bias yang baru sangat mudah dicari setelah kita menemukan gradientnya. Tetap dengan learning rate sebesar 0.25 kita akan mendapatkan weight dan bias yang baru.

Perubahan weight dan bias sangat kecil

Backward Pass (Hidden Layer 1 -> Input Layer)

Kita akan lakukan lagi langkah-langkah yang sudah kita pelajari tadi. Kali ini kita akan melakukan update terhadap weight dan bias diantara input layer dan hidden layer 1.

Chain Rule

Pertama kita akan mencari gradient loss terhadap J1out. Kali Ini lebih rumit daripada perhitungan K1out. Karena J1out dipengaruhi oleh gradient yang berasal dari K2. Sehingga kita harus melihat Layer K sebagai satu kesatuan, bukan lagi K1 dan K2.

Lanjut dengan gradient J1out terhadap J1in.

Selanjutnya kita akan cari gradient J1in terhadap Wij1.

Pada akhirnya kita bisa menghitung gradient loss terhadap Wij1 dengan menerapkan chain rule.

Perhitungan yang baru saja kita lakukan tadi akan diterapkan untuk semua parameter. Maka didapat semua gradient yang dibutuhkan untuk melakukan update.

SGD Update (Hidden Layer 1 -> Input Layer)

Weight dan bias setelah parameter update

Akhirnya selesai juga. Kita sudah mendapatkan semua parameter yang baru. Nanti proses ini (forward pass dan backward pass) akan diulang terus menerus sampai kita dapatkan nilai Loss yang paling kecil.

Old Parameter vs New Parameter

Old Parameters
New Parameters

Contoh diatas hanya menggunakan satu buah data pada saat forward dan backward. Secara umum Gradient Descent ini terdiri dari 3 tipe, SGD yang kita pakai diatas, Batch Gradient Descent dan Mini-batch Gradient Descent.

Pada Batch Gradient Descent (BGD), model akan diupdate setelah semua data seleasai di-”propagate”. Sedangkan Mini-batch berada ditengah-tengah SGD dan BGD.

Mini-batch gradient descent melakukan forward dan backward pass pada sekelompok kecil training data. Misalnya melakukan update untuk setiap 32/64 buah data dan error yang dihitung adalah mean dari sekelompok training data tersebut.

Pada part ini kita sudah sama-sama belajar tentang backpropagation, gradient dan SGD. Nanti di part berikutnya kita akan coba belajar tentang Deep Learning Framework. So, stay tune guys… :D

Mungkin untuk bacaan selanjutnya bisa disimak tulisan Mas Karpathy tentang pentingnya kita memahami backprop. Disitu juga dibahas tentang “dying ReLU” juga.

Semoga post ini bermanfaat untuk kita semua yang ingin memahami tentang backpropagation.

--

--