मुख्य सामग्री पर जाएं

न्यूरल नेटवर्क में फ़ॉरवर्ड प्रोपेगेशन: एक संपूर्ण गाइड

जानें कि न्यूरल नेटवर्क में फ़ॉरवर्ड प्रोपेगेशन कैसे काम करता है—गणितीय आधार से लेकर Python में व्यावहारिक कार्यान्वयन तक। कोड उदाहरणों और विज़ुअलाइज़ेशन के साथ इस आवश्यक डीप लर्निंग अवधारणा में महारत हासिल करें।
अपडेट किया गया 24 सित॰ 2026  · 12 मि॰ पढ़ें

AI के साथ खोजें

ChatGPTClaudePerplexity

न्यूरल नेटवर्क्स ने आर्टिफ़िशियल इंटेलिजेंस में क्रांति ला दी है—इमेज़ रिकग्निशन से लेकर नेचुरल लैंग्वेज प्रोसेसिंग तक। इन शक्तिशाली मॉडलों के केंद्र में एक बुनियादी प्रक्रिया होती है जिसे फ़ॉरवर्ड प्रोपेगेशन कहते हैं। यह गाइड इस मूल अवधारणा को समझाएगा—बुनियादी सिद्धांतों से लेकर व्यावहारिक कार्यान्वयन तक। 

यदि आप यहाँ कवर की गई कई अवधारणाओं पर हैंड्स-ऑन गाइड चाहते हैं, तो हमारा Deep Learning in Python स्किल ट्रैक ज़रूर देखें।

फ़ॉरवर्ड प्रोपेगेशन क्या है?

फ़ॉरवर्ड प्रोपेगेशन वह प्रक्रिया है जिसमें एक न्यूरल नेटवर्क इनपुट डेटा को भविष्यवाणियों या आउटपुट में बदलता है। इसे नेटवर्क के “सोचने” के चरण के रूप में समझें—जब उसे कोई इनपुट (जैसे इमेज या टेक्स्ट) दिखाया जाता है, तो फ़ॉरवर्ड प्रोपेगेशन यह दर्शाता है कि परतों के माध्यम से जानकारी कैसे बहती है और परिणाम उत्पन्न होता है।

तकनीकी रूप से, यह क्रमिक गणना है जो डेटा को इनपुट लेयर से छिपी परतों के माध्यम से आउटपुट लेयर तक ले जाती है। इस दौरान, डेटा वेटेड कनेक्शनों और एक्टिवेशन फ़ंक्शनों द्वारा रूपांतरित होता है, जिससे नेटवर्क जटिल पैटर्न पकड़ पाता है।

फ़ॉरवर्ड प्रोपेगेशन समझना क्यों महत्वपूर्ण है

फ़ॉरवर्ड प्रोपेगेशन को समझना कई कारणों से आवश्यक है:

  1. सीखने की नींव: यह जाने बिना कि नेटवर्क भविष्यवाणियाँ कैसे करता है, आप नहीं समझ सकते कि वह सीखता कैसे है। फ़ॉरवर्ड प्रोपेगेशन बैकप्रोपेगेशन समझने की पूर्व-आवश्यकता है—यही एल्गोरिद्म सीखने को संभव बनाता है।
  2. डीबगिंग और अनुकूलन: जब नेटवर्क अच्छा प्रदर्शन नहीं करता, तो डेटा का प्रवाह समझने से समस्याएँ पहचानना और ठीक करना आसान होता है।
  3. मॉडल डिज़ाइन: प्रभावी आर्किटेक्चर डिज़ाइन के लिए यह समझना ज़रूरी है कि विभिन्न लेयर कॉन्फ़िगरेशन में सूचना कैसे फैलती है।
  4. तैनाती की दक्षता: संसाधन-सीमित वातावरण में मॉडल तैनात करते समय फ़ॉरवर्ड प्रोपेगेशन का अनुकूलन अत्यंत आवश्यक है।

आप इस गाइड में क्या सीखेंगे

इस व्यापक गाइड के अंत तक, आप:

  • न्यूरल नेटवर्क गणनाओं के पीछे का गणित समझेंगे
  • NumPy का उपयोग करके फ़ॉरवर्ड प्रोपेगेशन को शून्य से लागू कर सकेंगे
  • TensorFlow और PyTorch जैसे आधुनिक फ़्रेमवर्क्स से कुशल फ़ॉरवर्ड प्रोपेगेशन करना जानेंगे
  • देख पाएँगे कि नेटवर्क से गुजरते हुए सूचना कैसे रूपांतरित होती है
  • फ़ॉरवर्ड प्रोपेगेशन को न्यूरल नेटवर्क्स की व्यापक सीखने की प्रक्रिया से जोड़ पाएँगे
  • वास्तविक डेटा पर एक संपूर्ण कार्यशील उदाहरण लागू करेंगे

पूर्व-आवश्यकताएँ

इस गाइड का पूरा लाभ उठाने के लिए, आपके पास होना चाहिए:

  • Python प्रोग्रामिंग की बुनियादी समझ
  • मौलिक गणितीय अवधारणाओं (वेक्टर, मैट्रिसेस, और बुनियादी कलन) से परिचय
  • मशीन लर्निंग की कुछ बुनियादी अवधारणाओं का अनुभव

यदि आपको अपनी नींव को मजबूत करने की ज़रूरत है, तो इन संसाधनों पर विचार करें:

व्यापक पृष्ठभूमि ज्ञान न होने पर भी, हमने इस गाइड को चरण-बद्ध तरीके से अवधारणाएँ बनाने के लिए तैयार किया है, ताकि दृढ़ इच्छाशक्ति वाले सीखने वालों के लिए न्यूरल नेटवर्क सुलभ हों। आइए शुरू करें!

फ़ॉरवर्ड प्रोपेगेशन की बुनियाद

फ़ॉरवर्ड प्रोपेगेशन को समझने के लिए हमें इसके मूल घटकों से शुरू करना होगा। आइए न्यूरल नेटवर्क में सबसे छोटे गणनात्मक यूनिट से शुरुआत करें और धीरे-धीरे अधिक जटिल संरचनाओं तक पहुँचें।

एकल न्यूरॉन: जहाँ से सब शुरू होता है

न्यूरल नेटवर्क की यात्रा जीवविज्ञान के समानांतर से शुरू होती है। जैसे मानव मस्तिष्क अरबों इंटरकनेक्टेड न्यूरॉन्स से बना है, वैसे ही कृत्रिम न्यूरल नेटवर्क जैविक कोशिकाओं से प्रेरित गणितीय मॉडलों से निर्मित होते हैं।

A sketch of a simplified neuron with a few major structures identified.

स्रोत: Deep Learning - Visual Approach

एक जैविक न्यूरॉन डेंड्राइट्स के माध्यम से अन्य न्यूरॉन्स से सिग्नल प्राप्त करता है, उन्हें अपने सेल बॉडी में प्रोसेस करता है, और फिर एक्सॉन के ज़रिए परिणाम आगे भेजता है। हमारे कम्प्यूटेशनल मॉडल में, हम इस प्रक्रिया को निम्न रूप में दर्शाते हैं:

  • इनपुट्स: न्यूरॉन में आने वाले संकेत (डेंड्राइट्स की तरह)
  • वेट्स: प्रत्येक इनपुट को दी गई महत्ता (सिनैप्टिक कनेक्शनों की शक्ति के समान)
  • बायस: एक अतिरिक्त पैरामीटर जो इनपुट्स से स्वतंत्र रूप से न्यूरॉन को सक्रिय या निष्क्रिय रहने में मदद करता है
  • एक्टिवेशन फ़ंक्शन: इनपुट्स के आधार पर यह निर्धारित करता है कि न्यूरॉन कितना और कब “फ़ायर” करेगा (सेल बॉडी द्वारा एक्शन पोटेंशियल बनाने जैसा)
  • आउटपुट: अगली परत को भेजा गया सिग्नल (अन्य न्यूरॉन्स को एक्सॉन द्वारा भेजने जैसा)

