$$
\definecolor{input}{RGB}{66, 133, 244}
\definecolor{output}{RGB}{219, 68, 55}
\definecolor{dinput}{RGB}{244, 180, 0}
\definecolor{doutput}{RGB}{15, 157, 88}
\definecolor{dweight}{RGB}{102, 0, 255}
$$
Algoritme propagasi mundur
Algoritme propagasi mundur sangatlah penting untuk melatih jaringan neural yang besar secara cepat. Artikel ini menjelaskan cara kerja algoritme.
Scroll ke bawah...
Jaringan neural sederhana
Di sebelah kanan, Anda akan melihat jaringan neural dengan satu masukan, satu node keluaran, dan dua lapisan tersembunyi dari setiap node.
Node di lapisan yang berdekatan dihubungkan dengan bobot \(w_{ij}\), yang merupakan parameter
jaringan.
Fungsi aktivasi
Setiap node memiliki total input \(\color{input}x\), fungsi aktivasi \(f(\color{input}x\color{black})\),
dan output \(\color{output}y\color{black}=f(\color{input}x\color{black})\).
\(f(\color{input}x\color{black})\) harus berupa fungsi non-linear, jika tidak, jaringan neural hanya akan dapat mempelajari model linear.
Fungsi aktivasi yang umum digunakan adalah
Fungsi sigmoid:
\(f(\color{input}x\color{black}) = \frac{1}{1+e^{-\color{input}x}}\).
Fungsi kesalahan
Tujuannya adalah untuk mempelajari bobot jaringan dari data secara otomatis sehingga output yang diprediksi \(\color{output}y_{output}\)
mendekati target \(\color{output}y_{target}\) untuk semua input \(\color{input}x_{input}\).
Untuk mengukur jarak dari tujuan, kami menggunakan fungsi error \(E\).
Fungsi error yang umum digunakan adalah \(E(\color{output}y_{output}\color{black},\color{output}y_{target}\color{black}) = \frac{1}{2}(\color{output}y_{output}\color{black} - \color{output}y_{target}\color{black})^2 \).
Propagasi maju
Kita mulai dengan mengambil contoh input \((\color{input}x_{input}\color{black},\color{output}y_{target}\color{black})\) dan memperbarui lapisan input jaringan.
Untuk menjaga konsistensi, kami menganggap input sama seperti node lainnya, tetapi tanpa fungsi aktivasi, sehingga output-nya sama dengan input-nya, yaitu \( \color{output}y_1 \color{black} = \color{input} x_{input} \).
Propagasi maju
Sekarang, kita memperbarui lapisan tersembunyi pertama. Kita mengambil output \(\color{output}y\) dari node di lapisan sebelumnya
dan menggunakan bobot untuk menghitung input \(\color{input}x\) dari node di lapisan berikutnya.
$$ \color{input} x_j \color{black} = $$$$ \sum_{i\in in(j)} w_{ij}\color{output} y_i\color{black} +b_j$$
Propagasi maju
Kemudian, kita memperbarui output node di lapisan tersembunyi pertama.
Untuk itu, kita menggunakan fungsi aktivasi, \( f(x) \).
$$ \color{output} y \color{black} = f(\color{input} x \color{black})$$
Propagasi maju
Dengan menggunakan 2 formula ini, kita lakukan penyebaran ke seluruh jaringan dan mendapatkan output akhir jaringan.
$$ \color{output} y \color{black} = f(\color{input} x \color{black})$$
$$ \color{input} x_j \color{black} = $$$$ \sum_{i\in in(j)} w_{ij}\color{output} y_i \color{black} + b_j$$
Turunan error
Algoritme propagasi mundur memutuskan berapa banyak yang akan diperbarui setiap bobot jaringan setelah membandingkan output yang diprediksi dengan output yang diinginkan untuk contoh tertentu.
Untuk itu, kita perlu menghitung perubahan error
sehubungan dengan setiap bobot \(\color{dweight}\frac{dE}{dw_{ij}}\).
Setelah memiliki turunan error, kita dapat memperbarui bobot menggunakan aturan pembaruan sederhana:
$$w_{ij} = w_{ij} - \alpha \color{dweight}\frac{dE}{dw_{ij}}$$
dengan \(\alpha\) adalah konstanta positif, yang disebut sebagai kecepatan pembelajaran, yang perlu disesuaikan secara empiris.
[Catatan] Aturan pembaruan sangat sederhana: jika error menurun saat bobot meningkat (\(\color{dweight}\frac{dE}{dw_{ij}}\color{black} < 0\)),
tingkatkan bobot, sebaliknya jika error meningkat saat bobot meningkat (\(\color{dweight}\frac{dE}{dw_{ij}} \color{black} > 0\)),
turunkan bobot.
Turunan tambahan
Untuk membantu menghitung \(\color{dweight}\frac{dE}{dw_{ij}}\), kita juga menyimpan dua turunan lagi untuk setiap node:
bagaimana error berubah dengan:
- total input node \(\color{dinput}\frac{dE}{dx}\) dan
- output node \(\color{doutput}\frac{dE}{dy}\).
Propagasi mundur
Mari kita mulai propagasi mundur turunan error.
Karena kita memiliki prediksi output dari contoh input tertentu ini, kita dapat menghitung perubahan error dengan output tersebut.
Mengingat fungsi error kita \(E = \frac{1}{2}(\color{output}y_{output}\color{black} - \color{output}y_{target}\color{black})^2\) , kita memiliki:
$$ \color{doutput} \frac{\partial E}{\partial y_{output}} \color{black} = \color{output} y_{output} \color{black} - \color{output} y_{target}$$
Propagasi mundur
Sekarang setelah \(\color{doutput} \frac{dE}{dy}\) kita bisa \(\color{dinput}\frac{dE}{dx}\) menggunakan aturan berantai.
$$\color{dinput} \frac{\partial E}{\partial x} \color{black} = \frac{dy}{dx}\color{doutput}\frac{\partial E}{\partial y} \color{black} = \frac{d}{dx}f(\color{input}x\color{black})\color{doutput}\frac{\partial E}{\partial y}$$
dengan \(\frac{d}{dx}f(\color{input}x\color{black}) = f(\color{input}x\color{black})(1 - f(\color{input}x\color{black}))\) jika \(f(\color{input}x\color{black})\) adalah fungsi aktivasi Sigmoid.
Propagasi mundur
Segera setelah memiliki turunan error yang sesuai dengan total input node,
kita dapat memperoleh turunan error sesuai dengan bobot yang dimasukkan ke node tersebut.
$$\color{dweight} \frac{\partial E}{\partial w_{ij}} \color{black} = \frac{\partial x_j}{\partial w_{ij}} \color{dinput}\frac{\partial E}{\partial x_j} \color{black} = \color{output}y_i \color{dinput} \frac{\partial E}{\partial x_j}$$
Propagasi mundur
Dan dengan menggunakan aturan berantai, kita juga bisa mendapatkan \(\frac{dE}{dy}\) dari lapisan sebelumnya. Kita telah membuat lingkaran penuh.
$$ \color{doutput} \frac{\partial E}{\partial y_i} \color{black} = \sum_{j\in out(i)} \frac{\partial x_j}{\partial y_i} \color{dinput} \frac{\partial E}{\partial x_j} \color{black} = \sum_{j\in out(i)} w_{ij} \color{dinput} \frac{\partial E}{\partial x_j}$$
Propagasi mundur
Kita hanya perlu mengulangi tiga formula sebelumnya sampai kita selesai menghitung semua turunan error.