Chollet ML نشر 12 أغسطس 2021 أرسل تقرير نشر 12 أغسطس 2021 ماهي دالة التنشيط softplus في كيراس Keras وكيف نستخدمها؟ وما هو الفرق بينها وبين دوال التنشيط الأخرى؟ اقتباس
1 Ahmed Sharshar نشر 12 أغسطس 2021 أرسل تقرير نشر 12 أغسطس 2021 (معدل) softplus هي دالة تنشيط تتميز بسهولة اجراء عملية التفاضل الخاصة بها، وهي على الصيغة الرياضية التالي: f(x) = ln(1+e^x) وتمثل بيانيا بالشكل التالي: ويتضح منها ان المجال الخاص بها هو 0 الى موجب ما لانهاية ، فهي تجعل القيم الاقل من الصفر = 0 بينما القيم الاكبر من الصفر تتصاعد بشكل مستقيم. وبالنسبة لتفاضلها فهو على الشكل التالي: e^x / (1+e^x) أو 1 / (1 + e^-x) وتاخذ الشكل البياني التالي: ويمكنك ان تلاحظ ان مشتقة تلك الدالة هي نفسها مشتقة الدالة sigmoid ، في النهاية هما نفس الدالة لكن بصيغ مختلفة في البداية، لهذا فهي ليست مستخدمة بشدة نظرا لاستخدام sigmoid والتي تؤدي نفس المهمة، لقراءه المزيد عن sigmoid يمكنك قراءه الاجابات في السؤال التالي: اقتباس يمكنك استخدامها في keras كالمثال التالي: >>> a = tf.constant([-20, -1.0, 0.0, 1.0, 20], dtype = tf.float32) >>> b = tf.keras.activations.softplus(a) >>> b.numpy() array([2.0611537e-09, 3.1326166e-01, 6.9314718e-01, 1.3132616e+00, 2.0000000e+01], dtype=float32) وفي بناء النماذج، يمكنك استخدامها كالتالي: from keras.models import Sequential from keras.layers import Flatten, Dense model = Sequential() model.add(Embedding(10000, 8, input_length=maxlen)) model.add(Flatten()) model.add(Dense(1, activation='softplus')) model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc']) model.summary() history = model.fit(x_train, y_train, epochs=10, batch_size=32, validation_split=0.2) تم التعديل في 12 أغسطس 2021 بواسطة Ahmed Sharshar اقتباس
1 Ali Haidar Ahmad نشر 12 أغسطس 2021 أرسل تقرير نشر 12 أغسطس 2021 هذه الدالة لها الشكل التالي: Softplus function: f(x) = ln(1+ex) # أو بشكل برمجي أوضح softplus(x) = log(exp(x) + 1) الآن لوعرضنا الرسم البياني لهذا التابع سنجد أنه بالشكل التالي: سنناقش هذه الدالة في حالتين: الأولى على المجال من 0 ل ∞- وهنا نجد أن قيمة الدالة تتناهى لل 0 كلما ابتعدنا عن ال 0 لقيم الدخل، وبالتالي سنجد أنها تسلك نفس سلوك دالة السيني من جهة، ومن جهة أخرى نجد أنها تشبه لحد ما دالة ال ReLU لكنها (أنعم) فدالة ال Relu مباشرة تصبح 0 من أجل القيم السالبة (وهذا مايجعلها تفقد بعض المعلومات-العيب الرئيسي لدالة الريلو-) أما دالة السوفت بلس فتأخذ مسار منحني قبل أن تصبح 0. وهذا مايوضحه الشكل التالي: الحالة الثانية من أجل القيم الموجبة، أي ضمن المجال 0 ل ∞+ نجد أنه هنا يمكن الفرق الجوهري بينها وبين السيني رغم أن بدايتها تشبهه، حيث أننا نجد أن قيم التابع مستمرة باتجاه اللانهاية ولاتتقارب عند القيمة 1 كما في السيني من جهة، ومن جهة أخرى نلاحظ أنها نسخة أنعم من دالة الريلو حيث أن دالة الريلو تأخذ شكل خطي على هذا المجال بينما السوفت تأخذ مسار غير خطي. الآن نذهب للناحية الأهم وهي الاشتقاق وهو مايهمنا في عملية الانتشار الخلفي وتحديث الأوزان. حسناً، هذه الدالة بينها وبين دالة السيني علاقة قوية وهي أن مشتق دالة ال softplus هو دالة السيني. dy/dx = 1 / (1 + e-x) هذا يعني أن قيم مشتقاتها ستكون ملائمة جداً لعملية التعلم، وهي تتفوق على السيني في هذا الأمر (السيني يعاني جداً من تلاشي المشتقات عند القيم الكبيرة للدخل وهذا مايعيق عملية التعلم). وتتفوق على relu من ناحية التعلم من القيم السلبة للدخل فالريلو تعطي قيمة 0 للمشتق من أجل القيم السلبة بينما تعطي سوفتبلس قيمة (حتى ولو أنها صغيرة). لكن relu أفضل منها في القسم الموجب للدخل لأن مشتقها دوماُ يكون 1. بينما السوفت تتدرج من 0 ل 1 حسب قيم الدخل (عملياً قيم z). في كيراس لها الشكل التالي: tf.keras.activations.softplus(x) مثال: import tensorflow as tf a = tf.constant([-20, -1.0, 0.0, 1.0, 20], dtype = tf.float32) b = tf.keras.activations.softplus(a) b.numpy() """ array([2.0611537e-09, 3.1326169e-01, 6.9314718e-01, 1.3132616e+00, 2.0000000e+01], dtype=float32) """ ويمكنك استخدامه في الطبقات الخفية لنموذجك (لاتستخدمه مع طبقة الخرج)، انظر للمثال التالي الذي سأوضح فيه كيفية استخدامه بكل الطرق: from keras.datasets import imdb from keras import preprocessing max_features = 10000 maxlen = 20 (x_train, y_train), (x_test, y_test) = imdb.load_data( num_words=max_features) x_train = preprocessing.sequence.pad_sequences(x_train, maxlen=maxlen) # هنا حددنا طول الكلمات ب 20 x_test = preprocessing.sequence.pad_sequences(x_test, maxlen=maxlen) # بناء نموذجك from keras.models import Sequential from keras.layers import Flatten, Dense,Embedding model = Sequential() model.add(Embedding(10000, 8, input_length=maxlen)) model.add(Flatten()) model.add(Dense(64, activation='softplus'))# بهذه الطريقة """ أو from tensorflow.keras import activations model.add(Dense(64, activation=activations.softplus)) أو بالشكل التالي model.add(Dense(64)) model.add(Activation(activations.softplus)) # أو model.add(Activation("softplus")) """ model.add(Dense(1, activation='sigmoid')) model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc']) model.summary() # تدريبه history = model.fit(x_train, y_train, epochs=10, batch_size=32, validation_split=0.2) اقتباس
السؤال
Chollet ML
ماهي دالة التنشيط softplus في كيراس Keras وكيف نستخدمها؟ وما هو الفرق بينها وبين دوال التنشيط الأخرى؟
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.