5 पॉइंट द्वारा GN⁺ 2025-11-03 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • बैकप्रोपेगेशन (backpropagation) न्यूरल नेटवर्क ट्रेनिंग का मुख्य आधार है, लेकिन इसकी आंतरिक कार्यप्रणाली को समझे बिना अप्रत्याशित त्रुटियाँ पैदा हो सकती हैं क्योंकि यह एक ‘leaky abstraction’ है
  • sigmoid और tanh activation functions में अगर weight initialization गलत हो, तो vanishing gradient की वजह से ट्रेनिंग रुक सकती है
  • ReLU में input 0 या उससे कम होने पर न्यूरॉन स्थायी रूप से निष्क्रिय हो सकता है, जिसे dead ReLU कहा जाता है
  • RNN में repeated matrix multiplication के कारण exploding gradient हो सकता है, जिसे रोकने के लिए gradient clipping या LSTM की जरूरत पड़ती है
  • बैकप्रोपेगेशन कैसे काम करता है यह न समझने पर, framework सब कुछ अपने-आप संभाल ले तब भी debugging और model improvement की क्षमता काफी घट जाती है

बैकप्रोपेगेशन को समझना क्यों ज़रूरी है

  • Stanford के CS231n lecture में छात्रों के लिए ऐसा assignment बनाया गया था जिसमें उन्हें forward pass और backpropagation खुद implement करना होता है
    • कुछ छात्रों ने शिकायत की कि TensorFlow जैसे framework बैकप्रोपेगेशन अपने-आप compute कर लेते हैं, इसलिए यह अनावश्यक है
  • लेकिन बैकप्रोपेगेशन पूर्ण abstraction नहीं बल्कि एक leaky abstraction है, इसलिए इसकी आंतरिक कार्यप्रणाली जाने बिना ट्रेनिंग फेल होने का कारण समझना मुश्किल होता है
  • सिर्फ यह सोचना कि “framework खुद संभाल लेगा” अंततः model design और debugging skills में गिरावट लाता है

sigmoid में vanishing gradient

  • sigmoid और tanh जैसे nonlinear functions में input value बड़ी होने पर output 0 या 1 के करीब पहुँच जाता है, जिससे saturation की स्थिति बनती है
    • इस समय local gradient z(1-z)*, 0 हो जाता है और backpropagation के दौरान gradient propagation रुक जाती है
  • sigmoid का अधिकतम gradient 0.25 होता है, इसलिए हर layer से गुजरते समय signal 1/4 या उससे कम रह जाता है
  • नतीजतन, निचली layers की learning speed ऊपरी layers की तुलना में काफी धीमी हो जाती है
  • इसलिए sigmoid layers का उपयोग करते समय weight initialization और data preprocessing पर विशेष ध्यान देना चाहिए

dead ReLU की समस्या

  • ReLU ऐसा function है जो input 0 या उससे कम होने पर output 0 कर देता है
    • forward pass में अगर neuron output 0 हो, तो backpropagation के दौरान gradient भी 0 हो जाता है और वह neuron स्थायी रूप से निष्क्रिय हो सकता है
  • ट्रेनिंग के दौरान बड़े weight updates या high learning rate की वजह से neuron ‘dead state’ में फिक्स हो सकता है
  • ट्रेनिंग के बाद भी कई मामलों में कुल neurons का बड़ा हिस्सा 0 output देता हुआ मिल सकता है
  • इसलिए ReLU इस्तेमाल करते समय learning rate tuning और initialization strategy महत्वपूर्ण हैं

RNN में exploding gradient

  • साधारण RNN में हर time step पर वही hidden state matrix (Whh) बार-बार multiply होता है
    • backpropagation के दौरान इस matrix के eigenvalue के आकार के अनुसार gradient 0 की ओर सिमट सकता है या अनंत तक बढ़ सकता है
  • |b| < 1 होने पर vanishing gradient, और |b| > 1 होने पर exploding gradient होता है
  • इससे बचने के लिए आम तौर पर gradient clipping लगाया जाता है या LSTM संरचना का उपयोग किया जाता है

