SiLU (Sigmoid Linear Unit)
تضرب SiLU، المعروفة أيضًا باسم Swish، المُدخل في قيمة سيغمويد الخاصة به لتنتج دالة تنشيط سلسة ذات بوابة ذاتية. يتناول الشرح رياضياتها ونشأتها ومقارنتها بـ ReLU.
وحدة الخطية السيغمويدية (SiLU) هي دالة تنشيط تُعرّف بالصيغة SiLU(x) = x · σ(x)، حيث σ هي دالة sigmoid. تمرّر المدخلات الموجبة الكبيرة من دون تغيير يُذكر، وتحول المدخلات السالبة الكبيرة إلى قيم تقارب الصفر، وتنحني بسلاسة بين الحالتين، لتصل إلى قيمة دنيا تبلغ نحو −0.278 عند x ≈ −1.278. وتماثل SiLU دالة Swish عندما β = 1، ويُستخدم الاسمان بالتبادل. وهي خيار افتراضي شائع في نماذج الرؤية الالتفافية، كما أنها تشغّل طبقات التغذية الأمامية في كثير من النماذج اللغوية الكبيرة (LLMs) داخل كتلة SwiGLU.
التعريف والخصائص#
تضرب SiLU كل مدخل في بوابة، σ(x)، تقع قيمتها بين 0 و1 وتُحسب من المدخل نفسه، ولذلك تُسمى ذاتية البوابة. مشتقتها هي σ(x) · (1 + x · (1 − σ(x)))، وتمنح هاتان الصيغتان SiLU أربع خصائص تميّز سلوكها أثناء التدريب عن ReLU:
- ناعمة في جميع المواضع: المنحنى ومشتقته متصلان، ولا يوجد انكسار عند الصفر؛ لذا تؤدي التغييرات الصغيرة في الأوزان إلى تغييرات صغيرة في الخرج، ما يجعلها مناسبة لـالانحدار المتدرج.
- تدرّج للمدخلات السالبة: تظل الوحدة التي يكون مدخلها سالبًا تتلقى تدرّجًا صغيرًا، فتستمر في التعلم. أما وحدات ReLU التي تبقى مدخلاتها سالبة فلا تتلقى أي تدرّج، وقد تتوقف عن التعلم نهائيًا؛ ويُعرف هذا الإخفاق باسم ReLU الميتة.
- غير رتيبة: ينخفض الخرج قليلًا كلما ارتفعت x من القيم السالبة الكبيرة إلى نحو −1.28، ثم يرتفع بعد ذلك، لذا فالدالة غير رتيبة.
- محدودة من الأسفل وغير محدودة من الأعلى: لا تنخفض المخرجات عن نحو −0.278، وتمر المدخلات الموجبة من دون تشبّع، كما في ReLU، ما يتجنب سلوك تلاشي التدرّج الذي يظهر مع sigmoid وtanh في الشبكات العميقة.
يقيّم الكود أدناه في PyTorch دالة SiLU وتدرّجات SiLU وReLU عند خمس نقاط.
import torch
import torch.nn.functional as F
x = torch.tensor([-4.0, -1.28, 0.0, 1.0, 4.0], requires_grad=True)
# SiLU(x) = x * sigmoid(x)، مقارنةً بـReLU على المدخلات نفسها
silu = F.silu(x)
relu = F.relu(x)
# تدرّج كل دالة تنشيط بالنسبة إلى مدخلها
silu_grad = torch.autograd.grad(silu.sum(), x)[0]
relu_grad = torch.autograd.grad(relu.sum(), x)[0]
print("SiLU output: ", [round(v, 4) for v in silu.tolist()])
print("SiLU gradient:", [round(v, 4) for v in silu_grad.tolist()])
print("ReLU gradient:", relu_grad.tolist())يطبع الكود مخرجات SiLU [-0.0719, -0.2785, 0.0, 0.7311, 3.9281]، وتدرّجات SiLU [-0.0527, -0.0003, 0.5, 0.9277, 1.0527]، وتدرّجات ReLU [0.0, 0.0, 0.0, 1.0, 1.0]. عند −4، تنتج ReLU القيمة 0 ولا تمرّر أي تدرّج، بينما تمرّر SiLU تدرّجًا مقداره −0.0527. وعند −1.28، تبلغ SiLU قيمتها الدنيا −0.2785 ويكون تدرّجها قريبًا جدًا من 0، وعند 4 يتجاوز تدرّجها 1 بقليل.
أصل التسمية#
أطلق Hendrycks وGimpel على x · σ(x) اسم وحدة الخطية السيغمويدية في ورقتهما لعام 2016 التي قدّمت GELU، حيث ظهرت بوصفها دالة شبيهة بـGELU قائمة على sigmoid، أداؤها أسوأ من GELU لكنه عادةً أفضل من ReLU وELU. ثم استخدم Elfwing وUchibe وDoya دالة SiLU لتقريب دوال الشبكات العصبية في التعلم المعزز عام 2017. وفي وقت لاحق من العام نفسه، أعاد باحثون في Google اكتشاف x · σ(βx) من خلال بحث آلي عن دوال التنشيط، وأطلقوا عليها اسم Swish، وأفادوا بأن استبدال ReLU بها رفع دقة المركز الأول على ImageNet بنسبة 0.9% في Mobile NASNet-A وبنسبة 0.6% في Inception-ResNet-v2. أضافت PyTorch الدالة nn.SiLU في الإصدار 1.7 بالاسم الأسبق.
SiLU مقارنةً بدوال التنشيط الأخرى#
- ReLU: تُعد max(0, x) أقل كلفة حسابية، وتنتج أصفارًا دقيقة، ولها تدرّج ثابت مقداره 1 للمدخلات الموجبة. وتضيف SiLU دالة sigmoid واحدة لكل عنصر مقابل النعومة والتدرّجات في الجانب السالب.
- GELU: x · Φ(x)، حيث Φ دالة التوزيع التراكمي للتوزيع الطبيعي المعياري. للمنحنيين الشكل نفسه، وتقارب SiLU المُقاسة x · σ(1.702x) دالة GELU بفارق لا يتجاوز نحو 0.02 في أي موضع. وتُعد GELU الخيار المعتاد في المحوّلات مثل BERT وViT، بينما تنتشر SiLU أكثر في الكواشف القائمة على CNN.
- Sigmoid: تحصر σ(x) وحدها المدخلات ضمن النطاق من 0 إلى 1، وتتشبّع عند الطرفين، لذا تُستخدم طبقة خرج للاحتمالات. أما SiLU فتستخدمها بوصفها بوابة فقط.
- Hard-Swish: x · ReLU6(x + 3) / 6، وهي تقريب لدالة SiLU قُدّم مع MobileNetV3، يستبدل بوابة sigmoid ببوابة خطية مقطعية، متجنبًا العملية الأسية في الأجهزة المحمولة.
- SwiGLU: وحدة خطية ذات بوابة تضرب SiLU(xW) عنصرًا بعنصر في إسقاط ثانٍ xV. وهي تشكّل كتلة التغذية الأمامية في LLaMA وكثير من النماذج اللغوية الكبيرة الأخرى.
مواضع استخدام SiLU#
تُستخدم SiLU، تحت اسم Swish، بوصفها دالة التنشيط في EfficientNet بأكمله، كما أنها شائعة في كواشف الأجسام الآنية الحديثة. تستخدم نماذج Ultralytics YOLO دالة SiLU منذ أن استبدل الإصدار 4.0 من YOLOv5 دالتي LeakyReLU وHardswish بها في يناير 2021، وفي YOLO26 تتألف كل كتلة Conv من التفاف وتطبيع الدفعات وSiLU.










