Maksim Sekretov ने एक छोटा, शुद्ध-JavaScript ट्रांसफॉर्मर रिलीज़ किया है जो Node.js पर चलता है और ट्रेनिंग के दौरान हर स्केलर (scalar), वेट (weight) और ग्रेडिएंट (gradient) को दिखाता है। tiny-language-model-neuro-js रिपॉजिटरी किसी को भी एक रैंडम मॉडल के साथ शुरुआत करने, उसे “can human read ?” जैसा प्रॉम्प्ट देने, उसे फेल होते देखने, और फिर सिंगल-कमांड ट्रेनिंग रन चलाकर उत्तर को सही होते देखने की सुविधा देती है।
अधिकांश LLM डेमो गणित को क्यों छिपाते हैं
सामान्य लैंग्वेज-मॉडल ट्यूटोरियल TensorFlow या PyTorch पर निर्भर करते हैं। वे फ्रेमवर्क पर्दे के पीछे स्वचालित रूप से कंप्यूटेशन ग्राफ बनाते हैं और ग्रेडिएंट की गणना करते हैं, इसलिए सीखने वाले केवल हाई-लेवल कोड और लॉस कर्व्स (loss curves) ही देख पाते हैं। इसके अंतर्निहित ऑपरेशन्स—जैसे कि प्रत्येक टोकन एम्बेडिंग (embedding) कैसे बनता है, अटेंशन स्कोर की गणना कैसे की जाती है, और ग्रेडिएंट्स हर मैट्रिक्स के माध्यम से वापस कैसे प्रवाहित होते हैं—अदृश्य रहते हैं।
JavaScript मॉडल में क्या अलग है
Sekretov का कार्यान्वयन (implementation) सब कुछ हटाकर उसे एक सिंगल डिपेंडेंसी-मुक्त (dependency-free) Node.js स्क्रिप्ट तक सीमित कर देता है। ट्रेनिंग पाइपलाइन एक सरल क्रम का पालन करती है:
- टोकनाइज़ेशन (Tokenization)
- एम्बेडिंग्स (Embeddings)
- कॉज़ल ट्रांसफॉर्मर ब्लॉक्स (Causal transformer blocks)
- मल्टी-हेड सेल्फ-अटेंशन (Multi-head self-attention)
- फीड-फॉरवर्ड नेटवर्क (FFN)
- लैंग्वेज-मॉडल हेड और सॉफ्टमैक्स (softmax)
- क्रॉस-एन्ट्रॉपी लॉस (Cross-entropy loss)
- बैकप्रोपैगेशन (Backpropagation)
node src/train.js --generalize --adaptive-teach चलाने से पूरा ट्रेनिंग लूप शुरू हो जाता है। क्योंकि कोड साधारण JavaScript है, इसलिए प्रत्येक टेंसर (tensor) एक सरल ऐरे (array) है, प्रत्येक मैट्रिक्स गुणन (matrix multiplication) एक स्पष्ट लूप है, और प्रत्येक ग्रेडिएंट अपने सोर्स वेट के ठीक बगल में होता है।
रैंडम अनुमानों से सही उत्तरों तक
जब मॉडल शुरू होता है, तो सभी पैरामीटर्स रैंडम होते हैं। इससे “can human read ?” पूछने पर अर्थहीन शब्द (gibberish) मिलते हैं। एक संक्षिप्त प्री-ट्रेनिंग चरण और सुपरवाइज्ड फाइन-ट्यूनिंग (SFT) के एक दौर के बाद, वही प्रॉम्प्ट एक समझदारी भरा उत्तर देता है। टीचर सिग्नल—लॉस फंक्शन के माध्यम से दिए गए सही टोकन सीक्वेंस—एम्बेडिंग्स, अटेंशन हेड्स और FFN लेयर्स के माध्यम से वापस प्रसारित होते हैं, और बारी-बारी से प्रत्येक स्केलर को अपडेट करते हैं।
कैटास्ट्रोफिक फॉरगेटिंग (catastrophic forgetting) से निपटना
शुरुआती रन में एक क्लासिक समस्या देखी गई: नया तथ्य सीखने से पहले से सीखे गए तथ्य मिट जाते थे। Sekretov ने इसे 'रिहर्सल' (rehearsal) के साथ ठीक किया—यानी नया डेटा पेश करते समय पुराने उदाहरणों को फिर से प्रस्तुत करना। ट्रेनिंग तभी रुकती है जब प्रत्येक टारगेट टोकन कम से कम 95% संभावना तक पहुँच जाता है और लगातार दस चेक्स में सफल रहता है। यह सरल लूप बिना किसी बाहरी लाइब्रेरी के एक मुख्य शोध चुनौती को प्रदर्शित करता है।
किसे लाभ होगा और कौन पीछे छूट सकता है
यह प्रोजेक्ट उन कमर्शियल LLMs के साथ प्रतिस्पर्धा नहीं करता है जो अरबों पैरामीटर्स और GPU क्लस्टर्स पर चलते हैं। प्रदर्शन का वह अंतर इसे प्रोडक्शन वर्कलोड के लिए अनुपयुक्त बनाता है, लेकिन यह मॉडल को एक पारदर्शी शिक्षण सहायता (teaching aid) में बदल देता है। छात्र, शौकिया लोग (hobbyists) और शोधकर्ता जो ब्लैक-बॉक्स फ्रेमवर्क के अंदर देखने के लिए संघर्ष करते हैं, अब उनके पास एक सैंडबॉक्स है जहाँ गणित वास्तव में कोड है।
क्या कमी है और प्रोजेक्ट कहाँ तक जा सकता है
क्योंकि कार्यान्वयन जानबूझकर न्यूनतम रखा गया है, यह कोड को पठनीय तो रखता है लेकिन स्केलेबिलिटी (scalability) को सीमित करता है।
आगे क्या देखें
रिपॉजिटरी पहले से ही GitHub पर सार्वजनिक है।
निष्कर्ष (Takeaway): एक ट्रांसफॉर्मर को शुद्ध JavaScript तक सीमित करके, Sekretov ने एक कुख्यात रूप से अपारदर्शी (opaque) तकनीक को एक पठनीय, संपादन योग्य स्क्रिप्ट में बदल दिया है। इसके बदले में गति (speed) का समझौता करना पड़ता है, लेकिन इससे जो लाभ मिलता है वह है अंतर्दृष्टि (insight)—अब कोई भी लैंग्वेज मॉडल को स्केलर-दर-स्केलर सीखते, भूलते और फिर से सीखते हुए देख सकता है।
