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

السؤال

Recommended Posts

  • 1
نشر

هي دالة رياضية نستخدمها كدالة تنشيط، مدخلاتها شعاع من الأعداد، وخرجها شعاع من القيم الاحتمالية، أي تقوم بتحويل متجه الأعداد إلى متجه احتمالي، حيث تتناسب احتمالات كل قيمة مع المقياس النسبي لكل قيمة في المتجه. ونستخدمها لمهام التصنيف المتعدد، حيث نضعها في آخر طبقة. ولها الشكل التالي:
images.png.69f14cf1746ed287da0ef4a350ce36f9.png
أي تأخذ كل قيمة من قيم شعاع الدخل على حدى، ثم تقوم بحساب ال exp لهذا العدد ثم تقسم الناتج على المجموع الكلي لل exp  لكل العينات (وبالتالي الخرج سيكون عبارة عن توزيع احتمالي). ولفهم هذا الكلام أكثر لنأخذ المثال التالي، لدينا 3 أصناف من الكرات (x,y,z) بما أنه لدينا 3 أصناف وبالتالي خرج الشبكة يجب أن يكون 3 قيم (أي يجب أن يكون لديك 3 خلايا في الخرج) بحيث كل قيمة تعبر عن احتمالية أن العينة هي إحدى الأصناف، حسناً لنرمز ل x ب 0 و y ب 1 و z ب 2 وبالتالي يمكن تمثيلها ك One-hot بالشكل التالي :

x0=[1,0,0]
y0=[0,1,0]
z0=[0,0,1]

ونحن لدينا 3 عصبونات في آخر طبقة، وبالتالي سيمثل العصبون الأول احتمالية كون العينة (الكرة) تمثل الصنف x، والعصبون الثاني احتمالية كون العينة (الكرة) تمثل الصنف y، والعصبون الأخير احتمالية كون العينة تنتمي للصنف z. فمثلاً من أجل عينة ما، عند الوصول لآخر طبقة سيتم إدخال ناتج آخر طبقة ( هنا شعاع من 3 قيم) إلى هذا التابع وبالتالي يصبح الخرج احتمالياً كما يلي:
softmax.thumb.png.abd70938e6e3937494e0123045a6d7c1.png
طبعاً القيم الاحتمالية التي وضعتها بشكل تقديري، لكن حتماً سيكون المجموع1، الآن سأكتب لك إياها بكود بسيط:

# transform values into probabilities
from math import exp
# calculate each probability
summation=(exp(7.0) + exp(2.0) + exp(0.1))
p1 = exp(7.0) / summation
p2 = exp(2.0) / summation
p3 = exp(0.1) / summation
print(p1, p2, p3) # 0.9923138027987766 0.006686157809719105 0.0010000393915043245
# sum of probabilities
print(p1 + p2 + p3) # 1.0

انظر كيف سأقوم بتحقيق هذا التابع، وسأطبقه على نفس السؤال:

from numpy import exp
def softmax(vector):
    e = exp(vector)
    return e / e.sum()
# define data
data = [7.0, 2.0, 0.1]
# التحويل
result = softmax(data)
print(result) # probabilities
# [0.9923138  0.00668616 0.00100004]

في كيراس وتنسرفلو تتواجد في الموديول التالي (لاحظ أنه موجود ضمن موديول الطبقات):

tf.keras.layers.Softmax()

ويمكنك تمريرها لنموذجك كدالة تنشيط في آخر طبقة عندما تكون المهمة مهمة تصنيف، كما في المثال التالي، حيث أنه لدينا مهمة تصنيف متعدد ل 46 صنف:

from keras.datasets import reuters
(train_data, train_labels), (test_data, test_labels) = reuters.load_data(
num_words=10000)
# ترميز البيانات
import numpy as np
def vectorize_sequences(sequences, dimension=10000):
results = np.zeros((len(sequences), dimension))
for i, sequence in enumerate(sequences):
results[i, sequence] = 1.
return results
x_train = vectorize_sequences(train_data)
x_test = vectorize_sequences(test_data)
from keras.utils.np_utils import to_categorical
one_hot_train_labels = to_categorical(train_labels)
one_hot_test_labels = to_categorical(test_labels)
# بناء النموذج
from keras import models
from keras import layers
model = models.Sequential()
model.add(layers.Dense(64, activation='relu', input_shape=(10000,)))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(46, activation='softmax')) # هنا الطبقةالأخيرة 
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
# التدريب
x_val = x_train[:1000]
partial_x_train = x_train[1000:]
y_val = one_hot_train_labels[:1000]
partial_y_train = one_hot_train_labels[1000:]
history = model.fit(partial_x_train,
partial_y_train,
epochs=20,
batch_size=512,
validation_data=(x_val, y_val))

وللتنويه يمكنك أيضاً استخدامها في الطبقات الخفية لكنها لن تعطيك نتائج مقبولة، مقارنة بالدوال الأخرى (استخدمها فقط كدالة تنشيط في الطبقة الأخيرة).

  • 1
نشر

في البداية دعنا نتذكر دالة التنشيط  tanh أو sigmoid والتي تقوم باخراج أحتمال الخرج فقط اذا كان ثنائي (0 او 1) تقوم softmax بتوسيع تلك الفكرة لانها تستطيع اخراج أكثر من صنف multi class وذلك عندما يكون الخرج الخاص بنا متعدد (قطة أو كلب أو أسد ...الخ)

أي أن Softmax تقوم بتعيين احتمالات عشرية لكل فئة في تصنيف ال Multi class . يجب ان يكون مجموع تلك الاحتمالات = 1.0. يساعد هذا في التدريب حيث يجعله يتعلم بسرعة أكبر مما لو كان الأمر خلاف ذلك. الشكل التالي يوضح هذة الفكرة:

حيث تمثل تلك المعادلة ال softmax بحيث يقوم بادخال كل قيمه ووضعها في دالة اسية e ثم حساب قيمتها مقسومه على مجموع كل القيم مرفوع للدالة الاسية e.

وتتميز تلك الدوال بقدرتها على تصنيف متعدد من الفئات عكس معظم الدوال التنشيطية الاخرى، لكن على صعيد أخر فانها أبطا نسبية من منافسيها نظرا لاحتياجها لحساب عمليات اسيه تاخذ وقتا.

اما عن استخدامها في keras فهي سهلة كالتالي:

tf.keras.layers.Softmax(axis=-1, **kwargs)

كمثال:

>>> inp = np.asarray([1., 2., 1.])
>>> layer = tf.keras.layers.Softmax()
>>> layer(inp).numpy()
array([0.21194157, 0.5761169 , 0.21194157], dtype=float32)
>>> mask = np.asarray([True, False, True], dtype=bool)
>>> layer(inp, mask).numpy()
array([0.5, 0. , 0.5], dtype=float32)

وفي الموديل، عادة ما تستخدم في أخر طبقة فقط من التعلم كالتالي:

model.add(layers.Dense(46, activation='softmax')) # الطبقة الاخيرة من التعلم 
model.compile(optimizer='rmsprop', loss='categorical_crossentropy',
metrics=['accuracy'])

 

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...