وكان معلمًا في ستانفورد لفترة طويلة، ثم أصبح رئيس قسم الهندسة الفكرية في تسلا، وكان يعمل في OpenAI، وأعتقد أنه أيضا إنتاج بعض أفضل مقاطع فيديو تعليمية في الهندسة الفكرية المتاحة اليوم. أحدث مشاريعها ، ولكن هذا ما يمكن وصفه فقط كأعمال فنية. microGPT microGPT هو تطبيق GPT كامل مكتوب في وهذا ليس كوداً مجهزًا أو مجهزًا، على العكس من ذلك، فإن الكود هو نظيف ومستقيمًا جيدًا وتأكيدًا جيدًا، حتى تجنب استخدام مكتبات التعلم العميق الخارجية. only about 200 lines of Python code في الواقع، لا توجد في المشروع بأكملها أي محفظة كاملة - يتم نشرها بسهولة كحد أقصى. . single GitHub Gist https://gist.github.com/karpathy/8627fe009c40f57531cb18360106ce95?embedable=true في هذه المقالة، سأحاول أن أشرح كيف يعمل هذا قطعة من الكود الجميل بطريقة . anyone with basic Python knowledge can understand دعنا نبدأ مع الاسم . GPT GPT يلتزم وتشكل هذه الهيكلية أساساً للعديد من نموذجات اللغات الكبيرة الحديثة. ChatGPT نفسه يحتوي على هذا الترجمة في اسمها، ويتم بناء معظم البدائل الرئيسية حاليا على نفس الفكرة الأساسية. Generative Pretrained Transformer نموذج GPT يتوقع بناء على الكلمات السابقة في النص. the next word (or token) هذا هو في الأساس ما يفعله جميع النماذج اللغوية.إنها تنشئ الإجابة عن طريق التنبؤ كلمة واحدة في وقت واحد.أولاً، إنها تنبؤ الكلمة التالية، ثم إنها تضاف هذه الكلمة إلى النص و تنبؤ الكلمة التالية مرة أخرى، وما إلى ذلك. في البداية ، قد يبدو هذا بسيطًا ، ولكن إذا كنت تفكر في ذلك بشكل أكثر احتياطًا ، فإن توقع الكلمة التالية بشكل صحيح يتطلب مستوى معين من الخبرة. . understanding of the text and its meaning في الشبكات العصبية ، يتم تنفيذ هذه العملية "التفكير" كعملية . very large mathematical function يتم تحويل الكلمات الدلالية إلى الأرقام وتغذيةها إلى هذه الميزات، والتي تقرر بعدها الكلمة التالية.في المبدأ، يمكن أن يتم تقديم أي نظام قواعد من خلال استخدام مثل هذه الميزات.لذلك يصبح مهمة العثور على الميزات المناسبة التي تسجل هيكل اللغات. هذه الوظيفة هي ما نسميه . model المشكلة هي أن هذه الوظيفة يمكن أن تكون وتشمل النماذج اللغوية الحديثة مليارات النماذج، مما يعني أن النماذج الرياضية التي وصفها يمكن أن تحتوي على مليارات من المكونات. extremely complex لحسن الحظ ، هناك عمل ذكي. بدلاً من كتابة الصيغة الحقيقية بنفسك، نحن نحدد بالنسبة إلى الصيغة، هي الهيكل مع العديد من النماذج التي يمكن تعديلها، ثم يمكن تعديل هذه النماذج تلقائيا حتى تعمل النماذج بشكل جيد. “template” لدينا العديد من هذه الملفات، اعتمادًا على نوع المشكلة التي نريد حلها: وتستخدم الشبكات التجميلية في كثير من الأحيان لإجراء الصور. تستخدم MLP (Percetrons Multi-Layer) لتقييم الوظيفة العامة. يتم استخدام تحويلات لغات جديدة مثل ChatGPT وما إلى ذلك. وتشكل هذه النماذج الهياكل الرياضية الكبيرة التي يمكن أن تتوفر على قواعد معقدة مرة أخرى عندما يتم تعديل المعايير بشكل صحيح. السؤال الوحيد هو: أو ، بمعنى آخر : How do we adjust these parameters? How do we “program” a neural network? وبطبيعة الحال ، من المستحيل تعديل المراحل من شبكة عصبية ، خاصة عندما نتعامل مع النماذج التي تحتوي على ملايين أو حتى مليارات من المراحل. لحسن الحظ، هناك طريقة لإجراء ذلك تلقائيا، باستخدام البيانات. والطريقة التي يجعلها ممكنة تسمى . training gradient descent إذا كان لدينا مجموعة من البيانات الكبيرة والتعليقات الرياضية الكبيرة (معدلنا) ، يمكننا حساب خطأ النماذج لكل مثال في مجموعة البيانات. في حالة التحويل ، يعمل العملية على نحو متزايد مثل هذا. Words are represented as points in a high-dimensional vector space, where words with similar meanings appear closer to each other. Each word corresponds to a point in this space. يتلقى النموذج سلسلة من الكلمات كدخول وتحاول تحديد الكلمة التالية.لأن الكلمات تمثل كوادر فيتامينية، يمكننا تحديد مدى مسافة الكلمة المتوقعة من الكلمة الصحيحة. And now comes the magic. باستخدام تراجع التردد، يمكننا تحديد كيفية تغيير المعايير في الصيغة لتقليل هذه الخطأ. إذا كان لدينا كمية كافية من البيانات، شبكة كبيرة بما فيه الكفاية، وتدريبها لفترة طويلة بما فيه الكفاية، فإن النموذج يتكيف تدريجياً مع الأنماط في مجموعة البيانات، وتنتج توقعات أكثر وضوحاً. ولكن كيف يعمل بالضبط هذا "المعجزة"؟ كيف تجد التراجع الترددي حقاً أعلى المعايير؟ يمكننا رؤية الخطأ كدور في مساحة عالية الدقة ، حيث يتوافق كل مساحة مع مزيج واحد من النماذج. إن التفكير في العديد من الجوانب أمر غير ممكن عمليًا بالنسبة للإنسان، لذلك يمكننا أن نتصور بدلاً من ذلك نموذجًا أسهل: جدار من الجبال والحدائق. في هذا المنهج: كل نقطة على الجدار يمثل مجموعة محددة من النماذج النماذج. ارتفاع المناظر الطبيعية في هذه اللحظة يمثل خطأ النموذج. في البداية من التدريب، يتم البدء في المراحل على سبيل المثال.هذا مثل وضع في مكان ما على سبيل المثال على الجبل. هدفنا هو تقليل الأخطاء ، مما يعني العثور على أدنى نقطة في الجوانب. الصعوبة هي أننا لا نعرف كيف تبدو المناظر الطبيعية، كما لو أننا نحاول التتويج من الجبل، أو في الشمس العميقة، وماذا يمكننا فعله؟ هذا هو المكان الذي يأتي فيه الانخفاض. في الرياضيات ، هناك مفهوم يسمى , which describes the slope of a function at a given point. derivative هذا هو مفيد للغاية هنا.المنتج يخبرنا . which direction the landscape slopes downward وبالتالي فإن الكمبيوتر يعمل بسهولة كما هو الحال: Measure the slope of the landscape. اتخذ خطوة صغيرة في الاتجاه الذي يقلل من الخطأ. التكرار خطوة بخطوة، يتحرك النموذج تدريجياً إلى أسفل حتى يصل إلى نقطة منخفضة في سياق الأخطاء. هذا هو بالطبع ما يفعله الانخفاض المرتفع. السؤال الوحيد هو: كيف نتمكّن من حساب الارتفاع في مثل هذه الوظيفة المعقدة؟ لن أذهب إلى التفاصيل الرياضية الكاملة هنا، لأن كارتايت لديها بالفعل. تفسيرها فيديو رائع For our purposes, it is enough to know the following. هناك أيضا قاعدة تسمى قاعدة سلسلة ، والتي تسمح لنا بتجميع هذه القاعدة المحيطة للكشف عن القاعدة المحيطة لعملية مشتركة كاملة. الفكرة الأساسية هي أننا نذهب إلى الخلف من خلال سلسلة العمليات ، مع جمع الترددات على طول الطريق. جميع إطاريات التعلم العميق الرئيسية تطبق هذه الميزة. مثال على ذلك: تستخدم TensorFlow نظام يسمى GradientTape ، والذي يقوم بتسجيل العمليات كما لوحة تسجيل الفيديو حتى يمكن حساب التردد بعد ذلك. يضيف PyTorch معلومات التردد مباشرة إلى الترددات. تتذكر كل الترددات كيف تم إنشاؤها، مما يسمح بتحليل الترددات تلقائيا. تطور Karpathy يتبع نفس الفكرة الأساسية. # Let there be Autograd to recursively apply the chain rule through a computation graph class Value: __slots__ = ('data', 'grad', '_children', '_local_grads') # Python optimization for memory usage def __init__(self, data, children=(), local_grads=()): self.data = data # scalar value of this node calculated during forward pass self.grad = 0 # derivative of the loss w.r.t. this node, calculated in backward pass self._children = children # children of this node in the computation graph self._local_grads = local_grads # local derivative of this node w.r.t. its children def __add__(self, other): other = other if isinstance(other, Value) else Value(other) return Value(self.data + other.data, (self, other), (1, 1)) def __mul__(self, other): other = other if isinstance(other, Value) else Value(other) return Value(self.data * other.data, (self, other), (other.data, self.data)) def __pow__(self, other): return Value(self.data**other, (self,), (other * self.data**(other-1),)) def log(self): return Value(math.log(self.data), (self,), (1/self.data,)) def exp(self): return Value(math.exp(self.data), (self,), (math.exp(self.data),)) def relu(self): return Value(max(0, self.data), (self,), (float(self.data > 0),)) def __neg__(self): return self * -1 def __radd__(self, other): return self + other def __sub__(self, other): return self + (-other) def __rsub__(self, other): return other + (-self) def __rmul__(self, other): return self * other def __truediv__(self, other): return self * other**-1 def __rtruediv__(self, other): return other * self**-1 def backward(self): topo = [] visited = set() def build_topo(v): if v not in visited: visited.add(v) for child in v._children: build_topo(child) topo.append(v) build_topo(self) self.grad = 1 for v in reversed(topo): for child, local_grad in zip(v._children, v._local_grads): child.grad += local_grad * v.grad في قواعد كاربايت ، يتم تنفيذ جميع منطق الحساب الترددي في class, which is only about . Value 40 lines long هذه الفئة هي في الأساس محطات حول القيم الرقمية. بالإضافة إلى تخزين البيانات نفسها، فإنه أيضا تخزين: وَمِنْهُمْ مَنْ يَسْتَمِعُونَ إِلَيْكَ وَمِنْهُمْ مَنْ يَسْتَمِعُونَ إِلَيْكَ وَمِنْهُمْ مَنْ يَسْتَمِعُونَ إِلَيْكَ وتحتوي على المراكز المحلية التي تحتاج إلى التوسع. If we look at the code, we can see that the standard operators are redefined: أضف إلى و الآخرين وهذا يعني أنه في كل مرة تقوم بتنفيذ عملية متقدمة على وبالتالي، فإن البرنامج ليس فقط يحدد النتيجة، ولكن أيضًا يحدد ما هي القيم التي تم إنتاجها وكيف يجب توزيع الارتفاع. Value وأخيراً، فإن يتم إجراء عملية التوسع المباشر من خلال سلسلة العمليات ويحتاج إلى تقييم التردد الكامل فيما يتعلق بالخطأ. backward() وهذه هي أساسا كل الفكرة. The other important component of training is gradient descent itself, which uses the computed gradients to update the parameters of the model. بمعنى آخر ، هذا هو الجزء من الكود الذي يمر في الواقع على الجبل باستخدام معلومات الارتفاعات. # Adam optimizer update: update the model parameters based on the corresponding gradients lr_t = learning_rate * (1 - step / num_steps) # linear learning rate decay for i, p in enumerate(params): m[i] = beta1 * m[i] + (1 - beta1) * p.grad v[i] = beta2 * v[i] + (1 - beta2) * p.grad ** 2 m_hat = m[i] / (1 - beta1 ** (step + 1)) v_hat = v[i] / (1 - beta2 ** (step + 1)) p.data -= lr_t * m_hat / (v_hat ** 0.5 + eps_adam) p.grad = 0 في تطبيق كارتاليا ، يتم ذلك مع وهي واحدة من أكثر أجهزة التحسين استخداما في التعلم العميق. Adam optimizer Adam هو أكثر تعقيداً قليلاً من الانخفاض البلاستيكي الأساسية. بدلاً من اتخاذ خطوات كبيرة، فإنه يتناسب مع حجم الخطوط بشكل إيجابي على أساس تاريخ البلاستيك السابقة. هذا يجعل عملية التدريب كلاً من . faster and more stable تشكل الحسابات المرتفعة المذكورة أعلاه والخطوة التحسين معا ما يمكن أن نسميه إطار التعلم العميق جزءا من الكود. Every neural network — whether it powers a language model, an image generator, a robot controller, or a self-driving car — is trained using essentially the same principle. هذه القصص القصيرة من الكود تسجل الفكرة الأساسية خلف الذكاء الاصطناعي الحديث. برامج واسعة مثل: TensorFlow بيترش JAX provide highly optimized implementations that can run on GPUs, TPUs, and distributed clusters, and include many additional tricks and optimizations. But if we strip everything down to the essentials, the underlying principle is exactly the same as what we see in this tiny Python implementation. الآن، عندما نرى جزءاً من إطار التعلم العميق من الكود، يمكننا الانخراط في الشبكة العصبية الحقيقية، بمعنى آخر، نموذج GPT نفسه. كما ذكرت سابقاً ، فإن الهدف من GPT هو التنبؤ بالطابع التالي على أساس السمات التي جاءت قبلها. هذا التحديد يسهل قليلا، لأن الدخول لا يتكون في الواقع من الكلمات، ولكن من الرموز. تُشبه الورقات الكلمات، ولكنها ليست واضحة. بدلاً من الاعتماد على كلمة المرور المحددة، يتعلم النظام كلمة المرور إحصائيًا من البيانات التدريبية. So training does not begin with a fixed list of words where each word already has a number assigned to it. Instead, this “dictionary” emerges from the data itself during preprocessing. هذا النهج مفيد بشكل خاص لللغات المضغوطة مثل اللغات المضغوطة ، حيث يمكن لأية كلمة واحدة أن تتكون من أشكال مختلفة بسبب المضغوطات والنتائج اللغوية. مع كميات كافية من البيانات التدريبية، يمكن أن يتعلم نموذج لغة أي لغة، سواء كانت طبيعية أو مصنوعة. في الواقع ، لا تحتاج إلى تثبيت التسمية ، ويمكن أن تثبت: جزء من الصور fragments of audio معالج القراءة أو أي نوع من البيانات Because of this, transformer models are not limited to language processing. They can also be used for image generation, speech processing, robotics, and many other tasks. Karpathy’s model is intentionally very small, so in this case, the tokens are not words but characters. وبالتالي، فإن الهدف من النماذج ليس من إنتاج عبارات أو إجابات كاملة، ولكن ببساطة إنتاج أسماء مثيرة للجدل. يتكون مجموعة البيانات التدريبية من قائمة واسعة من الأسماء، ونحن نتوقع من النماذج إنشاء أسماء جديدة تشبه إلى حد كبير الأمثلة. This is obviously far from a full-scale language model like ChatGPT. But in reality, the difference is mostly one of scale. إذا قمت بزيادة هذا النموذج المليون مرة، واستخدام تيموثات بدلاً من الأحرف، وتدريبها على مجموعة كبيرة من البيانات التي تم جمعها من الإنترنت، فستكون في نهاية المطاف شيء ما يوافق على نموذج لغة كبيرة الحديثة. يتم تدريب هذه النماذج الكبيرة عادة في مرحلة ثانية: التدريب المبكر – التدريب على مجموعة كبيرة من البيانات على الإنترنت لتعلم النماذج اللغوية العامة. Fine-tuning - تدريب إضافي باستخدام محادثات مصنوعة من البشر لتعزيز الاستجابة. The process requires enormous computational resources and huge amounts of high-quality data, often costing millions of dollars in compute. نظرًا لأن معظمنا ليس لديهم إمكانية الوصول إلى هذه الموارد، سنحتاج إلى التوافق على إنتاج الأسماء. # Let there be a Dataset `docs`: list[str] of documents (e.g. a list of names) if not os.path.exists('input.txt'): import urllib.request names_url = 'https://raw.githubusercontent.com/karpathy/makemore/988aa59/names.txt' urllib.request.urlretrieve(names_url, 'input.txt') docs = [line.strip() for line in open('input.txt') if line.strip()] random.shuffle(docs) print(f"num docs: {len(docs)}") # Let there be a Tokenizer to translate strings to sequences of integers ("tokens") and back uchars = sorted(set(''.join(docs))) # unique characters in the dataset become token ids 0..n-1 BOS = len(uchars) # token id for a special Beginning of Sequence (BOS) token vocab_size = len(uchars) + 1 # total number of unique tokens, +1 is for BOS print(f"vocab size: {vocab_size}") في بداية الكود ، نجد القسم المسؤول عن تحميل مجموعة البيانات من الأسماء وبناء الكلمة. In this case, the vocabulary simply consists of the list of characters that appear in the dataset. يتم تخصيص لكل حروف هوية رقمية ، مما يتيح تحويل النص إلى الأرقام التي يمكن معالجة الشبكة العصبية. ثم يأتي واحد من أهم المفاهيم في التعلم العميق: . embeddings The idea is simple but powerful. بدلاً من العمل مع أرقام تكنولوجيا تكنولوجيا تكنولوجيا تكنولوجيا تكنولوجيا تكنولوجيا تكنولوجيا تكنولوجيا تكنولوجيا تكنولوجيا تكنولوجيا هذه المركبات هي ما يعمل الشبكة العصبية في الواقع. point in a high-dimensional vector space In fact, any neural network can be viewed as a function that . maps vectors from one high-dimensional space into another مثال على ذلك: إذا تم تدريب شبكة عصبية لتصنيف الصور كلب أو كلب ، فإن الشبكة تقوم بتصنيف الصور إلى مساحة ثنائية ، حيث يتوافق الجانب واحد مع "الطبيعة" والآخر مع "الطبيعة". If we imagine an image generator like , it maps random noise into a high-dimensional space where each point represents an image conditioned on the prompt. Midjourney بغض النظر عن المهمة ، فإن الشبكة تعمل دائمًا . vector-to-vector transformation using a large mathematical function وهذا صحيح بالنسبة لـ GPT. يتم تحديد حجم مساحة الفوركس في الكود من خلال الحد الأدنى. , which in this implementation is set to . n_embd 16 وهذا يعني أن كل علامة (في هذه الحالة ، كل علامة) يتم تصنيفها ك . 16-dimensional vector من الناحية الرياضية، هذه الخلايا هي مجرد . matrix multiplication In the code, the matrix responsible for this transformation is called , which stands for . wte word/token embedding ومع ذلك ، معرفة أي شخص يظهر في كلمة ليس كافيا. الموضوعات أيضا. position على سبيل المثال، تغير معنى سلسلة إذا قمنا بتعديل الأحرف. من أجل إدخال معلومات الوضع، يستخدم النموذج , implemented using another matrix called . positional embeddings wpe يتم تخطيط الكود وواقعه إلى مركبات 16 متساوية ، ثم ببساطة . adds the two vectors together The result is a single vector that encodes both: the identity of the token its position within the sequence Earlier, we mentioned that these vector representations must be meaningful, because later the model will compute errors based on distances between vectors. في الأفضل : يجب أن تكون التوقعات القابلة للغاية قريبة من المركبات الصحيحة. يجب أن تكون التوقعات الخاطئة بعيدة عن ذلك. هذا يجعل سؤالًا مثيرًا للاهتمام: How do we design a good embedding space? The answer is surprisingly simple: We don’t. Instead, we initialize the embedding matrices ( and ) with random numbers and allow gradient descent to learn the correct representation during training. wte wpe If we have enough data, the optimization process will gradually adjust the matrices until they represent useful relationships. هذا يمكن أن يؤدي إلى خصائص ناشئة قوية للغاية. على سبيل المثال، في عالم الشهادة embedding model, vector arithmetic can capture semantic relationships. A classic example is: word2vec king − man + woman ≈ queen Here we can already see that the embedding space begins to represent a kind of حيث تظهر العلاقات بين المفاهيم مثل العلاقات الجيوسياسية بين المركبات. simplified model of the world Now that we have seen how vectors are created, we can finally look at the neural network itself, the component that transforms these vectors into new vectors representing the next token. In other words, the network maps vectors from the token embedding space back into the same space, but shifted by one token. For each token, it predicts which token should follow next. By repeatedly applying this process, the model can generate an entire sequence of text — or in this case, a name. The architecture used for this is called the . Transformer تم تقديم Transformer في عام 2017 من قبل الباحثين في جوجل في المقال المعروف: “Attention Is All You Need.” تم تصميم الأكاديمية الأصلية ل وكان يتكون من أربعة أجزاء رئيسية: machine translation كودي و Decoder The encoder processed the input sentence, while the decoder generated the translated output sentence. ومع ذلك، بالنسبة إلى النماذج النووية مثل GPT، نحن بحاجة فقط إلى : the . half of the original architecture decoder stack This is why GPT models are often described as . decoder-only transformers The decoder receives the input tokens and repeatedly processes them through a stack of identical layers. Each layer contains two main components: الاهتمام الذاتي شبكة عصبية متقدمة (MLP) يتم تكرار هذه الطبقات عدة مرات في النماذج الكبيرة.في الخرائط، يمكنك غالباً أن ترى هذا تمثل , meaning the block is stacked multiple times. ×N One of the key innovations of the Transformer architecture is that it processes the . entire sequence at once أنماط اللغات القديمة ، وخاصة الشبكات العصبية المتكررة (RNNs) ، معالجة النص كلمة واحدة في وقت واحد ، وتسليم المعلومات بطريقة سلسة على طول الترتيب. Transformers work differently. They can look at all tokens simultaneously, allowing the model to learn relationships between any parts of the text. وهذه الميزة تسمى هذا هو السبب في أن عنوان الكتاب الأصلي هو . attention Attention Is All You Need The attention mechanism calculates how في الترتيب . relevant each token is to every other token For each token vector, the model computes a set of weights describing how much attention it should pay to the other tokens. It then combines the information from those tokens accordingly. وبالتالي فإن المركبات الناتجة عن ذلك لا توجد إلا عن طريق الهواتف الذكية نفسها، ولكن أيضا . its meaning in the context of the entire sequence قد يبدو هذا معقدًا ، ولكن الحساسية بسيطة. Suppose we ask a language model: “What is the capital of France?” إذا نظرنا فقط إلى الكلمة ، لم نتمكن من تحديد الإجابة ، ولكن التفكير يتيح للكمبيوتر اتصال الكلمة with . “capital” “capital” “France” The resulting representation captures the meaning of the phrase ، مما يجعل من الممكن لنموذج إنتاج الإجابة الصحيحة: . “capital of France” Paris طريقة واحدة للتفكير في التحويلات هي أن تفكر في أنها مثل نوع من . soft database بدلاً من تخزين الحقائق الفارغة، يتم تخزين المعرفة في صورة مساحة الفوركس.لأن الشبكات العصبية تتمثل في الوظائف بدلاً من تخزين القواعد الحقيقية، فإنها غالباً ما تكون قادرة على الإجابة على الأسئلة التي لم تكن ترىها سابقاً. العودة إلى مثال إدراجنا السابق: إذا كانت البيانات التدريبية تحتوي على معلومات حول الملكات والنساء، فقد لا يزال النماذج قادرة على الإجابة على الأسئلة حول الملكات، لأن العلاقات بين هذه المفاهيم يتم تسجيلها في الفضاء الفكري. إذا اتبعنا هذه النماذج من قواعد البيانات، يمكننا أن نقول: acts like an , helping the model locate relevant information. Attention index The contain the knowledge itself. MLP layers هذه النماذج العقلية مفيدة للكلمات، ولكنها ليست صحيحة بالطبع. في تحويل حقيقي مثل هذا الذي تستخدمه في ChatGPT ، يتم تكرار هذه الحوافز الاهتمام + MLP العديد من المرات. لا يتم تخزين المعرفة في مكان واحد ، ولكن يتم توزيعها على مختلف طبقات. Additionally, each layer includes a residual connection, which mixes the original input vectors with the newly computed vectors. This allows information to flow through the network more effectively and stabilizes training. As the vectors pass through the layers, new abstractions and meanings can emerge. By the time the final layer produces its output, the model has combined information from many different levels of representation. The full process is far too complex to follow step by step with human intuition. ومع ذلك ، على الرغم من هذه المعقدة ، يعمل النظام بشكل رائع في الممارسة العملية. Now that we have a rough intuition about the transformer architecture, let’s look at one of its most important components in more detail: . attention # 1) Multi-head Attention block x_residual = x x = rmsnorm(x) q = linear(x, state_dict[f'layer{li}.attn_wq']) k = linear(x, state_dict[f'layer{li}.attn_wk']) v = linear(x, state_dict[f'layer{li}.attn_wv']) keys[li].append(k) values[li].append(v) x_attn = [] for h in range(n_head): hs = h * head_dim q_h = q[hs:hs+head_dim] k_h = [ki[hs:hs+head_dim] for ki in keys[li]] v_h = [vi[hs:hs+head_dim] for vi in values[li]] attn_logits = [sum(q_h[j] * k_h[t][j] for j in range(head_dim)) / head_dim**0.5 for t in range(len(k_h))] attn_weights = softmax(attn_logits) head_out = [sum(attn_weights[t] * v_h[t][j] for t in range(len(v_h))) for j in range(head_dim)] x_attn.extend(head_out) x = linear(x_attn, state_dict[f'layer{li}.attn_wo']) x = [a + b for a, b in zip(x, x_residual)] In Karpathy’s implementation, attention is calculated using three matrices called: Q (Query) K (المفتاح) V (Value) These matrices perform vector projections. In other words, each token vector is mapped into three different vector spaces. For every token we compute: a query vector a key vector a value vector بمجرد الحصول على هذه المركبات ، نقوم بمقارنة المركبات المطلوبة من توقيع واحد مع المركبات الرئيسية لجميع المركبات في الترتيب. Mathematically, this is done using a dot product. The dot product gives a score that represents how strongly two vectors are related. This produces a set of numbers that represent . how relevant each token is to the current token ومع ذلك ، فإن هذه الأرقام الحمراء ليست احتمالية حتى الآن. لترتيبها في توزيع احتمال ، نقوم بتطبيق , which transforms the scores into values between 0 and 1 that sum to 1. softmax function These values represent how much attention each token should receive. وفي النهاية، يدمج النماذج القيمة باستخدام هذه الازدحامات الاهتمام، مما يخلق النماذج الجديدة التي تحتوي على معلومات تم جمعها من السياق بأكملها. نموذج الاهتمام بالمنتجات النسائية المتوسطة يبدو هذا: Attention(Q, K, V) = softmax(QKᵀ / √dₖ) V Here: QKT يحدد الشبكة بين الأسئلة و الأسئلة √dk هو عامل التوسع الذي يثبت التدريب converts the scores into attention probabilities softmax V يوفر المعلومات التي يتم جمعها وفقًا لأحكام هذه الحالة. النتيجة هي ممثلة جديدة لكل تريند الذي يعكس . its meaning in the context of the entire sequence في هذه الحالة ، من المهم أن نذكر مفهوم مهم: . context length كما بحثنا سابقاً ، يتم معالجة التحويلات كل الترتيب في وقت واحد هذا ضروري لأن الاهتمام يتطلب مقارنة . every token with every other token وهذا يعني أن تكلفة الحاسوب تنمو with the number of tokens. quadratically إذا قمت بتضاعف طول السياق ، فإن كمية الحسابات تزيد حوالي أربع مرات. هذا هو واحد من القيود الرئيسية للمعدات التحويلية. Unlike some other architectures, transformers do not have a separate memory system. They can only “see” the tokens that fit within their context window. كل شيء خارج هذا النافذة هو غير مرئي على النموذج. This is why context length is such an important property of modern language models. In many modern AI systems, this limitation is addressed by adding an external memory mechanism. A common approach is to use a . vector database Instead of storing knowledge directly in the model, information can be stored externally as vector embeddings. When the model receives a question, the system can: تحويل المسألة إلى فيتامين. البحث في قاعدة بيانات المركبات للحصول على المعلومات ذات الصلة. Insert the retrieved information into the model’s context. وهذا يعني أن النموذج يرى كل منهما: السؤال and the relevant knowledge retrieved from the database Because both appear in the context window, the model can generate an answer based on that information. This technique is known as وتستخدم على نطاق واسع في أنظمة الذكاء الاصطناعي الحديثة ومركبات العميل. Retrieval-Augmented Generation (RAG) In this setup, the language model’s main role is not to store knowledge, but to generate coherent answers based on the information available in its context. But as we can see, this requires space in the context window, which is why context length remains so important. العودة إلى تطبيق Karpathy ، يستخدم النموذج ، وهو شكل تحسين من آلية الاهتمام الأساسية. multi-head attention بدلاً من حساب الاهتمام باستخدام مجموعة واحدة من الأقمار الصناعية Q، K، و V، يستخدم النموذج أغراض الاهتمام المتعددة. في هذا التطبيق، هناك أربعة رؤوس. كل رأس يتعلم التركيز على أنواع مختلفة من العلاقات بين العلامات، على سبيل المثال، قد يتركز رأس واحد على العلاقات التكليفية، في حين أن آخر قد يتلقى اتجاهات أطول. Using multiple heads improves the quality of the representation. To keep the computational cost roughly the same, the dimensionality of each head is reduced. Earlier, we mapped vectors from a . 16-dimensional space to another 16-dimensional space مع أربعة رؤوس الاهتمام ، يعمل كل رأسه في . The results from the heads are then combined back into a single vector. 4-dimensional space على الرغم من أن كل رأس يعمل مع المركبات الأقل متساوية ، فإن النتيجة المشتركة هي عادة أكثر تعبيرية وأكثر دقة من استخدام رأس الاهتمام واحد. Now that we have covered the attention mechanism, let’s move on to the second major component of the transformer block: the أو أو . MLP feed-forward neural network في الكود ، يبدو بلوك MLP مثل هذا: # 2) MLP block x_residual = x x = rmsnorm(x) x = linear(x, state_dict[f'layer{li}.mlp_fc1']) x = [xi.relu() for xi in x] x = linear(x, state_dict[f'layer{li}.mlp_fc2']) x = [a + b for a, b in zip(x, x_residual)] An MLP is a إذا نظرنا إلى هيكل الأقمار الصناعية، يمكننا تفسير صفات الأقمار الصناعية . classic neural network architecture neurons A neuron is a simple computational unit that: يزداد كل قدم على وزنها، sums the results, ثم يقوم بتطبيق وظيفة تشغيل غير خطية لإنتاج النتائج. وكانت هذه النماذج قد تم تأليفها في الأصل من قبل العلامات العصبية البيولوجية في الدماغ البشري.في هذا الصدد، كانت الشبكات العصبية مؤخراً محرجة من محاولات التعبير عن كيفية معالجة المعلومات في الدماغ. ومع ذلك، فإن أنظمة الذكاء الاصطناعي الحديث قد انتقلت بعيدًا عن هذه النماذج الأصلية. في جزء MLP ، لا تزال نستطيع أن نفهم شيئاً ما يشبه العضوية العصبية ، ولكن عندما نرى آليات مثل , it becomes much harder to maintain the brain-inspired interpretation. attention Because of this, it is often better to think of modern AI systems simply as , rather than literal models of the brain. trainable mathematical functions يتكون بلوك MLP في الكود من ثلاثة خطوات رئيسية: تحويل خطي (Matrix Multiplication) a (ReLU), nonlinear activation function تحويل خطير آخر. قد يبدو هذا بسيطًا، ولكن هيكلات مثل هذه لها خصائص الرياضية قوية للغاية. وهي معروفة بـ . تقارير عالمية تقارير عالمية وهذا يعني أنه في ظروف معينة، يمكن أن يكون MLP الكبيرة الكافية مقارنة to an arbitrary degree of accuracy. any mathematical function في النهاية ، يمكن أن يتعلم MLP كبير واحد تقريبا أي شيء. هذا هو السبب في أن الأكاديميات المتحركة تقوم بتجميع ميزات متعددة، بما في ذلك الاهتمام والمراكز المزدوجة، لتوزيع الحسابات بشكل أكثر فعالية. إن النموذج الحقيقي للاتصالات ليس واحدًا فقط، وإنما . probability distribution over all possible tokens وبعبارة أخرى، بالنسبة لكل نقطة تقييم في الكلمة، فإن النموذج يأتي من احتمال أن يظهر في الجانب التالي. During generation, the algorithm then samples from this probability distribution. This means that tokens with higher probability are more likely to be chosen, but there is still an element of randomness. يتم التحكم في هذه الحالة بمعدل يسمى . temperature The يحدد المقياس مدى قدرة نمو النماذج على الإبداع أو الإبداع. temperature درجة حرارة منخفضة - يفضل نموذجًا كبيرًا الأكسدة الأكثر احتمالًا، مما يخلق ردود فعل أكثر تقديرًا وأكثر دقة. درجة الحرارة العالية - يصبح توزيع احتمالية أسرع ، مما يسمح بتحديد التوقعات الأقل احتمالاً أكثر من مرة ، مما يؤدي إلى نتائج أكثر تنوعاً أو إبداعاً. For example: إذا أرادنا أن نموذج تحليل وثيقة ويجيب على أسئلة واقعية ، فإن درجة حرارة منخفضة عادة ما تكون مناسبة. إذا أردت من خلال النماذج إنتاج النص الإبداعي أو استكشاف الأفكار الجديدة، فإن درجة حرارة أعلى يمكن أن تؤدي إلى نتائج أكثر إثارة للاهتمام. هذا هو ما كنت أريد أن أشرح عن هذا قطعة من الكود الجميلة، و عن النماذج GPT بشكل عام. In many places, the explanation necessarily remained somewhat superficial. My goal was to strike a balance between two things: including as much useful insight as possible, while still keeping the discussion within the scope of a single article For readers who found parts of the explanation a bit unclear, or who want to explore the details more deeply, I highly recommend , his و و هناك ، سوف تجد مادة ممتازة تشرح كل ما تحتاجه لتفهم الكلمات المطروحة هنا بشكل كامل. Andrej Karpathy’s personal website قناة يوتيوب مدونته أتمنى أن يكون هذا المقال مفيدًا لعدد كبير من القراء، وإذا كان الأمر غير ذلك، فمن الممكن أن يخدمه كطلب لاستكشاف عالم الذكاء الاصطناعي الرائع.