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

دالة التنشيط sigmoid

Meezo ML

السؤال

Recommended Posts

  • 1

يعتبر هذا التابع تابع لوجيستي "logistic function" وهو تابع غير خطي، الشكل الرياضي له:

g=sigmoid(x) = 1 / (1 + exp(-x)).

والشكل البياني لهذا التابع هو كالتالي:
1*Myto4ZQagAOoyom4tqkaRQ.png
نلاحظ من الخط البياني للتابع أن قيمه تتراوح بين 0 و 1، حيث: عندما z=-∞ تكون قيمة التابع g=0 وعندما z=0 يكون g=0.5 وعندما z=+∞ يكون g=1.
ومن الرسم البياني نلاحظ أنه يمكن استخدامه في تدريب النماذج (أقصد أنه يعطي قيماً مختلفة عن الصفر أي هناك تغيرات في ميل المماس)، وكما نلاحظ من الرسم (المنحني الأزرق) فإن المشتق تكون قيمه فعالة للتدريب عندما تكون قيم z قريبة من الصفر ولكن من أجل قيم كبيرة جداً أو صغيرة جداً فلن تكون فعالة في التدريب لأن المماس يكون شبه مستقيم وبالتالي قيمة المشتقة تكون صغيرة جداً، مما يؤدي الى بطء شديد في عملية التدريب وبالتالي مكلف من الناحية الحسابية. إن الاستخدام الشائع والأهم والأفضل لهذا التابع هو استخدامه كمصنف في آخر طبقة من نموذج عندما تكون المهمة مهمة تصنيف ثنائي حيث أن خرجه يكون قيمة احتمالية بين 0 و 1 وبالتالي خيار ممتاز لمهام التصنيف الثنائي. وفي كيراس وتنسرفلو له الشكل التالي:

tf.keras.activations.sigmoid(x)

مثال:

a = tf.constant([-20, -1.0, 0.0, 1.0, 20], dtype = tf.float32)
b = tf.keras.activations.sigmoid(a)
b.numpy()
# الخرج
array([2.0611537e-09, 2.6894143e-01, 5.0000000e-01, 7.3105860e-01,
1.0000000e+00], 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
model = Sequential()
model.add(Embedding(10000, 8, input_length=maxlen))
model.add(Flatten())
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)

 

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

  • 0

تسمي دالة التنشيط sigmoid بهذا الاسم لانها مأخوذه من الدالة الشهيرة sigmoid function والتي يمكن التعبير عنها بالصيغة الرياضية الأتية:

sigmoid(x) = 1 / (1 + exp(-x)).

وهي دالة تتراوح قيمها بين سالب مالانهاية و موجب مالانهاية وتقطع محور الصادات عند 0.5 كما هو موضح بالشكل البياني الأتي:

88b0884b685010365a4478840c67fd50.thumb.png.099fc7ef25f9b751247e3a8dae2d3a96.png

وتكمن أهميتها في اشتقاقها حيث تعمل على الحصول على ميل الدالة بسهولة وتاخذ مشتقة دالة sigmoid كالتالي:

σ(x)=1/(1+e^(−x))
# مشتقة الدالة
dσ(x)/d(x) = σ(x)⋅(1−σ(x))

نري من المشتقة انها تستخدم الدوال الأسية في تحسين النواتج انثاء عملية التدريب، بحيث انه اذا كانت القيمة بعيدة عن الناتج الحقيقي، فان قيمة المشتقة تصبح كبيرة وبالتالي يتم تعديل تلك القيمة بشكل كبير، اما اذا كانت القيمة أثناء التدريب قريبة للغاية من القيمة الحقيقية، فأن المماس (المشتقة) يكون شبة أفقي (مستقيم) وبالتالي لا يتم تعديل تلك القيمة بشكل كبير.

وتتمثل أهميتها القصوى في كون القيم التي تخرج منها تترواح بين ال 0 و 1، وبالتالي هي مناسبة بشدة في التصنيف الثنائي binary classification كذلك في التصنيف الذي يعتمد على اصدار أحتمال لكل فئة probability of each class.

كذلك فأنه ، وعلى عكس دالة التنشيط ReLU، فأن مشتقة الدالة معرفة على كل المجال، لذا فانه لا يوجد احتمال يمكن أن تعلق فيه الدالة او يحدث أي خطأ انثاء عملية التدريب.

أما عن استخدامها في keras و tensorflow  فانه لا داعي لاعادة تعريف الدالة ومشتقتها مرة أخري حيث انها معرفة بالفعل ويمكن استخدامها مباشرة كالتالي:

from tensorflow.keras import layers
from tensorflow.keras import activations

model.add(layers.Dense(64))
model.add(layers.Activation(activations.sigmoid(x)))

ويفضل استخدام دالة التنشيط sigmoid كأخر طبقة مباشرة قبل بدء عملية التدريب، ولكن يمكن استخدامها كذلك بعد أى طبقة layer. 

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

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...