• 0

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

أريد توضيح لدالة التنشيط softsign وكيف نستخدمها في كيراس Keras؟

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


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

هي دالة تنشيط تستخدم مع الشبكات العصبية وتعطي خرجاً ضمن المجال 1 ل -1. ولها الشكل التالي:

softsign(x) = x / (abs(x) + 1).

حسناً هذه الدالة مرتبطة ارتباطاً وثيقاً بدالة tanh لذا أنصح أولاً بقراءة مافي الرابط التالي:

فهذه الدالة جاءت بغاية تطوير أو تحسين دالة ال tanh بغية منع الخلايا من الوصول لحالة ((التشبع)) بسرعة. أي بمعنى آخر منع الخلايا من الوصول لحالة عدم القدرة على تعلم أي معلومات جديدة. الآن تأمل الرسم البياني التالي، حيث أن الخط الأزرق يمثل دالة ال tanh واللون البرتقالي يمثل مشتقها واللون الأحمر هو دالة ال softsign والأخضر مشتقها.
Untitled.png.fbd860c09a00b8701770efc197487751.png

كما تلاحظ فإن دالة التانش تتقارب بشكل سريع من المقارب الأفقي (القيمة y=1 و y=-1) حيث أنها تتقارب منهم بشكل أسي، وهذا مايؤثر سلباً على قيم المشتق حيث أن ميل المماس يصبح أفقياً بسرعة كبيرة مع زيادة قيم ال x وهذا مايعني أن قيم المشتقة تنخفض وهذا مايعني أن عملية التعلم تتباطأ أسياً حتى تنعدم تقريباً في حالة استمرار تزايد قيمة قيم الدخل وهذا مانسميه بحالة (التشبع) أي أن الخلايا لم تعد قاردة على التعلم من البيانات أكثر من ذلك وهذا واضح جداً من الرسم جانباً حيث أن دالة المشتق للتانش تتقارب سريعاً من الصفر. الآن لو نظراً لدالة السوفت فإن أول أمر يمكننا ملاحظته هو أن دالة السوفت كما يشير اسمها هي دالة أنعممم والمقصود هنا أن دالة المشتق لها تتقارب ولكنها لاتنعتدم بسرعة كما في ال tanh وبالتالي منع الخلايا من التشبع. وهي الميزة الوحيدة لها مقارنة بال tanh أما على الجانب الآخر فنجد أن قيم المشتق للتانش أكبر ضمن مجال الدخل من -1 ل 1 وهذا أفضل لعملية التعلم. وفي كيراس يمكننا أن نجدها ضمن الموديول التالي:

tf.keras.activations.softsign(x)

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

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

"""
model.add(Dense(1, activation='sigmoid')) 
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])
model.summary()

 

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


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

دالة Softsign هي دالة تنشيط تقوم بإعادة تعيين القيم بين -1 و 1 من خلال تطبيق عتبة threshold تمامًا مثل دالة sigmoid. الميزة فيها أن قيمة softsign  هي صفر في مركزها ، اي ان نقطة الاصل لديها هي 0 مما يساعد الطبقة العصبية التالية أثناء عملية propagating.

وتعبر عنها رياضيا بالصيغة التالية:

f(x) = x / (1 + |x|)

وتمثل مشتقتها بالصيغة التالية:

dy/dx = 1 / (1 + |x|)^2

ويمكن تمثيل الدالة ومشتقتها كما هو موضح في الشكل التالي:

softsign-and-derivative.png.9bc73205adb5a9c0a2d42b772b6bac24.png

ويمكنك اختبارها بالكود كالتالي:

import tensorflow as tf
input_tensor = tf.constant([-1.5, 9.0, 11.0], dtype = tf.float32)
gen_output = tf.keras.activations.softsign(input_tensor)
gen_output.numpy()

output
>>> array([-0.6 , 0.9 , 0.9166667] , dtype=float32)

على الرغم من التشابة الملحوظ بينها وبين دالة tanh ، الا ان هناك اختلاف بينهما، الاختلاف الأساسي هو أن وظيفةالدالة tanh تتقارب أسيًا، اي تشبة الدوال الاسية. في حالة الدالة Softsign ، فإنها تتقارب مع دوال كثيرة الحدود. وهذا الخط الرفيع  بين الدالتين  يخلق فرقًا كبيرًا بين الحالتين وحالات الاستخدام الخاصة بكل منهما بهما.

ورغم ذلك فان دالة relu تعد افضل واكثر استخداما من softsign لانها ابسط وتاخذ وقتا اقل في الحسابات منهاوايضا تعد افضل في الحسابات المعقدة التي توجد في طبقات التعلم العميق.

ويمكنك استخدامها في  keras تماما مثل اي دالة تنشيط اخري كالتالي:

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='softsign')) 
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

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


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

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

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

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


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

تسجيل الدخول

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


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