डीप लर्निंग नॉलेज इंटरव्यू के दौरान पूछे जाने वाले सबसे आम सवालों में से एक है - " हम न्यूरल नेटवर्क को प्रशिक्षित करने के लिए क्वाड्रैटिक कॉस्ट फ़ंक्शन का उपयोग क्यों नहीं कर सकते? " इस लेख में, हम इस प्रश्न के उत्तर पर चर्चा करेंगे। इसमें बहुत सारा गणित शामिल होगा लेकिन कुछ भी पागलपन भरा नहीं होगा! मैं चीजों को सरल और सटीक रखूँगा।
आइए न्यूरल नेटवर्क की सामान्य वास्तुकला पर विचार करके शुरुआत करें
हमारे पास बाइनरी वर्गीकरण समस्या के लिए एक “इनपुट लेयर” बनाने वाले इनपुट की एक श्रृंखला, “छिपी हुई परत” में न्यूरॉन्स की एक श्रृंखला और एक न्यूरॉन “आउटपुट लेयर” बनाता है। इस प्रश्न के लिए, हम मान लेंगे कि हम एक बाइनरी क्लासिफायर के साथ काम कर रहे हैं, इसलिए हमारे पास नेटवर्क से केवल एक आउटपुट मान है।
अब, निम्न चित्र को देखें, जहाँ हमने इनपुट लेयर को हरे रंग से, आउटपुट न्यूरॉन को लाल रंग से और छिपी हुई लेयर के एक न्यूरॉन को नारंगी रंग से हाइलाइट किया है। सभी हरे रंग से लेकर नारंगी रंग तक, हम देखते हैं कि सभी इनपुट नारंगी न्यूरॉन से जुड़े हुए हैं। दूसरे शब्दों में, नारंगी न्यूरॉन का "सक्रियण" इनपुट लेयर में सभी हरे न्यूरॉन्स के "एकत्रीकरण" का उपयोग करके होता है। यह प्रक्रिया सभी परतों पर सभी न्यूरॉन्स पर दोहराई जाती है जब तक कि हम अंतिम लाल आउटपुट न्यूरॉन तक नहीं पहुँच जाते।
क्या होगा यदि हम नारंगी न्यूरॉन को लाल न्यूरॉन से बदल दें, अर्थात, हम छिपी हुई परत को हटा दें और लाल न्यूरॉन को हरे न्यूरॉन के साथ सीधे जोड़ दें?
हमें निम्नलिखित मिलेगा:
इस प्रश्न के लिए, हम उपर्युक्त 'सरलीकृत वास्तुकला' को मानेंगे और परिणाम को संपूर्ण वास्तुकला के लिए भी सामान्यीकृत किया जा सकता है।
अब आइये चरण-दर-चरण गणित से परिचित हों।
ऊपर जो हम देख रहे हैं वह न्यूरल नेटवर्क के लिए बुनियादी "वेट अपडेट" समीकरण है। मैंने लर्निंग फैक्टर और सब-सैंपलिंग (मिन-बैच) आदि जैसे अतिरिक्त हाइपरपैरामीटर हटा दिए हैं। w_k वज़न का वेक्टर है और वज़न हमारे न्यूरल नेटवर्क मॉडल के 'पैरामीटर' हैं। w_k में कॉलम वेक्टर में एकत्रित व्यक्तिगत वज़न शामिल हैं। ये वज़न मॉडल के इनपुट (जो हमारे आर्किटेक्चर में हरे न्यूरॉन्स हैं) से जुड़े हैं। हमारे पास एक लागत फ़ंक्शन C_i है जहाँ i = 1 से n हमारे नमूने में डेटा इंस्टेंस की संख्या है। लागत फ़ंक्शन C वास्तविक आउटपुट y और न्यूरल नेटवर्क (लाल न्यूरॉन) से आउटपुट के बीच "त्रुटि" है। प्रत्येक डेटा इंस्टेंस वास्तविक आउटपुट के बजाय एक अनुमानित आउटपुट का उत्पादन करेगा, इसलिए, प्रत्येक डेटा इंस्टेंस के लिए एक लागत या त्रुटि होगी। मॉडल का उद्देश्य पूरे डेटासेट पर औसतन इस लागत फ़ंक्शन को कम करना है। और जैसा कि हम जानते हैं, न्यूनतमकरण चरण में मॉडल मापदंडों (वज़न) के संबंध में व्युत्पन्न लेना शामिल है। हम इसे वेक्टर w_k के आंशिक व्युत्पन्न का उपयोग करके करते हैं। इसका मतलब यह है कि लागत C भार w_1 से w_q का एक अभिव्यक्ति/समुच्चय होगा और हम प्रत्येक भार w को विभेदित करेंगे और उसे एक वेक्टर में एकत्र करेंगे। इसे नकारात्मक "ग्रेडिएंट वेक्टर" कहा जाता है। इसका उपयोग भार वेक्टर को k-वें पुनरावृत्ति से (k+1)वें पुनरावृत्ति तक अपडेट करने के लिए किया जाता है। कार्यप्रणाली स्टोचैस्टिक ग्रेडिएंट अवरोहण है लेकिन हम इसे इस लेख के लिए छोड़ देंगे।
संक्षेप में, तंत्रिका नेटवर्क सभी नमूनों पर औसत और w_k के लिए गणना की गई नकारात्मक ग्रेडिएंट वेक्टर के माध्यम से भार के अपडेट द्वारा सीखता है। यह हमें लागत फ़ंक्शन को कम करने में मदद करता है और नेटवर्क को सीखने और इसकी सटीकता में सुधार करने में मदद करता है। यह स्पष्ट है कि यदि भार में अपडेट नहीं हो रहे हैं, क्योंकि नकारात्मक ग्रेडिएंट शून्य की ओर बढ़ रहा है, तो सीखना बंद हो गया है। इसका मतलब यह नहीं है कि हम न्यूनतम पर पहुँच गए हैं! क्योंकि हमारा लागत फ़ंक्शन अत्यधिक जटिल है और हमें एक बहुआयामी स्थान में न्यूनतम खोजने की आवश्यकता है। इसलिए, कई स्थानीय न्यूनतम हो सकते हैं जहाँ ग्रेडिएंट शून्य है और नेटवर्क सीखना बंद कर देता है। वैसे भी, हमें इस समस्या के लिए इसके बारे में चिंता करने की ज़रूरत नहीं है।
आइये निम्नलिखित अभिव्यक्ति पर नजर डालें:
यह अभिव्यक्ति z_i को x_ji इनपुट के भारित योग के रूप में परिभाषित करती है। ध्यान दें कि ये इनपुट हमारे आर्किटेक्चर में हरे न्यूरॉन्स हैं। चूँकि हमारे पास कोई छिपी हुई परत नहीं है, इसलिए हम इनपुट x_ji और भार w_j को मिलाते हैं और z_i प्राप्त करने के लिए एक पूर्वाग्रह शब्द जोड़ते हैं, जिसे हमारे आर्किटेक्चर में हरे न्यूरॉन्स से लाल न्यूरॉन तक जोड़ने वाले तीरों द्वारा दर्शाया जाता है। चूँकि हमारे पास q इनपुट हैं, इसलिए हमारे पास x_j और w_j हैं जहाँ j = 1 से q है
लेकिन, हम z_i को लाल न्यूरॉन में नहीं भेजते। हम इस पर एक "एक्टिवेशन फ़ंक्शन" लागू करते हैं। यह एक्टिवेशन फ़ंक्शन अलग-अलग न्यूरल नेटवर्क के लिए अलग-अलग हो सकता है। इस समस्या के उद्देश्यों के लिए, हम मानते हैं कि एक्टिवेशन फ़ंक्शन "सिग्मॉइड" या "लॉजिस्टिक" है। मैं यहाँ मान लूँगा कि पाठक इस फ़ंक्शन के बारे में जानते हैं और आगे बढ़ते हैं।
इसके बाद हमारी मुख्य समस्या का विवरण आता है - हम लागत फ़ंक्शन (C) को कैसे परिभाषित करते हैं? यह सर्वविदित है कि बाइनरी वर्गीकरण के लिए, लागत फ़ंक्शन "क्रॉस एन्ट्रॉपी" है, लेकिन यहाँ सवाल यह है कि यह "द्विघात" क्यों नहीं हो सकता है।
आइए दोनों लागत कार्यों की अभिव्यक्तियों को परिभाषित करें:
द्विघात लागत फ़ंक्शन – क्रॉस एन्ट्रॉपी लागत फ़ंक्शन –
जबकि द्विघात लागत फ़ंक्शन सीधा है (वास्तविक आउटपुट y_i और पूर्वानुमानित आउटपुट a_i के बीच कम से कम वर्ग न्यूनतमकरण के बारे में सोचें), हम क्रॉस-एंट्रॉपी लागत फ़ंक्शन के लिए कुछ स्पष्टीकरण दे सकते हैं। यह हमारे प्रतिगमन मॉडल में नकारात्मक लॉग-संभावना के समान है। ध्यान दें कि कोष्ठक के बाहर एक नकारात्मक चिह्न है, जिसका उपयोग लागत को सकारात्मक रखने के लिए किया जाता है (क्योंकि a_i 0 और 1 के बीच होगा - सिग्मॉइड का आउटपुट, इसलिए, कोष्ठक के अंदर का शब्द हमेशा नकारात्मक होगा)। यह भी ध्यान दें कि जब a_i वास्तव में y_i के करीब हो जाता है, तो लागत वास्तव में शून्य के करीब हो जाती है। ऐसा इसलिए है, क्योंकि जब y_i = 1 और a_i ~ 1, ln(a_i) लगभग 0 होगा। इसी तरह, जब y_i= 0 और a_i ~ 0, ln(1-a_i) लगभग 0 होगा। इस प्रकार, यह फ़ंक्शन लागत को सकारात्मक और न्यूनतम रखता है जब मॉडल अच्छी तरह से भविष्यवाणी कर रहा हो। हालाँकि, द्विघात लागत फ़ंक्शन के बारे में भी यही कहा जा सकता है। लेकिन हम इसका इस्तेमाल नहीं करते। क्यों? इसका कारण यहाँ बताया गया है
हम पहले देखे गए मूल वज़न अद्यतन समीकरण पर वापस जाते हैं और इसमें द्विघात लागत फ़ंक्शन इनपुट करते हैं। हमें निम्नलिखित मिलता है
अब चीजों को सरल रखने के लिए, हम केवल एक डेटा बिंदु पर विचार करेंगे, जो कि i=1 और n=1 है। और हम प्रत्येक भार w_j के लिए आंशिक रूप से विभेदन करते हैं। हमें निम्नलिखित मिलता है:
स्मरण करें कि चूँकि i = 1 है, इसलिए हमारे पास है
z का मान प्रतिस्थापित करने पर, हमें प्राप्त होता है
अर्थात् हमारा ग्रेडिएंट वेक्टर जो नेटवर्क के भार को अद्यतन करने के लिए जिम्मेदार है, जब हम द्विघात लागत फ़ंक्शन का उपयोग करते हैं तो इसमें सिग्मॉइड फ़ंक्शन का व्युत्पन्न होगा।
अब आइए सिग्मॉइड फ़ंक्शन के व्युत्पन्न के व्यवहार को देखें:
उपरोक्त प्लॉट से यह स्पष्ट है कि सिग्मॉइड फ़ंक्शन के ढलान का प्रतिनिधित्व करने वाला व्युत्पन्न, इनपुट z के बड़े होते ही 0 के करीब पहुँच जाता है! इसका क्या मतलब है? इसका मतलब है कि जब सक्रियण इनपुट z बड़ा होगा तो ग्रेडिएंट वेक्टर शून्य होगा। इसलिए, नेटवर्क सीखना बंद कर देगा क्योंकि वज़न अपडेट नहीं होगा। याद रखें कि इसका मतलब यह नहीं है कि हम न्यूनतम पर पहुँच गए हैं। इसका मतलब है कि हम एक अवांछनीय बिंदु पर और फ़ंक्शन स्पेस में फंस गए हैं जो न्यूनतम मूल्य से बहुत दूर हो सकता है। इसे "सीखने की धीमी गति" के रूप में जाना जाता है। हालाँकि, यह क्रॉस-एंट्रॉपी लागत फ़ंक्शन के साथ नहीं होता है।
हम क्रॉस-एन्ट्रॉपी लागत फ़ंक्शन का उपयोग करके समान प्रतिस्थापन करते हैं और निम्नलिखित प्राप्त करते हैं:
यह ध्यान रखना दिलचस्प है कि यह शब्द:
द्विघात लागत के लिए ग्रेडिएंट में भी होता है। हालाँकि, एक तरकीब है जिसका उपयोग हम इसे सरल बनाने के लिए करेंगे। सिग्मॉइड फ़ंक्शन का ग्रेडिएंट निम्न प्रकार से व्यक्त किया जा सकता है
हम इसे अपनी मूल अभिव्यक्ति में प्रतिस्थापित करते हैं और निम्नलिखित प्राप्त करते हैं:
यानी हमारा ग्रेडिएंट वेक्टर जो नेटवर्क के भार को अपडेट करने के लिए जिम्मेदार है, उसमें सिग्मॉइड फ़ंक्शन का व्युत्पन्न नहीं होता है जब हम क्रॉस एन्ट्रॉपी कॉस्ट फ़ंक्शन का उपयोग करते हैं। इसलिए, इस कॉस्ट फ़ंक्शन के साथ सीखने में कोई मंदी नहीं है।
बेहतर दृश्य के लिए हम ग्रेडिएंट्स को पुनः एक साथ रखते हैं:
इससे हमारे मूल प्रश्न का उत्तर मिल जाता है - हम द्विघात लागत फ़ंक्शन का उपयोग नहीं करते हैं, क्योंकि इससे सीखने की प्रक्रिया धीमी हो जाती है।
ध्यान दें कि उपरोक्त विश्लेषण केवल आउटपुट परत (एक न्यूरॉन की) पर किया गया था, हालांकि, इसे सामान्य तंत्रिका नेटवर्क के लिए भी सामान्यीकृत किया जा सकता है!