इसे ठोस बनाने के लिए एकल न्यूरॉन को विज़ुअलाइज़ करें:

A single neuron of a neural network with inputs, weights, bias, activation function and summation operation visualized.

स्रोत: Deep Learning - Visual Approach

यह सरल गणनात्मक यूनिट सबसे जटिल न्यूरल नेटवर्क्स की भी नींव है। लेकिन न्यूरॉन अपने इनपुट्स को आउटपुट में बदलता कैसे है? यहीं गणित काम आता है।

एकल न्यूरॉन की गणितीय नींव

न्यूरॉन का संचालन एक सीधे-सादे समीकरण से व्यक्त किया जा सकता है:

An equation representing the forward propagation process on a high-level

इसे भागों में समझें:

  • x हमारा इनपुट वेक्टर [x_1, x_2, x_3, …] है
  • w हमारा वेट वेक्टर [w_1, w_2, …, w_n] है
  • b बायस है (एक एकल स्केलर मान)
  • z वेटेड सम प्लस बायस है (अक्सर “प्री-एक्टिवेशन” या “लॉजिट” कहा जाता है)
  • f एक्टिवेशन फ़ंक्शन है
  • a न्यूरॉन का अंतिम आउटपुट है

आइए वास्तविक संख्याओं के साथ एक ठोस उदाहरण पर काम करें। मान लें हमारे पास तीन इनपुट वाला एक न्यूरॉन है:

Inputs: x = [2, 5, -1]
Weights: w = [0.5, -1, 2]
Bias: b = 0.5

पहले, हम वेटेड सम प्लस बायस निकालते हैं:

A sample calculation following the formula of forward propagation

अगला, हम एक एक्टिवेशन फ़ंक्शन लागू करते हैं। चलिए प्रचलित ReLU (Rectified Linear Unit) फ़ंक्शन का उपयोग करते हैं, जो इस प्रकार परिभाषित है:

The ReLU activation function formula applied over a sample value

नकारात्मक प्री-एक्टिवेशन मान होने पर, हमारा ReLU न्यूरॉन 0 आउटपुट देता है, यानी यह इस इनपुट के लिए “फ़ायर” नहीं करता।

एक्टिवेशन फ़ंक्शन अहम है क्योंकि यह नेटवर्क में नॉन-लिनियरिटी लाता है। इसके बिना, चाहे कितनी भी परतें हों, नेटवर्क केवल रैखिक संबंध ही सीख पाएगा। आम एक्टिवेशन फ़ंक्शनों में शामिल हैं:

  • Sigmoid: The formula for sigmoid application function— आउटपुट 0 और 1 के बीच; बाइनरी वर्गीकरण में उपयोगी
  • ReLU: ReLU activation function formula— सरल, कुशल और vanishing gradient समस्या में सहायक
  • Tanh: Tanh activation function formula — आउटपुट -1 और 1 के बीच; अक्सर हिडन लेयर्स में

हर एक्टिवेशन फ़ंक्शन की अपनी खूबियाँ और उपयोग-परिस्थितियाँ हैं, जिन्हें हम अपने न्यूरल नेटवर्क के कार्यान्वयन में और देखेंगे।

न्यूरॉन्स से लेयर्स तक

व्यक्तिगत न्यूरॉन्स शक्तिशाली होते हैं, लेकिन असली ताकत तब आती है जब इन्हें परतों में संगठित किया जाता है। एक लेयर समानांतर में इनपुट प्रोसेस करने वाले न्यूरॉन्स का संग्रह है। प्रायः न्यूरल नेटवर्क में तीन प्रकार की परतें होती हैं:

  1. इनपुट लेयर: कच्चा डेटा लेकर अगली परत को पास करता है
  2. हिडन लेयर्स: पिछली परतों से सूचना प्रोसेस करती हैं
  3. आउटपुट लेयर: अंतिम भविष्यवाणी या वर्गीकरण देती है

जब किसी लेयर में कई न्यूरॉन होते हैं, जो समान इनपुट लेते हैं किंतु अलग वेट्स/बायस रखते हैं, तो हम इसे मैट्रिक्स ऑपरेशनों से कुशलतापूर्वक दर्शा सकते हैं। देखें यह कैसे काम करता है।

मान लें हमारे पास 3 इनपुट मान और 4 न्यूरॉन्स वाली एक लेयर है। प्रत्येक न्यूरॉन के अपने वेट्स और बायस हैं:

Inputs: x = [x₁, x₂, x₃]
Weights for neuron 1: w₁ = [w₁₁, w₁₂, w₁₃]
Weights for neuron 2: w₂ = [w₂₁, w₂₂, w₂₃]
Weights for neuron 3: w₃ = [w₃₁, w₃₂, w₃₃]
Weights for neuron 4: w₄ = [w₄₁, w₄₂, w₄₃]
Biases: b = [b₁, b₂, b₃, b₄]

हम इन वेट्स को एक मैट्रिक्स W में व्यवस्थित कर सकते हैं:

Weight matrix W as part of the forward propagation process

अब हम एक ही मैट्रिक्स गुणन के साथ सभी न्यूरॉन्स के प्री-एक्टिवेशन एक साथ निकाल सकते हैं:

Computing neuron pre-activations with matrix multiplication

जहाँ:

  • X हमारा इनपुट वेक्टर [x₁, x₂, x₃] है
  • W^T हमारे वेट मैट्रिक्स का ट्रांसपोज़ है
  • B हमारा बायस वेक्टर [b₁, b₂, b₃, b₄] है
  • Z प्राप्त प्री-एक्टिवेशन वेक्टर [z₁, z₂, z₃, z₄] है

फिर हम एलिमेंट-वाइज़ एक्टिवेशन फ़ंक्शन लागू करके अंतिम आउटपुट पाते हैं:

Applying activation function over the vector of pre-activations

यह मैट्रिक्स निरूपण केवल गणितीय सुंदरता ही नहीं, बल्कि संगणनात्मक दक्षता भी है। आधुनिक हार्डवेयर (खासकर GPUs) मैट्रिक्स ऑपरेशनों के लिए अनुकूलित होते हैं, जिससे यह तरीका प्रत्येक न्यूरॉन का आउटपुट अलग-अलग निकालने की तुलना में कहीं तेज़ है।

इन परतों को स्टैक करने की क्षमता—जहाँ एक परत का आउटपुट अगली परत का इनपुट बनता है—न्यूरल नेटवर्क्स को जटिल पैटर्न सीखने की अद्भुत क्षमता देती है। अब जब हमने ये बिल्डिंग ब्लॉक्स जोड़ दिए हैं, तो पूरी नेटवर्क में फ़ॉरवर्ड प्रोपेगेशन कैसे काम करता है, यह देखने को तैयार हैं।

पूर्ण नेटवर्क में फ़ॉरवर्ड प्रोपेगेशन

अब जब हम व्यक्तिगत न्यूरॉन्स और लेयर्स समझ चुके हैं, तो देखें कि पूरा न्यूरल नेटवर्क फ़ॉरवर्ड प्रोपेगेशन कैसे करता है। यहीं डीप लर्निंग की असली शक्ति दिखती है।

मल्टी-लेयर नेटवर्क्स: संपूर्ण चित्र

एक पूरा न्यूरल नेटवर्क इनपुट लेयर, एक या अधिक हिडन लेयर्स, और एक आउटपुट लेयर से बना होता है। डीप लर्निंग में “डीप” का मतलब होता है कि नेटवर्क में कई हिडन लेयर्स हैं। हर परत डेटा को और अधिक अमूर्त तरीकों से बदलती है, जिससे नेटवर्क जटिल प्रतिनिधित्व सीख पाता है।

एक सरल नेटवर्क पर विचार करें जिसमें:

  • 4 फ़ीचर्स वाला इनपुट लेयर
  • दो हिडन लेयर्स—क्रमशः 3 और 2 न्यूरॉन्स
  • 3 न्यूरॉन्स वाला आउटपुट लेयर (मान लें मल्टी-क्लास वर्गीकरण के लिए)