DQN कोड में गलत clipping का मामला

  • TensorFlow आधारित DQN implementation में tf.clip_by_value से delta (Q error) को सीधे clip करने वाला code मिला
    • इस तरीके में delta सीमा से बाहर जाते ही gradient 0 हो जाता है और ट्रेनिंग रुक जाती है
  • जबकि असल इरादा gradient clipping का था, इसलिए इसके बजाय Huber loss का उपयोग करना चाहिए
    • उदाहरण code में condition के आधार पर tf.square और tf.abs को मिलाकर Huber loss implement किया गया है
  • यह समस्या GitHub issue के रूप में रिपोर्ट की गई और तुरंत ठीक कर दी गई

निष्कर्ष

  • बैकप्रोपेगेशन सिर्फ एक automation tool नहीं, बल्कि credit assignment की एक प्रणाली है जो जटिल परिणाम पैदा करती है
  • इसकी आंतरिक कार्यप्रणाली को समझे बिना model instability, training failure और debugging limitations का सामना करना पड़ता है
  • बैकप्रोपेगेशन गणितीय रूप से बहुत कठिन नहीं है, और CS231n lecture और assignments के ज़रिए इसे सहज रूप से सीखा जा सकता है
  • बैकप्रोपेगेशन को समझने से न्यूरल नेटवर्क design और problem-solving ability में बड़ा सुधार आता है
  • framework की automatic differentiation पर केवल निर्भर रहने के बजाय बैकप्रोपेगेशन के वास्तविक flow को समझना ज़्यादा महत्वपूर्ण है

