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

السؤال

Recommended Posts

  • 1
نشر (معدل)

دالة غير خطية، تشبه كثيراً التابع السيني Sigmoid ولكن الفرق بينهما في مجال قيم الخرج حيث يكون في ال tanh من 1- إلى 1، أي على عكس التابع السيني حيث يكون الخرج من 0 إلى 1. ولها الشكل التالي (الاورنج):
Untitled.thumb.png.8c9f68471873d64e2708094d9aa0faf1.pngمن الشكل نلاحظ أنها تأخذ أي قيمة حقيقية كقيم مدخلات. والخرج يكون في النطاق من 1 إلى -1. كلما كانت المدخلات أكبر (أكثر إيجابية) ، كلما كانت قيمة المخرجات أقرب إلى 1.0 ، بينما كلما كانت المدخلات أصغر (أكثر سلبية) ، كلما كان الناتج أقرب إلى -1.0. ومن الرسم البياني نلاحظ أيضاً أنه يمكن استخدامها في تدريب النماذج (مستمر و قابل للإشتقاق في كل مكان)، وكما نلاحظ من الرسم (المنحني الأزرق) فإن المشتق تكون قيمه فعالة للتدريب عندما تكون قيم z قريبة من الصفر (حولها) ولكن من أجل قيم كبيرة جداً أو صغيرة جداً فلن تكون فعالة في التدريب لأن المماس يكون شبه مستقيم وبالتالي قيمة المشتقة تكون صغيرة جداً، مما يؤدي الى بطء شديد في عملية التدريب وبالتالي مكلف من الناحية الحسابية. إن الميزة الأهم في هذا التابع مقارنة بال sigmoid هو أن قيم المشتقات أكبر وبالتالي تدرجاته (Gredint) تكون أكثر قوة نحو القيم الصغرى الشاملة GM أي بمعنى آخر أسرع في التقارب Converge وهذا مايجعله أكثر كفاءة مقارنة بالتابع السيني. أما عيبها فكما ذكرنا هو نفس المشكلة التي تعاني منها sigmoid وهي مشكلة تلاشي التدرجات "vanishing gradient" (المشتقات يصغر حجمها إلى أن تنعدم تقريباً عندما تزداد قيمة Z وهذا واضح من المنحني الأزرق). عند استخدام tanh للطبقات المخفية ، أنصح باستخدام تهيئة الوزن "Xavier Normal" أو "Xavier Uniform" (يُشار إليها أيضاً بتهيئة Glorot) إضافة إلى تقييس "scaling" بيانات الدخل إلى النطاق -1 إلى 1  قبل التدريب. وفي كيراس له الشكل التالي:

tf.keras.activations.tanh(x)

ويمكنك استخدامه في الطبقات الخفية لنموذجك (لاتستخدمه مع طبقة الخرج فكيراس لاتعالج حالته، رغم أنه يمكن استخدامه)، انظر للمثال التالي:

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(64, activation='tanh'))# بهذه الطريقة
"""
أو 
from tensorflow.keras import activations
model.add(Dense(64, activation=activations.tanh))
أو بالشكل التالي
model.add(Dense(64))
model.add(Activation(activations.tanh))
"""
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)

 

تم التعديل في بواسطة Ali Haidar Ahmad
  • 1
نشر

تعتبر دالة tanh دالة غير خطية، وهي تتشابه في هذا مع دالة ال sigmoid ، غير أن دالة ال sigmoid تتراوح قيمة الخرج من 0 ل 1 بينما دالة tanh تتراوح قيمة الخرج من -1 ل 1 كما هو موضح في الصورة التالية:

tanh.png.e82251fcb0f0a0441aad08dd86f92d1f.png

 

هنا ، يمكنك الملاحظة من الرسم البياني ، أن  tanh تستطيع ربط المدخلات بالمخرجات جيدًا. يتم تطبيق ذلك بحيث أن المدخلات الإيجابية بشدة (الصحيحة) يتم تعيينها بالقرب من 1 ، بينما يتم تعيين المدخلات السلبية بشدة (الخاطئة) بالقرب من -1.

وتعتبر الصيغة الرياضية للدالة tanh كالتالي:

f(x) = tanh(x) = (e^(2x) - 1) / (e^(2x) + 1)

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

import numpy as np
import matplotlib.pyplot as plt
 
def tanh(x):
    return np.tanh(x) 
 
def generate_sample_data(start, end, step):

    return np.linspace(start, end, step)
 
x = generate_sample_data(-5, 5, 10)
y = tanh(x)
 
# Now plot
plt.xlabel("x")
plt.ylabel("tanh(x)")
plt.plot(x, y)
plt.show()

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

على الرغم أن tanh تحتوي على الكثير من الخصائص الجيدة لبناء الموديل ، يجب على المرء دائمًا توخي الحذر عند استخدامه.

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

أما عن استخدامها في keras بالطريقة الأتية:

>>> a = tf.constant([-3.0,-1.0, 0.0,1.0,3.0], dtype = tf.float32)
>>> b = tf.keras.activations.tanh(a)
>>> b.numpy()
array([-0.9950547, -0.7615942,  0.,  0.7615942,  0.9950547], dtype=float32)

وفي بناء الموديل يمكن أستخدامها كالتالي:

model.add(Dense(12, input_shape=(8,), activation='tanh'))
model.add(Dense(8, activation='tanh'))

 

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...