दृश्य रूप में, यह नेटवर्क इस तरह दिखता है:

A simple neural network architecture

जैसे-जैसे डेटा इस नेटवर्क से होकर गुजरता है, हम हर परत पर कई गणनाएँ करते हैं। यदि हम निरूपित करें:

  • इनपुट वेक्टर X = [x_1, x_2, x_3, x_4]
  • वेट मैट्रिसेस को (हिडन लेयर के लिए) और (आउटपुट लेयर के लिए)
  • बायस वेक्टर्स को और
  • एक्टिवेशन फ़ंक्शन्स f1 (हिडन लेयर) और f2 (आउटपुट लेयर)

तो पूरे नेटवर्क में फ़ॉरवर्ड प्रोपेगेशन को हम इस प्रकार व्यक्त कर सकते हैं:

1. हिडन लेयर प्री-एक्टिवेशन की गणना: 

Calculate hidden layer pre-activations

2. एक्टिवेशन फ़ंक्शन लगाकर हिडन लेयर आउटपुट पाना: 

Apply activation function to get hidden layer outputs

3. आउटपुट लेयर प्री-एक्टिवेशन की गणना: 

Calculate output layer pre-activations

4. अंतिम आउटपुट पाने के लिए एक्टिवेशन फ़ंक्शन लगाना:

Apply activation function to get final outputs

अंतिम आउटपुट A^[2] नेटवर्क की भविष्यवाणी का प्रतिनिधित्व करता है। वर्गीकरण में यह प्रत्येक श्रेणी की संभावनाएँ हो सकती हैं; रिग्रेशन में अनुमानित मान।

अलग-अलग परतें प्रायः अलग एक्टिवेशन फ़ंक्शन्स का प्रयोग करती हैं। उदाहरण के लिए, हिडन लेयर्स में सामान्यतः ReLU उपयोग होता है, जबकि आउटपुट लेयर में हो सकते हैं:

  • बाइनरी वर्गीकरण के लिए Sigmoid
  • मल्टी-क्लास वर्गीकरण के लिए Softmax
  • रिग्रेशन के लिए Linear (कोई एक्टिवेशन नहीं)

इस बहु-परत संरचना की खूबसूरती यह है कि प्रत्येक परत डेटा के अलग-अलग पहलुओं का प्रतिनिधित्व सीख सकती है। शुरुआती परतें सरल फ़ीचर्स पकड़ती हैं, जबकि गहरी परतें इन्हें जोड़कर अधिक जटिल पैटर्न बनाती हैं। यही पदानुक्रमित सीखना इमेज और स्पीच रिकग्निशन जैसे जटिल कार्यों में न्यूरल नेटवर्क्स को शक्तिशाली बनाता है।

फ़ॉरवर्ड प्रोपेगेशन एल्गोरिद्म

आइए फ़ॉरवर्ड प्रोपेगेशन प्रक्रिया को एक एल्गोरिद्म में औपचारिक बनाएँ। L लेयर्स वाले एक न्यूरल नेटवर्क के लिए, फ़ॉरवर्ड प्रोपेगेशन के चरण इस प्रकार हैं:

# Pseudocode for forward propagation
def forward_propagation(X, parameters):
   """
   X: Input data (batch_size, n_features)
   parameters: Dictionary containing weights and biases for each layer
   Returns: The final output and all intermediate activations
   """
   # Store all activations for later use (e.g., in backpropagation)
   activations = {'A0': X}  # A0 is the input
  
   # Loop through L-1 layers (excluding the output layer)
   for l in range(1, L):
       # Get previous activation
       A_prev = activations[f'A{l-1}']
      
       # Get weights and biases for current layer
       W = parameters[f'W{l}']
       b = parameters[f'b{l}']
      
       # Compute pre-activation
       Z = np.dot(A_prev, W.T) + b
      
       # Apply activation function (e.g., ReLU for hidden layers)
       A = relu(Z)
      
       # Store values for later use
       activations[f'Z{l}'] = Z
       activations[f'A{l}'] = A
  
   # Compute output layer (layer L)
   A_prev = activations[f'A{L-1}']
   W = parameters[f'W{L}']
   b = parameters[f'b{L}']
  
   # Compute pre-activation for output layer
   Z = np.dot(A_prev, W.T) + b
  
   # Apply output activation function (depends on the task)
   if task == 'binary_classification':
       A = sigmoid(Z)
   elif task == 'multiclass_classification':
       A = softmax(Z)
   elif task == 'regression':
       A = Z  # Linear activation
  
   # Store output layer values
   activations[f'Z{L}'] = Z
   activations[f'A{L}'] = A
  
   return A, activations

यह एल्गोरिद्म फ़ॉरवर्ड प्रोपेगेशन के कई महत्वपूर्ण पहलुओं को रेखांकित करता है:

  1. क्रमानुगत प्रोसेसिंग: सूचना परत-दर-परत सख्ती से आगे की ओर बहती है।
  2. एक्टिवेशन स्टोरेज: हम केवल अंतिम आउटपुट ही नहीं, बल्कि सभी मध्यवर्ती एक्टिवेशन भी संग्रहीत करते हैं, जो बैकप्रोपेगेशन के दौरान प्रशिक्षण के लिए अत्यंत महत्वपूर्ण हैं।
  3. कार्य-विशिष्ट आउटपुट: आउटपुट लेयर के लिए एक्टिवेशन फ़ंक्शन विशेष समस्या (वर्गीकरण बनाम रिग्रेशन) पर निर्भर करता है।

फ़ॉरवर्ड प्रोपेगेशन एल्गोरिद्म आश्चर्यजनक रूप से सरल है, फिर भी यह न्यूरल नेटवर्क्स को अत्यंत जटिल फ़ंक्शन्स का सन्निकटन करने देता है। जब इसे बैकप्रोपेगेशन के उपयुक्त प्रशिक्षण से जोड़ा जाता है, तो यही सरल प्रक्रिया नेटवर्क को डेटा से सीखने और लगातार अधिक सटीक भविष्यवाणियाँ करने में सक्षम बनाती है।

समझ को और पक्का करने के लिए एक विशिष्ट उदाहरण ट्रेस करें। इनपुट X = [0.5, -0.2, 0.1] को हमारे उदाहरण नेटवर्क से गुज़रते हुए मानें, जिसमें:

  • हिडन लेयर वेट्स W^[1] (4×3 मैट्रिक्स) और बायस b^[1] (4 मानों का वेक्टर)
  • आउटपुट लेयर वेट्स W^[2] (2×4 मैट्रिक्स) और बायस b^[2] (2 मानों का वेक्टर)

सरलता के लिए, मान लें सभी वेट्स 0.1 हैं और सभी बायस 0:

X = [0.5, -0.2, 0.1]
W[1] = [[0.1, 0.1, 0.1], [0.1, 0.1, 0.1], [0.1, 0.1, 0.1], [0.1, 0.1, 0.1]]
b[1] = [0, 0, 0, 0]
W[2] = [[0.1, 0.1, 0.1, 0.1], [0.1, 0.1, 0.1, 0.1]]
b[2] = [0, 0]

हमारे एल्गोरिद्म का पालन करते हुए:

  • पहला चरण:

Calculate hidden layer pre-activations

  • दूसरा चरण ReLU के साथ: 

Apply activation function to get hidden layer outputs

  • तीसरा चरण:

Calculate hidden layer pre-activations

  • चौथा चरण sigmoid के साथ: 

Calculate output layer pre-activations

यह हमें अंतिम भविष्यवाणी देता है। बाइनरी वर्गीकरण के संदर्भ में, 0.5 के आस-पास के मान दो श्रेणियों के बीच अनिश्चितता दर्शाते हैं।

अगले भाग में, हम Python में फ़ॉरवर्ड प्रोपेगेशन लागू करेंगे ताकि इन गणनाओं को क्रिया में देखें।

Python में फ़ॉरवर्ड प्रोपेगेशन लागू करना

