العودة إلى الرئيسية

لماذا لا تزال الوصلات المتبقية التي عمرها عقد من الزمن تدعم كل الذكاء الاصطناعي (ولماذا يمثل ذلك مشكلة)

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

القراءة الصوتية غير متاحة في هذا المتصفح
لماذا لا تزال الوصلات المتبقية التي عمرها عقد من الزمن تدعم كل الذكاء الاصطناعي (ولماذا يمثل ذلك مشكلة)

الوسوم

ملخص سريع

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

لماذا لا تزال الوصلات المتبقية التي عمرها عقد من الزمن تُشغّل كل الذكاء الاصطناعي (ولماذا هذه مشكلة)

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

المشكلة التي حلتّها الوصلات المتبقية

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

عالجت الوصلات المتبقية هذه المشكلة من خلال تقديم فكرة بسيطة لكنها أنيقة: السماح لمدخل الطبقة بتجاوز طبقة وسيطة واحدة أو أكثر وإضافته مباشرة إلى المخرج. رياضيًا، بدلاً من تعلم تخطيط مباشر \( H(x) \)، تتعلم الطبقة تخطيطًا متبقيًا \( F(x) = H(x) - x \)، بحيث يصبح المخرج \( F(x) + x \). تضمن وصلة التخطي هذه أن التدرجات يمكن أن تتدفق مباشرة عبر الشبكة أثناء الانتشار العكسي، مما يحافظ على قوة الإشارة حتى في الشبكات التي تحتوي على مئات الطبقات.

كان التأثير فوريًا. بنية ResNet من مايكروسوفت، التي قدمت الوصلات المتبقية، فازت في مسابقة ImageNet لعام 2015 بشبكة من 152 طبقة — أعمق بكثير من أي شيء كان ممكنًا في السابق. مكّن هذا الاختراق عصر التعلم العميق الذي تلا ذلك.

لماذا لا تزال الوصلات المتبقية في كل مكان

الوصلات المتبقية ليست من بقايا الماضي؛ إنها مكون أساسي في الذكاء الاصطناعي الحديث. إليك لماذا لا تزال منتشرة في كل مكان:

1. تُمكّن التدريب المستقر على نطاق واسع

تعتمد كل بنية رئيسية اليوم على الوصلات المتبقية لتحقيق الاستقرار في التحسين. في المحولات (العمود الفقري لنماذج مثل GPT وBERT وLlama)، كل طبقة فرعية من الانتباه والتغذية الأمامية مغلفة في وصلة متبقية تليها تطبيع طبقة. هذا التصميم، المعروف باسم Pre-LN (تطبيع ما قبل الطبقة)، تم تحسينه في الورقة الأصلية "الانتباه هو كل ما تحتاج إليه" ولا يزال معيارًا. وبالمثل، تستخدم نماذج الانتشار مثل Stable Diffusion كتلًا متبقية في هياكل U-Net الخاصة بها لتوليد صور عالية الدقة.

2. محايدة تجاه البنية

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

3. رخيصة حسابيًا

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

4. تتماشى مع الإلهام البيولوجي

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

التكاليف الخفية للانتشار في كل مكان

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

1. اختناقات الذاكرة وعرض النطاق

تتطلب الوصلات المتبقية تخزين التنشيطات الوسيطة للانتشار العكسي. في شبكة عميقة بمئات الطبقات، يمكن أن يستهلك هذا كميات هائلة من ذاكرة GPU. على سبيل المثال، تدريب نموذج بـ 175 مليار معامل مثل GPT-3 يتطلب تخزين التنشيطات لكل كتلة متبقية، مما يؤدي إلى بصمات ذاكرة تتجاوز ما يمكن لمعظم الأجهزة التعامل معه. تقنيات مثل نقطة تفتيش التدرج (تخزين مجموعة فرعية فقط من التنشيطات) تخفف جزئيًا من هذا، لكنها تضيف عبئًا حسابيًا.

2. عودة التدرجات المتلاشية في الشبكات العميقة للغاية

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

3. تشجع على الإفراط في التوسيع

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

