لماذا يحدث هذا؟ يعتقد النموذج أن هناك رمزا تعبيريا لفرس البحر ، بالتأكيد ، ولكن لماذا يجعله يخرج رمزا تعبيريا * مختلفا*؟ إليك دليل من أداة التفسير المفضلة لدى الجميع ، Logit Lens! في عدسة Logit ، نستخدم lm_head النموذج بطريقة غريبة. عادة ، يتم استخدام lm_head لتحويل المتبقي (الحالة الداخلية المبنية على طبقات النموذج) إلى مجموعة من احتمالات الرمز المميز بعد الطبقة النهائية. ولكن في Logit Lens ، نستخدم lm_head بعد * كل * طبقة - يوضح لنا الرموز المميزة التي سيخرجها النموذج إذا كانت هذه الطبقة هي الطبقة النهائية. بالنسبة للطبقات المبكرة ، ينتج عن هذا حالات يصعب تفسيرها. ولكن بينما نتحرك عبر الطبقات ، يقوم النموذج بشكل متكرر بتنقيح المتبقية أولا نحو المفاهيم المفيدة لمواصلة النص ، ثم نحو التنبؤ النهائي. بالنظر إلى الصورة مرة أخرى ، في الطبقة النهائية ، لدينا الإخراج الفعلي للنموذج - ĠðŁ ، IJ ، ł - المعروف أيضا باسم ، بادئة بايت الرموز التعبيرية متبوعة ببقية الرموز التعبيرية للأسماك. (يبدو وكأنه هراء Unicode بسبب نزوة الترميز - لا تقلق بشأن ذلك. إذا كنت فضوليا ، فاسأل كلود عن هذا السطر من التعليمات البرمجية: 'bytes([byte_decoder[c] for c in 'ĠðŁIJł']).decode('utf-8') == ' 🐠 '') لكن انظر إلى ما يحدث في الطبقات الوسطى - لا نحصل فقط على بايت الرموز التعبيرية! نحصل على تلك * المفاهيم * ، وتحديدا مفهوم فرس البحر. على سبيل المثال ، في الطبقة 52 ، نحصل على "حصان البحر". في وقت لاحق ، في top-k ، نحصل على مزيج من "البحر" و "الحصان" وبادئة الرموز التعبيرية هذه ، "ĠðŁ". إذن ما الذي يفكر فيه النموذج؟ فرس البحر + الرموز التعبيرية! إنها تحاول إنشاء تمثيل متبقي لرمز تعبيري لفرس البحر. لماذا تفعل ذلك؟ حسنا ، دعونا نلقي نظرة على كيفية عمل lm_head بالفعل. lm_head عبارة عن مصفوفة ضخمة من المتجهات ذات الحجم المتبقي المرتبطة بمعرفات الرمز المميز. عندما يتم تمرير المتبقي إليه ، فإنه سيقارن هذا المتبقي مع كل متجه رمز مميز ، وبالتنسيق مع جهاز أخذ العينات ، حدد معرف الرمز المميز مع متجه يشبه إلى حد كبير المتبقي. (من الناحية الفنية: إنها طبقة خطية بدون تحيز ، لذا فإن v @ w.T يقوم بعمل منتجات نقطية مع كل متجه غير مضمن ، ثم log_softmax و argmax / عينة درجة الحرارة.) لذلك إذا أراد النموذج إخراج كلمة "Hello" ، فإنه يحتاج إلى إنشاء متجه مشابه للمتجه لرمز الإخراج "Hello" الذي يمكن أن يتحول lm_head إلى معرف Hello Token. وإذا أراد النموذج إخراج رمز تعبيري لفرس البحر ، فإنه يحتاج إلى إنشاء بقايا مشابهة للمتجه لرمز (رموز) إخراج رمز تعبيري لفرس البحر - والتي يمكن أن تكون من الناحية النظرية أي قيمة تعسفية ، ولكن من الناحية العملية هو Seahorse + emoji ، أسلوب word2vec. المشكلة الوحيدة هي أن الرموز التعبيرية لفرس البحر غير موجودة! لذلك عندما يصل بقايا فرس البحر + الرموز التعبيرية المتبقية إلى lm_head ، فإنه يقوم بمنتج النقطة الخاص به على جميع المتجهات ، ويختار جهاز أخذ العينات أقرب رمز مميز - رمز تعبيري للسمكة. الآن ، هذا التفرقة هو معلومات قيمة! يمكنك أن ترى في مثال الهدنة أنه عندما يتم وضع الرمز المميز مرة أخرى في السياق بشكل انحدار تلقائي ، يمكن للنموذج معرفة أنه ليس رمزا تعبيريا لفرس البحر. لذلك يحاول مرة أخرى ، يهز المتبقي ويحصل على رمز تعبيري مختلف قليلا ، ويشطف ويكرر حتى يدرك ما يحدث أو يستسلم أو ينفد من رموز الإخراج. ولكن حتى يحصل النموذج على رمز الإخراج الخاطئ من lm_head ، فإنه لا يعرف أنه لا يوجد رمز تعبيري لفرس البحر في lm_head. يفترض أن Seahorse + emoji سينتج الرمز (الرموز المميزة) التي يريدها. ------------------ للتكهن (أكثر) ، أتساءل عما إذا كان هذا جزءا من فائدة RL - فهو يعطي النماذج معلومات حول lm_head يصعب الوصول إليها لأنها في نهاية مكدس الطبقات. (تذكر أن النماذج الأساسية لا يتم تدريبها على مخرجاتها / عمليات الطرح الخاصة بها - وهذا يحدث فقط في RL.)