اذهب إلى المحتوى

السؤال

Recommended Posts

  • 1
نشر

هذه الدالة لها الشكل التالي:

Softplus function: f(x) = ln(1+ex)
# أو بشكل برمجي أوضح
softplus(x) = log(exp(x) + 1)

الآن لوعرضنا الرسم البياني لهذا التابع سنجد أنه بالشكل التالي:Softplus.png.6f84bb8439a2264b900406cf1e7c029b.png

سنناقش هذه الدالة في حالتين: الأولى على المجال من 0 ل  ∞-  وهنا نجد أن قيمة الدالة تتناهى لل 0 كلما ابتعدنا عن ال 0 لقيم الدخل، وبالتالي سنجد  أنها تسلك نفس سلوك دالة السيني من جهة، ومن جهة أخرى نجد أنها تشبه لحد ما دالة ال ReLU لكنها (أنعم) فدالة ال Relu مباشرة تصبح  0 من أجل القيم السالبة (وهذا مايجعلها تفقد بعض المعلومات-العيب الرئيسي لدالة الريلو-) أما دالة السوفت بلس فتأخذ مسار منحني قبل أن تصبح 0. وهذا مايوضحه الشكل التالي:
61157cb776899_RELUvsSplus.png.21931ae480999ab86ea5fb3430367f0a.png
الحالة الثانية من أجل القيم الموجبة، أي ضمن المجال 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)

 

  • 1
نشر (معدل)

softplus هي دالة تنشيط تتميز بسهولة اجراء عملية التفاضل الخاصة بها، وهي على الصيغة الرياضية التالي:

f(x) = ln(1+e^x)

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

activation-softplus.png.fcf32ec9785f34ead31f4b471bbae5d8.png

ويتضح منها ان المجال الخاص بها هو 0 الى موجب ما لانهاية ، فهي تجعل القيم الاقل من الصفر = 0 بينما القيم الاكبر من الصفر تتصاعد بشكل مستقيم.

وبالنسبة لتفاضلها فهو على الشكل التالي:

e^x / (1+e^x)
أو 
1 / (1 + e^-x)

وتاخذ الشكل البياني التالي:

sigmoid-function.png.17b611991a2e15451c5fabc549d41da2.png

ويمكنك ان تلاحظ ان مشتقة تلك الدالة هي نفسها مشتقة الدالة 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)

 

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

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...