5 poin oleh GN⁺ 2025-11-03 | 1 komentar | Bagikan ke WhatsApp
  • Backpropagation adalah inti dari pelatihan jaringan saraf, tetapi jika cara kerja internalnya tidak dipahami, dapat muncul kesalahan tak terduga karena ia merupakan struktur "abstraksi yang bocor (leaky abstraction)"
  • Fungsi aktivasi sigmoid atau tanh dapat menyebabkan vanishing gradient sehingga pelatihan berhenti jika inisialisasi bobot salah
  • ReLU dapat memicu fenomena dead ReLU, yaitu neuron menjadi nonaktif secara permanen saat input bernilai 0 atau kurang
  • Pada RNN, perkalian matriks yang berulang dapat menyebabkan exploding gradient, sehingga perlu menggunakan gradient clipping atau LSTM untuk mencegahnya
  • Jika tidak memahami cara kerja backpropagation, meskipun framework menanganinya secara otomatis, kemampuan debugging dan perbaikan model akan sangat menurun

Mengapa backpropagation perlu dipahami

  • Dalam kuliah CS231n di Stanford, tugas dirancang agar mahasiswa mengimplementasikan forward pass dan backpropagation secara langsung
    • Sebagian mahasiswa mengeluh karena menganggap itu tidak perlu, sebab framework seperti TensorFlow menghitung backpropagation secara otomatis
  • Namun, backpropagation adalah abstraksi yang bocor, bukan abstraksi yang sepenuhnya tertutup, sehingga tanpa memahami cara kerjanya, sulit mengetahui penyebab kegagalan pelatihan
  • Sikap seperti “framework akan mengurusnya sendiri” pada akhirnya menurunkan kemampuan desain model dan debugging

Vanishing gradient pada sigmoid

  • Fungsi nonlinier sigmoid atau tanh akan memasuki kondisi saturasi (saturation) ketika nilai input besar, sehingga output mendekati 0 atau 1
    • Pada saat itu, gradien lokal z(1-z)* menjadi 0, sehingga propagasi gradien terhenti saat backpropagation
    Iklan
  • Gradien maksimum sigmoid adalah 0,25, sehingga setiap kali melewati lapisan, sinyal menyusut menjadi 1/4 atau kurang
  • Akibatnya, kecepatan belajar lapisan bawah menjadi jauh lebih lambat dibanding lapisan atas
  • Karena itu, saat menggunakan lapisan sigmoid, perlu perhatian khusus pada inisialisasi bobot dan preprocessing data

Masalah dead ReLU

  • ReLU adalah fungsi yang membuat output menjadi 0 saat input 0 atau kurang
    • Jika output neuron bernilai 0 pada forward pass, maka saat backpropagation gradiennya juga menjadi 0, sehingga neuron tersebut dapat menjadi nonaktif permanen
  • Selama pelatihan, update bobot yang besar atau learning rate yang tinggi dapat membuat neuron terkunci dalam "keadaan mati"
  • Setelah pelatihan, ada juga kasus ketika sebagian besar neuron dalam jaringan menghasilkan 0
  • Karena itu, saat menggunakan ReLU, penyesuaian learning rate dan strategi inisialisasi sangat penting

Exploding gradient pada RNN

  • Dalam RNN sederhana, matriks hidden state (Whh) yang sama dikalikan berulang pada setiap time step
    • Saat backpropagation, gradien akan menuju 0 atau membesar tanpa batas tergantung pada besar eigenvalue matriks tersebut
  • Jika |b| < 1, terjadi vanishing gradient; jika |b| > 1, terjadi exploding gradient
  • Untuk mencegahnya, praktik umum adalah menerapkan gradient clipping atau menggunakan arsitektur LSTM
Iklan

