• 0

دالة التنشيط selu واستخدامها في كيراس Keras

ماهي دالة التنشيط selu  وكيف نقوم باستخدامها في كيراس Keras؟

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 1

SELU هي دالة تنشيط لها الصيغة الرياضية:

f(x) = { λ.x   if x > 0
	λ.α(exp(x)-1) if x < 0}

حيث ان λ و α ثوابت عددية وتساوي تقريبا 

a ≈ 1.6732632423543772848170429916717
 
λ ≈ 1.0507009873554804934193349852946

وترسم بيانيا بالشكل التالي:

relu--7--1.thumb.png.f95727101da07655d168a222797074f6.png

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

تلك الدالة ببساطه تقوم بعمل normalization، اي انها تقوم بطرح المتوسط من كل قيمة بعد ذلك تقسم على الانحراف المعياري، وبهذا فان المتوسط يصبح 0 والانحراف المعياري يصبح 1 للاوزان  بعد عمل ال normalization وهذا يساعد في عملية التعلم ويجعلها اسهل.

بالنسبة لمشتقتها فهي كالتالي:

f(x) = { λ  if x > 0
	λ.α(exp(x)) if x < 0}

ويمكن تمثيلها بيانيا بالشكل التالي:

relu--6-.thumb.png.24e7ff4e7aa30d3141f904ee1dbd0382.png

مميزاتها:

  • بعد تطبيق ال normalization فان هذا يجعل عملية التعلم اسرع بكثير مقارنه بعدم استخدامها.
  • لا يمكن ان يحدث اي مشكلة اثناء عملية التعلم.

العيوب:

  • تعتبر جديدة نسبيا لذا ليس لها دعم كبير في الاكواد حتى الان

اما عن استخدامها في Keras فيمكنك استخدامها تماما كاي دالة تنشيط اخرى كالتالي:

num_classes = 10  
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(64, kernel_initializer='lecun_normal',
                                activation='selu'))
model.add(tf.keras.layers.Dense(32, kernel_initializer='lecun_normal',
                                activation='selu'))
model.add(tf.keras.layers.Dense(16, kernel_initializer='lecun_normal',
                                activation='selu'))
model.add(tf.keras.layers.Dense(num_classes, activation='softmax'))

 

تمّ تعديل بواسطة Ahmed Sharshar

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 1

الوحدة الخطية المتدرجة (SELU) Exponential Linear Unit

دالة التنشيط SELU هي نوع آخر من ReLU. حيث  أنه إذا قمت ببناء شبكة عصبية تتكون حصريًا من مجموعة من الطبقات الكثيفة dense layers ، وإذا كانت جميع الطبقات المخفية تستخدم دالة تنشيط SELU ، فستقوم الشبكة ب self-normalize . سوف يميل ناتج كل طبقة إلى الحفاظ على المتوسط 0 والانحراف المعياري 1 أثناء التدريب ، مما يحل مشكلة التدرجات المتلاشية / المتفجرة. (exploding gradients)

غالبًا ما تتفوق دالة التنشيط هذه على دوال التنشيط الأخرى بشكل كبير.

 

يتم تعريف SELU على النحو التالي:

f(x) = scale * x                 , z > 0
     = scale * α * (exp(x) - 1)   , z <= 0

حيث  "α" و "scale"  ثوابت معرّفة مسبقًا
 

α = 1.67326324 

scale = 1.05070098

لاستخدام SELU مع Keras و TensorFlow 2 ، ما عليك سوى تعيين  ' activation= 'selu و 'kernel_initializer='lecun_normal

from tensorflow.keras.layers import Dense

Dense(10, activation='selu', kernel_initializer='lecun_normal')

 هناك بعض الشروط لكي تعمل SELU بشكل جيد:

  • تعمل SELU فقط مع الشبكات العصبية التي تتكون حصريًا من مجموعة من الطبقات الكثيفة dense layers. و قد لا تعمل مع الشبكات العصبية التلافيفية CNN بشكل جيد.
  • يجب أيضًا تهيئة أوزان كل طبقة مخفية باستخدام LeCun normal initialization.
  • يجب توحيد ال Input features بمتوسط 0 وانحراف معياري 1.
