مينGPT-TF
إعادة تنفيذ TensorFlow لـ mingpt
دفاتر الملاحظات
تم تدريب play_math.ipynb
و play_char.ipynb
على colab. توجد الروابط أعلى كل دفتر ملاحظات لتدريب النموذج على colab. تم تقليل batch_size
الكمبيوتر المحمول play_char.ipynb
ليناسب ذاكرة GPU
بـ colab. قم بتغيير المعلمات وفقًا لذاكرة GPU.
مينغبت-الملف التمهيدي
إعادة تنفيذ PyTorch لتدريب GPT. يحاول minGPT أن يكون صغيرًا ونظيفًا وقابلاً للتفسير وتعليميًا، نظرًا لأن معظم البرامج المتاحة حاليًا مترامية الأطراف بعض الشيء. GPT ليس نموذجًا معقدًا وهذا التنفيذ يتكون بشكل مناسب من حوالي 300 سطر من التعليمات البرمجية، بما في ذلك النمط المعياري ووحدة الاهتمام الذاتي السببية المخصصة غير الضرورية تمامًا. على أية حال، كل ما يحدث هو أن سلسلة من المؤشرات تدخل في سلسلة من كتل المحولات، ويخرج التوزيع الاحتمالي للمؤشر التالي. بقية التعقيد هو مجرد ذكاء في التجميع (سواء عبر الأمثلة أو عبر طول التسلسل) بحيث يكون التدريب فعالاً.
"مكتبة" minGPT الأساسية (hah) عبارة عن ملفين: mingpt/model.py
يحتوي على تعريف نموذج المحول الفعلي و mingpt/trainer.py
عبارة عن لوحة PyTorch النموذجية (المستقلة عن GPT) التي تدرب النموذج. تُظهر دفاتر ملاحظات Jupyter المرفقة كيف يمكن استخدام "المكتبة" (hah) لتدريب نماذج التسلسل:
- يقوم
play_math.ipynb
بتدريب GPT الذي يركز على الجمع (مستوحى من قسم الإضافة في ورقة GPT-3) - يقوم
play_char.ipynb
بتدريب GPT ليكون نموذج لغة على مستوى الأحرف على نص عشوائي، مشابه لـ char-rnn الأقدم ولكن باستخدام محول بدلاً من RNN -
play_words.ipynb
إصدار BPE غير موجود بعد
باستخدام برنامج التشفير bpe والتدريب الموزع وربما fp16، قد يكون هذا التنفيذ قادرًا على إعادة إنتاج نتائج GPT-1/GPT-2، على الرغم من أنني لم أجرب $$$. من المحتمل أن يكون GPT-3 بعيد المنال لأن ما أفهمه هو أنه لا يتناسب مع ذاكرة وحدة معالجة الرسومات ويتطلب معالجة أكثر دقة للنموذج الموازي.
استخدام المثال
هذا الرمز بسيط بما فيه الكفاية للاختراق فقط، وليس "مستخدمًا"، ولكن واجهة برمجة التطبيقات الحالية تبدو كما يلي:
# you're on your own to define a class that returns individual examples as PyTorch LongTensors
from torch . utils . data import Dataset
train_dataset = MyDataset (...)
test_dataset = MyDataset (...)
# construct a GPT model
from mingpt . model import GPT , GPTConfig
mconf = GPTConfig ( vocab_size , block_size , n_layer = 12 , n_head = 12 , n_embd = 768 ) # a GPT-1
model = GPT ( mconf )
# construct a trainer
from mingpt . trainer import Trainer , TrainerConfig
tconf = TrainerConfig ( max_epochs = 10 , batch_size = 256 )
trainer = Trainer ( model , train_dataset , test_dataset , tconf )
trainer . train ()
# (... enjoy the show for a while... )
# sample from the model (the [None, ...] and [0] are to push/pop a needed dummy batch dimension)
from mingpt . utils import sample
x = torch . tensor ([ 1 , 2 , 3 ], dtype = torch . long )[ None , ...] # context conditioning
y = sample ( model , x , steps = 30 , temperature = 1.0 , sample = True , top_k = 5 )[ 0 ]
print ( y ) # our model filled in the integer sequence with 30 additional likely integers
مراجع
شفرة:
- يحتوي openai/gpt-2 على النموذج ولكن ليس على رمز التدريب، وهو موجود في TensorFlow
- يحتوي openai/image-gpt على بعض التعديلات الحديثة مثل gpt-3 في الكود الخاص به، وهو مرجع جيد أيضًا
- Huggingface/Transformers لديه مثال لنمذجة اللغة. إنها كاملة المواصفات ولكن نتيجة لذلك يصعب تتبعها إلى حد ما. على سبيل المثال، تحتوي بعض الوظائف الكبيرة على ما يصل إلى 90% من التعليمات البرمجية غير المستخدمة خلف العديد من البيانات المتفرعة غير المستخدمة في الإعداد الافتراضي لنمذجة اللغة البسيطة.
الأوراق + بعض الملاحظات التنفيذية:
تحسين فهم اللغة من خلال التدريب المسبق التوليدي (GPT-1)
- نموذجنا يتبع إلى حد كبير عمل المحولات الأصلية
- لقد قمنا بتدريب محول مكون من 12 طبقة لوحدة فك التشفير فقط مع رؤوس مقنعة للانتباه الذاتي (768 حالة أبعاد و12 رأس انتباه). بالنسبة لشبكات التغذية الأمامية ذات الموقع الحكيم، استخدمنا 3072 حالة داخلية ذات أبعاد.
- آدم ماكس معدل التعلم 2.5e-4. (يستخدم GPT-3 لاحقًا لحجم النموذج هذا 6e-4)
- تسوس LR: زاد خطيًا من الصفر خلال تحديثات عام 2000 الأولى وتم صلبه إلى 0 باستخدام جدول جيب التمام
- نحن نتدرب لمدة 100 حقبة على دفعات صغيرة مكونة من 64 عينة عشوائية ومتسلسلة متجاورة مكونة من 512 رمزًا.
- نظرًا لاستخدام معيار الطبقة على نطاق واسع في جميع أنحاء النموذج، كانت تهيئة الوزن البسيطة لـ N(0, 0.02) كافية
- مفردات ترميز البايت (BPE) مع 40.000 عملية دمج
- المتبقية، والتضمين، والمتسربين من الاهتمام بمعدل 0.1 للتسوية.
- نسخة معدلة من تسوية L2 المقترحة في (37)، مع w = 0.01 على جميع الأوزان غير المتحيزة أو المكتسبه
- بالنسبة لوظيفة التنشيط، استخدمنا وحدة الخطأ الخطي الغوسية (GELU).
- استخدمنا تضمينات الموضع المستفادة بدلاً من النسخة الجيبية المقترحة في العمل الأصلي
- للضبط الدقيق: نضيف التسرب إلى المصنف بمعدل 0.1. معدل التعلم 6.25e-5 وحجم الدفعة 32.3 حقبة. نحن نستخدم جدول تناقص معدل التعلم الخطي مع إحماء يزيد عن 0.2% من التدريب. تم ضبط π على 0.5.
- نموذج GPT-1 مكون من 12 طبقة وd_model 768، ~117M معلمات
نماذج اللغة هي متعلمون متعددو المهام غير خاضعين للرقابة (GPT-2)
- تم نقل LayerNorm إلى مدخلات كل كتلة فرعية، على غرار الشبكة المتبقية قبل التنشيط
- تمت إضافة تطبيع طبقة إضافية بعد كتلة الاهتمام الذاتي النهائية.
- يتم استخدام التهيئة المعدلة التي تمثل التراكم على المسار المتبقي بعمق النموذج. نقوم بقياس أوزان الطبقات المتبقية عند التهيئة بعامل 1/√N حيث N هو عدد الطبقات المتبقية. (غريب لأنه في الكود الذي تم إصداره، لا يمكنني العثور إلا على استخدام بسيط لـ 0.02 القديم... في إصدارهم لـ image-gpt وجدت أنه يستخدم لـ c_proj، وحتى ذلك الحين فقط من أجل الاهتمام، وليس لـ mlp.huh. https: //github.com/openai/image-gpt/blob/master/src/model.py)
- يتم توسيع المفردات إلى 50257
- زيادة حجم السياق من 512 إلى 1024 رمزًا
- يتم استخدام حجم دفعة أكبر من 512
- استخدم GPT-2 48 طبقة وd_model 1600 (مقابل 12 طبقة أصلية وd_model 768). ~1.542B معلمات
نماذج اللغة هي عدد قليل من المتعلمين (GPT-3)
- GPT-3: 96 طبقة، 96 رأسًا، مع d_model يبلغ 12,288 (175B معلمات).
- شبيه GPT-1: 12 طبقة، 12 رأسًا، d_model 768 (125M)
- نحن نستخدم نفس النموذج والهندسة المعمارية مثل GPT-2، بما في ذلك التهيئة المعدلة والتطبيع المسبق والترميز القابل للعكس الموصوف فيه
- نحن نستخدم أنماط انتباه متناثرة كثيفة ونطاقات محلية متناوبة في طبقات المحول، على غرار المحول المتناثر
- لدينا دائمًا طبقة التغذية الأمامية أكبر بأربعة أضعاف من حجم طبقة عنق الزجاجة، dff = 4 ∗ dmodel
- تستخدم جميع النماذج نافذة سياق nctx = 2048 رمزًا.
- آدم مع β1 = 0.9، β2 = 0.95، وeps = 10−8
- تستخدم جميع النماذج تحلل الوزن بمقدار 0.1 لتوفير قدر صغير من التنظيم. (ملاحظة: GPT-1 استخدم 0.01 على ما أعتقد، انظر أعلاه)
- قص المعيار العالمي للتدرج عند 1.0
- إحماء خطي LR على أول 375 مليون رمز. ثم استخدم اضمحلال جيب التمام لخفض معدل التعلم إلى 10% من قيمته، أي أكثر من 260 مليار رمز.
- قم بزيادة حجم الدفعة تدريجيًا خطيًا من قيمة صغيرة (32 ألف رمز مميز) إلى القيمة الكاملة خلال أول 4-12 مليار رمز مميز للتدريب، اعتمادًا على حجم النموذج.
- يتم دائمًا استخدام نافذة سياق زمنية كاملة بحجم 2048، مع محدد رمزي خاص لنهاية المستند
رخصة
معهد ماساتشوستس للتكنولوجيا