Phase 19: Capstone Projects

المخطط التكراري

حلقة بحثية بدون خريط جدول هي صف مع الوهم. خريط جدول هو المكان الذي يقرر فيه الحلقة ما يجب التوقف عن استكشافه، وهذا القرار هو اللعبة بأكملها.

Type: Build

Languages: Python

Prerequisites: Phase 19 lessons 50-53

Time: ~90 minutes

أهداف التعلم

  • نموذج سير عمل البحث كمركز فرضية يغذى فتحات التجربة المتوازية التي تنتج نتائجها.
  • إنجاز تجارب متعددة بالتزامن مع Asyncio حتى يمكن للمجدول أن يبقي جميع الفتحات مشغولا.
  • تسجيل كل فرع فرضية مع UCB حتى يمكن للمخطط أن يحصن فروع منخفضة الإنتاج دون التخلي عن الاستكشاف.
  • ونشر النتائج النهائية إلى مرحلة كتابة ورقة ومرحلة ترتيب أخرى حتى تنتج فرع عالي الإنتاج فرضيات متابعة.
  • أظهر على السطح أثر التكرار مع نقاط الفرع، احتلال الفتحة، وقرارات القص.

لماذا المخطط وليس قائمة عمل

قائمة عمل مسطحة تعمل على الوظائف بالتسلسل في الترتيب. هذا جيد عندما تكون كل وظيفة مستقلة. البحث ليس مستقلًا: يغير نتائج التجربة الثالثة أولوية التجربة الرابعة والخامسة. يقوم المخطط الذي يقرأ المنتج المنتج ومع ذلك يعيد ترتيب الصف بأكثر عمل مفيد يتم القيام به لكل وحدة حساب.

اختيار التصميم المثير للاهتمام هو قاعدة تسجيل النقاط. يسعى المستحق الجشع دائمًا إلى اختيار الزعيم الحالي ولا يستكشف أبدًا. لا يستغل المستحق الجشع الموحد أبدًا. UCB (التي تُحدد الثقة العليا) هو الطريق الوسطى: استغل الزعيم مع احتياط القدرة على الفرع التي تم تجربتها أقل.

شكل النظام

flowchart LR
    Queue[Hypothesis queue] --> Sched[Scheduler]
    Sched --> Slot1[Slot 1]
    Sched --> Slot2[Slot 2]
    Sched --> Slot3[Slot 3]
    Slot1 --> Bus[Result bus]
    Slot2 --> Bus
    Slot3 --> Bus
    Bus --> Score[UCB scorer]
    Score --> Queue
    Bus --> Paper[Paper write fan-out]

يحتوي الصف على فرضيات. يختار المخطط الفرضية ذات أعلى مستوى من UCB عندما تفرغ فتحة. كل فتحة تعمل تجربة غير متزامنة. تجارب انتهت تنفجر نتيجة على الحافلة. يقوم الحافلة بتحديث إحصاءات UCB على الفرع الأصلي وتقوم بتحديث إصدار الفروع إلى مرحلة الكتابة الورقية عندما يتجاوز عواقب.

شكل الفرضية

flowchart TB
    Hyp[Hypothesis] --> Id[id]
    Hyp --> Branch[branch id]
    Hyp --> Payload[payload dict]
    Hyp --> Stats[runs and reward sum]
    Stats --> Runs[runs int]
    Stats --> Sum[reward sum float]

branchهو مفتاح إحصاءات UCB. قد تشارك فرضات متعددة فرعًا (الفرع هو اتجاه البحث؛ الفرضية هي تجربة واحدة داخلها). runsهو عدد التجارب التي تم الانتهاء منها لهذا الفروعreward_sumهو الجائزة المتراكمة.

تسجيلات UCB

الصيغة UCB المستخدمة في هذا الدروس هي UCB1 الكلاسيكية.

textucb(branch) = mean_reward(branch) + c * sqrt( ln(total_runs) / runs(branch) )

total_runsهو عدد جميع التجارب التي تم إنجازها عبر جميع الفروع.cهو وزن الاستكشاف ؛ الدروس غير متكاملة إلى sqrt(2)- فروع مع صفر من الرحلات تحصل+infفالأفروع التي لم يتم تجربتها يتم جدولةها أولاً دائماً. فروع ذات متوسط مرتفع من المكافآت تحتفظ بمعدل مرتفع حتى تتساوى الفروع الأخرى؛ فروع التي تعمل مرات عديدة دون مكافأة كبيرة يتم استغلاقها من قبل البدائل الأقل إدارة.

