مجموعة بيانات مع علامات مع نافذة تنزلق
Type: Build
Languages: Python
Prerequisites: Phase 04 lessons, Phase 07 transformer lessons, Lesson 30 of this phase
Time: ~90 minutes
أهداف التعلم
- حول الجسم الخام إلى سلسلة من الهويات الوهمية عن طريق الاتصال بـ "التوكينيزر" مرة واحدة.
- قطع تيار الهوية في نوافذ ذات الطول الثابت مع خطوة قابلة للتشكيل.
- بناء مجموعة بيانات PyTorch التي تعيد المدخلات والهدف التنسورات للتنبؤ التوجيهية القادمة.
- لف مجموعة البيانات في DataLoader مع مزيج تحديدية زرع لكل عصر.
- سبب التنازل بين التقدم والكفالة وحجم مجموعة البيانات الفعالة.
الإطار
يقرأ دورة ما قبل التدريب مجموعة واحدة من أوراق الهوية التجريبية في وقت واحد ويحديث النموذج. يتم تحديد شكل كل مجموعة من خلال عقد التدريب. بالنسبة لنموذج لغة السببية، فإن اللعبة تحمل (B, T)هويات المدخلات و (B, T)الهدف هو إدخال المعلومات المتحول من جانب واحد. مهمة خط البيانات هي إنتاج هذا العقد على الطلب، بطريقة تحديدية ويمكن إعادة إنتاجها، من مجموعة قد تكون عدة جيجا بايت من النص الخام.
هذه الدروس تبني خط الأنابيب. يحول الوهم من الدروس السابقة النص إلى قائمة طويلة مسطحة من الهويات. ينقسم نافذة زائفة تلك القائمة إلى أمثلة تدريبية. يعرض مجموعة بيانات مخصصة الأمثلة كمتخديرات. يقوم DataLoader بتجميعها ويتم خلطها مع بذرة معروفة.
عقد الشكل
المعدل المسببي يستهلك أوراق الشكل(B, T)أينBهو حجم اللحظة و Tهو طول السياق. الهدف في الموقف tهو المدخل في الموقفt+1هذا يعني أن كل مثال للتدريب يغطيT+1المعلومات الخامة. خطوات النافذة تحكم كمية التداخل بين الأمثلة المتتالية.
flowchart LR
A[raw corpus text] --> B[tokenizer.encode]
B --> C[flat list of ids]
C --> D[sliding window slicer]
D --> E[(id_window_0)]
D --> F[(id_window_1)]
D --> G[(id_window_n)]
E --> H[PyTorch Dataset]
F --> H
G --> H
H --> I[DataLoader with seeded shuffle]
I --> J[batches of B x T+1 ids]
J --> K[split into input and target]لا تتداخل قطعة القصص مع حدود الجسم إذا لم يكن لدى النافذة الأخيرة ما يكفي من الهويات لملءهاT+1المواقع، القاطع يرميه.<|pad|>هذا أيضاً خيار صالح لكنه يزيد تعقيداً في قناع الخسارة
لماذا نافذة زلقة
إنّ جسم التدريب هو سلسلة طويلة من المعلومات. إذا كان النموذج يرى فقط نوافذ غير متداخلة، فإنّ كل مثال تدريب سيُعلّم نفسهTحدود. تعديل الخطوة يُحرك تلك الحدود حولها بحيث يرى النموذج مهام أكثر تنوعاً
خطوة منTيُنتج نافذة غير متداخلة.T // 2يُنتج التداخل بنسبة 50% ويضاعف مجموعة البيانات الفعالة.1يُنتجُ التداخلُ القصوى ويزيدُ مجموعةِ البياناتِ بِعَاملِ Tتكلفة أكثر حساباً لكل عصر. الفائدة هي تنوع الحدود. معظم الجولات التي تتم قبل التدريب تستخدم خطوة تساوي طول السياق لأن الجسم أكبر بكثير من ما يمكن أن ينهي النموذج في عصر واحد ، لذلك يكون حججة تنوع الحدود أضعف.
فئة مجموعة البيانات
مجموعة بيانات PyTorch لديها طريقتين مطلوبتين. __len__يعيد عدد الأمثلة. __getitem__يعود مثال واحد كزوج من العجلات. مجموعة بياناتنا تخزين تيار id المشفر والخطوة. تحسب إندكسها بداية النافذة على الفور بحيث تكلفة الذاكرة هي نسخة واحدة من تيار id بغض النظر عن عدد الأمثلة التي تنتج الخطوة.
sequenceDiagram
participant Trainer
participant DataLoader
participant Dataset
participant Tokenizer
Trainer->>DataLoader: iter(dataloader)
DataLoader->>Dataset: __len__
DataLoader->>Dataset: __getitem__(i)
Dataset->>Dataset: window = ids[start:start+T+1]
Dataset->>DataLoader: (input_ids, target_ids)
DataLoader->>Trainer: batch (B,T) input, (B,T) target
Note over Tokenizer,Dataset: tokenizer.encode runs once at build timeالتحول الواحد يحدث بالداخل__getitem__. مجموعة البيانات تعود(input, target)أينinput = window[:-1]وtarget = window[1:]كلاهما هو "بيتورش" طويل الجهاز، ويعالجهم حلقة التدريب على أنها حقيقة الأرض
التشويش القياسي
جهاز تحميل بيانات مع shuffle=Trueيقرأ من مولد بيتورش عشوائي.torch.Generatorفي كل مرة يتم إعادة تشغيل الدورة، نحصل على نفس التشويش كل مرة يتم إعادة تشغيل الدورة. هذه الملكية مهمة عندما تريد مقارنة اثنين من الدورات التي تختلف فقط في مادة واحدة. بدون بذرة، الدورين ترى البيانات في ترتيبات مختلفة وعوالي الخسارة تختلف لأسباب غير مرتبطة بالتغيير.
العقد في هذه الدروس بسيطepoch_seed = base_seed + epoch_indexيتم نقل البذور الأساسية عند البناء. يتم زيادة مؤشر العصر من قبل المدرب في أعلى كل عصر. إعادة التدريب مع نفس البذور الأساسية ترى دائما نفس الترتيب في كل عصر.
عينة العينات
الاختيار الافتراضي في PyTorch يختار المؤشرات بشكل متساوي بشكل عشوائي مع تعطيل استبدال. هذا ما نريده للتدريب المسبق. للتحسينات الدقيقة على مجموعة بيانات صغيرة العقد هو نفسه. يقوم DataLoader بتجميع مجموعة عن طريق الاتصال __getitem__ Bلأن كل مثال هو نفس الطول من خلال البناء، لا حاجة إلى منطق التشغيل.
الدرس لا يزالnum_workers=0في عملية إنتاجية يوازي العمال__getitem__مع خط أنابيبنا هذا هو في الغالب بدون عملية لأن العمل هو مجرد شريحة من الجهاز التنسوري في الذاكرة، ولكن نفس مجموعة بيانات API يدعم العمال نظيفة.
أمثلة العد
لـ (د) سلسلة طول N، طول السياقTو خطوةS، عدد الأمثلة هو max(0, 1 + (N - (T + 1)) // S). يضع الدروس هذا الحساب كطريقة ثابتة على مجموعة البيانات حتى يستطيع المدرب حساب إجمالي الخطوات لكل عصر دون تكرار.
ما لا يفعله هذا الدروس
لا يتدفق من القرص. يتم تشفير الجسم بالكامل في الذاكرة ويحتفظ كمتضغوط واحد. بالنسبة لجسم يضم بضع ملايين من الهويات التي هي أقل بكثير من مائة ميغابايت وهي الشكل المناسب للدرس. التدفق على القرص هو مصدر قلق منفصل يضبط من خلال استبدال التخزين لكنه يبقى عقد مجموعة البيانات.
لا يتعامل مع العديد من الوثائق. يتم التعامل مع الجسم كمتدفق واحد متواصل. يتم تشفير الحدود التالية للوثيقة عن طريق إدخال <|endoftext|>عندما يتم بناء الجسم من العديد من الوثائق، يتعلم النموذج التنبؤ حول الحدود.
كيفية قراءة الرمز
main.pyيحدد فئتين ومساعد واحدSlidingWindowDatasetهو مجموعة بيانات PyTorch. make_dataloaderيعيد جهاز DataLoader المثبت مع مولد بذرة. _encode_corpus_to_idsهو مكالمة tokenizer واحدة. التجربة في الأسفل تبني tokenizer صغير في العملية، وتشفير مجموعة متكاملة، وبناء مجموعة البيانات والمدفوعة، طباعة مجموعة واحدة، وتؤكد عقد الشكل.code/tests/test_dataset.pyقم بتحديد صيغة عدد النوافذ، خاصية التحول بمقدار واحد، التشويش المحدد، والتبادل الدوري.
إشغلي التجربة، ثم قم بتغيير طول السياق من 16 إلى 32 وشاهد كيف ينخفض عدد الأمثلة لكل عصر. هذا الرقم هو ميزانيتك خطوة لكل عصر.
This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.
Browse the complete course catalog or open this lesson on GitHub.