Contoh clipping yang salah dalam kode DQN

  • Dalam implementasi DQN berbasis TensorFlow, ditemukan kode yang langsung melakukan clipping pada delta (error Q) dengan tf.clip_by_value
    • Pendekatan ini membuat gradien menjadi 0 ketika delta berada di luar rentang, sehingga pelatihan berhenti
  • Karena yang dimaksud sebenarnya adalah gradient clipping, seharusnya digunakan Huber loss sebagai gantinya
    • Dalam contoh kode, Huber loss diimplementasikan secara kondisional dengan menggabungkan tf.square dan tf.abs
  • Masalah ini dilaporkan sebagai isu di GitHub dan langsung diperbaiki

Kesimpulan

  • Backpropagation bukan sekadar alat otomatisasi, melainkan sistem credit assignment yang dapat menimbulkan konsekuensi kompleks
  • Tanpa memahami cara kerjanya, kita akan menghadapi ketidakstabilan model, kegagalan pelatihan, dan keterbatasan debugging
  • Backpropagation tidak sulit secara matematis, dan dapat dipelajari secara intuitif melalui kuliah dan tugas CS231n
  • Dengan memahami backpropagation, kemampuan merancang jaringan saraf dan memecahkan masalah akan meningkat pesat
  • Daripada hanya mengandalkan fitur autodiff dari framework, yang penting adalah memahami aliran backpropagation yang sebenarnya