अब जब हम फ़ॉरवर्ड प्रोपेगेशन का सिद्धांत समझ गए हैं, तो आइए इसे Python में लागू करें। हम केवल NumPy का उपयोग करके “स्क्रैच से” कार्यान्वयन से शुरू करेंगे, फिर देखेंगे कि आधुनिक डीप लर्निंग फ़्रेमवर्क्स इस प्रक्रिया को कैसे सरल बनाते हैं।

NumPy के साथ स्क्रैच से बनाना

NumPy कुशल ऐरे ऑपरेशन्स प्रदान करता है, जिनसे हम चर्चा किए गए मैट्रिक्स कैलकुलेशन्स लागू कर सकते हैं। आइए एक सरल न्यूरल नेटवर्क क्लास बनाते हैं जो कई परतों के माध्यम से फ़ॉरवर्ड प्रोपेगेशन करता है।

सबसे पहले, आवश्यक लाइब्रेरीज़ आयात करें:

import numpy as np
import matplotlib.pyplot as plt

# For reproducibility
np.random.seed(42)

अब, वे एक्टिवेशन फ़ंक्शन्स परिभाषित करें जो हम अपने नेटवर्क में उपयोग करेंगे:

def relu(Z):
   """ReLU activation function: max(0, Z)"""
   return np.maximum(0, Z)

def sigmoid(Z):
   """Sigmoid activation function: 1/(1 + e^(-Z))"""
   return 1 / (1 + np.exp(-Z))

def softmax(Z):
   """Softmax activation function for multi-class classification"""
   # Subtract max for numerical stability (prevents overflow)
   exp_Z = np.exp(Z - np.max(Z, axis=1, keepdims=True))
   return exp_Z / np.sum(exp_Z, axis=1, keepdims=True)

अगला, अपने न्यूरल नेटवर्क के लिए एक क्लास बनाएँ:

class NeuralNetwork:
   def __init__(self, layer_dims, activations):
       """
       Initialize a neural network with specified layer dimensions and activations
      
       Parameters:
       - layer_dims: List of integers representing the number of neurons in each layer
                    (including input and output layers)
       - activations: List of activation functions for each layer (excluding input layer)
       """
       self.L = len(layer_dims) - 1  # Number of layers (excluding input layer)
       self.layer_dims = layer_dims
       self.activations = activations
       self.parameters = {}
      
       # Initialize parameters (weights and biases)
       self.initialize_parameters()
  
   def initialize_parameters(self):
       """Initialize weights and biases with small random values"""
       for l in range(1, self.L + 1):
           # He initialization for weights - helps with training deep networks
           self.parameters[f'W{l}'] = np.random.randn(self.layer_dims[l], self.layer_dims[l-1]) * np.sqrt(2 / self.layer_dims[l-1])
           self.parameters[f'b{l}'] = np.zeros((self.layer_dims[l], 1))
  
   def forward_propagation(self, X):
       """
       Perform forward propagation through the network
      
       Parameters:
       - X: Input data (n_features, batch_size)
      
       Returns:
       - AL: Output of the network
       - caches: Dictionary containing all activations and pre-activations
       """
       caches = {}
       A = X  # Input layer activation
       caches['A0'] = X
      
       # Process through L-1 layers (excluding output layer)
       for l in range(1, self.L):
           A_prev = A
          
           # Get weights and biases for current layer
           W = self.parameters[f'W{l}']
           b = self.parameters[f'b{l}']
          
           # Forward propagation for current layer
           Z = np.dot(W, A_prev) + b
          
           # Apply activation function
           activation_function = self.activations[l-1]
           if activation_function == "relu":
               A = relu(Z)
           elif activation_function == "sigmoid":
               A = sigmoid(Z)
          
           # Store values for backpropagation
           caches[f'Z{l}'] = Z
           caches[f'A{l}'] = A
      
       # Output layer
       W = self.parameters[f'W{self.L}']
       b = self.parameters[f'b{self.L}']
       Z = np.dot(W, A) + b
      
       # Apply output activation function
       activation_function = self.activations[self.L-1]
       if activation_function == "sigmoid":
           AL = sigmoid(Z)
       elif activation_function == "softmax":
           AL = softmax(Z)
       elif activation_function == "linear":
           AL = Z  # No activation for regression
      
       # Store output layer values
       caches[f'Z{self.L}'] = Z
       caches[f'A{self.L}'] = AL
      
       return AL, caches

उपरोक्त NeuralNetwork क्लास एक कस्टमाइज़ेबल आर्किटेक्चर के साथ न्यूरल नेटवर्क बनाने और उपयोग करने के लिए पूर्ण ढाँचा देती है। इसके प्रमुख घटक इस प्रकार हैं:

  1. इनिशियलाइज़ेशन: नेटवर्क को निर्दिष्ट लेयर डायमेंशन्स और एक्टिवेशन फ़ंक्शन्स के साथ कॉन्फ़िगर किया जाता है। बेहतर प्रशिक्षण प्रदर्शन के लिए वेट्स और बायस को He इनिशियलाइज़ेशन से ऑटोमैटिक सेट किया जाता है।
  2. फ़ॉरवर्ड प्रोपेगेशन: अभी जो forward_propagation मेथड लागू किया, वही नेटवर्क की भविष्यवाणी क्षमता का हृदय है। यह:
  • इनपुट डेटा को प्रत्येक परत से गुज़ारता है
  • हर परत पर उपयुक्त एक्टिवेशन फ़ंक्शन लागू करता है
  • बैकप्रोपेगेशन में उपयोग के लिए मध्यवर्ती मान कैश में संग्रहीत करता है
  • अंतिम आउटपुट और सभी कैश किए गए मान लौटाता है

3. एक्टिवेशन फ़ंक्शन्स: नेटवर्क ReLU, sigmoid, और softmax सहित कई एक्टिवेशन फ़ंक्शन्स का समर्थन करता है, जिससे यह रिग्रेशन और वर्गीकरण दोनों प्रकार की समस्याएँ संभाल सकता है।

4. लचीला आर्किटेक्चर: यह कार्यान्वयन मनचाही गहराई और चौड़ाई वाले नेटवर्क बनाने देता है, जो विभिन्न मशीन लर्निंग कार्यों के लिए उपयुक्त है।

यह कार्यान्वयन उस मानक पैटर्न का अनुसरण करता है जहाँ डेटा नेटवर्क में आगे की ओर बहता है, और प्रत्येक परत डेटा को बदलकर अगली परत को पास करती है।

अब एक छोटे उदाहरण नेटवर्क के साथ अपने कार्यान्वयन का परीक्षण करें:

# Create a sample network
# Input layer: 3 features
# Hidden layer 1: 4 neurons with ReLU activation
# Output layer: 2 neurons with sigmoid activation (binary classification)
layer_dims = [3, 4, 2]
activations = ["relu", "sigmoid"]
nn = NeuralNetwork(layer_dims, activations)

# Create sample input data - 3 features for 5 examples
X = np.random.randn(3, 5)

# Perform forward propagation
output, caches = nn.forward_propagation(X)

print(f"Input shape: {X.shape}")
print(f"Output shape: {output.shape}")
print(f"Output values:\n{output}")

आउटपुट:

Input shape: (3, 5)
Output shape: (2, 5)
Output values:
[[0.00386784 0.54343014 0.39661893 0.5        0.51056934]
[0.11877049 0.32541093 0.44840699 0.5        0.45586633]]

आइए यह भी विज़ुअलाइज़ करें कि नेटवर्क से गुजरते हुए डेटा कैसे रूपांतरित होता है:

