Neural Architecture Search (NAS)
يؤتمت البحث عن البنى العصبية (NAS) تصميم الشبكات العصبية عبر البحث في الطبقات والروابط. تعرّف على الأساليب والتكاليف الحاسوبية والنماذج المبنية باستخدام NAS.
البحث عن البنية العصبية (NAS) هو فرع من التعلم الآلي المؤتمت (AutoML)، تتمثل مهمته في تصميم بنية شبكة عصبية تلقائيًا. فبدلًا من أن يختار المهندس يدويًا الالتفاف وأنواع الطبقات الأخرى وأعماق الشبكة وعروضها ووصلاتها، تقترح خوارزمية البحث بنيات مرشحة، وتقدّر أداء كل بنية في المهمة، ثم تستخدم النتائج لاقتراح بنيات أفضل. وعادةً ما يكون الهدف هو الدقة، وغالبًا ما تُوازَن الدقة بتكلفة مثل زمن استجابة الاستدلال، أو عدد المعلمات، أو FLOPs على العتاد المستهدف. وفي مجال الرؤية الحاسوبية، أنتج NAS عدة هياكل أساسية شائعة الاستخدام، منها EfficientNet وMobileNetV3.
آلية عمل NAS#
يصنف استعراض في مجلة أبحاث التعلم الآلي أساليب NAS وفق ثلاثة أبعاد:
- فضاء البحث: مجموعة البنى الممكن بناؤها، مثل أنواع العمليات وأحجام النوى ووصلات التخطي المسموح بها وكيفية ربطها. تبحث أساليب كثيرة عن خلية صغيرة متكررة وتكدس نسخًا منها، ما يقلص الفضاء ويتيح نقل خلية عُثر عليها في مجموعة بيانات صغيرة إلى مجموعة كبيرة.
- استراتيجية البحث: الخوارزمية التي تختار النماذج المرشحة المراد تجربتها، بدءًا من متحكمات التعلم بالتعزيز والتطور، وصولًا إلى الأساليب القائمة على التدرج وأخذ العينات العشوائي البسيط.
- استراتيجية تقدير الأداء: طريقة تقييم نموذج مرشح دون تدريبه كاملًا، باستخدام عدد أقل من حقب التدريب أو صور ومجموعات بيانات أصغر أو تنبؤات بالدقة النهائية أو أوزان مشتركة بين النماذج المرشحة.
من آلاف أيام GPU إلى ساعات#
كانت عمليات NAS المبكرة مكلفة لأن كل نموذج مرشح كان يُدرّب حتى التقارب. في دراسة Zoph وLe لعام 2016، أنشأ متحكم تكراري مدرّب باستخدام التعلم بالتعزيز الشبكات، وأُجري البحث على 800 وحدة GPU في آن واحد، واستخدمت متابعة NASNet نحو 500 وحدة GPU لأربعة أيام للعثور على خلية في CIFAR-10 أمكن نقلها إلى ImageNet. وحققت AmoebaNet نتائج مشابهة باستخدام التطور المنظَّم بكلفة نحو 3,150 يومًا من GPU. وخفّض ENAS البحث إلى أقل من 16 ساعة على وحدة GPU واحدة عبر مشاركة أوزان النموذج بين جميع النماذج المرشحة، التي يعاملها بوصفها رسومًا فرعية لشبكة كبيرة واحدة، بينما خفف DARTS الاختيار المتقطع للعمليات إلى أوزان مستمرة، بحيث أمكن تحسين البنية نفسها باستخدام الانحدار المتدرج في بضعة أيام من GPU. كما خففت المقارنة المعيارية من حماسة المجال: إذ حقق البحث العشوائي مع الإيقاف المبكر أداءً لا يقل عن ENAS على معياري Penn Treebank وCIFAR-10.
NAS المراعي للعتاد والنماذج المبنية باستخدام NAS#
كان أكبر أثر عملي لـNAS في النماذج الفعالة الخاصة بـالذكاء الاصطناعي الطرفي، حيث يجب الموازنة بين الدقة والسرعة على جهاز محدد. أدرج MnasNet زمن الاستجابة المقاس على هواتف فعلية ضمن هدف البحث، وحقق دقة 75.2% من الفئة الأولى على ImageNet خلال 78 مللي ثانية على هاتف Pixel، أي أسرع بمقدار 1.8 مرة من MobileNetV2 وبدقة أعلى بنسبة 0.5%. ونشأ EfficientNet-B0 من بحث مشابه، ثم وُسّع إلى عائلة B1-B7 باستخدام التحجيم المركب، كما جمع MobileNetV3 بين NAS المراعي للعتاد وخوارزمية NetAdapt لضبطه لوحدات CPU المحمولة. وفي اكتشاف الكائنات، تعمل نماذج YOLO-NAS من Deci، التي عُثر عليها بمحرك البحث AutoNAC وصُممت لتقليل خسارة الدقة بعد تكميم INT8، ضمن حزمة Ultralytics عبر الفئة NAS للاستدلال والتحقق والتصدير، لا للتدريب. واستحوذت NVIDIA لاحقًا على Deci، ولم يعد فريقها الأصلي يحدّث النماذج.
مثال مبسط على NAS#
ينفذ المثال التالي أبسط استراتيجيات البحث، وهي أخذ العينات العشوائي، على فضاء بحث صغير لشبكات الإدراك متعددة الطبقات باستخدام مجموعة صور الأرقام المكتوبة يدويًا في scikit-learn. يُدرَّب كل نموذج مرشح 30 حقبة فقط كتقدير منخفض الكلفة للأداء، ثم يُقيَّم على بيانات التحقق:
import random
import warnings
from sklearn.datasets import load_digits
from sklearn.exceptions import ConvergenceWarning
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
warnings.simplefilter("ignore", ConvergenceWarning) # short training runs are the cheap estimate
X, y = load_digits(return_X_y=True)
X_train, X_val, y_train, y_val = train_test_split(X / 16, y, random_state=0)
# Search space: 1-3 hidden layers, each 8-128 units wide. Search strategy: 12 random samples
random.seed(0)
space = [8, 16, 32, 64, 128]
candidates = {tuple(random.choices(space, k=random.randint(1, 3))) for _ in range(12)}
# Performance estimation: train each candidate for only 30 epochs, then score it on validation data
scores = {}
for layers in candidates:
model = MLPClassifier(hidden_layer_sizes=layers, max_iter=30, random_state=0)
scores[layers] = model.fit(X_train, y_train).score(X_val, y_val)
worst, best = min(scores, key=scores.get), max(scores, key=scores.get)
print(f"{len(scores)} architectures: worst {worst} {scores[worst]:.3f}, best {best} {scores[best]:.3f}")تنتج العينات الـ12 عشر بنيات متميزة، وتتراوح دقة التحقق لديها من 0.398 لطبقتين تحوي كل منهما 8 وحدات إلى 0.978 لطبقات تضم 128 و128 و16 وحدة، لذا يغير اختيار البنية وحده الدقة بنحو 60 نقطة. وفي تشغيل NAS كامل، يُعاد تدريب البنية الفائزة حتى التقارب، ثم تُعلن درجتها على مجموعة اختبار منفصلة.
NAS مقارنةً بالمصطلحات ذات الصلة#
- ضبط المعلمات الفائقة: يحسّن إعدادات التدريب، مثل معدل التعلّم، لبنية ثابتة. أما NAS فيتعامل مع البنية نفسها بوصفها المتغير، وغالبًا ما تُنفَّذ العمليتان معًا.
- تقليص النموذج وتقطير المعرفة: يقلّصان شبكة موجودة أو يحاكيانها بعد التدريب، بينما يبحث NAS عن تصميم فعال قبل التدريب.
- التعلّم بالنقل: يعيد استخدام الأوزان التي تعلّمها نموذج مدرّب مسبقًا. ويحدد NAS البنية التي ستُملأ بهذه الأوزان، كما أن الشبكات التي يعثر عليها NAS، مثل EfficientNet، هي نفسها أُطر أساسية شائعة مدرّبة مسبقًا.