1 komentar

 
GN⁺ 2025-11-03
Opini Hacker News
  • Sepertinya backpropagation mendapat reputasi buruk yang tidak semestinya di sini
    Sebenarnya pembahasan ini lebih tentang betapa tidak sempurnanya abstraksi gradient dan berbagai varian gradient descent dalam proses optimisasi daripada tentang backpropagation itu sendiri
    Backpropagation hanyalah algoritma untuk menghitung turunan dari fungsi komposisi, dan masalah seperti vanishing gradient yang muncul saat menumpuk sigmoid berkali-kali bukanlah masalah backpropagation melainkan sifat dari fungsi itu sendiri
    Alasan orang diminta mengimplementasikan backward pass secara langsung adalah agar mereka benar-benar merasakan bagaimana suku eksponensial bekerja dengan menghitung turunan sendiri

    • Aku paham maksudmu, tapi menurutku dalam kasus ini ‘koreksi kecil’ itu tidak terlalu berguna
      Intinya adalah bahwa dalam situasi tertentu detail backpropagation (termasuk perhitungan gradient) tidak bisa diabstraksikan
      Ini terutama berlaku saat memakai gradient descent, dan mungkin menjadi masalah yang lebih kecil pada algoritma optimisasi global lainnya
      Karena secara praktis saat ini satu-satunya cara menghitung gradient dalam deep learning adalah backpropagation, kebocoran abstraksi ini bersifat nyata
    • Menurutku itu bukan koreksi kecil, melainkan sanggahan yang sah terhadap kerangka konseptual yang keliru
      Aku menghargai kontribusi Karpathy, tetapi tulisan dan ceramahnya sering mengaburkan pembedaan konsep sehingga menimbulkan salah paham
      Dengan levelnya, orang wajar mengharapkan ketepatan yang lebih tinggi
  • Kontribusi Karpathy dalam pendidikan deep learning benar-benar luar biasa
    Dari tulisan-tulisan singkat sampai esai klasik tentang RNN, lalu kuliah di YouTube dan proyek GitHub, semuanya hebat
    nanochat yang baru dirilis juga contoh yang sangat bagus; contoh lengkap yang kecil dan jelas sangat membantu para pembelajar

    • Aku pernah merekomendasikan tulisan Karpathy kepada rekan-rekan yang sangat mendalami LLM, dan ternyata mereka tidak terlalu tertarik
      Belakangan aku sadar mereka lebih tertarik memercayai dan memanfaatkan LLM daripada memahaminya
      Faktanya, mereka lebih tertarik pada diskusi spekulatif seperti “masyarakat tempat mesin cerdas melakukan semua pekerjaan” daripada cara kerja LLM itu sendiri
    • Cara kerja Karpathy menarik
      Alih-alih sekadar “bertanya ke ChatGPT”, dia mencari sendiri, membaca kode, dan menemukan bug
      Pendekatan yang eksploratif seperti ini adalah pembelajaran yang sesungguhnya
  • Saat program magister, aku pernah mendapat tugas mengimplementasikan backpropagation secara langsung berdasarkan makalah
    Tugasnya adalah menulis forward pass dan backward pass hanya dengan operasi matematis, dan itu adalah pengalaman belajar terbaik tahun itu
    Tugas seperti ini biasanya tidak akan kita lakukan sendiri, tetapi saat dipaksa melakukannya manfaatnya sangat besar

    • Perbedaan pemahaman antara hanya membaca makalah dan mengimplementasikannya dalam kode sangat besar
    • Aku pernah mengimplementasikannya sendiri dengan Java waktu SMA, dan bagian tersulitnya adalah menulis perkalian matriks sendiri
      Aku juga membuat UI untuk memvisualisasikan bagaimana bobot dan bias berubah selama pelatihan
    • Aku penasaran apakah makalah itu tersedia untuk umum
  • Aku penasaran dengan hubungan antara backpropagation dan optimizer
    SGD hanya bergerak sederhana ke arah gradient, tetapi optimizer yang lebih canggih seperti Adam tidak memakai gradient secara langsung begitu saja, melainkan menerapkan normalisasi, momentum, clipping, dan sebagainya
    Kalau begitu, apakah perhitungan gradient yang akurat benar-benar diperlukan, atau cukup mengetahui arah kasarnya saja?

    • Dalam praktiknya gradient sebenarnya diaproksimasi dengan minibatch kecil, jadi setiap langkah bersifat noisy, dan justru noise itu membantu meningkatkan performa
      Ada riset terkait seperti makalah tentang noise pada SGD dan riset visualisasi
      Tetapi menebak arah secara kasar itu berbahaya — karena kelengkungan (Hessian) fungsi loss bisa berubah drastis
    • “Bukankah cukup tahu arahnya saja, bukan gradient yang tepat?” adalah pertanyaan lama
      Dari ide seperti inilah stochastic gradient descent lahir, dan lebih jauh lagi ada pendekatan seperti Direct Feedback Alignment
      Ringkasan Ben Recht tentang hubungan antara optimisasi dan reinforcement learning juga menarik
    • Backpropagation melakukan perhitungan turunan yang akurat hingga tingkat presisi numerik
      Yang penting bukan nilai fungsi loss itu sendiri, melainkan bentuk gradient dan kelengkungannya
      Optimizer seperti Adam menyesuaikan gradient dengan memperkirakan sensitivitas skala tiap parameter melalui aproksimasi orde pertama
      Optimisasi orde lebih tinggi tidak mungkin dilakukan pada fungsi nonlinier seperti ReLU
    • Menyesuaikan gradient bukanlah sekadar ‘fudge’
      Itu adalah langkah penting untuk mengatasi masalah vanishing gradient
      Di ruang berdimensi tinggi, kesalahan kecil pun bisa berdampak besar, jadi perhitungan gradient yang akurat sangat penting
    • Kalkulus itu sendiri tidak sulit
      Masalahnya justru bagaimana menghitung “arah perkiraan” itu
      Optimizer canggih seperti AdamW pun tetap menggunakan gradient sebagai inti
  • Sekitar tahun 2016, rasanya trik seperti gradient clipping jauh lebih sering dipakai
    Misalnya dalam makalah Alex Graves tahun 2013 Sequence Generation with RNNs, dia juga menyatakan memakai clipping untuk mencegah ledakan gradient pada LSTM
    Aku sendiri sampai pernah mengikuti kuliah khusus yang hanya membahas autograd PyTorch karena merasa pentingnya backpropagation

    • Dulu sepertinya ada lebih banyak trik karena orang bereksperimen dengan beragam arsitektur jaringan
      Sekarang framework sudah mendukung clipping, dan pemahaman terhadap masalah pelatihan juga meningkat
      Tapi bukan berarti masalahnya hilang — ReLU dan GELU masih menjadi fungsi aktivasi dasar, dan pelatihan LLM masih terasa dekat dengan ‘seni gelap’
      Smol Training Playbook dari Hugging Face adalah buktinya
  • Dalam jangka panjang, menurutku mungkin menguntungkan untuk melatih model yang tahan terhadap keragaman fungsi aktivasi
    Misalnya, jika ReLU, Swish, GELU, dan lainnya diganti-ganti secara acak selama pelatihan, kita bisa memperoleh semacam efek regularisasi seperti dropout
    Dengan begitu saat inferensi kita bahkan bisa menggantinya dengan fungsi yang biaya komputasinya paling murah

  • Judul asli “Yes you should understand backprop” jauh lebih jelas dan lebih baik

    • Justru karena backpropagation adalah abstraksi yang bocor, penting untuk membangun intuisi dengan menghitungnya sendiri secara manual
      Jika terlalu banyak bagian digantikan oleh kode, kita mudah terjebak dalam ilusi bahwa semuanya bekerja seperti sihir
      Pengalaman menghitung convolution dan backpropagation sendiri saat kuliah pascasarjana sangat membantu
  • Pertanyaan “kalau framework otomatis menghitung backward pass, kenapa harus menulisnya sendiri?”
    terasa mengkhawatirkan karena logikanya sama seperti “kalau ada kalkulator, kenapa harus belajar penjumlahan?”

    • Ada juga sanggahan
      Seperti memahami compiler, algoritma sorting, atau cara kerja transistor itu berguna, mempelajari backpropagation juga bernilai
      Hanya saja, karena waktu belajar terbatas, pertanyaannya adalah apakah mempelajari ini lebih bermanfaat dibanding topik lain
      Backpropagation layak dipelajari karena tanpa memahami cara kerjanya, akan sulit mengenali mode kegagalan tersembunyi
      Aku juga sudah beberapa kali mengimplementasikannya sendiri, dan tingkat kompleksitasnya pas untuk mengevaluasi bahasa pemrograman baru
  • Saat pertama kali belajar deep learning, backpropagation terasa seperti sihir
    Tetapi setelah mengimplementasikannya sendiri, ternyata itu hanya rangkaian perhitungan sederhana, dan sejak itu aku jauh lebih percaya diri saat debugging atau mencari penyebab loss yang mandek
    Bagi siapa pun yang belajar deep learning, aku sangat menyarankan untuk setidaknya sekali mengimplementasikannya sendiri

  • Ada juga posisi sebaliknya
    Menurut sebagian orang, mahasiswa tidak perlu repot mengimplementasikan backpropagation dengan NumPy
    Masalah kebocoran pada BackProp akan diselesaikan peneliti dengan optimizer baru, dan developer tinggal mencari hyperparameter yang bagus

    • Namun tujuan universitas adalah mendidik mahasiswa menjadi peneliti
    • Gagasan bahwa “cukup pilih optimizer yang bagus” adalah salah paham
      Sebagian masalah justru muncul dari desain model atau loop pelatihan
      Misalnya gradient clipping bukan default di kebanyakan framework
      Tulisan ini ditujukan kepada pembaca dengan sudut pandang peneliti atau akademik
    • Masalahnya bukan optimizer, melainkan karakteristik turunan dari fungsi aktivasi
      Jika tidak memahami perilaku gradient dari fungsi seperti sigmoid atau ReLU, kita tidak akan bisa menyelesaikan masalah ledakan atau kehilangan gradient
    • Untuk kelas CS Stanford, sangat wajar jika prinsip dasar diimplementasikan langsung
      Untuk membuat arsitektur model baru, kita harus memahami cara kerja backpropagation; kalau tidak, pelatihan bisa gagal atau performanya menurun
    • Masalahnya adalah tetap tidak tahu bahwa kita tidak tahu
      Kita harus menembus abstraksi itu agar akhirnya bisa menemukan wilayah yang benar-benar tidak kita ketahui (unknown unknowns)