يُزيل البوابة التقطيعية عن المُختار. يُزيل التقطيع فرعًا من الجدول المُخطط للمستقبل عندما تنخفض متوسط مكافأته إلى أقل من مستوى مطلقاً (بالتعيين0.2) بعدprune_after_runsالمحاكمات (الديفال3هذا يبقي الصف محدوداً

فتحات متوازية مع asyncio

المخطط يقوم بتجربة معasyncio.create_taskكل مهمة تتم على طريق المدير التجريبيasync def(التي تعيد الـResultالحلقة الرئيسية تنتظر مجموعة من المهام أثناء الرحلة معasyncio.wait(..., return_when=asyncio.FIRST_COMPLETED)ويرسل تحديثات النتيجة في كل اكتمال

sequenceDiagram
    autonumber
    participant S as Scheduler
    participant Q as Hypothesis queue
    participant R as Experiment runner
    participant T as In-flight tasks
    S->>Q: pop highest UCB
    S->>R: create_task(run(hypothesis))
    R-->>T: Result (task completes)
    S->>T: await wait(FIRST_COMPLETED)
    S->>S: update UCB stats
    S->>Q: re-queue follow-ups

ثلاث فتحات تعمل بالتزامن. الحلقة الرئيسية لا تُحجب في تجربة واحدة. يبدأ المخطط بمواصلة بدء مهام جديدة بمجرد إطلاق فتحة، حتى يكون الصف فارغًا ولا تكون هناك مهام في الطيران.

التشغيل: محركات تشغيل الورق

عندما تتعرض الجائزة المتوسطة لفرعpaper_threshold(الوضع الافتراضي 0.7) ولم تنتج هذه الفرع ورقة بعد، ويعزف المخططpaper.triggerفي هذه الدروس يتم التقاط الزناد كقائمة حتى يمكن للاختبارات أن تؤكد ذلك.

التوسع: فرضيات متابعة

عندما يصل النتيجة عالية الإنتاجية ، يمكن للمخطط أن يطلب المستخدم المقدمة expanderلإنتاج فرضية متابعة واحدة أو أكثر على نفس الفرع.Resultإلىlist[Hypothesis]. الدروس ترسل مُوسعًا تحديديًا ينتج اثنين من المتابعات لأي نتيجة تتجاوز مكافأة عتبة الورق.

الميزانيات

ميزانيتين تحمي المخطط من حلقات الهرب

textmax_experiments    : total count of experiments run across all branches
max_seconds        : wall-clock cap (asyncio time)

عندما يطلق أي من هذه المهام، يتوقف المخطط عن جدولة المهام الجديدة، وينتظر المهام في الرحلة، ويرد البصمة النهائية.stop_reason. . .

التقرير النهائي

كل قرار في الجدول (التقاط، إرسال، النتيجة، التقطير، الترويج) ينشر حدثًا واحدًا. يجمع التقرير النهائي إحصاءات لكل فروع، والمسارات الإجمالية، والساعة الجدارية الإجمالية، والحركات التي تنفجر. يقرأ الدروس التالية، الظهور النهائي، هذا التقرير لدفع كاتب الورق.

كيفية قراءة الرمز

code/main.pyيحددHypothesis،Result،BranchStats،IterationSchedulerوmake_deterministic_runnerالمصنع الذي يعيد من يدير تجربة غير متوافقة مع مكافآت متوقعة.delay_ms(الوضع الافتراضي 5ms) لذلك يمكن ملاحظة التزامن.

code/tests/test_scheduler.pyتغطية: يختار UCB الفرع غير المختبرة أولاً، وموظف الفراغ المتوازي، ويقوم أجهزة الورق عند تجاوز العد، ويقوم بترقيع الفرع بعد التجارب ذات الأداء المنخفض، ويتم فرضيات متابعة متزايدة، ويتم الخروج من الميزانية (كلا من عدد التجربة و ساعة الجدار).

الذهاب إلى أبعد

ثلاثة تمديدات ستحتاجها تنفيذ حقيقي. أولاً، إحصاءات UCB المستمرة عبر الجلسات: الإحصاءات الحالية تعيش في الذاكرة؛ المخطط الحقيقي سوف يراقبها حتى إعادة البدء يحافظ على ميزانية الاستكشاف التي تم إنفاقها بالفعل. ثانياً، تسجيل النقاط متعددة الأهداف: بدلاً من مكافأة مستوى، كل نتيجة تنبعث عن متجه و UCB تصبح محركاً للاختيار في نمط باريتو. ثالثاً، القراصنة السياقية: ظروف الاختيار على ميزات الفرضية (الطول، التعقيد) لذلك الفرضيات المماثلة تشارك الاستكشاف.

المخطط هو المكان الذي يصبح فيه البحث أكثر من قائمة عمل. بمجرد أن يتم تشبيه UCB والمسارات تعمل بالتوازي، كل تحسين آخر يتكون في الأعلى.

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.