<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Machine Learning on kenji.blog</title><link>http://kenji.blog/hi/categories/machine-learning/</link><description>Recent content in Machine Learning on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>hi</language><copyright>kenjinote</copyright><lastBuildDate>Fri, 11 Sep 2026 22:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/hi/categories/machine-learning/index.xml" rel="self" type="application/rss+xml"/><item><title>【शुरुआती लोगों के लिए】 Transformer मॉडल की गणितीय संरचना को समझना</title><link>http://kenji.blog/hi/p/transformer-mathematical-structure/</link><pubDate>Fri, 11 Sep 2026 22:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/transformer-mathematical-structure/</guid><description>&lt;img src="http://kenji.blog/p/transformer-mathematical-structure/img/eyecatch.jpg" alt="Featured image of post 【शुरुआती लोगों के लिए】 Transformer मॉडल की गणितीय संरचना को समझना" />&lt;h1 id="परचय-transformer-क-गणत-कय-सख">परिचय: Transformer का गणित क्यों सीखें?
&lt;/h1>&lt;p>यह कहना अतिशयोक्ति नहीं होगी कि &amp;ldquo;Transformer&amp;rdquo; वह आर्किटेक्चर है जिसने आधुनिक प्राकृतिक भाषा प्रसंस्करण (NLP) और समग्र रूप से AI के इतिहास को फिर से लिखा है। 2017 में Google के शोधकर्ताओं द्वारा प्रकाशित पेपर &amp;ldquo;Attention Is All You Need&amp;rdquo; में पहली बार प्रस्तावित यह मॉडल, OpenAI की GPT सीरीज़ (ChatGPT की आधारभूत तकनीक), Google के BERT, और Anthropic के Claude जैसे बड़े भाषा मॉडल (LLMs) के मुख्य भाग (दिल) के रूप में कार्य करता है, जो आज दुनिया पर राज कर रहे हैं।&lt;/p>
&lt;p>हालांकि, अक्सर &amp;ldquo;Attention (ध्यान तंत्र) का उपयोग करके संदर्भ को समझने&amp;rdquo; जैसी गुणात्मक व्याख्याएं Transformer के काम करने के तरीके के बारे में देखने को मिलती हैं, लेकिन वास्तविकता यह है कि शुरुआती लोगों के लिए इसके पीछे की &lt;strong>गणितीय संरचना&lt;/strong> में गहराई से जाने वाले स्पष्टीकरण आश्चर्यजनक रूप से कम हैं। यह वास्तव में समझने के लिए कि AI &amp;ldquo;शब्दों&amp;rdquo; को &amp;ldquo;गणितीय सूत्रों&amp;rdquo; के रूप में कैसे संसाधित करता है और आश्चर्यजनक रूप से प्राकृतिक पाठ कैसे उत्पन्न करता है, इसके गणितीय तंत्र को समझना आवश्यक है।&lt;/p>
&lt;p>इस लेख में, हम उन लोगों के लिए जो गणित और प्रोग्रामिंग का बुनियादी ज्ञान रखते हैं (जो हाई स्कूल स्तर के मैट्रिक्स और डिफरेंशियल कैलकुलस की अवधारणाओं को समझते हैं), Transformer के मुख्य भागों जैसे &amp;ldquo;Self-Attention तंत्र&amp;rdquo;, &amp;ldquo;क्वेरी-की-वैल्यू (Q/K/V) मॉडल&amp;rdquo;, &amp;ldquo;Softmax फ़ंक्शन द्वारा सामान्यीकरण&amp;rdquo;, और &amp;ldquo;Positional Encoding&amp;rdquo; की गणितीय संरचना को पूरी तरह से और आसानी से समझने योग्य तरीके से स्पष्ट करेंगे।&lt;/p>
&lt;p>आप गणितीय सूत्रों की झड़ी से अभिभूत हो सकते हैं, लेकिन हर एक गणना का एक स्पष्ट &amp;ldquo;अर्थ&amp;rdquo; होता है। जब तक आप इस लेख को पढ़ना समाप्त करेंगे, तब तक आपको यह समझ आ जाएगा कि Transformer केवल एक जादुई ब्लैक बॉक्स नहीं deeply नहीं है, बल्कि सूक्ष्मता से डिज़ाइन किए गए गणित और सांख्यिकी का एक क्रिस्टल है।&lt;/p>
&lt;hr>
&lt;h1 id="1-परपरक-तरक-क-समए-और-transformer-क-नवचर">1. पारंपरिक तरीकों की सीमाएँ और Transformer का नवाचार
&lt;/h1>&lt;p>Transformer के आगमन से पहले, प्राकृतिक भाषा प्रसंस्करण की मुख्यधारा रिकरंट न्यूरल नेटवर्क (RNN) और इसके डेरिवेटिव जैसे LSTM (Long Short-Term Memory) थे। RNN को समय-श्रृंखला (time-series) डेटा को संसाधित करने के लिए डिज़ाइन किया गया था, और यह वाक्यों को शुरुआत से लेकर शब्द दर शब्द अनुक्रमिक रूप से पढ़ता है।&lt;/p>
&lt;p>लेकिन, RNN में दो गंभीर कमज़ोरियाँ थीं:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>दीर्घकालिक निर्भरता (Long-term dependencies) सीखने में कठिनाई&lt;/strong>: जैसे-जैसे वाक्य लंबा होता है, शुरुआत में इनपुट किए गए शब्दों की जानकारी अंत तक पहुँचने तक फीकी पड़ जाती है (वैनिशिंग ग्रेडिएंट समस्या / Vanishing gradient problem)।&lt;/li>
&lt;li>&lt;strong>समानांतर गणना (Parallel computation) असंभव&lt;/strong>: चूंकि शब्दों को क्रमिक रूप से संसाधित किया जाना चाहिए, GPU का उपयोग करके बड़े पैमाने पर समानांतर गणना मुश्किल है, और प्रशिक्षण में भारी मात्रा में समय लगता है।&lt;/li>
&lt;/ol>
&lt;p>Transformer ने RNN संरचना को पूरी तरह से त्याग कर और संदर्भ को पकड़ने के लिए केवल &amp;ldquo;Attention&amp;rdquo; का उपयोग करके एक पैराडाइम शिफ्ट (प्रतिमान बदलाव) लाया। इसने अनुक्रम (sequence) की लंबाई चाहे कितनी भी हो, बिना किसी जानकारी के नुकसान के, और गणनाओं को समानांतर करके GPU के प्रदर्शन को अधिकतम करने के लिए इसे संभव बना दिया।&lt;/p>
&lt;hr>
&lt;h1 id="2-transformer-क-समगर-आरकटकचर">2. Transformer का समग्र आर्किटेक्चर
&lt;/h1>&lt;p>सबसे पहले, आइए समग्र Transformer आर्किटेक्चर का विहंगावलोकन करें। Transformer मुख्य रूप से दो ब्लॉकों से बना है: &amp;ldquo;Encoder&amp;rdquo; (एनकोडर) और &amp;ldquo;Decoder&amp;rdquo; (डिकोडर)। अनुवाद कार्य को एक उदाहरण के रूप में लेते हुए, Encoder इनपुट भाषा (जैसे: अंग्रेजी) को एक गणितीय वेक्टर प्रतिनिधित्व में परिवर्तित करता है, और Decoder उस वेक्टर प्रतिनिधित्व के आधार पर आउटपुट भाषा (जैसे: जापानी) उत्पन्न करता है।&lt;/p>
&lt;p>नीचे दिया गया चित्र Encoder ब्लॉक की आंतरिक संरचना का सरलीकृत संस्करण है।&lt;/p>
&lt;div class="mermaid">graph TD
A["इनपुट टोकन"] --> B["इनपुट एम्बेडिंग"]
B --> C["पोजिशनल एन्कोडिंग"]
C --> D["मल्टी-हेड सेल्फ-अटेंशन"]
D --> E["ऐड एंड लेयर नॉर्मलाइज़ेशन"]
E --> F["फीड फॉरवर्ड नेटवर्क"]
F --> G["ऐड एंड लेयर नॉर्मलाइज़ेशन"]
G --> H["अगले लेयर के लिए आउटपुट"]
C -.->|"रेसिडुअल कनेक्शन"| E
E -.->|"रेसिडुअल कनेक्शन"| G&lt;/div>
&lt;p>अब से, आइए प्रत्येक घटक में किए जा रहे गणितीय कार्यों को एक-एक करके देखें।&lt;/p>
&lt;hr>
&lt;h1 id="3-शबद-क-वकटरइजशन-और-पजशनल-एनकडग-positional-encoding">3. शब्दों का वेक्टराइज़ेशन और पोजिशनल एन्कोडिंग (Positional Encoding)
&lt;/h1>&lt;p>कंप्यूटर सीधे तौर पर टेक्स्ट को नहीं समझ सकते हैं। इनपुट टेक्स्ट को सबसे पहले &amp;ldquo;टोकन (Token)&amp;rdquo; नामक इकाइयों में विभाजित किया जाता है, और प्रत्येक को एक निश्चित लंबाई वाले वेक्टर में बदल दिया जाता है। इसे &lt;strong>Input Embedding&lt;/strong> कहा जाता है।&lt;/p>
&lt;h2 id="31-input-embedding-क-गणत">3.1 Input Embedding का गणित
&lt;/h2>&lt;p>मान लें कि शब्दावली (vocabulary) का आकार $V$ है, और एम्बेडिंग वेक्टर का डायमेंशन $d_{model}$ है (मूल पेपर में $d_{model} = 512$)। एम्बेडिंग मैट्रिक्स $W_E \in \mathbb{R}^{V \times d_{model}}$ का उपयोग करके प्रत्येक शब्द $w_i$ को एक वेक्टर $x_i \in \mathbb{R}^{d_{model}}$ में बदल दिया जाता है।&lt;/p>
$$ x_i = W_E \cdot \text{one\_hot}(w_i) $$
&lt;p>नतीजतन, पूरे वाक्य को एक मैट्रिक्स $X \in \mathbb{R}^{N \times d_{model}}$ के रूप में दर्शाया जाता है ($N$ वाक्य की लंबाई है)।&lt;/p>
&lt;h2 id="32-positional-encoding-क-आवशयकत-और-सतर">3.2 Positional Encoding की आवश्यकता और सूत्र
&lt;/h2>&lt;p>Transformer, RNN की तरह क्रमिक रूप से शब्दों को संसाधित नहीं करता है, बल्कि सभी शब्दों को एक साथ समानांतर में संसाधित करता है। गणना गति के दृष्टिकोण से यह एक बड़ा लाभ है, लेकिन साथ ही यह &lt;strong>&amp;ldquo;शब्दों का क्रम (Word order)&amp;rdquo; जैसी महत्वपूर्ण जानकारी खो जाने&lt;/strong> की समस्या का कारण बनता है। उदाहरण के लिए, &amp;ldquo;कुत्ता आदमी को काटता है&amp;rdquo; और &amp;ldquo;आदमी कुत्ते को काटता है&amp;rdquo; में समान इनपुट शब्द सेट हैं, लेकिन उनके अर्थ पूरी तरह से अलग हैं।&lt;/p>
&lt;p>इस शब्द क्रम की जानकारी को मॉडल में प्रदान करने के लिए &lt;strong>Positional Encoding&lt;/strong> तैयार किया गया था।
स्थिति $pos$ पर शब्द के $i$-वें डायमेंशन के लिए Positional Encoding $PE$ की गणना निम्नलिखित त्रिकोणमितीय कार्यों (Trigonometric functions) का उपयोग करके की जाती है:&lt;/p>
$$ PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d_{model}}}\right) $$
$$ PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d_{model}}}\right) $$
&lt;p>यहाँ, $pos$ शब्द की स्थिति ($0, 1, 2, \dots, N-1$) है, और $i$ वेक्टर डायमेंशन का इंडेक्स ($0, 1, \dots, d_{model}/2 - 1$) है।&lt;/p>
&lt;h3 id="सइन-sine-और-कसइन-cosine-क-उपयग-कय-कर">साइन (Sine) और कोसाइन (Cosine) का उपयोग क्यों करें?
&lt;/h3>&lt;p>पहली नज़र में, यह एक बहुत ही जटिल और अजीब सूत्र लग सकता है, लेकिन इसके पीछे एक गहरा गणितीय कारण है। त्रिकोणमितीय कार्यों का उपयोग करके, मॉडल न केवल &lt;strong>&amp;ldquo;पूर्ण स्थिति (Absolute position)&amp;rdquo;&lt;/strong> बल्कि &lt;strong>&amp;ldquo;सापेक्ष स्थिति (Relative position)&amp;rdquo; में अंतर&lt;/strong> को भी आसानी से सीख सकता है।&lt;/p>
&lt;p>हाई स्कूल गणित में सीखे गए त्रिकोणमितीय कार्यों के योग प्रमेय (Addition theorem) को याद करें:
&lt;/p>
$$ \sin(\alpha + \beta) = \sin\alpha \cos\beta + \cos\alpha \sin\beta $$
$$ \cos(\alpha + \beta) = \cos\alpha \cos\beta - \sin\alpha \sin\beta $$
&lt;p>एक स्थिति $pos$ से $k$ ऑफ़सेट की दूरी पर स्थित स्थिति $pos + k$ की Positional Encoding को स्थिति $pos$ के Positional Encoding के रैखिक संयोजन (Linear combination) के रूप में व्यक्त किया जा सकता है। दूसरे शब्दों में, मैट्रिक्स $M_k$ का उपयोग करके इसे इस प्रकार लिखा जा सकता है:&lt;/p>
$$ PE_{pos+k} = M_k \cdot PE_{pos} $$
&lt;p>यह Attention तंत्र को डॉट-प्रोडक्ट (Dot-product) गणना के माध्यम से आसानी से यह पहचानने की अनुमति देता है कि शब्द एक-दूसरे से &amp;ldquo;कितनी दूर&amp;rdquo; हैं। इसके अलावा, विभिन्न तरंग दैर्ध्य (wavelengths) के साथ कई साइन और कोसाइन तरंगों को मिलाकर, इसका यह भी लाभ है कि यह एक अद्वितीय स्थिति वेक्टर उत्पन्न कर सकता है चाहे वाक्य कितना भी लंबा क्यों न हो।&lt;/p>
&lt;p>अंतिम इनपुट मैट्रिक्स $X_{input}$, शब्द एम्बेडिंग वेक्टर और इस स्थिति एन्कोडिंग को जोड़कर बनता है।&lt;/p>
$$ X_{input} = X + PE $$
&lt;hr>
&lt;h1 id="4-self-attention-सलफ-अटशन-क-गहर-गणत">4. Self-Attention (सेल्फ-अटेंशन) का गहरा गणित
&lt;/h1>&lt;p>अब हम अंततः Transformer के सबसे महत्वपूर्ण घटक, &lt;strong>Self-Attention (स्व-ध्यान तंत्र)&lt;/strong> में कदम रखते हैं। Self-Attention का उद्देश्य &amp;ldquo;एक वाक्य में सभी शब्दों के बीच प्रासंगिकता (relevance) की गणना करना और संदर्भ को ध्यान में रखते हुए प्रत्येक शब्द के वेक्टर को एक समृद्ध प्रतिनिधित्व में अपडेट करना&amp;rdquo; है।&lt;/p>
&lt;p>यहाँ, एक &amp;ldquo;खोज प्रणाली (Search system)&amp;rdquo; की सादृश्यता (Analogy) का उपयोग किया जाता है।&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Query (Q)&lt;/strong>: क्वेरी (खोज शब्द)। &amp;ldquo;मैं अभी क्या जानकारी ढूंढ रहा हूँ?&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>Key (K)&lt;/strong>: की (शीर्षक)। &amp;ldquo;मेरे पास क्या जानकारी है?&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>Value (V)&lt;/strong>: वैल्यू (सामग्री)। &amp;ldquo;मैं वास्तव में कौन सी जानकारी प्रदान करता हूँ?&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;h2 id="41-मटरकस-q-k-v-क-नरमण">4.1 मैट्रिक्स $Q, K, V$ का निर्माण
&lt;/h2>&lt;p>इनपुट मैट्रिक्स $X \in \mathbb{R}^{N \times d_{model}}$ के लिए (सरलता के लिए यहां बैच आकार को अनदेखा कर रहे हैं), हम इसे सीखने योग्य वेट मैट्रिक्स (learnable weight matrices) $W^Q, W^K, W^V \in \mathbb{R}^{d_{model} \times d_k}$ से गुणा करके क्वेरी $Q$, की $K$, और वैल्यू $V$ की गणना करते हैं। (आमतौर पर $d_k = d_v = d_{model} / h$)&lt;/p>
$$ Q = X W^Q $$
$$ K = X W^K $$
$$ V = X W^V $$
&lt;p>यहाँ, $Q, K, V$ सभी $\mathbb{R}^{N \times d_k}$ के मैट्रिक्स बन जाते हैं।&lt;/p>
&lt;h2 id="42-attention-score-क-गणन-डट-परडकट">4.2 Attention Score की गणना (डॉट-प्रोडक्ट)
&lt;/h2>&lt;p>यह मापने के लिए कि प्रत्येक शब्द की क्वेरी (Query) अन्य सभी शब्दों की की (Key) से कितनी संबंधित है, हम वेक्टर्स के &lt;strong>डॉट-प्रोडक्ट (Dot-product)&lt;/strong> की गणना करते हैं। मैट्रिक्स संचालन के रूप में लिखे जाने पर यह निम्न प्रकार होता है:&lt;/p>
$$ \text{Scores} = Q K^T $$
&lt;p>इस गणना से प्राप्त मैट्रिक्स $\text{Scores} \in \mathbb{R}^{N \times N}$ का प्रत्येक तत्व $s_{ij}$, $i$-वें शब्द की Query और $j$-वें शब्द की Key का डॉट-प्रोडक्ट है, यानी यह &amp;ldquo;प्रासंगिकता की ताकत&amp;rdquo; को दर्शाता है।&lt;/p>
&lt;h2 id="43-सकलग-scaling">4.3 स्केलिंग (Scaling)
&lt;/h2>&lt;p>डॉट-प्रोडक्ट का उपयोग करके स्कोर की गणना करने में एक समस्या है। जैसे-जैसे वेक्टर डायमेंशन $d_k$ बढ़ता है, डॉट-प्रोडक्ट का मूल्य अत्यधिक बड़ा या छोटा हो जाता है।&lt;/p>
&lt;p>आइए इसे गणितीय रूप से सिद्ध करें।
मान लें कि क्वेरी का प्रत्येक तत्व $q \sim \mathcal{N}(0, 1)$ और की का प्रत्येक तत्व $k \sim \mathcal{N}(0, 1)$ स्वतंत्र मानक सामान्य वितरण (Standard normal distribution) का पालन करता है।
डॉट-प्रोडक्ट $q \cdot k = \sum_{i=1}^{d_k} q_i k_i$ का माध्य (mean) और प्रसरण (variance) ज्ञात करें।
माध्य: चूँकि $\mathbb{E}[q_i k_i] = \mathbb{E}[q_i] \mathbb{E}[k_i] = 0 \times 0 = 0$ है, योग का माध्य भी $0$ है।
प्रसरण: $q_i k_i$ का प्रसरण, स्वतंत्रता के कारण $\text{Var}(q_i k_i) = \mathbb{E}[(q_i k_i)^2] - (\mathbb{E}[q_i k_i])^2 = 1 \times 1 - 0 = 1$ है।
इसलिए, पूरे डॉट-प्रोडक्ट का प्रसरण डायमेंशन $d_k$ के बराबर होगा।&lt;/p>
$$ \text{Var}(q \cdot k) = d_k $$
&lt;p>जैसे-जैसे प्रसरण बढ़ता है, इसके बाद लागू किए जाने वाले Softmax फ़ंक्शन में, अधिकतम मान (maximum value) के अलावा अन्य ग्रेडिएंट अत्यधिक छोटे हो जाते हैं, जिससे &amp;ldquo;वैनिशिंग ग्रेडिएंट (Vanishing gradient)&amp;rdquo; होता है, और सीखना रुक जाता है।
इसे रोकने के लिए, स्कोर को $\sqrt{d_k}$ से विभाजित (स्केल) किया जाता है ताकि प्रसरण हमेशा $1$ पर बना रहे।&lt;/p>
$$ \text{Scaled Scores} = \frac{Q K^T}{\sqrt{d_k}} $$
&lt;h2 id="44-softmax-फकशन-दवर-सभवयत-probabilization">4.4 Softmax फ़ंक्शन द्वारा संभाव्यता (Probabilization)
&lt;/h2>&lt;p>प्राप्त स्कोर को एक संभाव्यता वितरण (Probability distribution) (वेट/weights) में बदलने के लिए जिसका योग $1$ है, हम प्रत्येक पंक्ति (row) पर &lt;strong>Softmax फ़ंक्शन&lt;/strong> लागू करते हैं।&lt;/p>
$$ a_{ij} = \text{softmax}(s_i)_j = \frac{\exp(s_{ij} / \sqrt{d_k})}{\sum_{m=1}^N \exp(s_{im} / \sqrt{d_k})} $$
&lt;p>मैट्रिक्स $A \in \mathbb{R}^{N \times N}$ को Attention Weight (अटेंशन वेट) मैट्रिक्स कहा जाता है। इस मैट्रिक्स की प्रत्येक पंक्ति $i$ को देखकर, &amp;ldquo;शब्द $i$ को समझने के लिए किसी अन्य शब्द $j$ पर कितना ध्यान (Attention) दिया जाना चाहिए&amp;rdquo; इसे 0 से 1 के मान के रूप में व्यक्त किया जाता है।&lt;/p>
&lt;h2 id="45-value-क-भरत-यग-weighted-sum">4.5 Value का भारित योग (Weighted sum)
&lt;/h2>&lt;p>अंत में, प्राप्त Attention Weight मैट्रिक्स $A$ का उपयोग करके, Value मैट्रिक्स $V$ के भारित योग (Weighted sum) की गणना की जाती है।&lt;/p>
$$ \text{Output} = A V = \text{softmax}\left(\frac{Q K^T}{\sqrt{d_k}}\right) V $$
&lt;p>इस ऑपरेशन द्वारा आउटपुट मैट्रिक्स $Z \in \mathbb{R}^{N \times d_v}$, &amp;ldquo;संदर्भ को ध्यान में रखकर अपडेट किए गए शब्द वेक्टर अभ्यावेदन (representations)&amp;rdquo; का एक संग्रह है।
यह पेपर में परिभाषित &lt;strong>Scaled Dot-Product Attention&lt;/strong> की पूरी तस्वीर है।&lt;/p>
&lt;hr>
&lt;h1 id="5-multi-head-attention-मलट-हड-अटशन">5. Multi-Head Attention (मल्टी-हेड अटेंशन)
&lt;/h1>&lt;p>केवल एक Attention गणना (सिंगल हेड) के साथ, यह संभावना है कि यह केवल एक दृष्टिकोण (उदाहरण के लिए, &amp;ldquo;व्याकरणिक संबंध&amp;rdquo;) से संदर्भ को पकड़ सकता है। इसलिए, भाषा के विविध अर्थ संबंधी और वाक्य रचनात्मक संबंधों (जैसे &amp;ldquo;विषय और विधेय (Subject and predicate)&amp;rdquo;, &amp;ldquo;सर्वनाम और उसका संदर्भ&amp;rdquo;) को एक साथ पकड़ने के लिए, &lt;strong>Multi-Head Attention&lt;/strong> को पेश किया गया था।&lt;/p>
&lt;p>हम पहले की तरह $Q, K, V$ के निर्माण और Attention गणना को समानांतर में $h$ बार (हेड्स की संख्या। मूल पेपर में $h=8$) करते हैं।&lt;/p>
$$ \text{head}_i = \text{Attention}(X W_i^Q, X W_i^K, X W_i^V) $$
&lt;p>यहाँ, $W_i^Q, W_i^K, W_i^V \in \mathbb{R}^{d_{model} \times d_k}$ $i$-वें हेड के लिए समर्पित सीखने योग्य वेट मैट्रिक्स हैं।&lt;/p>
&lt;p>प्रत्येक हेड से आउटपुट परिणाम $\text{head}_i \in \mathbb{R}^{N \times d_v}$ को क्षैतिज रूप से जोड़ा (Concatenate) जाता है।&lt;/p>
$$ \text{Concat}(\text{head}_1, \dots, \text{head}_h) \in \mathbb{R}^{N \times (h \cdot d_v)} $$
&lt;p>आमतौर पर, इसे इस प्रकार सेट किया जाता है कि $h \cdot d_v = d_{model}$ हो, इसलिए संयोजन के बाद डायमेंशन फिर से इनपुट के समान $d_{model}$ पर वापस आ जाता है। अंत में, इस मैट्रिक्स को वेट मैट्रिक्स $W^O \in \mathbb{R}^{d_{model} \times d_{model}}$ से गुणा करके अंतिम आउटपुट प्राप्त किया जाता है।&lt;/p>
$$ \text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \dots, \text{head}_h) W^O $$
&lt;div class="mermaid">graph TD
X["इनपुट X"] --> Q1["Q1"]
X --> K1["K1"]
X --> V1["V1"]
Q1 &amp; K1 &amp; V1 --> H1["हेड 1"]
X --> Q2["Q2"]
X --> K2["K2"]
X --> V2["V2"]
Q2 &amp; K2 &amp; V2 --> H2["हेड 2"]
X --> QN["..."]
X --> KN["..."]
X --> VN["..."]
QN &amp; KN &amp; VN --> HN["हेड h"]
H1 &amp; H2 &amp; HN --> C["कॉन्कैटिनेट (Concatenate)"]
C --> WO["WO से गुणा करें"]
WO --> OUT["मल्टी-हेड आउटपुट"]&lt;/div>
&lt;hr>
&lt;h1 id="6-feed-forward-neural-network-ffn">6. Feed-Forward Neural Network (FFN)
&lt;/h1>&lt;p>Multi-Head Attention का आउटपुट फिर &lt;strong>Position-wise Feed-Forward Network (FFN)&lt;/strong> में इनपुट किया जाता है।
यह एक 2-लेयर पूरी तरह से जुड़ा हुआ न्यूरल नेटवर्क (fully connected neural network) है जिसे अनुक्रम के &amp;ldquo;प्रत्येक स्थिति (शब्द) के लिए स्वतंत्र रूप से&amp;rdquo; लागू किया जाता है।&lt;/p>
&lt;p>गणितीय रूप से, इसे इस प्रकार दर्शाया जाता है:&lt;/p>
$$ \text{FFN}(x) = \max(0, x W_1 + b_1) W_2 + b_2 $$
&lt;p>यहाँ, $\max(0, z)$ ReLU (Rectified Linear Unit) एक्टिवेशन फ़ंक्शन को दर्शाता है (हाल के मॉडल में अक्सर GELU या SwiGLU का उपयोग किया जाता है)।&lt;/p>
&lt;p>इस नेटवर्क की भूमिका बहुत महत्वपूर्ण है। Attention तंत्र &amp;ldquo;शब्दों के बीच संबंध (स्थानिक और अनुक्रमिक संबंध)&amp;rdquo; सीखता है, जबकि FFN &amp;ldquo;प्रत्येक शब्द वेक्टर के गैर-रैखिक फीचर ट्रांसफॉर्मेशन (Non-linear feature transformation)&amp;rdquo; के लिए ज़िम्मेदार है।
आमतौर पर, डायमेंशन को अस्थायी रूप से पहले लेयर के वेट $W_1$ द्वारा बहुत बढ़ाया जाता है (उदाहरण के लिए, $d_{model}=512$ से $d_{ff}=2048$ तक 4 गुना विस्तारित किया जाता है), और फीचर स्पेस पर जटिल गणना करने के बाद, इसे दूसरे लेयर के वेट $W_2$ के साथ फिर से मूल डायमेंशन में लाया जाता है। इस &amp;ldquo;डायमेंशन के विस्तार और संकुचन&amp;rdquo; से मॉडल की अभिव्यंजक शक्ति में नाटकीय रूप से वृद्धि होती है।&lt;/p>
&lt;hr>
&lt;h1 id="7-अवशषट-कनकशन-residual-connection-और-लयर-नरमलइजशन-layer-normalization">7. अवशिष्ट कनेक्शन (Residual Connection) और लेयर नॉर्मलाइज़ेशन (Layer Normalization)
&lt;/h1>&lt;p>डीप लर्निंग में, जैसे-जैसे नेटवर्क में लेयर्स गहरी होती जाती हैं, प्रशिक्षण के दौरान ग्रेडिएंट गायब हो जाते हैं या फट जाते हैं (Exploding gradient), जिससे एक समस्या उत्पन्न होती है कि वे अच्छी तरह से नहीं सीख पाते। इसे रोकने के लिए, Transformer के प्रत्येक सब-लेयर (Attention और FFN) के चारों ओर &lt;strong>अवशिष्ट कनेक्शन (Residual Connection)&lt;/strong> और &lt;strong>लेयर नॉर्मलाइज़ेशन (Layer Normalization)&lt;/strong> को रखा गया है।&lt;/p>
&lt;p>गणितीय रूप से, सब-लेयर के आउटपुट को इस प्रकार संसाधित किया जाता है:&lt;/p>
$$ \text{Output} = \text{LayerNorm}(x + \text{Sublayer}(x)) $$
&lt;h2 id="71-अवशषट-कनकशन-x--textsublayerx">7.1 अवशिष्ट कनेक्शन ($x + \text{Sublayer}(x)$)
&lt;/h2>&lt;p>इनपुट $x$ को सीधे सब-लेयर के आउटपुट में जोड़ा जाता है। इससे, बैकप्रोपेगेशन (Backpropagation) के दौरान ग्रेडिएंट शॉर्टकट के माध्यम से सीधे उथले लेयर्स (shallow layers) तक पहुंचता है, जिससे लेयर्स के गहरे होने पर भी सीखना स्थिर रहता है।&lt;/p>
&lt;h2 id="72-layer-normalization-क-गणत">7.2 Layer Normalization का गणित
&lt;/h2>&lt;p>Layer Normalization एक तकनीक है जो फीचर डायमेंशन की दिशा में माध्य और प्रसरण की गणना करके डेटा को सामान्य (normalize) करती है। बैच आकार $B$, अनुक्रम लंबाई $N$, और डायमेंशन $d_{model}$ के इनपुट में, किसी एक शब्द वेक्टर $x \in \mathbb{R}^{d_{model}}$ के लिए सामान्यीकरण किया जाता है।&lt;/p>
&lt;p>माध्य $\mu$ और प्रसरण $\sigma^2$ की गणना करें:
&lt;/p>
$$ \mu = \frac{1}{d_{model}} \sum_{i=1}^{d_{model}} x_i $$
$$ \sigma^2 = \frac{1}{d_{model}} \sum_{i=1}^{d_{model}} (x_i - \mu)^2 $$
&lt;p>फिर, सामान्यीकृत आउटपुट $\hat{x}$ प्राप्त करें:
&lt;/p>
$$ \text{LN}(x) = \frac{x - \mu}{\sqrt{\sigma^2 + \epsilon}} \odot \gamma + \beta $$
&lt;p>
($\epsilon$ शून्य से विभाजन (division by zero) को रोकने के लिए एक बहुत छोटा स्थिरांक है। $\gamma, \beta$ सीखने योग्य स्केल और शिफ्ट पैरामीटर हैं)&lt;/p>
&lt;p>बैच दिशा में सामान्यीकरण (Batch Normalization) के बजाय लेयर दिशा में सामान्यीकरण (Layer Normalization) को अपनाने का कारण यह है कि वाक्यों जैसे चर लंबाई (variable-length) वाले अनुक्रम डेटा को संसाधित करते समय, बैचों के बीच आँकड़े अस्थिर होने का खतरा होता है। Layer Normalization के माध्यम से, Transformer बैच आकार पर निर्भर किए बिना स्थिर प्रशिक्षण प्राप्त करने में सक्षम होता है।&lt;/p>
&lt;hr>
&lt;h1 id="8-डकडर-वशषट-सरचन-masked-attention-और-cross-attention">8. डिकोडर-विशिष्ट संरचना: Masked Attention और Cross-Attention
&lt;/h1>&lt;p>अब तक बताई गई संरचना एनकोडर की है। वाक्यों को उत्पन्न करने वाले डिकोडर ब्लॉक में, संरचना थोड़ी अलग होती है।&lt;/p>
&lt;h2 id="81-masked-multi-head-attention">8.1 Masked Multi-Head Attention
&lt;/h2>&lt;p>डिकोडर की भूमिका &amp;ldquo;पिछले शब्दों से अगले शब्द की भविष्यवाणी करना&amp;rdquo; है। इसलिए, यदि यह प्रशिक्षण के दौरान &amp;ldquo;भविष्य के शब्दों&amp;rdquo; को देख लेता है, तो यह नकल (चीटिंग) होगी। इसे रोकने के लिए किया जाने वाला गणितीय संचालन &lt;strong>Masking (मास्किंग)&lt;/strong> है।&lt;/p>
&lt;p>स्कोर मैट्रिक्स $Q K^T$ में, एक मास्क मैट्रिक्स $M$ जोड़ा जाता है जो ऊपरी त्रिकोणीय हिस्से (upper triangular part, भविष्य की जानकारी के अनुरूप) में $-\infty$ के करीब बहुत छोटा मान सेट करता है।&lt;/p>
$$ M_{ij} = \begin{cases} 0 &amp; (i \le j) \\ -\infty &amp; (i > j) \end{cases} $$
$$ \text{Masked Attention}(Q, K, V) = \text{softmax}\left(\frac{Q K^T + M}{\sqrt{d_k}}\right) V $$
&lt;p>Softmax फ़ंक्शन की गणना करते समय, क्योंकि $\exp(-\infty) = 0$ होता है, भविष्य के शब्दों के लिए Attention Weight पूरी तरह से $0$ हो जाता है। यह कारणता (Causality) को बनाए रखते हुए ऑटो-रिग्रेसिव (autoregressive) पीढ़ी (generation) को संभव बनाता है।&lt;/p>
&lt;h2 id="82-encoder-decoder-cross-attention">8.2 Encoder-Decoder Cross-Attention
&lt;/h2>&lt;p>डिकोडर का दूसरा सब-लेयर &lt;strong>Cross-Attention&lt;/strong> है, जो एनकोडर के आउटपुट को संदर्भित करता है।
यहाँ, $Q$ पिछले डिकोडर लेयर से उत्पन्न होता है, लेकिन $K$ और $V$ एनकोडर के अंतिम लेयर के आउटपुट से उत्पन्न होते हैं।&lt;/p>
$$ Q_{decoder} = X_{dec} W^Q $$
$$ K_{encoder} = X_{enc} W^K $$
$$ V_{encoder} = X_{enc} W^V $$
&lt;p>इस गणना के माध्यम से, मॉडल अनुवाद कार्यों में यह सीख सकता है कि &amp;ldquo;वर्तमान में अनुवाद किया जा रहा शब्द, मूल विदेशी भाषा के वाक्य के किस भाग से दृढ़ता से संबंधित है&amp;rdquo;।&lt;/p>
&lt;hr>
&lt;h1 id="9-कमपयटशनल-कमपलकसट-और-आधनक-अनकलन-optimization-क-गणत">9. कम्प्यूटेशनल कॉम्प्लेक्सिटी और आधुनिक अनुकूलन (Optimization) का गणित
&lt;/h1>&lt;p>Transformer एक बेहतरीन मॉडल है, लेकिन इसकी गणितीय संरचना के कारण इसकी कुछ &amp;ldquo;कमज़ोरियाँ&amp;rdquo; भी हैं।
Self-Attention की कम्प्यूटेशनल जटिलता (Computational complexity) पर ध्यान दें। स्कोर मैट्रिक्स $Q K^T$ की गणना में, $(N \times d_k)$ के मैट्रिक्स को $(d_k \times N)$ के मैट्रिक्स से गुणा किया जाता है, इसलिए इसकी गणना की जटिलता &lt;strong>$O(N^2 \cdot d_{model})$&lt;/strong> है।&lt;/p>
&lt;p>दूसरे शब्दों में, &lt;strong>अनुक्रम लंबाई $N$ के सापेक्ष गणना की मात्रा और मेमोरी का उपयोग वर्ग (square) में बढ़ता है&lt;/strong>।
यदि वाक्य छोटा है तो यह कोई समस्या नहीं है, लेकिन यदि आप एक पूरी किताब जैसा लंबा संदर्भ LLM में इनपुट करने का प्रयास करते हैं, तो $N$ दसियों हज़ार से लेकर लाखों तक पहुँच सकता है, और पारंपरिक Attention गणना GPU मेमोरी को तुरंत समाप्त कर देगी।&lt;/p>
&lt;p>इस $O(N^2)$ के अभिशाप को तोड़ने के लिए, हाल के वर्षों में गणितीय और हार्डवेयर दृष्टिकोण से विभिन्न अनुकूलन प्रस्तावित किए गए हैं।
इसका एक प्रमुख उदाहरण &lt;strong>FlashAttention&lt;/strong> है। FlashAttention एक एल्गोरिथ्म है जो GPU के मेमोरी पदानुक्रम (SRAM और HBM) के बीच डेटा ट्रांसफर (मेमोरी एक्सेस) को कम करने के लिए Attention गणना को टाइल-जैसी संरचना (Tiling) में विभाजित करता है। यद्यपि गणितीय रूप से यह मानक Attention (Exact Attention) के समान परिणाम देता है, फिर भी हार्डवेयर स्तर के अनुकूलन के माध्यम से यह नाटकीय गति और मेमोरी में कमी प्राप्त करता है, जिससे GPT-4 जैसे लंबे-संदर्भ वाले मॉडल संभव हो सके।&lt;/p>
&lt;p>इसके अलावा, Sparse Attention और Linear Attention पर भी बहुत शोध किया जा रहा है, जो कम्प्यूटेशनल जटिलता को $O(N \log N)$ या $O(N)$ के अनुमानित स्तर पर लाते हैं।&lt;/p>
&lt;hr>
&lt;h1 id="10-करयनवयन-implementation-क-कलपन-pytorch-सटइल-सयड-कड">10. कार्यान्वयन (Implementation) की कल्पना (PyTorch-स्टाइल स्यूडो-कोड)
&lt;/h1>&lt;p>यदि हम अब तक की गणितीय संरचना को वास्तविक प्रोग्रामिंग कोड (Python / PyTorch) में लागू करते हैं, तो हम देखेंगे कि इसे आश्चर्यजनक रूप से सरलता से लिखा जा सकता है। नीचे Self-Attention के मुख्य भाग के लिए स्यूडो-कोड दिया गया है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">torch&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">torch.nn.functional&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">F&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">math&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">scaled_dot_product_attention&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">q&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">k&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">v&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">mask&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">None&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># q, k, v का आकार (Shape): [batch_size, num_heads, seq_length, d_k]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">d_k&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">q&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">size&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 1. डॉट-प्रोडक्ट द्वारा स्कोर गणना: Q * K^T&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># अंतिम 2 डायमेंशन को ट्रांसपोज़ (Transpose) करके मैट्रिक्स गुणन (Matrix multiplication)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">scores&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">torch&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">matmul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">q&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">k&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">transpose&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 2. स्केलिंग (Scaling)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">scores&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">scores&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">math&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sqrt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">d_k&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 3. मास्किंग (Masked Attention के मामले में)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">mask&lt;/span> &lt;span class="ow">is&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="kc">None&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">scores&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">scores&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">masked_fill&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">mask&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mf">1e9&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 4. Softmax द्वारा संभाव्यता&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">attention_weights&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">F&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">softmax&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">scores&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">dim&lt;/span>&lt;span class="o">=-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 5. Value मैट्रिक्स का गुणन&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">output&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">torch&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">matmul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">attention_weights&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">v&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">output&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">attention_weights&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>आप देख सकते हैं कि गणितीय सूत्र $Q K^T / \sqrt{d_k}$ को &lt;code>torch.matmul(q, k.transpose(-2, -1)) / math.sqrt(d_k)&lt;/code> के रूप में सहजता से लागू किया गया है। यह डीप लर्निंग का एक बहुत ही दिलचस्प पहलू है कि गणितीय सिद्धांतों को उन्नत अनुकूलन पुस्तकालयों (Optimization libraries) की मदद से केवल कुछ लाइनों के कोड में साकार किया जा सकता है।&lt;/p>
&lt;hr>
&lt;h1 id="नषकरष-गणतय-सतर-स-उभरन-वल-बदधमतत-क-सवरप">निष्कर्ष: गणितीय सूत्रों से उभरने वाला &amp;ldquo;बुद्धिमत्ता&amp;rdquo; का स्वरूप
&lt;/h1>&lt;p>इस लेख में, हमने Transformer मॉडल के भीतर गहराई में छिपी गणितीय संरचना को उजागर किया है।&lt;/p>
&lt;p>शब्दों को बहु-आयामी (Multi-dimensional) वेक्टर स्पेस में मैप करने वाली Embedding, स्थिति की जानकारी को त्रिकोणमितीय तरंगों के संयोजन के रूप में व्यक्त करने वाली Positional Encoding, और सूचना पुनर्प्राप्ति (Information retrieval) की सादृश्यता से पैदा हुआ मैट्रिक्स डॉट-प्रोडक्ट गणना वाला Self-Attention तंत्र। ये सभी घटक केवल रैखिक बीजगणित (Linear algebra), कैलकुलस (Calculus), और प्रायिकता-सांख्यिकी (Probability &amp;amp; Statistics) जैसे बुनियादी गणित का एक संचय हैं।&lt;/p>
&lt;p>लेकिन, जब ये सरल मैट्रिक्स गणनाएँ कई लेयर्स में जुड़ जाती हैं, और अरबों-खरबों मापदंडों (Parameters) के माध्यम से विशाल डेटासेट से पैटर्न सीखती हैं, तो यह हमारी &amp;ldquo;भाषा&amp;rdquo; को समझने, तार्किक तर्क करने, और कभी-कभी रचनात्मक विचार उत्पन्न करने वाले &amp;ldquo;बुद्धिमत्ता के स्वरूप&amp;rdquo; के रूप में सामने आती है।&lt;/p>
&lt;p>जैसा कि भड़काऊ शीर्षक &amp;ldquo;Attention Is All You Need&amp;rdquo; से पता चलता है, जटिल रिकरंट और कनवल्शनल (Convolutional) प्रोसेसिंग को त्यागकर पूरी तरह से &amp;ldquo;अटेंशन (प्रासंगिकता)&amp;rdquo; गणना पर केंद्रित इस आर्किटेक्चर की सुंदरता इसकी गणितीय सरलता में ही निहित है।&lt;/p>
&lt;p>भविष्य में, Transformer को पार करने वाले नए आर्किटेक्चर (जैसे स्टेट स्पेस मॉडल Mamba) उभर सकते हैं, लेकिन Transformer द्वारा स्थापित &amp;ldquo;Attention के माध्यम से संदर्भ समझ&amp;rdquo; का गणितीय ढांचा AI के इतिहास में हमेशा के लिए उकेरा जाएगा।&lt;/p>
&lt;p>यदि आपको भविष्य में ChatGPT या Claude जैसे LLM का उपयोग करने का अवसर मिलता है, तो ज़रा कल्पना करें कि बैकग्राउंड में हर सेकंड ट्रिलियन बार $Q K^T$ के मैट्रिक्स गुणन की गणना की जा रही है और Softmax फ़ंक्शन संभावनाओं का उत्पादन कर रहा है। तकनीक के प्रति आपकी समझ (Resolution) बढ़ेगी, और आपको AI की दुनिया और भी दिलचस्प लगने लगेगी।&lt;/p>
&lt;h3 id="सदरभ">संदर्भ
&lt;/h3>&lt;ul>
&lt;li>Vaswani, A., et al. (2017). &amp;ldquo;Attention Is All You Need.&amp;rdquo; &lt;em>Advances in Neural Information Processing Systems&lt;/em>.&lt;/li>
&lt;li>Alammar, J. (2018). &amp;ldquo;The Illustrated Transformer.&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>&lt;em>यह लेख उन लोगों के लिए एक मार्गदर्शिका के रूप में लिखा गया था जो प्राकृतिक भाषा प्रसंस्करण (NLP) और AI के गणितीय आधार सीख रहे हैं। यदि आपके कोई प्रश्न या विचार-विमर्श हैं, तो कृपया हमें टिप्पणी अनुभाग में बताएं!&lt;/em>&lt;/p></description></item><item><title>llama.cpp की क्वांटाइजेशन तकनीक (GGUF) कैसे काम करती है, इसकी व्याख्या</title><link>http://kenji.blog/hi/p/llama-cpp-quantization-gguf/</link><pubDate>Fri, 11 Sep 2026 00:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/llama-cpp-quantization-gguf/</guid><description>&lt;img src="http://kenji.blog/p/llama-cpp-quantization-gguf/img/eyecatch.jpg" alt="Featured image of post llama.cpp की क्वांटाइजेशन तकनीक (GGUF) कैसे काम करती है, इसकी व्याख्या" />&lt;h2 id="1-परचय-llm-क-कवटइजशन-क-आवशयकत-कय-ह">1. परिचय: LLM को क्वांटाइजेशन की आवश्यकता क्यों है?
&lt;/h2>&lt;p>हाल के वर्षों में लार्ज लैंग्वेज मॉडल्स (LLM: Large Language Models) का विकास उल्लेखनीय रहा है, लेकिन इसके पीछे &amp;ldquo;कंप्यूटिंग संसाधनों की कमी&amp;rdquo; और &amp;ldquo;मेमोरी बैंडविड्थ की रुकावट&amp;rdquo; जैसी गंभीर समस्याएं सामने आई हैं। उदाहरण के लिए, यदि Llama 3 जैसे 70B (70 बिलियन) पैरामीटर वाले मॉडल को मानक 16-बिट फ्लोटिंग पॉइंट (FP16) में मेमोरी में लोड किया जाता है, तो केवल पैरामीटर लगभग 140GB VRAM/RAM की खपत करते हैं। जब इसमें इन्फरेंस के दौरान कॉन्टेक्स्ट (KV कैश) जोड़ा जाता है, तो यह डेटा सेंटर के लिए बने हाई-एंड GPU (NVIDIA A100 80GB या H100 80GB) के मल्टीपल क्लस्टर्स के बिना काम नहीं करेगा।&lt;/p>
&lt;p>व्यक्तिगत डेवलपर्स और एज डिवाइस (MacBook या सामान्य गेमिंग PC) पर LLM चलाने के लिए एक तारणहार के रूप में &lt;strong>llama.cpp&lt;/strong> और इसकी मुख्य &lt;strong>क्वांटाइजेशन (Quantization) तकनीक&lt;/strong> सामने आई। विशेष रूप से, &lt;strong>GGUF (GPT-Generated Unified Format)&lt;/strong> नामक एक फ़ाइल फॉर्मेट और &lt;strong>k-quants&lt;/strong> नामक एक उन्नत ब्लॉक-स्तरीय क्वांटाइजेशन एल्गोरिथम मॉडल के आकार को कुछ अंश तक सिकोड़ने के लिए एक क्रांतिकारी तरीका है, जबकि मॉडल की सटीकता (Perplexity) में कमी को कम से कम रखा जाता है।&lt;/p>
&lt;p>इस लेख में, हम llama.cpp में क्वांटाइजेशन की गणितीय पृष्ठभूमि, GGML फॉर्मेट के साथ अंतर, GGUF फॉर्मेट की विस्तृत संरचना, और k-quants के आंतरिक तंत्र को गहराई से समझाएंगे।&lt;/p>
&lt;hr>
&lt;h2 id="2-कवटइजशन-quantization-क-गणतय-आधर">2. क्वांटाइजेशन (Quantization) का गणितीय आधार
&lt;/h2>&lt;p>LLM के संदर्भ में क्वांटाइजेशन का अर्थ है निरंतर मानों (या उच्च-परिशुद्धता फ्लोटिंग-पॉइंट नंबरों) को कम बिट्स (INT8, INT4, INT3, आदि) वाले असतत (discrete) मानों में मैप करना।&lt;/p>
&lt;h3 id="21-लनयर-कवटइजशन-क-मल-सतर">2.1. लीनियर क्वांटाइजेशन का मूल सूत्र
&lt;/h3>&lt;p>सबसे सरल दृष्टिकोण लीनियर क्वांटाइजेशन (Min-Max क्वांटाइजेशन) है। मान लें कि मूल उच्च-परिशुद्धता वेट (weight) टेंसर $W$ है और क्वांटाइज्ड इंटीजर टेंसर $W_q$ है।&lt;/p>
$$ W_q = \text{round}\left( \frac{W}{S} \right) + Z $$
&lt;p>जहाँ,&lt;/p>
&lt;ul>
&lt;li>$S$ &lt;strong>स्केल फैक्टर (Scale Factor)&lt;/strong> है, जो क्वांटाइजेशन के स्टेप साइज (रेज़ोल्यूशन) को निर्धारित करता है।&lt;/li>
&lt;li>$Z$ &lt;strong>जीरो-पॉइंट (Zero-point)&lt;/strong> है, जो एक बायस वैल्यू है और क्वांटाइजेशन के बाद वास्तविक संख्या $0.0$ को संबंधित पूर्णांक मान में शिफ्ट करता है।&lt;/li>
&lt;li>$\text{round}(\cdot)$ निकटतम पूर्णांक पर राउंडिंग फ़ंक्शन है।&lt;/li>
&lt;/ul>
&lt;p>डीक्वांटाइजेशन (Dequantization) के माध्यम से, इन्फरेंस के दौरान अनुमानित वास्तविक वेट $\tilde{W}$ को बहाल किया जाता है।&lt;/p>
$$ \tilde{W} = S \times (W_q - Z) $$
&lt;h3 id="22-समटरक-कवटइजशन-बनम-असमटरक-कवटइजशन">2.2. सिमेट्रिक क्वांटाइजेशन बनाम असिमेट्रिक क्वांटाइजेशन
&lt;/h3>&lt;p>जीरो-पॉइंट $Z$ को संभालने के तरीके के आधार पर इसे मुख्य रूप से दो विधियों में विभाजित किया गया है।&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>असिमेट्रिक क्वांटाइजेशन (Asymmetric Quantization)&lt;/strong>
डेटा के न्यूनतम मान $W_{\min}$ और अधिकतम मान $W_{\max}$ का उपयोग करके मैपिंग की जाती है।
&lt;/p>
$$ S = \frac{W_{\max} - W_{\min}}{2^b - 1}, \quad Z = \text{round}\left(-\frac{W_{\min}}{S}\right) $$
&lt;p>
यहाँ $b$ क्वांटाइजेशन बिट्स की संख्या है (उदाहरण के लिए, 4 बिट्स के लिए $2^4-1 = 15$)। चूँकि $Z$ को बनाए रखना आवश्यक है, इसलिए गणना और मेमोरी ओवरहेड थोड़ा बढ़ जाता है।&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>सिमेट्रिक क्वांटाइजेशन (Symmetric Quantization)&lt;/strong>
डेटा के पूर्ण मान (absolute value) के अधिकतम मान का उपयोग करके शून्य के चारों ओर मैपिंग की जाती है ($Z=0$)।
&lt;/p>
$$ S = \frac{\max(|W_{\max}|, |W_{\min}|)}{2^{b-1} - 1}, \quad Z = 0 $$
&lt;p>
llama.cpp का शुरुआती क्वांटाइजेशन (उदाहरण के लिए लिगेसी Q4_0) सिमेट्रिक क्वांटाइजेशन का उपयोग करता है, और क्योंकि इसमें $Z$ टर्म नहीं होता है, इसका लाभ यह है कि SIMD निर्देशों के साथ डॉट प्रोडक्ट गणना बहुत तेज़ हो जाती है।&lt;/p>
&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="3-ggml-स-gguf-तक-क-वकस-और-फइल-सरचन">3. GGML से GGUF तक का विकास और फ़ाइल संरचना
&lt;/h2>&lt;p>llama.cpp की चर्चा करते समय, C++ में लिखी गई टेंसर गणना लाइब्रेरी &lt;strong>GGML&lt;/strong> और इससे प्राप्त फ़ाइल स्वरूप &lt;strong>GGUF&lt;/strong> अपरिहार्य हैं।&lt;/p>
&lt;h3 id="31-ggml-क-चनतय">3.1. GGML की चुनौतियाँ
&lt;/h3>&lt;p>प्रारंभिक llama.cpp &lt;code>ggml&lt;/code> फॉर्मेट (और &lt;code>ggjt&lt;/code> जैसे वेरिएंट) का उपयोग करता था। हालाँकि, इनमें निम्नलिखित समस्याएँ थीं:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>विस्तार का अभाव:&lt;/strong> मैजिक नंबर और हाइपरपैरामीटर निश्चित लंबाई और निश्चित क्रम में हार्डकोड किए गए थे, जिसके परिणामस्वरूप हर बार नए मॉडल आर्किटेक्चर (जैसे: Llama, Falcon, Mixtral) या नए टोकनाइज़र जोड़े जाने पर विनाशकारी परिवर्तन (breaking changes) हुए।&lt;/li>
&lt;li>&lt;strong>बैकवर्ड कम्पैटिबिलिटी का नुकसान:&lt;/strong> फॉर्मेट को बार-बार अपडेट किया जाता था, और पुरानी मॉडल फ़ाइलें नवीनतम llama.cpp द्वारा नहीं पढ़ी जा सकती थीं।&lt;/li>
&lt;/ul>
&lt;h3 id="32-gguf-फरमट-क-जनम">3.2. GGUF फॉर्मेट का जन्म
&lt;/h3>&lt;p>अगस्त 2023 में पेश किया गया &lt;strong>GGUF&lt;/strong>, इन समस्याओं को हल करने के लिए डिज़ाइन किया गया एक अत्यधिक बहुमुखी (versatile) फॉर्मेट है। इसकी सबसे बड़ी विशेषता &lt;strong>की-वैल्यू (Key-Value) आधारित मेटाडेटा संरचना&lt;/strong> को अपनाना है।&lt;/p>
&lt;p>नीचे दिया गया Mermaid आरेख GGUF की फ़ाइल संरचना का एक एब्सट्रेक्ट रूप है।&lt;/p>
&lt;div class="mermaid">graph TD
A["GGUF फ़ाइल"] --> B["हेडर (मैजिक, संस्करण)"]
A --> C["मेटाडेटा (की-वैल्यू पेयर)"]
A --> D["टेंसर जानकारी (नाम, आकार, ऑफसेट)"]
A --> E["टेंसर डेटा (बाइनरी पेलोड)"]
C --> C1["general.architecture: llama"]
C --> C2["llama.context_length: 4096"]
C --> C3["tokenizer.ggml.tokens: [...]"]
E --> E1["लेयर 0 वेट्स"]
E --> E2["लेयर 1 वेट्स"]
E --> E3["..."]&lt;/div>
&lt;p>&lt;strong>GGUF के मुख्य लाभ:&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>&lt;strong>लचीलापन (Flexibility):&lt;/strong> मॉडल के हाइपरपैरामीटर, RoPE (Rotary Positional Embedding) सेटिंग्स, टोकनाइज़र के शब्दावली (vocabulary) डेटा आदि सभी को नामित की-वैल्यू पेयर के रूप में संग्रहीत किया जाता है। अज्ञात कीज़ (keys) को अनदेखा कर दिया जाता है, जिससे नई सुविधाएँ जोड़ना आसान हो जाता है।&lt;/li>
&lt;li>&lt;strong>एंडियन-स्वतंत्र (Endian-independent):&lt;/strong> GGUF डिफ़ॉल्ट रूप से लिटिल-एंडियन को अपनाता है, लेकिन क्योंकि इसमें स्पष्ट रूप से एक फ्लैग होता है, यह विभिन्न आर्किटेक्चर के बीच सुरक्षित रूप से पोर्टेबल है।&lt;/li>
&lt;li>&lt;strong>mmap (मेमोरी मैपिंग) के लिए ऑप्टिमाइज़ेशन:&lt;/strong> टेंसर डेटा एक विशिष्ट सीमा पर अलाइन (पैडिंग) होता है और OS के &lt;code>mmap()&lt;/code> सिस्टम कॉल का उपयोग करके डिस्क से सीधे मेमोरी स्पेस में मैप किया जा सकता है। इससे मॉडल लोड करने का इनिशियलाइज़ेशन समय लगभग शून्य हो जाता है।&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="4-k-quants-क-गहरई-उननत-बलक-सतरय-कवटइजशन">4. k-quants की गहराई: उन्नत ब्लॉक-स्तरीय क्वांटाइजेशन
&lt;/h2>&lt;p>GGUF फॉर्मेट की वास्तविक शक्ति &lt;strong>k-quants (K-quantization)&lt;/strong> है, जो मॉडल वेट्स को कंप्रेस करने के लिए जिम्मेदार है।&lt;/p>
&lt;p>आमतौर पर, न्यूरल नेटवर्क के वेट्स पूरे लेयर में सामान्य वितरण (normal distribution) के करीब होते हैं, लेकिन स्थानीय रूप से आउटलायर्स (Outliers) मौजूद होते हैं। यदि पूरे लेयर के वेट्स को एक समान स्केल फैक्टर $S$ के साथ क्वांटाइज किया जाता है, तो आउटलायर्स के कारण छोटे वेट्स की जानकारी पूरी तरह से खो जाती है।&lt;/p>
&lt;p>इसे रोकने के लिए, llama.cpp &lt;strong>ब्लॉक-स्तरीय क्वांटाइजेशन (Block-wise Quantization)&lt;/strong> करता है। वेट टेंसर को छोटे ब्लॉक्स (उदाहरण के लिए 32 एलीमेंट या 256 एलीमेंट) में विभाजित किया जाता है, और प्रत्येक ब्लॉक का अपना विशिष्ट स्केल फैक्टर (और जीरो-पॉइंट) होता है।&lt;/p>
&lt;h3 id="41-लगस-कवटइजशन-q4_0-q4_1-क-समए">4.1. लिगेसी क्वांटाइजेशन (Q4_0, Q4_1) की सीमाएँ
&lt;/h3>&lt;p>शुरुआती &lt;code>Q4_0&lt;/code> में 32 FP16 वेट्स का एक ब्लॉक था जो एक FP16 स्केल फैक्टर साझा करता था।&lt;/p>
&lt;ul>
&lt;li>ब्लॉक साइज: 32&lt;/li>
&lt;li>मेमोरी: 1 स्केल (16bit) + 32 4bit वेट्स (128bit) = 144bit&lt;/li>
&lt;li>प्रति एलीमेंट प्रभावी बिट्स (bpw: bits per weight): $144 / 32 = 4.5$ bpw&lt;/li>
&lt;/ul>
&lt;p>हालांकि यह काफी उत्कृष्ट है, सटीकता और कम्प्रेशन अनुपात की सीमाएं दिखाई देने लगीं। यहीं पर &lt;strong>k-quants&lt;/strong> सामने आया, जिसकी पदानुक्रमित (hierarchical) संरचना अधिक जटिल और परिष्कृत है।&lt;/p>
&lt;h3 id="42-सपरबलक-और-सबबलक-क-पदनकरमत-सरचन-q4_k_m-क-उदहरण">4.2. सुपरब्लॉक और सबब्लॉक की पदानुक्रमित संरचना (Q4_K_M का उदाहरण)
&lt;/h3>&lt;p>k-quants की एक पदानुक्रमित संरचना है जिसमें बड़े &amp;ldquo;सुपर-ब्लॉक (Super-block)&amp;rdquo; और उनके भीतर छोटे &amp;ldquo;सब-ब्लॉक (Sub-block)&amp;rdquo; होते हैं। यह मेटाडेटा (स्केल वैल्यू आदि) को भी क्वांटाइज करता है, जिससे सटीकता बनाए रखते हुए bpw को न्यूनतम किया जा सके।&lt;/p>
&lt;p>आइए &lt;strong>Q4_K_M&lt;/strong> की संरचना को देखें, जो सबसे लोकप्रिय सेटिंग है। Q4_K_M 256 एलीमेंट के सुपरब्लॉक का उपयोग करता है।&lt;/p>
&lt;div class="mermaid">graph TD
A["सुपर-ब्लॉक (256 वेट्स)"] --> B["स्केल मेटाडेटा (FP16/INT8)"]
A --> C["सब-ब्लॉक 0 (32 वेट्स, 4-बिट)"]
A --> D["सब-ब्लॉक 1 (32 वेट्स, 4-बिट)"]
A --> E["..."]
A --> F["सब-ब्लॉक 7 (32 वेट्स, 4-बिट)"]
B --> B1["सुपर-स्केल (FP16)"]
B --> B2["सब-स्केल्स (8 x 6-बिट)"]
B --> B3["सब-मिन्स (8 x 6-बिट)"]&lt;/div>
&lt;p>C++ (GGML) में वास्तविक संरचना को इस प्रकार परिभाषित किया गया है:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// llama.cpp में block_q4_K की वैचारिक संरचना
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="cp">#define QK_K 256
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">struct&lt;/span> &lt;span class="nc">block_q4_K&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint8_t&lt;/span> &lt;span class="n">d&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="c1">// पूरे सुपर-ब्लॉक का सुपर-स्केल (जैसे FP16 x 2)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">uint8_t&lt;/span> &lt;span class="n">scales&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">12&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="c1">// 8 सब-ब्लॉक (प्रत्येक 32 एलीमेंट) का 6-बिट स्केल और 6-बिट न्यूनतम मान (जीरो-पॉइंट) पैक्ड डेटा
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">uint8_t&lt;/span> &lt;span class="n">qs&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">QK_K&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="c1">// 4-बिट क्वांटाइज्ड वेट डेटा (256 एलीमेंट / 2 = 128 बाइट्स)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;strong>गणितीय डीक्वांटाइजेशन (Dequantization) प्रक्रिया:&lt;/strong>&lt;/p>
&lt;p>सब-ब्लॉक $i$ ($0 \le i &lt; 8$) के भीतर एलीमेंट $j$ ($0 \le j &lt; 32$) का अनुमानित वास्तविक मान $\tilde{W}_{i, j}$ इस प्रकार कैलकुलेट किया जाता है:&lt;/p>
$$ \tilde{W}_{i, j} = S_{\text{super}} \times s_i \times (w_{i, j} - m_i) $$
&lt;ul>
&lt;li>$S_{\text{super}}$: पूरे सुपरब्लॉक के लिए फ्लोटिंग-पॉइंट स्केल&lt;/li>
&lt;li>$s_i$: सबब्लॉक $i$ के लिए क्वांटाइज्ड 6-बिट स्केल&lt;/li>
&lt;li>$m_i$: सबब्लॉक $i$ के लिए क्वांटाइज्ड 6-बिट न्यूनतम मान (जीरो-पॉइंट)&lt;/li>
&lt;li>$w_{i, j}$: 4-बिट क्वांटाइज्ड वेट ($0 \dots 15$)&lt;/li>
&lt;/ul>
&lt;p>यह पदानुक्रमित संरचना आउटलायर्स को अनुकूलित करने की क्षमता बनाए रखती है, जबकि स्केल फैक्टर द्वारा उपयोग की जाने वाली मेमोरी को काफी कम कर देती है। Q4_K_M कुल मिलाकर लगभग &lt;strong>4.8 bpw&lt;/strong> प्राप्त करता है।&lt;/p>
&lt;h3 id="43-ववध-k-quants-वकलप">4.3. विविध k-quants विकल्प
&lt;/h3>&lt;p>llama.cpp उद्देश्य के आधार पर कई प्रकार के विकल्प प्रदान करता है। &amp;ldquo;K&amp;rdquo; के बाद के सफिक्स (S, M, L) आकार को इंगित करते हैं।&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">फॉर्मेट&lt;/th>
&lt;th style="text-align:center">BPW (Bits per Weight)&lt;/th>
&lt;th style="text-align:left">अवलोकन और विशेषताएं&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Q2_K&lt;/strong>&lt;/td>
&lt;td style="text-align:center">2.5～3.3&lt;/td>
&lt;td style="text-align:left">अत्यधिक कम्प्रेशन। सटीकता काफी कम हो जाती है, लेकिन उन वातावरणों के लिए उपयोगी है जहां VRAM बहुत कम है।&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Q3_K_M&lt;/strong>&lt;/td>
&lt;td style="text-align:center">3.3&lt;/td>
&lt;td style="text-align:left">3-बिट क्वांटाइजेशन का मानक। Q4 से खराब है, लेकिन अक्सर स्वीकार्य सीमा के भीतर रहता है।&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Q4_K_M&lt;/strong>&lt;/td>
&lt;td style="text-align:center">4.8&lt;/td>
&lt;td style="text-align:left">&lt;strong>अनुशंसित स्वीट स्पॉट&lt;/strong>। मॉडल के आकार को आधा करने और सटीकता बनाए रखने दोनों में संतुलन प्रदान करता है।&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Q5_K_M&lt;/strong>&lt;/td>
&lt;td style="text-align:center">5.5&lt;/td>
&lt;td style="text-align:left">जब अधिक सटीकता की आवश्यकता हो। Q4 और FP16 के बीच एक मध्यवर्ती स्थिति।&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Q6_K&lt;/strong>&lt;/td>
&lt;td style="text-align:center">6.6&lt;/td>
&lt;td style="text-align:left">FP16 के लगभग समान Perplexity बनाए रखता है, लेकिन फ़ाइल का आकार बड़ा होता है।&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Q8_0&lt;/strong>&lt;/td>
&lt;td style="text-align:center">8.5&lt;/td>
&lt;td style="text-align:left">INT8 के बराबर। मुख्य रूप से इन्फरेंस के दौरान इंटरमीडिएट टेंसर गणना के लिए या केवल अंतिम लेयर में उपयोग किया जाता है।&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;em>ध्यान दें: वास्तविक BPW मॉडल के टेंसर (उदाहरण के लिए, Attention के Q/K/V प्रोजेक्शन, या FFN वेट्स) के आधार पर मिश्रित क्वांटाइजेशन (Mixed Quantization) द्वारा मॉडल भर में औसत निकाला जाता है। महत्वपूर्ण टेंसर को Q6 में और अन्य को Q4 में क्वांटाइज करने जैसे ऑप्टिमाइज़ेशन आंतरिक रूप से किए जाते हैं।&lt;/em>&lt;/p>
&lt;hr>
&lt;h2 id="5-इनफरस-क-दरन-परदरशन-अनकलन-simd-और-cuda-आरकटकचर">5. इन्फरेंस के दौरान प्रदर्शन अनुकूलन: SIMD और CUDA आर्किटेक्चर
&lt;/h2>&lt;p>केवल GGUF मॉडल को मेमोरी में लोड करने से इन्फरेंस तेज़ नहीं होता है। LLM इन्फरेंस का अधिकांश भाग &amp;ldquo;मैट्रिक्स गुणन (Matrix-Vector Multiplication, जिसे GEMV या Matrix-Matrix, GEMM कहा जाता है)&amp;rdquo; है। क्वांटाइज्ड वेट्स और FP16 (या FP32) में रखे गए एक्टिवेशन (इनपुट डेटा) के बीच गुणा-और-जोड़ (multiply-accumulate) संचालन को तेज़ करना यहाँ कुंजी है।&lt;/p>
&lt;h3 id="51-cpu-वतवरण-म-simd-नरदश-क-उपयग">5.1. CPU वातावरण में SIMD निर्देशों का उपयोग
&lt;/h3>&lt;p>llama.cpp CPU इन्फरेंस में अपनी अद्भुत गति का श्रेय असेंबली-स्तर के &lt;strong>SIMD (Single Instruction, Multiple Data)&lt;/strong> ऑप्टिमाइज़ेशन को देता है।
उदाहरण के लिए, Intel/AMD CPUs पर, यह &lt;strong>AVX2&lt;/strong> और &lt;strong>AVX-512&lt;/strong> का पूरा उपयोग करता है, और Apple Silicon पर, यह &lt;strong>ARM NEON&lt;/strong> निर्देश सेट का पूरा उपयोग करता है।&lt;/p>
&lt;p>इन्फरेंस के दौरान, यह गुणा करने से पहले $W_q$ को FP32 में वापस (Dequantize) नहीं करता है।
एक्टिवेशन पक्ष को भी ब्लॉक दर ब्लॉक गतिशील रूप से क्वांटाइज किया जाता है (Dynamic Quantization, आमतौर पर INT8 में), और &lt;strong>INT8 $\times$ INT4&lt;/strong> पूर्णांक गणनाओं को SIMD के विशेष डॉट-प्रोडक्ट निर्देशों (जैसे &lt;code>vdpaddd&lt;/code> या &lt;code>_mm256_madd_epi16&lt;/code>) का उपयोग करके एक साथ प्रोसेस किया जाता है। अंतिम एक्यूमुलेटर (accumulator) में इसे FP32 पर वापस करके और स्केल फैक्टर से गुणा करके, यह अभूतपूर्व थ्रूपुट (throughput) प्राप्त करता है।&lt;/p>
&lt;h3 id="52-gpu-वतवरण-cublas--cuda-म-ऑफलडग">5.2. GPU वातावरण (cuBLAS / CUDA) में ऑफलोडिंग
&lt;/h3>&lt;p>नवीनतम llama.cpp में केवल CPU के लिए ही नहीं, बल्कि NVIDIA GPUs (CUBLAS / CUDA) के लिए भी शक्तिशाली समर्थन है।
GGUF फ़ाइल के कुछ या सभी लेयर्स को VRAM में ऑफलोड किया जा सकता है (&lt;code>--n-gpu-layers&lt;/code> विकल्प)।&lt;/p>
&lt;div class="mermaid">sequenceDiagram
participant User as उपयोगकर्ता
participant CPU_RAM as CPU &amp; RAM (mmap)
participant VRAM as GPU VRAM
participant Compute as टेंसर कोर
User->>CPU_RAM: GGUF लोड करें (mmap)
CPU_RAM->>VRAM: लेयर्स ऑफलोड करें (उदा. 30/32 लेयर्स)
Note over CPU_RAM, VRAM: डेटा VRAM में क्वांटाइज्ड रहता है
User->>Compute: फॉरवर्ड पास (इनपुट टोकन्स)
Compute->>VRAM: क्वांटाइज्ड वेट्स प्राप्त करें
Compute->>Compute: SRAM में ऑन-द-फ्लाई FP16 में डीक्वांटाइज करें
Compute->>Compute: मैट्रिक्स गुणा (cuBLAS / कस्टम कर्नेल)
Compute->>User: आउटपुट Logits&lt;/div>
&lt;p>GPU पर गणना करते समय, VRAM की बैंडविड्थ (Memory Bandwidth) सबसे बड़ी रुकावट होती है। चूंकि वेट्स को k-quants द्वारा कंप्रेस किया जाता है, VRAM से GPU की गणना इकाई (SM: Streaming Multiprocessor या Tensor Cores) तक डेटा ट्रांसफर मात्रा 1/3 से 1/4 तक कम हो जाती है। जिस क्षण वेट्स गणना इकाई तक पहुंचते हैं, उन्हें ऑन-द-फ्लाई (on-the-fly) FP16 में डीक्वांटाइज (विस्तारित) किया जाता है, और टेंसर कोर (Tensor Core) का उपयोग करके अल्ट्रा-हाई-स्पीड मैट्रिक्स गुणन निष्पादित किया जाता है।
दूसरे शब्दों में, यह कहा जा सकता है कि क्वांटाइजेशन &lt;strong>&amp;ldquo;कम्प्यूटेशनल लोड को कम करने&amp;rdquo; के लिए नहीं, बल्कि &amp;ldquo;मेमोरी ट्रांसफर वॉल्यूम को कम करने&amp;rdquo; के लिए किया जाता है&lt;/strong>।&lt;/p>
&lt;hr>
&lt;h2 id="6-ममर-उपयग-और-परदरशन-टरड-ऑफ-क-वशषट-उदहरण">6. मेमोरी उपयोग और प्रदर्शन ट्रेड-ऑफ़ का विशिष्ट उदाहरण
&lt;/h2>&lt;p>यहां, आइए Llama 3 8B मॉडल का उदाहरण लेते हुए GGUF क्वांटाइजेशन स्तर के आधार पर आवश्यक स्पेक्स देखें। (संख्याएं केवल एक अनुमान हैं)&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">मॉडल/क्वांटाइजेशन&lt;/th>
&lt;th style="text-align:left">फ़ाइल का आकार&lt;/th>
&lt;th style="text-align:left">आवश्यक VRAM/RAM&lt;/th>
&lt;th style="text-align:left">इन्फरेंस गति (अनुमान)&lt;/th>
&lt;th style="text-align:left">Perplexity गिरावट&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Llama-3-8B (FP16)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">लगभग 16 GB&lt;/td>
&lt;td style="text-align:left">18 GB से अधिक&lt;/td>
&lt;td style="text-align:left">बेसलाइन&lt;/td>
&lt;td style="text-align:left">कोई नहीं (Base)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Llama-3-8B (Q8_0)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">लगभग 8.5 GB&lt;/td>
&lt;td style="text-align:left">10 GB से अधिक&lt;/td>
&lt;td style="text-align:left">तेज़&lt;/td>
&lt;td style="text-align:left">लगभग शून्य&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Llama-3-8B (Q6_K)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">लगभग 6.6 GB&lt;/td>
&lt;td style="text-align:left">8 GB से अधिक&lt;/td>
&lt;td style="text-align:left">बहुत तेज़&lt;/td>
&lt;td style="text-align:left">न्यूनतम&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Llama-3-8B (Q4_K_M)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">लगभग 4.9 GB&lt;/td>
&lt;td style="text-align:left">6.5 GB से अधिक&lt;/td>
&lt;td style="text-align:left">सबसे तेज़/इष्टतम&lt;/td>
&lt;td style="text-align:left">स्वीकार्य/न्यूनतम&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Llama-3-8B (Q3_K_M)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">लगभग 3.9 GB&lt;/td>
&lt;td style="text-align:left">5.5 GB से अधिक&lt;/td>
&lt;td style="text-align:left">सबसे तेज़&lt;/td>
&lt;td style="text-align:left">थोड़ी ध्यान देने योग्य&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Llama-3-8B (Q2_K)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">लगभग 3.0 GB&lt;/td>
&lt;td style="text-align:left">4.5 GB से अधिक&lt;/td>
&lt;td style="text-align:left">तेज़&lt;/td>
&lt;td style="text-align:left">स्पष्ट गिरावट&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>ध्यान रखने योग्य बातें (KV कैश का प्रभाव):&lt;/strong>
LLM इन्फरेंस में, जैसे-जैसे कॉन्टेक्स्ट की लंबाई (प्रॉम्प्ट में टोकन की संख्या) बढ़ती है, न স্বয়ংক্রিয় रूप से मॉडल वेट्स बल्कि पिछली Attention स्थिति को सेव करने वाले &lt;strong>KV कैश&lt;/strong> की मेमोरी खपत भी बहुत तेज़ी से बढ़ती है।
उदाहरण के लिए, 8192 टोकन के कॉन्टेक्स्ट के लिए, केवल KV कैश कई GB की खपत करता है। इसलिए, वास्तविक उपयोग में, &lt;code>मॉडल फ़ाइल आकार + लगभग 1.5GB से 3GB&lt;/code> का मार्जिन (Headroom) सुरक्षित करना आवश्यक है। Q4_K_M की सिफारिश करने का कारण यह है कि इस KV कैश को सुरक्षित करने के बाद भी, यह एक बेहतरीन विकल्प है जो सामान्य 8GB VRAM वाले GPU (जैसे RTX 3060 / 4060) पर सुरक्षित रूप से काम करता है।&lt;/p>
&lt;p>हाल के llama.cpp में, &lt;strong>KV कैश को ही Q8_0 या Q4_0 में क्वांटाइज करने का फीचर&lt;/strong> भी जोड़ा गया है, और कॉन्टेक्स्ट की लंबाई को और बढ़ाने के लिए लगातार प्रयास किए जा रहे हैं।&lt;/p>
&lt;hr>
&lt;h2 id="7-नषकरष">7. निष्कर्ष
&lt;/h2>&lt;p>इस लेख में, हमने llama.cpp के मूल भाग, GGUF फॉर्मेट और k-quants क्वांटाइजेशन तकनीक की आंतरिक संरचना के बारे में गहराई से बताया है।&lt;/p>
&lt;ol>
&lt;li>&lt;strong>GGUF का लचीलापन:&lt;/strong> की-वैल्यू (Key-Value) मेटाडेटा संरचना के साथ, इसने एक मजबूत इकोसिस्टम बनाया है जो बिना विनाशकारी परिवर्तनों (breaking changes) के LLM (नए मॉडल आर्किटेक्चर का उद्भव) के तेजी से विकास को अपना सकता है।&lt;/li>
&lt;li>&lt;strong>k-quants के माध्यम से अत्यधिक कम्प्रेशन:&lt;/strong> सुपर-ब्लॉक और सब-ब्लॉक के पदानुक्रमित स्केल फैक्टर प्रबंधन के माध्यम से, यह आउटलायर्स (outliers) की जानकारी बनाए रखते हुए प्रति वेट औसत 4.8 बिट्स (Q4_K_M) का अविश्वसनीय कम्प्रेशन प्राप्त करता है।&lt;/li>
&lt;li>&lt;strong>मेमोरी बैंडविड्थ की रुकावट को दूर करना:&lt;/strong> SIMD और CUDA में उन्नत कर्नेल कार्यान्वयन के कारण, यह ऑन-द-फ्लाई डीक्वांटाइजेशन के साथ गणना करके VRAM ट्रांसफर वॉल्यूम को कम करता है और इन्फरेंस की गति में काफी सुधार करता है।&lt;/li>
&lt;/ol>
&lt;p>llama.cpp की तकनीकी क्षमता, जो AI के लोकतंत्रीकरण को बढ़ावा दे रही है, केवल एक उपकरण होने से कहीं आगे जाती है और इसे आधुनिक सॉफ्टवेयर इंजीनियरिंग के शिखरों में से एक कहना अतिशयोक्ति नहीं होगी। क्वांटाइजेशन एल्गोरिथम और GGUF फॉर्मेट के तंत्र को समझकर, आप अपने वातावरण के लिए सबसे उपयुक्त मॉडल का चयन करने और अधिक सटीक रूप से प्रदर्शन ट्यूनिंग (performance tuning) करने में सक्षम होंगे।&lt;/p>
&lt;h3 id="सदरभ-लक">संदर्भ लिंक
&lt;/h3>&lt;ul>
&lt;li>&lt;a class="link" href="https://github.com/ggerganov/llama.cpp" target="_blank" rel="noopener"
>llama.cpp GitHub Repository&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://github.com/ggerganov/ggml/blob/master/docs/gguf.md" target="_blank" rel="noopener"
>GGUF Format Specification&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://github.com/ggerganov/llama.cpp/pull/1684" target="_blank" rel="noopener"
>K-quants Implementation PR&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>(समाप्त)&lt;/p></description></item></channel></rss>