कंप्यूटर विज्ञान में, मजबूती (robustness) किसी कंप्यूटर सिस्टम की निष्पादन के दौरान त्रुटियों से निपटने और गलत इनपुट से निपटने की क्षमता है। इसमें कई क्षेत्र शामिल हैं, जिनमें मजबूत प्रोग्रामिंग, मजबूत मशीन लर्निंग और मजबूत नेटवर्क डिज़ाइन शामिल हैं। औपचारिक तकनीकें, जैसे कि फ़ज़ टेस्टिंग, मजबूती प्रदर्शित करने के लिए आवश्यक हैं, क्योंकि इनमें अमान्य या अप्रत्याशित इनपुट के साथ परीक्षण शामिल होता है। वैकल्पिक रूप से, जानबूझकर दोष इंजेक्शन का उपयोग मजबूती का परीक्षण करने के लिए किया जा सकता है, और कई व्यावसायिक उत्पाद सॉफ़्टवेयर विश्लेषण की मजबूती परीक्षण करते हैं।
सभी संभावित विफलता बिंदुओं को कवर करने वाली मजबूत प्रणालियों का निर्माण संभावित इनपुट और इनपुट संयोजनों की विशाल मात्रा के कारण कठिन है। चूंकि सभी मामलों का व्यापक परीक्षण अव्यावहारिक है, डेवलपर्स परीक्षण मामलों को सामान्यीकृत करते हैं। उदाहरण के लिए, पूर्णांक इनपुट का परीक्षण करते समय, कोई डेवलपर पूर्ण संख्याओं के पूरे सेट का प्रतिनिधित्व करने के लिए एक ऋणात्मक संख्या, शून्य और एक धनात्मक संख्या का चयन कर सकता है। यह विधि अधिक कुशल है लेकिन विफलता की अधिक संभावना है। परीक्षण मामलों को सामान्यीकृत करना अमान्य उपयोगकर्ता इनपुट से विफलता से निपटने की एक तकनीक है, लेकिन सिस्टम अन्य कारणों से भी विफल हो सकते हैं, जैसे कि नेटवर्क डिस्कनेक्शन। फिर भी, जटिल सिस्टम को किसी भी त्रुटि को सुचारू रूप से संभालना चाहिए, और कुछ सबसे मजबूत सिस्टम विकसित होने योग्य और नई परिस्थितियों में आसानी से अनुकूलित होने वाले होते हैं।
मजबूती प्राप्त करने में चुनौतियाँ
प्रोग्राम और सॉफ़्टवेयर आमतौर पर विशिष्ट कार्यों पर केंद्रित उपकरण होते हैं, जो उन्हें इंटरनेट या जैविक प्रणालियों जैसे सिस्टम की तुलना में कम सामान्यीकृत और कम लचीला बनाते हैं, जो अपने वातावरण के अनुकूल होते हैं। जैविक प्रणालियाँ अनुकूलन प्राप्त करने का एक तरीका अतिरेकता (redundancy) है। उदाहरण के लिए, मनुष्यों को आम तौर पर केवल एक गुर्दे की आवश्यकता होती है, लेकिन दूसरा होने से विफलता के लिए जगह मिलती है। यह सिद्धांत सॉफ़्टवेयर पर लागू किया जा सकता है, लेकिन चुनौतियों के साथ। आँख बंद करके कोड जोड़ने का सुझाव नहीं दिया जाता है, क्योंकि यह अधिक त्रुटियाँ पेश करता है, जटिलता बढ़ाता है, और सिस्टम को समझना कठिन बनाता है। नए कोड में समकक्ष कार्यक्षमता होनी चाहिए ताकि यदि एक फ़ंक्शन टूट जाए, तो दूसरा उसे बदल सके, मैन्युअल या स्वचालित सॉफ़्टवेयर विविधता का उपयोग करके। इसके लिए अतिरिक्त तर्क की आवश्यकता होती है ताकि यह पता चले कि विफलता बिंदु को कैसे और कब समायोजित किया जाए, जिससे सिस्टम जटिलता बढ़ जाती है। डेवलपर्स को अतिरेकता और जटिलता के बीच संतुलन बनाना चाहिए। वर्तमान में, कंप्यूटर विज्ञान प्रथाएँ मजबूत प्रणालियों के निर्माण के बजाय स्केलेबिलिटी और दक्षता पर ध्यान केंद्रित करती हैं, आंशिक रूप से क्योंकि मजबूती को सामान्य तरीके से प्राप्त करना कठिन है।
मजबूत प्रोग्रामिंग
मजबूत प्रोग्रामिंग एक शैली है जो अप्रत्याशित समाप्ति और अप्रत्याशित क्रियाओं को सुचारू रूप से संभालने पर केंद्रित है, सटीक और स्पष्ट त्रुटि संदेश प्रदर्शित करके जो उपयोगकर्ताओं को प्रोग्राम डीबग करने में मदद करते हैं। यह कई सिद्धांतों द्वारा निर्देशित है:
- पागलपन (Paranoia): प्रोग्रामर मानता है कि उपयोगकर्ता कोड को तोड़ने के लिए बाहर हैं और उनका अपना कोड विफल हो सकता है या गलत तरीके से काम कर सकता है।
- मूर्खता (Stupidity): प्रोग्रामर मानता है कि उपयोगकर्ता गलत, बोगस और विकृत इनपुट का प्रयास करेंगे। परिणामस्वरूप, प्रोग्रामर स्पष्ट, सहज त्रुटि संदेश लौटाता है जिन्हें त्रुटि कोड देखने की आवश्यकता नहीं होती है, और गुमराह किए बिना जितना संभव हो उतना सटीक होने का लक्ष्य रखता है।
- खतरनाक उपकरण (Dangerous implements): उपयोगकर्ताओं को लाइब्रेरी, डेटा संरचनाओं या डेटा संरचनाओं के पॉइंटर्स तक पहुँच नहीं मिलनी चाहिए। यह जानकारी छिपाई जानी चाहिए ताकि आकस्मिक संशोधन को रोका जा सके जो बग पेश कर सकते हैं। जब इंटरफेस सही ढंग से बनाए जाते हैं, तो उपयोगकर्ता खामियाँ खोजे बिना उनका उपयोग करते हैं, केवल अपने कोड पर ध्यान केंद्रित करते हैं।
- असंभव (Can't happen): कोड संशोधन एक "असंभव" मामले के घटित होने की संभावना पेश कर सकते हैं। ऐसे मामलों को अत्यधिक असंभव माना जाता है, और डेवलपर तदनुसार उनके लिए हैंडलिंग लागू करता है।
मजबूत मशीन लर्निंग
Machine learning में मजबूती आम तौर पर एल्गोरिदम की स्थिरता को संदर्भित करती है। एक मशीन लर्निंग एल्गोरिदम को मजबूत माना जाने के लिए, या तो परीक्षण त्रुटि प्रशिक्षण त्रुटि के अनुरूप होनी चाहिए, या डेटासेट में शोर जोड़ने के बाद प्रदर्शन स्थिर रहना चाहिए। Deep learning के उदय के साथ, न्यूरल नेटवर्क की मजबूती में बढ़ती रुचि रही है, विशेष रूप से विरोधी हमलों (adversarial attacks) के प्रति उनकी भेद्यता के कारण। इस क्षेत्र में शोध में अक्सर विरोधी प्रशिक्षण जैसी तकनीकें शामिल होती हैं, जहाँ मॉडल को लचीलापन सुधारने के लिए परेशान इनपुट पर प्रशिक्षित किया जाता है। इस क्षेत्र के शोधकर्ताओं जैसे Aleksander Madry के काम से संबंध हैं, जिन्होंने विरोधी मजबूती का अध्ययन किया है, और Thomas G. Dietterich, जिन्होंने त्रुटि-सुधार आउटपुट कोड और मजबूत सीखने का पता लगाया है।
मजबूत नेटवर्क डिज़ाइन
मजबूत नेटवर्क डिज़ाइन परिवर्तनशील या अनिश्चित मांगों के सामने नेटवर्क डिज़ाइन करने का अध्ययन है। सॉफ़्टवेयर डिज़ाइन के समान, नेटवर्क डिज़ाइन में मजबूती व्यापक है क्योंकि परिवर्तनों या इनपुट की विशाल संभावनाएँ हैं। इसमें ऐसे नेटवर्क बनाना शामिल है जो विभिन्न ट्रैफ़िक स्थितियों या विफलताओं के तहत प्रदर्शन और कनेक्टिविटी बनाए रख सकें। यह क्षेत्र Amazon Web Services, Microsoft Azure, और Google Cloud जैसे क्लाउड इंफ्रास्ट्रक्चर प्रदाताओं के लिए प्रासंगिक है, जिन्हें परिवर्तनशील लोड और संभावित हार्डवेयर विफलताओं के बावजूद विश्वसनीय सेवा सुनिश्चित करनी चाहिए।
मजबूत एल्गोरिदम
ऐसे एल्गोरिदम मौजूद हैं जो इनपुट में त्रुटियों को सहन करते हैं। ये एल्गोरिदम सही या स्वीकार्य आउटपुट उत्पन्न करने के लिए डिज़ाइन किए गए हैं, भले ही इनपुट डेटा में शोर, आउटलायर्स या अन्य अशुद्धियाँ हों। यह कंप्यूटर विज़न और सिग्नल प्रोसेसिंग जैसे क्षेत्रों में विशेष रूप से महत्वपूर्ण है, जहाँ वास्तविक दुनिया का डेटा अक्सर अपूर्ण होता है। मजबूत एल्गोरिदम आउटलायर्स की पहचान करने और उन्हें कम भार देने के लिए सांख्यिकीय तरीकों का उपयोग कर सकते हैं, या उन्हें मजबूत प्रोग्रामिंग के सिद्धांतों के समान, अतिरेकता को ध्यान में रखकर डिज़ाइन किया जा सकता है।
यह भी देखें
- दोष सहनशीलता (Fault tolerance)
- रक्षात्मक प्रोग्रामिंग (Defensive programming)
- गैर-कार्यात्मक आवश्यकता (Non-functional requirement)