4. هي عكاز، وليس حلاً

يجادل النقاد بأن الوصلات المتبقية أصبحت عكازًا يسمح للباحثين بتجنب مواجهة مشاكل بنيوية أعمق. بدلاً من تصميم شبكات تتعلم بكفاءة من الصفر، نعتمد على وصلات التخطي لترقيع عدم استقرار التدريب. أدى هذا إلى انتشار بنى "شبيهة بـ ResNet" هي تعديلات على التصميم الأصلي لعام 2015، بدلاً من كونها ابتكارات حقيقية.

تنفيذ عملي: بناء شبكة متبقية

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

المتطلبات

  • Python 3.8 أو أعلى
  • PyTorch 2.0 أو أعلى
  • GPU قادر على CUDA (اختياري، لكن موصى به للتدريب)

التثبيت خطوة بخطوة

أولاً، قم بتثبيت Python وإنشاء بيئة افتراضية لعزل التبعيات:

python3 -m venv resnet_env
source resnet_env/bin/activate

الآن قم بتثبيت PyTorch. قم بزيارة [pytorch.org](https://pytorch.org) للحصول على أحدث أمر لنظامك. على سبيل المثال، لـ CUDA 11.8:

pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118

قم بتثبيت المكتبات الإضافية:

pip install numpy matplotlib tqdm

أمثلة الاستخدام

أنشئ ملفًا باسم `residual_demo.py` بالكود التالي:

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
from tqdm import tqdm

# تعريف كتلة متبقية أساسية
class ResidualBlock(nn.Module):
    def __init__(self, in_channels, out_channels, stride=1):
        super(ResidualBlock, self).__init__()
        self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=stride, padding=1, bias=False)
        self.bn1 = nn.BatchNorm2d(out_channels)
        self.relu = nn.ReLU(inplace=True)
        self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=1, padding=1, bias=False)
        self.bn2 = nn.BatchNorm2d(out_channels)
        
        # وصلة التخطي: ضبط الأبعاد إذا لزم الأمر
        self.shortcut = nn.Sequential()
        if stride != 1 or in_channels != out_channels:
            self.shortcut = nn.Sequential(
                nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=stride, bias=False),
                nn.BatchNorm2d(out_channels)
            )
    
    def forward(self, x):
        out = self.relu(self.bn1(self.conv1(x)))
        out = self.bn2(self.conv2(out))
        out += self.shortcut(x)  # الوصلة المتبقية
        out = self.relu(out)
        return out

# بناء ResNet بسيط لـ CIFAR-10
class SimpleResNet(nn.Module):
    def __init__(self, num_classes=10):
        super(SimpleResNet, self).__init__()
        self.conv1 = nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1, bias=False)
        self.bn1 = nn.BatchNorm2d(16)
        self.relu = nn.ReLU(inplace=True)
        self.layer1 = self._make_layer(16, 16, 2, stride=1)
        self.layer2 = self._make_layer(16, 32, 2, stride=2)
        self.layer3 = self._make_layer(32, 64, 2, stride=2)
        self.avgpool = nn.AdaptiveAvgPool2d((1, 1))
        self.fc = nn.Linear(64, num_classes)
    
    def _make_layer(self, in_channels, out_channels, num_blocks, stride):
        layers = [ResidualBlock(in_channels, out_channels, stride)]
        for _ in range(1, num_blocks):
            layers.append(ResidualBlock(out_channels, out_channels, stride=1))
        return nn.Sequential(*layers)
    
    def forward(self, x):
        x = self.relu(self.bn1(self.conv1(x)))
        x = self.layer1(x)
        x = self.layer2(x)
        x = self.layer3(x)
        x = self.avgpool(x)
        x = torch.flatten(x, 1)
        x = self.fc(x)
        return x

# تحميل مجموعة بيانات CIFAR-10
transform = transforms.Compose([
    transforms.RandomHorizontalFlip(),
    transforms.RandomCrop(32, padding=4),
    transforms.ToTensor(),
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])

trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=128, shuffle=True, num_workers=2)

testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=128, shuffle=False, num_workers=2)