def visualize_activations(caches, example_idx=0):
   """Visualize the activations for a single example through the network"""
   plt.figure(figsize=(15, 6))
  
   # Plot input
   plt.subplot(1, 3, 1)
   plt.bar(range(caches['A0'].shape[0]), caches['A0'][:, example_idx])
   plt.title('Input Layer')
   plt.xlabel('Feature')
   plt.ylabel('Value')
  
   # Plot hidden layer activation
   plt.subplot(1, 3, 2)
   plt.bar(range(caches['A1'].shape[0]), caches['A1'][:, example_idx])
   plt.title('Hidden Layer (ReLU Activation)')
   plt.xlabel('Neuron')
   plt.ylabel('Activation')
  
   # Plot output layer
   plt.subplot(1, 3, 3)
   plt.bar(range(caches['A2'].shape[0]), caches['A2'][:, example_idx])
   plt.title('Output Layer (Sigmoid Activation)')
   plt.xlabel('Neuron')
   plt.ylabel('Activation')
  
   plt.tight_layout()
   plt.show()

# Visualize the first example
visualize_activations(caches)

This visualization helps us understand how the input data is transformed as it propagates through a neural network.

यह विज़ुअलाइज़ेशन दिखाता है कि नेटवर्क से गुजरते हुए इनपुट डेटा कैसे रूपांतरित होता है। हम देख सकते हैं कि:

  1. इनपुट फ़ीचर्स धनात्मक या ऋणात्मक हो सकते हैं
  2. हिडन लेयर में ReLU के बाद, सभी एक्टिवेशन गैर-ऋणात्मक होते हैं
  3. आउटपुट लेयर में sigmoid मानों को 0 और 1 के बीच सीमित करता है

हमारा “स्क्रैच से” कार्यान्वयन फ़ॉरवर्ड प्रोपेगेशन के मूल सिद्धांत दर्शाता है, लेकिन आधुनिक फ़्रेमवर्क्स न्यूरल नेटवर्क बनाने के लिए अधिक कुशल और लचीले उपकरण देते हैं।

डीप लर्निंग फ़्रेमवर्क्स का उपयोग

अब, लोकप्रिय डीप लर्निंग फ़्रेमवर्क्स—TensorFlow और PyTorch—का उपयोग करके वही न्यूरल नेटवर्क लागू करें। ये फ़्रेमवर्क्स प्रदर्शन को अनुकूलित करते हैं और उच्च-स्तर के एब्स्ट्रैक्शंस देते हैं, जिससे जटिल मॉडल बनाना आसान होता है।

पहले, TensorFlow/Keras का कार्यान्वयन देखें:

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Input

# For reproducibility
tf.random.set_seed(42)

# Create the same network architecture
tf_model = Sequential([
   Input(shape=(3,)),  # Input layer with 3 features
   Dense(4, activation='relu'),  # Hidden layer with 4 neurons
   Dense(2, activation='sigmoid')  # Output layer with 2 neurons
])

tf_model.summary()

A sample tensorflow model summary

# Sample input data with the shape expected by Keras
X_tf = np.random.randn(5, 3)  # 5 examples, 3 features

# Forward propagation in TensorFlow
tf_output = tf_model.predict(X_tf)

print(f"TensorFlow output shape: {tf_output.shape}")
print(f"TensorFlow output values:\n{tf_output}")
TensorFlow output shape: (5, 2)
TensorFlow output values:
[[0.6855308  0.7139542 ]
[0.4952355  0.5231934 ]
[0.50174904 0.5198488 ]
[0.44331825 0.6860926 ]
[0.6624589  0.5385444 ]]

अभी हमने TensorFlow/Keras का उपयोग करके अपना न्यूरल नेटवर्क लागू किया और कुछ नमूना डेटा पर फ़ॉरवर्ड प्रोपेगेशन सफलतापूर्वक किया। मॉडल समरी हमारी आर्किटेक्चर दिखाती है—3 फ़ीचर्स लेने वाला इनपुट लेयर, 4 न्यूरॉन्स वाला ReLU हिडन लेयर, और 2 न्यूरॉन्स वाला sigmoid आउटपुट लेयर। कुल मिलाकर मॉडल में 26 ट्रेन करने योग्य पैरामीटर्स हैं।

फ़ॉरवर्ड प्रोपेगेशन के परिणाम आउटपुट शेप (5, 2) दिखाते हैं—हमारे 5 इनपुट उदाहरणों के लिए प्रत्येक में 2 आउटपुट मान। आउटपुट लेयर में sigmoid होने के कारण ये मान 0 और 1 के बीच सीमित होते हैं।

अब देखते हैं कि PyTorch का उपयोग करके वही आर्किटेक्चर कैसे बनाया जा सकता है, ताकि तरीकों की तुलना की जा सके।

import torch
import torch.nn as nn

# For reproducibility
torch.manual_seed(42)

# Create a network in PyTorch
class PyTorchNN(nn.Module):
   def __init__(self):
       super(PyTorchNN, self).__init__()
       self.hidden = nn.Linear(3, 4)  # 3 inputs, 4 hidden neurons
       self.relu = nn.ReLU()
       self.output = nn.Linear(4, 2)  # 4 inputs from hidden, 2 outputs
       self.sigmoid = nn.Sigmoid()
  
   def forward(self, x):
       x = self.relu(self.hidden(x))
       x = self.sigmoid(self.output(x))
       return x

# Instantiate the model
torch_model = PyTorchNN()

# Print model structure
print(torch_model)

आउटपुट:

PyTorchNN(
 (hidden): Linear(in_features=3, out_features=4, bias=True)
 (relu): ReLU()
 (output): Linear(in_features=4, out_features=2, bias=True)
 (sigmoid): Sigmoid()
)

