दो हिस्से: खोज और मूल्यांकन
शतरंज इंजन दो प्रोग्राम हैं जो मिलकर काम करते हैं। खोज आगे देखती है: “अगर मैं यह चलूँ, तो वे वह जवाब दे सकते हैं, फिर मैं यह चलूँ…”। मूल्यांकन किसी एक पोज़िशन को, बिना कुछ हिलाए, देखता है और उसे एक संख्या देता है: कौन बेहतर है, और कितना।
दोनों को एक-दूसरे की ज़रूरत है। खोज जितनी गहरी, कमज़ोर मूल्यांकन उतना कम मायने रखता है; मूल्यांकन जितना बेहतर, उतनी कम गहराई चाहिए। चूँकि मूल्यांकन हर लाइन के हर सिरे पर चलता है — हर सेकंड लाखों बार — इसलिए उसे अच्छा भी होना चाहिए और बहुत तेज़ भी।
खोज
इंजन हर बार एक स्तर और गहराई तक सोचता है (iterative deepening), इसलिए घड़ी खत्म होने पर उसके पास हमेशा एक चाल तैयार रहती है। हर चाल को हर गहराई तक देखने में अनंत समय लगेगा, इसलिए ज़्यादातर मेहनत उन चालों को न देखने में जाती है जिनसे कोई फ़र्क नहीं पड़ सकता:
- अल्फ़ा-बीटा। जैसे ही कोई एक जवाब किसी चाल को गलत साबित कर देता है, इंजन उस चाल की जाँच रोक देता है। चालों के अच्छे क्रम के साथ यह नतीजा बदले बिना वृक्ष का ज़्यादातर हिस्सा छोड़ देता है।
- सबसे अच्छी चालें पहले। सबसे पहले ये आज़माई जाती हैं: वह चाल जो पिछली बार यह पोज़िशन आने पर सबसे अच्छी थी, कीमती मोहरों को मारने वाली चालें, और ऐसी शांत चालें जो मिलती-जुलती पोज़िशनों में काम आईं (killer moves और एक history table)।
- याददाश्त। एक transposition table पहले से खोजी गई पोज़िशनों को याद रखती है, क्योंकि एक ही पोज़िशन अक्सर चालों के अलग-अलग क्रम से बन जाती है।
- सोचे-समझे शॉर्टकट। बाद में आने वाली कम संभावना वाली चालें कम गहराई तक खोजी जाती हैं (late move reductions); इतनी अच्छी पोज़िशन कि एक चाल छोड़ देने पर भी बढ़त बनी रहे, उसकी खोज जल्दी रोक दी जाती है (null move pruning); शह वाली चालें एक चाल और गहराई तक खोजी जाती हैं।
- सिर्फ़ शांत पोज़िशन। खोज कभी किसी अदला-बदली के बीच में नहीं रुकती: हर लाइन के अंत में वह तब तक मारने वाली चालें देखती रहती है जब तक पोज़िशन शांत न हो जाए (quiescence search), ताकि मूल्यांकन कभी ऐसा वज़ीर न देखे जो अगली ही चाल में वापस मारा जाने वाला हो।
- कई कोर। इंजन एक साथ कई थ्रेड से खोज सकता है, और वे सब एक ही transposition table साझा करते हैं (Lazy SMP)।
बोर्ड
इंजन के भीतर बोर्ड 64-बिट संख्याओं का एक समूह है, हर खाने के लिए एक बिट (bitboards): एक संख्या सफ़ेद घोड़ों के लिए, एक काले हाथियों के लिए, और इसी तरह आगे। चालें और हमले कुछ बिट ऑपरेशन भर रह जाते हैं, और दूर तक चलने वाले मोहरे अपने हमले पहले से गणना की गई तालिकाओं में देखते हैं (magic bitboards)। वैरिएंट के संयुक्त मोहरे — महाराजा, आर्कबिशप और चांसलर — अपने घटकों के मेल की तरह चलते हैं, इसलिए वे उन्हीं तालिकाओं का दोबारा उपयोग करते हैं।
पोज़िशन का हाथ से आकलन
इंजन का मूल मूल्यांकन शतरंज के अनुभव पर आधारित नियमों की एक सूची है, हर नियम का अपना भार है: मटीरियल, हर मोहरा कहाँ खड़ा है, वह कितने खानों पर नियंत्रण रखता है, पास्ड और अकेले प्यादे, ऊँटों की जोड़ी, खुली फ़ाइलों पर हाथी, राजा के आगे प्यादों की ढाल। ओपनिंग से एंडगेम तक ये भार धीरे-धीरे बदलते हैं।
यह काम करता है, और आज ऐप में यही खेलता है, लेकिन यह सिर्फ़ वही जानता है जो किसी ने लिखने की सोची। बाकी सब इसे दिखाई नहीं देता।
न्यूरल नेटवर्क
न्यूरल नेटवर्क सिर्फ़ मूल्यांकन की जगह लेता है। खोज बिल्कुल वैसी ही रहती है — नेटवर्क चालें नहीं चुनता, वह हर सेकंड कई बार एक ही सवाल का जवाब देता है: यह पोज़िशन कितनी अच्छी है?
- इनपुट खुद बोर्ड है। मोहरे 18 तरह के हैं — प्यादा, घोड़ा, ऊँट, हाथी, वज़ीर, राजा और तीन संयुक्त मोहरे, दो रंगों में — और खाने 64: 18 × 64 = 1152 हाँ-या-ना वाले सवाल, जैसे “क्या f3 पर सफ़ेद घोड़ा है?”। एक सामान्य पोज़िशन में इनमें से लगभग 32 का जवाब “हाँ” होता है। संयुक्त मोहरे अपने अलग इनपुट हैं, दूसरे मोहरों का मिश्रण नहीं, इसलिए नेटवर्क खुद सीखता है कि महाराजा की असली कीमत कितनी है।
- दोनों नज़रिए। बोर्ड दो बार दिया जाता है: जैसा चाल वाला पक्ष उसे देखता है, और उलटकर, जैसा प्रतिद्वंद्वी उसे देखता है। नेटवर्क को शतरंज दो बार नहीं सीखना पड़ता, एक बार सफ़ेद के लिए और एक बार काले के लिए।
- न्यूरॉन प्रोग्राम नहीं किए जाते। कोई न्यूरॉन को नहीं बताता कि उसे क्या ढूँढना है। ट्रेनिंग के दौरान वे खुद-ब-खुद डिटेक्टर बन जाते हैं — कुछ ऐसा, जैसे “बिना प्यादों की ढाल वाला राजा” या “सातवीं रैंक तक पहुँचा हाथी”।
यह तेज़ क्यों है
नेटवर्क के नाम NNUE का मतलब है Efficiently Updatable Neural Network — ऐसा न्यूरल नेटवर्क जिसे कुशलता से अपडेट किया जा सके। पहली परत एक तालिका है जिसमें हर इनपुट के लिए संख्याओं का एक कॉलम है, और न्यूरॉन बस उन इनपुट के कॉलमों का जोड़ हैं जिनका जवाब “हाँ” है। एक चाल सिर्फ़ दो से चार इनपुट बदलती है, इसलिए जोड़ कभी शुरू से दोबारा नहीं गिना जाता — उसे अपडेट किया जाता है:
सब कुछ छोटे पूर्णांकों में गिना जाता है, प्रोसेसर के वेक्टर निर्देशों से एक साथ कई। हमारे मापों में नेटवर्क वाला इंजन उसी खोज-गहराई तक हाथ से लिखे मूल्यांकन की तुलना में लगभग दोगुनी तेज़ी से पहुँचता है (हमारी बेंचमार्क पोज़िशनों पर 0.95 बनाम 2.0 सेकंड, हमारी टेस्ट मशीन का एक कोर)।
यह कैसे सीखता है
ट्रेनिंग का हर उदाहरण एक पोज़िशन है जिसके साथ दो लेबल होते हैं: कुछ चालें गहरी खोज ने उसे जो स्कोर दिया, और खेल आखिरकार कैसे खत्म हुआ। नेटवर्क एक नज़र में दोनों का अनुमान लगाना सीखता है। पूरी तरकीब यही है: जब खोज किसी पोज़िशन के बारे में नेटवर्क से पूछती है, तो जवाब में पहले से वह शामिल होता है जो ज़्यादा गहराई से देखने पर मिलता, मानो खोज मुफ़्त में और आगे तक चली गई हो।
इंजन सिर्फ़ अपने खुद के खेलों से सीखता है, संयुक्त मोहरों और अपनी सेनाओं समेत — किसी दूसरे इंजन का विश्लेषण इसमें नहीं जाता। नया नेटवर्क तभी रखा जाता है जब वह सैकड़ों खेलों के मैच में पिछले वाले को हरा दे। अब तक हर दौर पिछले से साफ़ तौर पर ज़्यादा मज़बूत रहा है:
| नेटवर्क | ट्रेनिंग पोज़िशन | सेल्फ़-प्ले में नतीजा |
|---|---|---|
| पहला | 3 मिलियन | हाथ से लिखे मूल्यांकन पर +44 Elo |
| दूसरा | 10 मिलियन | पहले पर +168 Elo |
| तीसरा | 30 मिलियन | दूसरे पर +157 Elo |
| चौथा | 68 मिलियन | तीसरे पर +102 Elo |
ये आँकड़े हमारे अपने इंजन के संस्करणों के बीच क्लासिक ओपनिंग से खेले गए खेलों से आए हैं, हर मैच में 600 खेल। सेल्फ़-प्ले में बढ़त अक्सर बढ़ा-चढ़ाकर दिखती है; किसी बाहरी इंजन के विरुद्ध माप इंजन की ताकत वाले पेज पर है।
अभी स्थिति क्या है
- चौथा नेटवर्क इंजन में शामिल हो चुका है। 2500 की ताकत पर सेट Fairy-Stockfish के विरुद्ध यह 55% स्कोर करता है, यानी उस पैमाने पर लगभग 2535; उसी परीक्षण में हाथ से लिखा मूल्यांकन लगभग 2210 तक पहुँचता है।
- नेटवर्क वैरिएंट को क्लासिक शतरंज जितना अच्छी तरह नहीं जानता। जिन अपनी सेनाओं पर उसने सीखा, वे सब हमारे जनरेटर से आईं, किसी खिलाड़ी से नहीं, इसलिए ये शुरुआती पोज़िशन कुछ बनावटी हैं। असली खिलाड़ी कैसी सेनाएँ सजाते, यह हम अभी नहीं जानते। ऊपर से वैरिएंट खेलना ही ज़्यादा कठिन है: मोहरों के ज़्यादा प्रकार, और लगभग हर खेल में नई शुरुआती पोज़िशन।
- खिलाड़ियों के खेल अभी इकट्ठा नहीं किए जाते। योजना यह है कि सर्वर उन खेलों को सहेजे जिनमें खिलाड़ी ने स्तर 5 चुना और अपनी सेना से इंजन को हराया। यह अभी संभव नहीं है। नेटवर्क को सीखने के लिए करोड़ों पोज़िशन चाहिए — चौथे नेटवर्क ने 6.8 करोड़ से सीखा — और खिलाड़ियों ने अभी वैरिएंट के इतने खेल खेले ही नहीं कि इतनी पोज़िशन मिल सकें।