Ticker

6/random/ticker-posts

Memahami Neural Networks: Panduan Lengkap untuk Pemula

Deep learning adalah topik yang sangat populer akhir-akhir ini. Tapi apa yang membuatnya istimewa dan membedakannya dari aspek lain machine learning? Itu adalah pertanyaan yang dalam (maafkan plesetannya). Untuk mulai menjawabnya, kita perlu mempelajari dasar-dasar neural networks. Neural networks adalah "kuda kerja" dari deep learning. Dan meskipun mungkin terlihat seperti kotak hitam, sebenarnya (maaf, saya akan berhenti membuat plesetan yang buruk) mereka mencoba mencapai hal yang sama seperti model lainnya – membuat prediksi yang baik. Dalam postingan ini, kita akan menjelajahi seluk-beluk neural network sederhana. Dan pada akhirnya, semoga Anda (dan saya) akan mendapatkan pemahaman yang lebih dalam dan intuitif tentang bagaimana neural networks melakukan apa yang mereka lakukan. --- ## Pandangan dari Ketinggian 30.000 Kaki Mari mulai dengan gambaran tingkat tinggi sehingga kita tahu apa yang kita kerjakan. **Neural networks adalah jaringan multi-layer dari neuron (node biru dan magenta pada grafik di bawah) yang kita gunakan untuk mengklasifikasikan sesuatu, membuat prediksi, dll.** Di bawah ini adalah diagram neural network sederhana dengan lima input, 5 output, dan dua hidden layer neuron. Neural network with two hidden layers *Neural network dengan dua hidden layer* Dimulai dari kiri, kita memiliki: 1. Layer input model kita dalam warna oranye. 2. Hidden layer pertama neuron kita dalam warna biru. 3. Hidden layer kedua neuron kita dalam warna magenta. 4. Layer output (alias prediksi) model kita dalam warna hijau. Panah yang menghubungkan titik-titik menunjukkan bagaimana semua neuron saling terhubung dan bagaimana data bergerak dari layer input semua jalan sampai ke layer output. Nanti kita akan menghitung langkah demi langkah setiap nilai output. Kita juga akan melihat bagaimana neural network belajar dari kesalahannya menggunakan proses yang dikenal sebagai backpropagation. --- ## Mencari Arah Kita Tapi pertama-tama mari kita cari arah kita. Apa sebenarnya yang dicoba dilakukan oleh neural network? Seperti model lainnya, ia mencoba membuat prediksi yang baik. Kita memiliki serangkaian input dan serangkaian nilai target – dan kita mencoba mendapatkan prediksi yang sesuai dengan nilai target tersebut sedekat mungkin. Lupakan untuk sesaat gambar neural network yang lebih rumit yang saya gambar di atas dan fokus pada yang lebih sederhana di bawah ini. Neural network with two hidden layers *Logistic regression (dengan hanya satu fitur) diimplementasikan melalui neural network* Ini adalah logistic regression satu fitur (kita memberikan model hanya satu variabel X) yang dinyatakan melalui neural network (jika Anda perlu penyegaran tentang logistic regression, [saya menulis tentang itu di sini](https://towardsdatascience.com/understanding-logistic-regression-using-a-simple-example-163de52ea900)). Untuk melihat bagaimana mereka terhubung, kita dapat menulis ulang persamaan logistic regression menggunakan kode warna neural network kita. Logistic regression (with only one feature) implemented via a neural network *Persamaan logistic regression* Mari kita periksa setiap elemen: 1. X (dalam oranye) adalah input kita, satu-satunya fitur yang kita berikan kepada model kita untuk menghitung prediksi. 2. B1 (dalam turquoise, alias hijau-biru) adalah parameter slope yang diestimasi dari logistic regression kita – B1 memberi tahu kita seberapa besar Log_Odds berubah saat X berubah. Logistic regression equation**Perhatikan bahwa B1 hidup pada garis turquoise, yang menghubungkan input X ke neuron biru di Hidden Layer 1**. 3. B0 (dalam biru) adalah bias – sangat mirip dengan istilah intercept dari regresi. Perbedaan utamanya adalah bahwa dalam neural networks, setiap neuron memiliki istilah biasnya sendiri (sedangkan dalam regresi, model memiliki satu istilah intercept). 4. Neuron biru juga mencakup [sigmoid activation function](https://en.wikipedia.org/wiki/Sigmoid_function) (ditandai dengan garis melengkung di dalam lingkaran biru). Ingat bahwa sigmoid function adalah yang kita gunakan [untuk pergi dari log-odds ke probabilitas (lakukan pencarian control-f untuk "sigmoid" di postingan saya sebelumnya)](https://towardsdatascience.com/understanding-logistic-regression-using-a-simple-example-163de52ea900). 5. Dan akhirnya kita mendapatkan probabilitas prediksi dengan menerapkan sigmoid function ke kuantitas (B1*X + B0). Tidak terlalu buruk kan? Jadi mari kita rangkum. Neural network super sederhana hanya terdiri dari komponen-kponen berikut: - Koneksi (meskipun dalam praktiknya, biasanya akan ada beberapa koneksi, masing-masing dengan bobotnya sendiri, yang masuk ke neuron tertentu), dengan bobot "hidup di dalamnya", yang mentransformasi input Anda (menggunakan B1) dan memberikannya ke neuron. - Neuron yang mencakup istilah bias (B0) dan activation function (sigmoid dalam kasus kita). **Dan dua objek ini adalah blok bangunan fundamental dari neural network**. Neural network yang lebih kompleks hanyalah model dengan lebih banyak hidden layer dan itu berarti lebih banyak neuron dan lebih banyak koneksi antar neuron. Dan web koneksi yang lebih kompleks ini (dan bobot dan bias) adalah yang memungkinkan neural network untuk "mempelajari" hubungan rumit yang tersembunyi dalam data kita. --- ## Mari Tambahkan Sedikit Kompleksitas Sekarang Sekarang setelah kita memiliki kerangka dasar, mari kembali ke neural network yang sedikit lebih rumit dan lihat bagaimana ia pergi dari input ke output. Ini dia lagi untuk referensi: Our slightly more complicated neural network *Neural network yang sedikit lebih rumit kita* Hidden layer pertama terdiri dari dua neuron. Jadi untuk menghubungkan semua lima input ke neuron di Hidden Layer 1, kita membutuhkan sepuluh koneksi. Gambar berikutnya (di bawah) menunjukkan hanya koneksi antara Input 1 dan Hidden Layer 1. The connections between Input 1 and Hidden Layer 1 *Koneksi antara Input 1 dan Hidden Layer 1* Perhatikan notasi kita untuk bobot yang hidup dalam koneksi – W1,1 menunjukkan bobot yang hidup dalam koneksi antara Input 1 dan Neuron 1 dan W1,2 menunjukkan bobot dalam koneksi antara Input 1 dan Neuron 2. Jadi notasi umum yang akan saya ikuti adalah W**a,b** menunjukkan bobot pada koneksi antara Input **a** (atau Neuron **a**) dan Neuron **b**. Sekarang mari kita hitung output dari setiap neuron di Hidden Layer 1 (dikenal sebagai activations). Kita melakukannya menggunakan rumus berikut (**W** menunjukkan bobot, **In** menunjukkan input). ``` Z1 = W1*In1 + W2*In2 + W3*In3 + W4*In4 + W5*In5 + Bias_Neuron1 Neuron 1 Activation = Sigmoid(Z1) ``` Kita dapat menggunakan matriks matematika untuk merangkum perhitungan ini (ingat aturan notasi kita – misalnya, W4,2 menunjukkan bobot yang hidup dalam koneksi antara Input 4 dan Neuron 2): Matrix math makes our life easier *Matriks matematika membuat hidup kita lebih mudah* Untuk setiap layer neural network di mana layer sebelumnya adalah **m** elemen dalam dan layer saat ini adalah **n** elemen dalam, ini digeneralisasi menjadi: ``` [W] @ [X] + [Bias] = [Z] ``` Dimana [W] adalah matriks bobot **n by m** Anda (koneksi antara layer sebelumnya dan layer saat ini), [X] adalah matriks **m by 1** Anda dari input awal atau activations dari layer sebelumnya, [Bias] adalah matriks **n by 1** Anda dari bias neuron, dan [Z] adalah matriks **n by 1** Anda dari output intermediate. **Dalam persamaan sebelumnya, saya mengikuti notasi Python dan menggunakan @ untuk menunjukkan perkalian matriks**. Setelah kita memiliki [Z], kita dapat menerapkan activation function (sigmoid dalam kasus kita) ke setiap elemen [Z] dan itu memberi kita output neuron (activations) untuk layer saat ini. Akhirnya sebelum kita melanjutkan, mari kita petakan secara visual setiap elemen ini kembali ke grafik neural network kita untuk mengikat semuanya ([Bias] tertanam dalam neuron biru). Visualizing [W], [X], and [Z] 

 *Memvisualisasikan [W], [X], dan [Z]* Dengan berulang kali menghitung [Z] dan menerapkan activation function ke dalamnya untuk setiap layer berturut-turut, kita dapat bergerak dari input ke output. Proses ini dikenal sebagai forward propagation. Sekarang setelah kita tahu bagaimana output dihitung, saatnya mulai mengevaluasi kualitas output dan melatih neural network kita. --- ## Saatnya Neural Network Belajar Ini akan menjadi postingan yang panjang jadi silakan istirahat kopi sekarang. Masih dengan saya? Keren! Sekarang setelah kita tahu bagaimana nilai output neural network dihitung, saatnya melatihnya. > Proses pelatihan neural network, pada tingkat tinggi, seperti model data science lainnya – **definisikan cost function dan gunakan [gradient descent optimization](https://ml-cheatsheet.readthedocs.io/en/latest/gradient_descent.html) untuk meminimalkannya**. Pertama mari kita pikirkan tuas apa yang bisa kita tarik untuk meminimalkan cost function. Dalam regresi linear atau logistic tradisional kita mencari koefisien beta (B0, B1, B2, dll.) yang meminimalkan cost function. Untuk neural network, kita melakukan hal yang sama tetapi pada skala yang jauh lebih besar dan lebih rumit. Dalam regresi tradisional, kita dapat mengubah beta tertentu secara terisolasi tanpa mempengaruhi koefisien beta lainnya. Jadi dengan menerapkan kejutan terisolasi kecil pada setiap koefisien beta dan mengukur dampaknya pada cost function, relatif mudah untuk mengetahui ke arah mana kita perlu bergerak untuk mengurangi dan akhirnya meminimalkan cost function. Five feature logistic regression implemented via a neural network *Lima fitur logistic regression diimplementasikan melalui neural network* **Dalam neural network, mengubah bobot satu koneksi (atau bias neuron) memiliki efek bergema di semua neuron lain dan aktivasi mereka di layer berikutnya**. **Itu karena setiap neuron dalam neural network seperti model kecilnya sendiri**. Misalnya, jika kita menginginkan logistic regression lima fitur, kita bisa mengekspresikannya melalui neural network, seperti yang di sebelah kiri, menggunakan hanya satu neuron tunggal! > Jadi setiap hidden layer neural network pada dasarnya adalah **tumpukan model** (setiap neuron individu dalam layer bertindak seperti modelnya sendiri) **yang outputnya masuk ke lebih banyak model di hilir** (setiap hidden layer berturut-turut dari neural network menahan lebih banyak neuron). ### Cost Function Jadi mengingat semua kompleksitas ini, apa yang bisa kita lakukan? Sebenarnya tidak terlalu buruk. Mari kita lakukan langkah demi langkah. Pertama, izinkan saya menyatakan tujuan kita dengan jelas. Mengingat serangkaian input pelatihan (fitur kita) dan hasil (target yang kita coba prediksi): > Kita ingin menemukan set bobot (ingat bahwa setiap garis penghubung antara dua elemen dalam neural network menampung bobot) dan bias (setiap neuron menampung bias) yang meminimalkan cost function kita – dimana cost function adalah perkiraan seberapa salah prediksi kita relatif terhadap hasil target. Untuk melatih neural network kita, kita akan menggunakan [Mean Squared Error (MSE)](https://en.wikipedia.org/wiki/Mean_squared_error) sebagai cost function: ``` MSE = Sum [ ( Prediction – Actual )² ] (1 / num_observations) ``` MSE model memberi tahu kita rata-rata seberapa salah kita tetapi dengan sentuhan – dengan mengkuadratkan kesalahan prediksi kita sebelum merata-ratakannya, kita menghukum prediksi yang jauh dari jauh lebih keras daripada yang hanya sedikit salah. Cost function dari regresi linear dan logistic regression beroperasi dengan cara yang sangat mirip. Oke keren, kita memiliki cost function untuk diminimalkan. Saatnya mengaktifkan [gradient descent](https://ml-cheatsheet.readthedocs.io/en/latest/gradient_descent.html) kan? Tidak begitu cepat – untuk menggunakan gradient descent, kita perlu mengetahui gradien cost function kita, vektor yang menunjuk ke arah kemiringan terbesar (kita ingin berulang kali mengambil langkah ke arah yang berlawanan dari gradien untuk akhirnya sampai di minimum). Kecuali dalam neural network kita memiliki begitu banyak bobot dan bias yang bisa diubah yang semuanya saling terhubung. Bagaimana kita akan menghitung gradien dari semua itu? Di bagian berikutnya, kita akan melihat bagaimana backpropagation membantu kita menangani masalah ini. ### Tinjauan Cepat Gradient Descent Gradien fungsi adalah vektor yang elemennya adalah turunan parsialnya terhadap setiap parameter. Misalnya, jika kita mencoba meminimalkan cost function, C(B0, B1), dengan hanya dua parameter yang bisa diubah, B0 dan B1, gradiennya adalah: ``` Gradien dari C(B0, B1) = [ [dC/dB0], [dC/dB1] ] ``` Jadi setiap elemen gradien memberi tahu kita bagaimana cost function akan berubah jika kita menerapkan perubahan kecil pada parameter tertentu – jadi kita tahu apa yang harus di-tweak dan seberapa banyak. Untuk merangkum, kita bisa berbaris menuju minimum dengan mengikuti langkah-langkah ini: Illustration of Gradient Descent *Ilustrasi Gradient Descent* 1. Hitung gradien "lokasi kita saat ini" (hitung gradien menggunakan nilai parameter kita saat ini). 2. Ubah setiap parameter dengan jumlah yang proporsional terhadap elemen gradiennya dan ke arah yang berlawanan dari elemen gradiennya. Misalnya, jika turunan parsial cost function kita terhadap B0 positif tetapi kecil dan turunan parsial terhadap B1 negatif dan besar, maka kita ingin mengurangi B0 dengan jumlah kecil dan meningkatkan B1 dengan jumlah besar untuk menurunkan cost function kita. 3. Hitung ulang gradien menggunakan nilai parameter baru yang kita tweak dan ulangi langkah-langkah sebelumnya sampai kita sampai di minimum. --- ## Backpropagation Saya akan menunda ke [buku teks yang hebat ini (online dan gratis!) untuk matematika terperinci (jika Anda ingin memahami neural networks lebih dalam, pasti periksa)](http://neuralnetworksanddeeplearning.com/). Sebaliknya kita akan melakukan yang terbaik untuk membangun pemahaman intuitif tentang bagaimana dan mengapa backpropagation bekerja. Ingat bahwa forward propagation adalah proses bergerak maju melalui neural network (dari input ke output akhir atau prediksi). Backpropagation adalah kebalikannya. Kecuali bukan sinyal, kita memindahkan kesalahan mundur melalui model kita. Beberapa visualisasi sederhana sangat membantu ketika saya mencoba memahami proses backpropagation. Di bawah ini adalah gambaran mental saya tentang neural network sederhana saat forward propagates dari input ke output. Prosesnya dapat diringkas dengan langkah-langkah berikut: - Input dimasukkan ke layer neuron biru dan dimodifikasi oleh bobot, bias, dan sigmoid di setiap neuron untuk mendapatkan activations. Misalnya: _Activation_1 = Sigmoid( Bias_1 + W1*Input _1 )_ - Activation 1 dan Activation 2, yang keluar dari layer biru dimasukkan ke neuron magenta, yang menggunakannya untuk menghasilkan output activation akhir. Dan tujuan forward propagation adalah menghitung activations di setiap neuron untuk setiap hidden layer berturut-turut sampai kita sampai di output. Forward propagation in a neural network *Forward propagation dalam neural network* Sekarang mari kita balik saja. Jika Anda mengikuti panah merah (pada gambar di bawah), Anda akan memperhatikan bahwa kita sekarang mulai dari output neuron magenta. Itu adalah output activation kita, yang kita gunakan untuk membuat prediksi, dan sumber kesalahan utama dalam model kita. **Kemudian kita memindahkan kesalahan ini mundur melalui model kita melalui bobot dan koneksi yang sama yang kita gunakan untuk forward propagating sinyal kita** (jadi bukan Activation 1, sekarang kita memiliki Error1 – kesalahan yang dapat dikaitkan dengan neuron biru atas). Ingat kita mengatakan bahwa tujuan forward propagation adalah menghitung neuron activations layer demi layer sampai kita sampai di output? Kita sekarang dapat menyatakan tujuan backpropagation dengan cara yang sama: > Kita ingin menghitung kesalahan yang dapat dikaitkan dengan setiap neuron (saya hanya akan merujuk pada kuantitas kesalahan ini sebagai kesalahan neuron karena mengatakan "dapat dikaitkan" lagi dan lagi tidak menyenangkan) mulai dari layer yang paling dekat dengan output semua jalan kembali ke layer awal model kita. Backpropagation in a neural network *Backpropagation dalam neural network* Jadi mengapa kita peduli dengan kesalahan untuk setiap neuron? Ingat bahwa dua blok bangunan neural network adalah koneksi yang meneruskan sinyal ke neuron tertentu (dengan bobot hidup di setiap koneksi) dan neuron itu sendiri (dengan bias). **Bobot dan bias ini di seluruh jaringan juga merupakan dial yang kita tweak untuk mengubah prediksi yang dibuat oleh model**. Bagian ini sangat penting: > **Magnitudo kesalahan neuron tertentu** (relatif terhadap kesalahan semua neuron lain) **secara langsung proporsional terhadap dampak output neuron itu (alias activation) pada cost function kita**. Jadi kesalahan setiap neuron adalah proxy untuk turunan parsial cost function terhadap input neuron itu. Ini masuk akal secara intuitif – jika neuron tertentu memiliki kesalahan yang jauh lebih besar daripada semua yang lain, maka tweaking bobot dan bias neuron yang bermasalah akan memiliki dampak yang lebih besar pada kesalahan total model kita daripada mempermainkan neuron lainnya. Dan turunan parsial terhadap setiap bobot dan bias adalah elemen individu yang menyusun vektor gradien cost function kita. **Jadi pada dasarnya backpropagation memungkinkan kita menghitung kesalahan yang dapat dikaitkan dengan setiap neuron dan itu pada gilirannya memungkinkan kita menghitung turunan parsial dan akhirnya gradien sehingga kita dapat menggunakan gradient descent**. Hurray! ### Analogi yang Membantu – The Blame Game Itu banyak untuk dicerna jadi semoga analogi ini akan membantu. Hampir semua orang pernah memiliki rekan kerja yang mengerikan di beberapa titik dalam hidupnya – seseorang yang akan selalu bermain blame game dan melempar rekan kerja atau bawahan di bawah bus ketika hal-hal salah. Nah neuron, melalui backpropagation, adalah master dari blame game. Ketika kesalahan di-backpropagate ke neuron tertentu, **neuron itu akan dengan cepat dan efisien menunjuk jari ke rekan hulu (atau rekan) yang paling bersalah atas penyebab kesalahan** (yaitu neuron layer 4 akan menunjuk jari ke neuron layer 3, neuron layer 3 ke neuron layer 2, dan seterusnya). Neurons blame the most active upstream neurons 

 *Neuron menyalahkan neuron hulu yang paling aktif* --- **Sumber:** [Towards Data Science - Understanding Neural Networks](https://towardsdatascience.com/understanding-neural-networks-19020b758230/)

Post a Comment

0 Comments