1 टिप्पणियां

 
GN⁺ 2025-11-03
Hacker News राय
  • यहाँ backpropagation को शायद अनुचित रूप से खराब प्रतिष्ठा मिल रही है
    असल में यह चर्चा backpropagation के बारे में कम, और gradient तथा gradient descent के विभिन्न रूप optimization प्रक्रिया में कितने अपूर्ण abstraction हैं इस बारे में ज़्यादा है
    backpropagation तो सिर्फ composite function का derivative निकालने वाला algorithm है, और sigmoid को कई बार stack करने पर होने वाली vanishing gradient जैसी समस्याएँ backpropagation की नहीं बल्कि function की अपनी विशेषताएँ हैं
    लोगों से backward pass खुद implement करवाने का कारण यह है कि वे derivative की गणना सीधे करते हुए महसूस करें कि exponential terms कैसे काम करते हैं

    • मैं तुम्हारी बात समझता हूँ, लेकिन इस मामले में वह ‘छोटी-सी आपत्ति’ मुझे ज़्यादा उपयोगी नहीं लगती
      मुख्य बात यह है कि कुछ स्थितियों में backpropagation के विवरणों को, gradient गणना सहित, abstraction के पीछे छिपाया नहीं जा सकता
      खासकर gradient descent का उपयोग करते समय यह सच है, और दूसरे global optimization algorithms में समस्या कम हो सकती है
      अभी व्यावहारिक रूप से deep learning में gradient निकालने का एकमात्र तरीका backpropagation ही है, इसलिए इस abstraction का leak होना वास्तविक है
    • यह कोई छोटी आपत्ति नहीं, बल्कि गलत conceptual framing पर एक उचित आपत्ति है
      Karpathy के योगदान का सम्मान है, लेकिन उनके लेख और talks अक्सर अवधारणात्मक भेदों को धुंधला कर देते हैं, जिससे गलतफहमियाँ पैदा होती हैं
      उनके स्तर के व्यक्ति से अधिक सटीकता की अपेक्षा होती है
  • Karpathy का deep learning शिक्षा में योगदान वास्तव में बहुत बड़ा है
    छोटे लेखों से लेकर RNN पर इस उत्कृष्ट लेख तक, और YouTube lectures व GitHub projects तक, सब शानदार हैं
    हाल ही में जारी nanochat भी एक बेहतरीन उदाहरण है; छोटे, स्पष्ट, पूर्ण उदाहरण सीखने वालों के लिए बहुत मददगार होते हैं

    • मैंने LLM में गहराई से डूबे सहकर्मियों को Karpathy के लेख सुझाए, लेकिन आश्चर्यजनक रूप से उनकी रुचि नहीं थी
      बाद में लगा कि वे LLM को समझने से ज़्यादा उस पर भरोसा करके इस्तेमाल करने में रुचि रखते थे
      वास्तव में, उन्हें LLM के काम करने के तरीके से ज़्यादा “ऐसा समाज जहाँ बुद्धिमान मशीनें सब कुछ करें” जैसी कल्पनाश्रित चर्चाओं में दिलचस्पी थी
    • Karpathy का काम करने का तरीका दिलचस्प है
      वह सिर्फ “ChatGPT से पूछने” के बजाय, खुद खोज करते हैं, code पढ़ते हैं, और bugs ढूँढ़ते हैं
      यही जिज्ञासापूर्ण दृष्टिकोण असली सीख है
  • मास्टर्स में मैंने एक paper के आधार पर backpropagation को सीधे implement करने वाला assignment किया था
    उसमें सिर्फ गणितीय operations के सहारे forward और backward pass लिखना था, और वह उस साल का मेरा सबसे अच्छा learning experience था
    ऐसे assignments इंसान खुद से शायद ही करे, लेकिन जब करने पड़ते हैं तो वे बेहद मददगार साबित होते हैं

    • सिर्फ paper पढ़ने और उसे code में implement करने के बीच समझ का अंतर बहुत बड़ा होता है
    • मैंने स्कूल के समय Java में इसे खुद implement किया था, और matrix multiplication सबसे कठिन हिस्सा था
      मैंने UI भी बनाया था ताकि training के दौरान weights और biases कैसे बदलते हैं, यह visualise कर सकूँ
    • उत्सुकता है कि क्या वह paper सार्वजनिक रूप से उपलब्ध है
  • मैं backpropagation और optimizer के संबंध को लेकर उत्सुक था
    SGD तो बस gradient की दिशा में चलता है, लेकिन Adam जैसे उन्नत optimizer gradient को सीधे वैसा का वैसा उपयोग नहीं करते; वे normalization, momentum, clipping आदि लगाते हैं
    तो क्या सटीक gradient गणना वास्तव में ज़रूरी है, या सिर्फ दिशा का मोटा अंदाज़ा भी काफी है?

    • व्यवहार में gradient को छोटे minibatch से approximate किया जाता है, इसलिए हर step noisy होता है, लेकिन उल्टा वही noise performance सुधारने में मदद भी कर सकता है
      इस विषय पर SGD noise papers, visualization research आदि हैं
      लेकिन दिशा को बस मोटे तौर पर लेना खतरनाक हो सकता है — loss function की curvature (Hessian) बहुत तेजी से बदल सकती है
    • “क्या सटीक gradient से ज़्यादा सिर्फ दिशा जानना काफी नहीं?” यह बहुत पुराना सवाल है
      वास्तव में stochastic gradient descent भी इसी तरह के विचार से आया, और आगे Direct Feedback Alignment जैसी approaches भी हैं
      Ben Recht का optimization और reinforcement learning के संबंध पर यह सारांश भी रोचक है
    • backpropagation संख्यात्मक precision के स्तर पर सटीक derivative गणना करता है
      महत्वपूर्ण चीज loss function की value से अधिक gradient और curvature का shape है
      Adam जैसे optimizers first-order approximation से हर parameter की scale sensitivity का अनुमान लगाकर gradient को समायोजित करते हैं
      higher-order optimization, ReLU जैसी nonlinear functions में, संभव नहीं है
    • gradient को adjust करना कोई ‘fudge’ नहीं है
      यह vanishing gradient समस्या से निपटने के लिए आवश्यक कदम है
      high-dimensional space में छोटी त्रुटियाँ भी बड़ा असर डाल सकती हैं, इसलिए सटीक gradient गणना बहुत महत्वपूर्ण है
    • calculus अपने आप में कठिन नहीं है
      असली सवाल यह है कि “दिशा का मोटा अंदाज़ा” आखिर निकाला कैसे जाएगा
      AdamW जैसे उन्नत optimizers भी अब भी gradient को केंद्रीय रूप से इस्तेमाल करते हैं
  • लगता है 2016 के आसपास gradient clipping जैसे tricks का उपयोग कहीं अधिक होता था
    उदाहरण के लिए Alex Graves के 2013 के paper Sequence Generation with RNNs में भी कहा गया है कि LSTM में exploding gradient को रोकने के लिए clipping इस्तेमाल की गई थी
    मैंने तो PyTorch autograd पर केंद्रित विशेष lectures तक किए थे, क्योंकि मुझे backpropagation का महत्व गहराई से महसूस हुआ

    • पहले शायद अलग-अलग network architectures के साथ प्रयोग अधिक होते थे, इसलिए ऐसे tricks भी ज़्यादा थे
      अब frameworks clipping को support करते हैं, और training समस्याओं की समझ भी बेहतर हुई है
      लेकिन समस्या खत्म नहीं हुई है — ReLU और GELU अब भी default activation functions हैं, और LLM training अब भी काफी हद तक ‘black art’ जैसी है
      Hugging Face की Smol Training Playbook इसका प्रमाण है
  • लंबे समय में शायद ऐसे models train करना फायदेमंद हो सकता है जो activation functions की विविधता के प्रति robust हों
    उदाहरण के लिए ReLU, Swish, GELU आदि को यादृच्छिक रूप से बदल-बदलकर training कराई जाए, तो dropout जैसी एक तरह की regularization effect मिल सकती है
    इससे inference के समय सबसे सस्ती function को चुनकर इस्तेमाल करना भी संभव हो सकता है

  • मूल शीर्षक “Yes you should understand backprop” कहीं अधिक स्पष्ट और बेहतर है

    • क्योंकि backpropagation एक leaky abstraction है, इसलिए इसे हाथ से गणना करके intuition बनाना महत्वपूर्ण है
      अगर code बहुत कुछ अपने आप कर दे, तो ‘यह जादू की तरह काम करता है’ वाली गलतफहमी में फँसना आसान है
      ग्रेजुएट स्कूल में convolution और backpropagation को हाथ से गणना करने का मेरा अनुभव बहुत मददगार था
  • “जब framework backward pass अपने आप निकाल देता है, तो इसे खुद क्यों लिखना चाहिए?” यह सवाल
    “जब calculator है, तो जोड़ना क्यों सीखना चाहिए?” जैसी तर्कशैली पर आधारित है, इसलिए चिंताजनक लगता है

    • इसका प्रतिवाद भी है
      जैसे compiler, sorting algorithm, या transistor के काम करने के तरीके को समझना उपयोगी है, वैसे ही backpropagation सीखना भी मूल्यवान है
      लेकिन सीखने का समय सीमित होता है, इसलिए असली सवाल यह है कि इसे सीखना दूसरे विषयों की तुलना में अधिक लाभकारी है या नहीं
      backpropagation इसलिए सीखने लायक है क्योंकि इसकी आंतरिक कार्यप्रणाली न जानने पर छिपे हुए failure modes पहचानना कठिन हो जाता है
      मैंने भी इसे कई बार implement किया है, और यह नई language का मूल्यांकन करने के लिए एकदम सही जटिलता देता है
  • जब मैंने पहली बार deep learning सीखी, तब backpropagation सचमुच जादू जैसा लगा था
    लेकिन खुद implement करने पर समझ आया कि यह तो साधारण गणनाओं की लगातार श्रृंखला है, और उसी वजह से debugging करने या loss रुक जाने के कारण खोजने में मेरा आत्मविश्वास बहुत बढ़ा
    जो भी deep learning सीख रहा हो, उसे कम-से-कम एक बार खुद हाथ से implement करने की सलाह दूँगा

  • एक विरोधी दृष्टिकोण भी है
    मुझे नहीं लगता कि छात्रों को ज़रूर NumPy में backpropagation implement करना चाहिए
    BackProp की leak समस्या को शोधकर्ता नए optimizers से हल करेंगे, और developers को सिर्फ अच्छे hyperparameters ढूँढ़ने होंगे

    • लेकिन विश्वविद्यालयों का उद्देश्य छात्रों को शोधकर्ता के रूप में तैयार करना होता है
    • “बस अच्छा optimizer चुन लो” कहना एक गलतफहमी है
      समस्या का एक हिस्सा model design या training loop से पैदा होता है
      उदाहरण के लिए gradient clipping ज़्यादातर frameworks में default नहीं है
      यह लेख शोधकर्ताओं या अकादमिक दृष्टिकोण वाले पाठकों के लिए है
    • समस्या optimizer नहीं, बल्कि activation functions की derivative विशेषताएँ हैं
      अगर आप sigmoid या ReLU जैसी functions के gradient behavior को नहीं समझते, तो exploding या vanishing gradient समस्याओं से नहीं निपट सकते
    • Stanford की CS class हो तो मूलभूत सिद्धांतों को खुद implement करना स्वाभाविक है
      नए model architectures बनाने के लिए backpropagation कैसे काम करता है, यह समझना ज़रूरी है; नहीं तो training fail हो सकती है या performance गिर सकती है
    • समस्या यह है कि “जो नहीं जानते, उसे न जानना” बना रहता है
      abstraction के भीतर उतरने पर ही वास्तव में अज्ञात क्षेत्रों (unknown unknowns) का पता चलता है