# تهيئة النموذج، دالة الخسارة، المحسن
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = SimpleResNet().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.1, momentum=0.9, weight_decay=5e-4)
scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)

# حلقة التدريب
num_epochs = 50
for epoch in range(num_epochs):
    model.train()
    running_loss = 0.0
    for inputs, labels in tqdm(trainloader, desc=f'Epoch {epoch+1}/{num_epochs}'):
        inputs, labels = inputs.to(device), labels.to(device)
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()
        running_loss += loss.item()
    
    scheduler.step()
    print(f'Epoch {epoch+1} Loss: {running_loss/len(trainloader):.4f}')

# التقييم
model.eval()
correct = 0
total = 0
with torch.no_grad():
    for inputs, labels in testloader:
        inputs, labels = inputs.to(device), labels.to(device)
        outputs = model(inputs)
        _, predicted = torch.max(outputs, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print(f'Test Accuracy: {100 * correct / total:.2f}%')

قم بتشغيل السكريبت:

python residual_demo.py

سيقوم هذا بتدريب ResNet صغير على CIFAR-10، مما يوضح كيف تمكن الوصلات المتبقية التدريب المستقر لشبكة من 10 طبقات. لاحظ أنه حتى مع هذا التنفيذ البسيط، يتقارب النموذج بشكل موثوق — نتيجة مباشرة لوصلات التخطي.

لماذا هذه مشكلة للمستقبل

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

علاوة على ذلك، قد تؤدي هيمنة الوصلات المتبقية إلى خنق الابتكار. يتردد الباحثون في اقتراح بنى لا تتضمن وصلات تخطي، لأنها تُعتبر أساسية لاستقرار التدريب. هذا يخلق "حدًا أدنى محليًا" في فضاء التصميم — نحن نُحسّن ضمن النموذج المتبقي بدلاً من استكشاف بدائل مثل "الالتفافات العميقة" أو "الانتباه الخطي" أو "نماذج فضاء الحالة" (والتي، ومن المفارقات، تستخدم أيضًا وصلات متبقية في تطبيقاتها).

بدائل في الأفق

تظهر عدة بدائل واعدة، على الرغم من أن أياً منها لم يحل محل الوصلات المتبقية بعد:

  • **الشبكات الخالية من المطبع (NFNet)**: تزيل NFNet من DeepMind تطبيع الدفعة والوصلات المتبقية باستخدام تهيئة مقيّسة بعناية ووظائف تنشيط. تحقق دقة تنافسية على ImageNet بدون وصلات تخطي.
  • **نماذج التوازن العميق (DEQ)**: تعالج هذه الشبكة كنظام نقطة ثابتة، مما يلغي الحاجة إلى كتل متبقية صريحة عن طريق تكرار طبقة واحدة حتى التوازن.
  • **نماذج فضاء الحالة (SSM)**: تستخدم بنى مثل Mamba التكرار الخطي بدلاً من الانتباه، مما يزيل الحاجة إلى وصلات متبقية في الطبقة الفرعية للانتباه. ومع ذلك، لا تزال تستخدم وصلات تخطي في أجزاء أخرى.

تظل هذه الأساليب متخصصة، ويرجع ذلك إلى حد كبير إلى أن الوصلات المتبقية مفهومة جيدًا وسهلة التنفيذ.

الخاتمة

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

في الوقت الحالي، تظل الوصلات المتبقية العمود الفقري للذكاء الاصطناعي — لكن الشقوق بدأت في الظهور. قد لا يأتي الاختراق التالي من جعل الوصلات المتبقية أفضل، بل من تعلم بناء شبكات لا تحتاج إليها على الإطلاق.

المصادر

أسئلة شائعة

عن ماذا يتحدث هذا المقال؟

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

لمن يفيد هذا المقال؟

يفيد القراء المهتمين بفهم أدوات وتقنيات الذكاء الاصطناعي بطريقة عملية وواضحة.

ما الخطوة التالية؟

اقرأ المقال كاملاً، راجع المصادر المرفقة، ثم جرّب الأفكار المناسبة لاحتياجك بحذر.