```python
# Sample input data
X_torch = torch.randn(5, 3)  # 5 examples, 3 features

# Forward propagation in PyTorch
torch_output = torch_model(X_torch)

print(f"PyTorch output shape: {torch_output.shape}")
print(f"PyTorch output values:\n{torch_output}")

आउटपुट:

PyTorch output shape: torch.Size([5, 2])
PyTorch output values:
tensor([[0.4516, 0.4116],
       [0.4289, 0.4267],
       [0.4278, 0.4172],
       [0.3771, 0.4321],
       [0.5769, 0.3328]], grad_fn=<SigmoidBackward0>)

अब अपने कार्यान्वयनों की तुलना करें:

# Compare dimensions and structure of outputs
print("\nComparison of implementations:")
print(f"NumPy output shape: {output.shape}")
print(f"TensorFlow output shape: {tf_output.shape}")
print(f"PyTorch output shape: {torch_output.shape}")

आउटपुट:

Comparison of implementations:
NumPy output shape: (2, 5)
TensorFlow output shape: (5, 2)
PyTorch output shape: torch.Size([5, 2])

हमारे कार्यान्वयनों के बीच मुख्य अंतर:

  1. संरचना और पठनीयता:
  • NumPy: हर चरण का स्पष्ट कार्यान्वयन—पूर्ण नियंत्रण और पारदर्शिता
  • TensorFlow/Keras: उच्च-स्तरीय एब्स्ट्रैक्शन—विवरण छिपते हैं पर कोड सरल होता है
  • PyTorch: ऑब्जेक्ट-ओरिएंटेड अप्रोच—स्पष्ट forward मेथड
  1. प्रदर्शन:
  • TensorFlow और PyTorch GPU त्वरक के लिए ऑपरेशन्स को अनुकूलित करते हैं
  • दोनों फ़्रेमवर्क्स प्रशिक्षण हेतु कुशल ग्रेडिएंट गणना लागू करते हैं
  • बड़े नेटवर्क्स के लिए मेमोरी उपयोग का अनुकूलन
  1. विस्तारणीयता:
  • फ़्रेमवर्क्स में प्री-बिल्ट घटक (लेयर्स, ऑप्टिमाइज़र्स, आदि) उपलब्ध
  • मॉडल सेव/लोड, विज़ुअलाइज़ेशन और डिप्लॉयमेंट के लिए टूल्स
  • व्यापक समुदाय समर्थन और प्रलेखन

सरल नेटवर्क्स के लिए हमारा NumPy कार्यान्वयन पर्याप्त है, लेकिन जटिलता बढ़ने पर डीप लर्निंग फ़्रेमवर्क्स आवश्यक हो जाते हैं। वे लो-लेवल अनुकूलन सँभालते हैं और विकास से लेकर तैनाती तक पूरे वर्कफ़्लो के लिए टूल्स देते हैं। इन फ़्रेमवर्क्स पर और जानने के लिए ये अलग गाइड देखें:

अगले भाग में, हम एक संपूर्ण कार्यशील उदाहरण बनाएँगे जो वास्तविक समस्या पर फ़ॉरवर्ड प्रोपेगेशन लागू करता है।

फ़ॉरवर्ड प्रोपेगेशन उदाहरण

अब जब हमने फ़ॉरवर्ड प्रोपेगेशन को स्क्रैच से और लोकप्रिय फ़्रेमवर्क्स के साथ लागू कर लिया है, तो इसे वास्तविक समस्या पर क्रिया में देखें। हम एक संपूर्ण उदाहरण बनाएँगे और बेहतर प्रदर्शन के लिए प्रक्रिया को अनुकूलित करना देखेंगे।

संपूर्ण कार्यशील उदाहरण

हाथ से लिखे अंकों की पहचान (MNIST डेटासेट) जैसी क्लासिक समस्या पर अपना ज्ञान लागू करें। इस डेटासेट में 70,000 इमेज़ (0–9) हैं, प्रत्येक 28x28 पिक्सेल।

पहले डेटा लोड और तैयार करें:

from tensorflow.keras.datasets import mnist
import numpy as np
import matplotlib.pyplot as plt

# Load MNIST dataset
(X_train, y_train), (X_test, y_test) = mnist.load_data()

# Normalize pixel values to range [0, 1]
X_train = X_train / 255.0
X_test = X_test / 255.0

# Reshape images to vectors (flatten 28x28 to 784)
X_train_flat = X_train.reshape(X_train.shape[0], -1).T  # Shape: (784, 60000)
X_test_flat = X_test.reshape(X_test.shape[0], -1).T     # Shape: (784, 10000)

# Convert labels to one-hot encoding
def one_hot_encode(y, num_classes=10):
   one_hot = np.zeros((num_classes, y.size))
   one_hot[y, np.arange(y.size)] = 1
   return one_hot

y_train_one_hot = one_hot_encode(y_train)  # Shape: (10, 60000)
y_test_one_hot = one_hot_encode(y_test)    # Shape: (10, 10000)

# Display sample images
plt.figure(figsize=(10, 5))
for i in range(5):
   plt.subplot(1, 5, i+1)
   plt.imshow(X_train[i], cmap='gray')
   plt.title(f"Label: {y_train[i]}")
   plt.axis('off')
plt.tight_layout()
plt.show()

Output of a neural network for digits classification

अब, अपने NumPy कार्यान्वयन से इस कार्य के लिए एक न्यूरल नेटवर्क बनाएँ। हम यह नेटवर्क बनाएँगे:

  • इनपुट लेयर: 784 न्यूरॉन्स (28x28 पिक्सेल)
  • हिडन लेयर: 128 न्यूरॉन्स ReLU एक्टिवेशन के साथ
  • आउटपुट लेयर: 10 न्यूरॉन्स softmax एक्टिवेशन के साथ (10 अंकों के लिए)
# Define our network architecture
layer_dims = [784, 128, 10]
activations = ["relu", "softmax"]
nn = NeuralNetwork(layer_dims, activations)

# Take a small batch for demonstration
batch_size = 64
batch_indices = np.random.choice(X_train_flat.shape[1], batch_size, replace=False)
X_batch = X_train_flat[:, batch_indices]
y_batch = y_train_one_hot[:, batch_indices]

# Perform forward propagation
output, caches = nn.forward_propagation(X_batch)

# Compute accuracy
predictions = np.argmax(output, axis=0)
true_labels = np.argmax(y_batch, axis=0)
accuracy = np.mean(predictions == true_labels)

print(f"Batch accuracy: {accuracy:.4f}")

Out: Batch accuracy: 0.0781

हमें 7% सटीकता मिली, जो यादृच्छिक अनुमान से भी कम है। लेकिन यह अपेक्षित है क्योंकि हम केवल फ़ॉरवर्ड प्रोपेगेशन कर रहे हैं—अभी किसी तरह का सीखना (ट्रेनिंग) शामिल नहीं है।

अब देखें कि नेटवर्क एक एकल इमेज़ को हर परत से गुजरते हुए कैसे प्रोसेस करता है:

def visualize_network_processing(nn, image, label, caches):
   """Visualize network processing for a single image"""
   plt.figure(figsize=(15, 10))
  
   # Plot original image
   plt.subplot(2, 3, 1)
   plt.imshow(image.reshape(28, 28), cmap='gray')
   plt.title(f"Input Image (Digit: {label})")
   plt.axis('off')
  
   # Plot flattened input (first 100 values)
   plt.subplot(2, 3, 2)
   plt.bar(range(100), image.flatten()[:100])
   plt.title("Input Layer (first 100 pixels)")
   plt.xlabel("Pixel Index")
   plt.ylabel("Pixel Value")
  
   # Plot hidden layer activations (first 50 neurons)
   plt.subplot(2, 3, 3)
   hidden_activations = caches['A1'][:50, 0]
   plt.bar(range(len(hidden_activations)), hidden_activations)
   plt.title("Hidden Layer Activations (first 50 neurons)")
   plt.xlabel("Neuron Index")
   plt.ylabel("Activation")
  
   # Plot output layer activations
   plt.subplot(2, 3, 4)
   output_activations = caches['A2'][:, 0]
   plt.bar(range(10), output_activations)
   plt.xticks(range(10))
   plt.title("Output Layer Activations (Softmax)")
   plt.xlabel("Digit Class")
   plt.ylabel("Probability")
  
   # Plot prediction vs actual
   plt.subplot(2, 3, 5)
   prediction = np.argmax(output_activations)
   plt.bar(['Actual', 'Predicted'], [label, prediction], color=['blue', 'orange'])
   plt.title(f"Prediction: {prediction}, Actual: {label}")
   plt.ylabel("Digit")
  
   plt.tight_layout()
   plt.show()

# Visualize forward propagation for the first image in our batch
image_idx = 0
image = X_batch[:, image_idx].reshape(784, 1)
label = true_labels[image_idx]

visualize_network_processing(nn, image, label, caches)

A diagram showing how an image of the digit 4 flows through a sample neural network

यह विज़ुअलाइज़ेशन दिखाता है कि सूचना हमारे नेटवर्क से कैसे बहती है:

  1. इनपुट लेयर: फ़्लैट किए गए इमेज पिक्सेल (0 और 1 के बीच मान)
  2. हिडन लेयर: ReLU-सक्रिय न्यूरॉन्स अंक की अलग-अलग विशेषताएँ पकड़ते हैं
  3. आउटपुट लेयर: softmax 10 संभावित अंकों पर प्रायिकता वितरण देता है

सबसे सक्रिय आउटपुट न्यूरॉन नेटवर्क की भविष्यवाणी से मेल खाता है। भले ही वेट्स यादृच्छिक हों (क्योंकि हमने अभी तक ट्रेनिंग नहीं की), हम देख सकते हैं कि फ़ॉरवर्ड प्रोपेगेशन इनपुट डेटा को भविष्यवाणी में कैसे बदलता है।

पूरा उदाहरण बनाने के लिए, हम बैकप्रोपेगेशन से इस नेटवर्क को प्रशिक्षित करेंगे—वेट्स और बायस समायोजित करके समय के साथ भविष्यवाणियाँ सुधारी जाएँगी। पर बिना प्रशिक्षण के भी, यह उदाहरण वास्तविक डेटा पर फ़ॉरवर्ड प्रोपेगेशन की प्रक्रिया दर्शाता है।

फ़ॉरवर्ड प्रोपेगेशन का अनुकूलन

जैसे-जैसे नेटवर्क बड़े और डेटासेट विशाल होते जाते हैं, फ़ॉरवर्ड प्रोपेगेशन का अनुकूलन अहम हो जाता है। यहाँ कुछ प्रमुख रणनीतियाँ हैं:

1. बैच प्रोसेसिंग

एक समय में एक उदाहरण प्रोसेस करने के बजाय, हम एक साथ उदाहरणों के बैच पर फ़ॉरवर्ड प्रोपेगेशन करते हैं। इससे आधुनिक हार्डवेयर की पैरेलल प्रोसेसिंग क्षमता का लाभ मिलता है।

2. वेक्टराइज़ेशन

लूप्स की जगह मैट्रिक्स ऑपरेशन्स का उपयोग गणना को बहुत तेज़ कर देता है। इसलिए हमारे कार्यान्वयन में NumPy ऐरे ऑपरेशन्स का उपयोग किया गया।

3. मेमोरी प्रबंधन

बड़े नेटवर्क्स में मेमोरी उपयोग का ध्यान रखना पड़ता है। तकनीकों में शामिल हैं:

  • मध्यवर्ती एक्टिवेशन के लिए मेमोरी का पुन: उपयोग
  • सभी मध्यवर्तियों को संग्रहीत किए बिना परत-दर-परत एक्टिवेशन की गणना
  • निम्न परिशुद्धता अभ्यावेदन का उपयोग (जैसे 32-बिट की जगह 16-बिट फ्लोट)

4. GPU त्वरक

ग्राफ़िक्स प्रोसेसिंग यूनिट्स मैट्रिक्स ऑपरेशनों में निपुण होती हैं। आधुनिक फ़्रेमवर्क्स सरलता से गणना को GPU पर ले जा सकते हैं, जिससे बड़ा स्पीडअप मिलता है:

# TensorFlow example of GPU acceleration
import tensorflow as tf

# Check for available GPUs
print("GPUs Available:", tf.config.list_physical_devices('GPU'))

# TensorFlow automatically uses available GPUs
with tf.device('/GPU:0'):  # Explicitly specify GPU if multiple are available
   # Computation runs on GPU if available
   result = tf_model.predict(X_tf)

5. विशिष्ट हार्डवेयर

GPUs से आगे, Google के Tensor Processing Units (TPUs) जैसे हार्डवेयर विशेष रूप से न्यूरल नेटवर्क ऑपरेशन्स के लिए बनाए गए हैं।

6. एल्गोरिद्मिक अनुकूलन

कुछ एक्टिवेशन फ़ंक्शन्स और नेटवर्क आर्किटेक्चर संगणनात्मक दक्षता के लिए डिज़ाइन किए गए हैं:

  • ReLU की गणना sigmoid या tanh से तेज़ होती है
  • Depthwise separable convolutions, मानक कॉन्वोल्यूशन्स की तुलना में गणना कम करती हैं
  • नेटवर्क प्रूनिंग अनावश्यक कनेक्शन्स हटाकर गणना घटाती है

7. फ़्रेमवर्क अनुकूलन

डीप लर्निंग फ़्रेमवर्क्स कई लो-लेवल अनुकूलन लागू करते हैं:

  • Fused operations—कई चरणों को एक ही कुशल कर्नेल में संयोजित करना
  • ऑटो-ट्यून एल्गोरिद्म—विशिष्ट हार्डवेयर के लिए सबसे तेज़ इम्प्लिमेंटेशन चुनना
  • JIT (Just-In-Time) कम्पाइलेशन—विशिष्ट नेटवर्क कॉन्फ़िगरेशन के लिए अनुकूलित कोड बनाना

जैसे-जैसे नेटवर्क गहरे और चौड़े होते जाते हैं, फ़ॉरवर्ड प्रोपेगेशन का अनुकूलन और महत्वपूर्ण होता जाता है। ResNets, Transformers और EfficientNets जैसी आधुनिक आर्किटेक्चर्स फ़ॉरवर्ड प्रोपेगेशन को अधिक कुशल बनाने के लिए विशेष डिज़ाइन विकल्पों को शामिल करती हैं, जबकि मॉडल सटीकता बरकरार या बेहतर रहती है।

अगले भाग में, हम देखेंगे कि फ़ॉरवर्ड प्रोपेगेशन का बैकप्रोपेगेशन से क्या संबंध है—यही पूरी सीखने की प्रक्रिया को पूर्ण करता है।

बैकप्रोपेगेशन के साथ संबंध

हमने अब फ़ॉरवर्ड प्रोपेगेशन को विस्तार से देखा है, पर न्यूरल नेटवर्क्स के संदर्भ में यह कहानी का केवल आधा हिस्सा है। आइए संक्षेप में देखें कि फ़ॉरवर्ड प्रोपेगेशन का बैकप्रोपेगेशन से कैसा संबंध है—यही एल्गोरिद्म नेटवर्क को सीखने में सक्षम बनाता है।

फ़ॉरवर्ड और बैकवर्ड प्रोपेगेशन को जोड़ना

फ़ॉरवर्ड प्रोपेगेशन और बैकप्रोपेगेशन न्यूरल नेटवर्क्स में पूरक प्रक्रियाएँ हैं:

  • फ़ॉरवर्ड प्रोपेगेशन इनपुट लेकर भविष्यवाणी करता है—नेटवर्क में बाएँ से दाएँ चलता है।
  • बैकप्रोपेगेशन त्रुटियाँ लेकर वेट अपडेट निकालता है—नेटवर्क में दाएँ से बाएँ चलता है।

ये दोनों प्रक्रियाएँ सीखने में अविभाज्य हैं। बैकप्रोपेगेशन फ़ॉरवर्ड प्रोपेगेशन के बिना नहीं हो सकता, क्योंकि उसे चाहिए:

  1. हर परत के एक्टिवेशन (जिन्हें हमने कैश में संग्रहीत किया)
  2. अंतिम भविष्यवाणी—जिसकी तुलना सही लेबल से होगी
  3. फ़ॉरवर्ड प्रोपेगेशन के दौरान प्रयुक्त नेटवर्क आर्किटेक्चर और वेट्स

फ़ॉरवर्ड प्रोपेगेशन को ऐसे समझें जैसे नेटवर्क अपनी मौजूदा समझ के आधार पर सर्वोत्तम अनुमान लगा रहा है, जबकि बैकप्रोपेगेशन उन गलतियों के आधार पर उस समझ को परिष्कृत करता है।

लर्निंग लूप

पूरी सीखने की प्रक्रिया एक चक्रीय पैटर्न का अनुसरण करती है:

  1. फ़ॉरवर्ड प्रोपेगेशन: नेटवर्क इनपुट डेटा प्रोसेस करके भविष्यवाणियाँ करता है।
  2. लॉस गणना: भविष्यवाणियों की वास्तविक लक्ष्य से तुलना कर त्रुटि निकाली जाती है।
  3. बैकवर्ड प्रोपेगेशन: त्रुटि को नेटवर्क में पीछे की ओर फैलाकर पता लगाया जाता है कि प्रत्येक वेट का उसमें कितना योगदान था।
  4. वेट अपडेट: त्रुटि घटाने के लिए वेट्स समायोजित किए जाते हैं।
  5. दोहराव: यह प्रक्रिया नए डेटा के साथ तब तक चलती रहती है जब तक नेटवर्क अच्छा प्रदर्शन न करने लगे।

इस प्रक्रिया की शक्ति इसलिए है क्योंकि फ़ॉरवर्ड प्रोपेगेशन बैकप्रोपेगेशन के लिए आवश्यक संदर्भ प्रदान करता है। फ़ॉरवर्ड चरण में, नेटवर्क न केवल भविष्यवाणी करता है बल्कि सभी मध्यवर्ती मानों और निर्णयों का हिसाब भी रखता है। बैकप्रोपेगेशन फिर इन्हीं सूचनाओं का उपयोग लक्षित समायोजन करने में करता है।

इस व्यवस्था की खूबसूरती यह है कि दो अपेक्षाकृत सरल प्रक्रियाओं के साथ मिलकर जटिल सीखना उभरता है। फ़ॉरवर्ड प्रोपेगेशन सीधा है—बस क्रम से मैट्रिक्स गुणन और एक्टिवेशन फ़ंक्शन्स। बैकप्रोपेगेशन अधिक जटिल है, पर सीधे-सीधे कलन सिद्धांतों से निकलता है।

मिलकर, ये न्यूरल नेटवर्क्स को पर्याप्त डेटा और कम्प्यूटेशनल संसाधनों के साथ लगभग किसी भी पैटर्न को सीखने में सक्षम बनाते हैं। इसी सीखने की क्षमता ने कंप्यूटर विज़न, नेचुरल लैंग्वेज प्रोसेसिंग, गेम-प्लेइंग और असंख्य अन्य क्षेत्रों में प्रगति को गति दी है।

इस लेख में फ़ॉरवर्ड प्रोपेगेशन को गहराई से समझना—पूरी सीखने की प्रक्रिया को समझने की नींव देता है। सीखने के पहलू में और गहराई से जाने के लिए, हमारे backpropagation गाइड में देखें कि नेटवर्क्स अपनी गलतियों से कैसे सीखते हैं।

निष्कर्ष और अगले कदम

फ़ॉरवर्ड प्रोपेगेशन वह आधारभूत प्रक्रिया है जो न्यूरल नेटवर्क्स को इनपुट्स को भविष्यवाणियों में बदलने देती है। जैसा कि हमने देखा, इसमें क्रमिक मैट्रिक्स गुणन और एक्टिवेशन फ़ंक्शन शामिल हैं जो डेटा को परत-दर-परत रूपांतरित करते हैं। चाहे आप स्क्रैच से नेटवर्क लागू कर रहे हों, आधुनिक फ़्रेमवर्क्स का उपयोग कर रहे हों, या मॉडल प्रदर्शन को ट्रबलशूट कर रहे हों—इस प्रक्रिया को समझना अत्यंत महत्वपूर्ण है। 

फ़ॉरवर्ड प्रोपेगेशन में महारत हासिल करके, आपने गहन शिक्षण मॉडलों को बनाने और समझने की दिशा में एक महत्वपूर्ण कदम उठा लिया है—जो विभिन्न क्षेत्रों में जटिल समस्याओं को सुलझा सकते हैं।

अपनी डीप लर्निंग यात्रा जारी रखने के लिए, DataCamp के व्यापक संसाधन देखें: 

  • न्यूरल नेटवर्क्स के पीछे के गणित में गहराई से जाएँ: Introduction to Deep Neural Networks
  • ट्रेनिंग प्रक्रिया में महारत हासिल करें: Mastering Backpropagation
  • नेटवर्क बनाकर हाथ आज़माएँ PyTorch या R में। 

एक संरचित लर्निंग पाथ के लिए, Deep Learning in Python ट्रैक आपको वास्तविक अनुप्रयोगों के लिए न्यूरल नेटवर्क बनाना और तैनात करना सिखाने हेतु आवश्यक सब कुछ प्रदान करता है।

Forward Propagation FAQs

What is the difference between forward propagation and backpropagation?

फ़ॉरवर्ड प्रोपेगेशन इनपुट से आउटपुट तक डेटा को न्यूरल नेटवर्क में आगे बढ़ाकर भविष्यवाणी करने की प्रक्रिया है। बैकप्रोपेगेशन उलटी दिशा में चलता है—त्रुटियों के आधार पर वेट्स अपडेट करने हेतु ग्रेडिएंट्स की गणना करता है। प्रशिक्षण में ये दोनों साथ काम करते हैं—फ़ॉरवर्ड प्रोपेगेशन भविष्यवाणी करता है, बैकप्रोपेगेशन नेटवर्क को गलतियों से सीखने में मदद करता है।

Why do we need activation functions in forward propagation?

एक्टिवेशन फ़ंक्शन्स न्यूरल नेटवर्क्स में नॉन-लिनियरिटी लाते हैं, जिससे वे सरल रैखिक संबंधों से आगे जटिल पैटर्न सीख पाते हैं। इनके बिना, कितनी भी परतें हों, नेटवर्क एकल रैखिक लेयर जैसा बर्ताव करेगा—और डेटा से सीखने की उसकी क्षमता गंभीर रूप से सीमित हो जाएगी।

How is forward propagation implemented efficiently in modern frameworks?

आधुनिक फ़्रेमवर्क्स बैच प्रोसेसिंग, GPU त्वरक, वेक्टराइज़्ड ऑपरेशन्स, मेमोरी प्रबंधन तकनीकें, और विशेष एल्गोरिद्म के माध्यम से फ़ॉरवर्ड प्रोपेगेशन को अनुकूलित करते हैं। TensorFlow और PyTorch ये अनुकूलन स्वतः सँभालते हैं, जिससे आपको लो-लेवल विवरण मैनेज किए बिना जटिल नेटवर्क बनाने की सुविधा मिलती है।

Can forward propagation be used without training the network?

हाँ। एक बार नेटवर्क प्रशिक्षित हो जाने के बाद, इंफ़रेंस (नए डेटा पर भविष्यवाणी) के दौरान केवल फ़ॉरवर्ड प्रोपेगेशन का उपयोग होता है। यही कारण है कि फ़ॉरवर्ड प्रोपेगेशन को समझना मॉडल तैनाती के लिए महत्वपूर्ण है—क्योंकि बैकप्रोपेगेशन के साथ प्रशिक्षण केवल विकास चरण में आवश्यक है।

How does the choice of activation function affect forward propagation?

विभिन्न एक्टिवेशन फ़ंक्शन्स नेटवर्क की सीखने की क्षमता और संगणनात्मक दक्षता, दोनों को प्रभावित करते हैं। ReLU की गणना तेज़ है और vanishing gradients से बचाने में मदद करता है; sigmoid बाइनरी आउटपुट्स के लिए उपयोगी है; और softmax मल्टी-क्लास समस्याओं में आउटपुट को सामान्यीकृत करता है। आपका चयन इस पर असर डालता है कि नेटवर्क क्या पैटर्न सीख सकता है और वह डेटा कितनी तेज़ी से प्रोसेस करता है।


Bexruz (Bex) Tuychiev's photo
Author
Bexruz (Bex) Tuychiev
LinkedIn

मैं 2 से अधिक वर्षों के अनुभव वाला डेटा साइंस कंटेंट क्रिएटर हूँ और Medium पर सबसे बड़े फॉलोइंग्स में से एक रखता हूँ। मुझे एआई और एमएल पर विस्तार से लेख लिखना पसंद है, जिसमें हल्का-सा व्यंग्यात्मक अंदाज रहता है—क्योंकि कुछ तो करना पड़ता है ताकि वे कम उबाऊ लगें। मैंने 130 से अधिक लेख और एक DataCamp कोर्स तैयार किया है, और एक और बन रहा है। मेरा कंटेंट 50 लाख से अधिक लोगों ने देखा है, जिनमें से 20 हज़ार लोग Medium और LinkedIn पर फॉलोअर्स बन गए। 

विषय
कृत्रिम बुद्धिमत्ता
Python
मशीन लर्निंग

शीर्ष DataCamp कोर्स

{count, plural, one {कोर्स} other {कोर्स}}

इंटरमीडिएट Deep Learning with PyTorch

{hours} घंटा
30.1K
CNN, RNN, LSTM और GRU जैसी मूलभूत डीप लर्निंग आर्किटेक्चर सीखें, ताकि इमेज और क्रमिक डेटा का मॉडल बना सकें।
विवरण देखेंRight Arrow
पाठ्यक्रम शुरू करें

{count, plural, one {लर्निंग पाथ} other {लर्निंग पाथ}}

डीप लर्निंग में Python

{hours} घंटा
अपने मशीन लर्निंग सफर को डीप लर्निंग तक आगे बढ़ाएँ। विभिन्न डेटा प्रकारों को मॉडल करने के लिए न्यूरल नेटवर्क बनाने हेतु PyTorch लाइब्रेरी का उपयोग करें।
और देखेंRight Arrow