تمّ تعديل بواسطة Walid K

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 1

من أحدث دوال التنشيط، ظهرت حوالي عام 2017، مع 90 صفحة من البراهين، ,وهي معقدة إلى حد ما مقارنة بباقي دوال التنشيط، شكلها العام كما يلي (يمكنك الإطلاع على شكلها البياني في الإجابة المقدمة من Ahmed Sharshar -البيان الأول-) :

if x > 0: return scale * x
if x < 0: return scale * alpha * (exp(x) - 1)
# بحيث 
# alpha=1.67326324
# scale=1.05070098

إذا كانت قيمة الإدخال x أكبر من الصفر ، فإن قيمة المخرجات تصبح x مضروبة في lambda λ  أو scale.أما إذا كانت قيمة الإدخال x أصغر أو تساوي الصفر، يتشكل لدينا منحني على طول المحور السالب بحيث يرتفع إلى 0 عندما يكون x صفر. بشكل أساسي. وهذا مايعطي الدالة القدر على التعلم وبشكل فعال من أجل أي دخل. شيئ آخر جدير بالذكر عن هذه الدالة هو أنها تقوم بعملية normalization إلى حد ما للبيانات (كما أشار Ahmed Sharshar). ويشار لها بأنها تحقق مبدأ "self-normalizing neural networks". وهذا مايعطي الشبكة سرعة أكبر. (في الرابط في الأسفل شرح لل Batch normlaization).
عند التحدث عن أي دالة تنشيط فإن أهم ماتريده هو المشتقات، فهي محور عملية التعلم والتدريب، هذه الدالة على محورها الموجب مطابقة لدالة elu إلا أنها تضيف عليها تحسيناً وهو ضربها بمعامل scale (أو يشار له بلمدا وقيمته حصراً أكبر من واحد) والغاية من ذلك جعل الميل أكبر من 1 وبذلك تجعل قيمة المشتق على هذا المجال دوماً أكبر من واحد وهذا يجعل عملية التعلم أسرع. وعلى المحور السالب تكون قيم المشتق كما في الرسم البياني الثاني في إجابة Ahmed Sharshar وبالتالي قابلية للتعلم على المحور السالب أيضاً وبكفاءة. هذا يجعلها تحل كل المشاكل التي تعاني منها بقية توابع التنشيط (في الرابط في الأسفل تجد دالة ال elu وكل مايتعلق بهذه المشاكل).  لكن مشكلتها أنه لم يصدر أي أوراق بحثية فيما إذا كانت جيدة للتطبيق مع الشبكات العصبية المتكررة RNNs و التلاففية CNNs.
في كيراس تجدها في الموديول التالي:

tf.keras.activations.selu(x)

ولاستخدامها أثناء تدريب نماذجك يمكنك تمريرها للطبقة بإحدى الطرق في المثال التالي:

model = Sequential()
model.add(Embedding(10000, 8, input_length=maxlen))
model.add(Flatten())
model.add(Dense(64, activation='selu'))# بهذه الطريقة
"""
أو 
from tensorflow.keras import activations
model.add(Dense(64, activation=activations.elu,kernel_initializer='lecun_normal'))
أو بالشكل التالي
model.add(Dense(64,kernel_initializer='lecun_normal'))
model.add(Activation(activations.selu )) # أو model.add(Activation("selu"))

lecun_normal ومن الضروري تهيئة الأوزان في الطبقة التي تستخدم فيها هذه الدالة بالتوزيع 
"""
model.add(Dense(1, activation='sigmoid')) 
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])
model.summary()

وطبعاً توحيد ال Input features بمتوسط 0 وانحراف معياري 1 يكون مضمون من خلال قيمتي ألف و لمدا (هذه القيم تم اختيارها مسبقاً) ومن خلال استخدام المهيئ المناسب وهو lecun_normal.

تمّ تعديل بواسطة Ali Haidar Ahmad

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن