Chollet ML نشر 14 أغسطس 2021 أرسل تقرير نشر 14 أغسطس 2021 ماهي دالة التنشيط selu وكيف نقوم باستخدامها في كيراس Keras؟ اقتباس
1 Ahmed Sharshar نشر 14 أغسطس 2021 أرسل تقرير نشر 14 أغسطس 2021 (معدل) SELU هي دالة تنشيط لها الصيغة الرياضية: f(x) = { λ.x if x > 0 λ.α(exp(x)-1) if x < 0} حيث ان λ و α ثوابت عددية وتساوي تقريبا a ≈ 1.6732632423543772848170429916717 λ ≈ 1.0507009873554804934193349852946 وترسم بيانيا بالشكل التالي: تستطيع ان تلاحظ من الرسم تصرف الدالة، وهي تأخذ شكلا اسيا في القيم الاقل من الصفر بينما تتحول لتصبح خطية في القيم الاكبر من الصفر، وهي تشبه الددالة elu ، فقط باضافة بعض الثوابت. تلك الدالة ببساطه تقوم بعمل normalization، اي انها تقوم بطرح المتوسط من كل قيمة بعد ذلك تقسم على الانحراف المعياري، وبهذا فان المتوسط يصبح 0 والانحراف المعياري يصبح 1 للاوزان بعد عمل ال normalization وهذا يساعد في عملية التعلم ويجعلها اسهل. بالنسبة لمشتقتها فهي كالتالي: f(x) = { λ if x > 0 λ.α(exp(x)) if x < 0} ويمكن تمثيلها بيانيا بالشكل التالي: مميزاتها: بعد تطبيق ال 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')) تم التعديل في 14 أغسطس 2021 بواسطة Ahmed Sharshar اقتباس
1 Walid Kadded نشر 15 أغسطس 2021 أرسل تقرير نشر 15 أغسطس 2021 (معدل) الوحدة الخطية المتدرجة (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. تم التعديل في 15 أغسطس 2021 بواسطة Walid K اقتباس
1 Ali Haidar Ahmad نشر 15 أغسطس 2021 أرسل تقرير نشر 15 أغسطس 2021 (معدل) من أحدث دوال التنشيط، ظهرت حوالي عام 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. تم التعديل في 15 أغسطس 2021 بواسطة Ali Haidar Ahmad اقتباس
السؤال
Chollet ML
ماهي دالة التنشيط selu وكيف نقوم باستخدامها في كيراس Keras؟
3 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.