إسماعيل بن علا

MyTorcha

إطار عمل للتعلم العميق مبني من الصفر

التعلم العميق · مارس 2024 · مكتمل

إطار عمل للتعلم العميق أُعيد بناؤه من المبادئ الأولى: من الاشتقاق التلقائي إلى LSTM والانتباه، مع فحص كل تدرّج.

التقنياتPythonNumPypytestPyTorch

MyTorcha — نظرة عامة

نظرة عامة

أطر العمل مثل PyTorch تختزل تدريب الشبكة في استدعاء واحد، وهو ما يخفي أيضًا كيفية عملها. MyTorcha يزيل هذه الطبقة: كل تدرّج (gradient) هو شيفرة كتبتها بنفسي واختبار يتحقق منها، وNumPy هي التبعية الوحيدة.

بدأ المشروع كمحرّك اشتقاق تلقائي (autograd) عددي، حيث كل رقم هو عقدة في رسم بياني حسابي. تلك النسخة محفوظة كفصل تعليمي. وهي أيضًا سبب ظهور محرّك ثانٍ في الإطار: طبقة واحدة من 784 إلى 10 تبني 31,427 عقدة عددية لكل صورة. محرّك الموتّرات (Tensor) يطبّق قاعدة السلسلة نفسها على مصفوفات كاملة، وهو ما يجعل النماذج الالتفافية والتكرارية ونماذج الانتباه عملية على المعالج المركزي.

إعادة البناء عنت أولًا اختبار النسخة الأصلية. كشفت فحوص الفروق المحدودة أخطاء حقيقية في الإصدار v1: مشتق لدالة log خاطئ بمعامل يقارب 3، وعُقد تتساوى بحسب القيمة فتُدمج بصمت أثناء الانتشار العكسي، وحالة محسِّن مشتركة بين كل الأوزان. كل واحد منها صار الآن اختبار انحدار (regression test).

السؤال

هل أفهم التعلم العميق فهمًا كافيًا لإعادة بناء إطار عمل كامل، من الاشتقاق التلقائي إلى LSTM والانتباه، تتطابق تدرّجاته مع تدرّجات PyTorch؟

أهم الميزات

كيف يعمل

  1. كل عملية تسجّل مدخلاتها

    تحسب العملية مصفوفة خرجها وتخزّن دالة تحوّل تدرّج الخرج إلى تدرّج واحد لكل مدخل.

  2. backward() تجتاز الرسم البياني

    ترتيب طوبولوجي تكراري يرتّب الرسم البياني؛ وتتدفق التدرّجات في الاتجاه المعاكس وتُجمع مجددًا فوق أبعاد البثّ.

  3. الطبقات وحدات (Modules)

    تعثر الوحدة Module على معلماتها Parameters باجتياز خصائصها، لذلك فإن شبكة CNN أو LSTM ليست سوى Python عادي مركَّب من قطع مختبَرة.

  4. فحص مزدوج

    تُقارَن كل قاعدة انتشار عكسي مع الفروق المحدودة بدقة float64، ويُقارَن التمرير الأمامي والعكسي لكل طبقة مع نظيريهما في PyTorch.

أمثلة

المدخل

cnn = nn.Sequential(nn.Conv2d(1, 8, 3, padding=1), nn.BatchNorm2d(8), nn.ReLU(), nn.MaxPool2d(2), ..., nn.Linear(784, 10)); mt.Trainer(cnn, nn.CrossEntropyLoss(), optim.Adam(cnn.parameters(), lr=2e-3)).fit(train_loader, epochs=3, val_loader=val_loader)

المخرج

Validation accuracy 94.35%, 96.70%, 97.10% over 3 epochs (9,146 parameters; an MLP with 101,770 parameters reaches 93.65%).

examples/03_digits_mlp_vs_cnn.py على 10k صورة تدريب و2k صورة تحقق من ملف CSV لأرقام Kaggle.

المدخل

model = CharLSTM(vocab); 300 Adam steps on a short text

المخرج

step 0: 'the dbveclgk stmap,sed d ahylb...' -> step 100: 'the chain rule walks that memory backwards.'

examples/05_char_lstm.py: نموذج لغوي من Embedding + LSTM مدرَّب من الصفر.

التقنيات المستخدمة

ما تعلمته

الحدود