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

السؤال

Recommended Posts

  • 1
نشر

RELU هي إختصار ل Re(ctified) L(inear) (U)nit وهي من أشهر دوال التنشيط المستخدمة، ترجع قيمة 0 في حال كانت القيمة المدخلة أقل من أو تساوي 0 و ترجع نفس قيمة x في حال كانت القيمة أكبر من 0:

1*3Jwh6c8Og8O0u5YiamF60w.png

وبالتالي يمكن كتبتها كالتالي:

 f(x) = max(0,x)

هذه الدالة تتكون من دالتين خطيتين و مع بعضهما تكونان الدالة غير الخطية، وفي حالة القيم المدخلة كانت موجبة لا يوجد حدود للقيم التي تخرجها الدالة فهي تعتمد على مقدار القيمة الموجبة المدخلة. و تعتبر من أسرع الدوال بالمقارنة مع دوال أخرى مثل Sigmoid, Tanh.

والان لنتعرف على كيفية التعامل مع relu في tensorflow ، تستخدم relu كعملية في الشبكات العصبية و تستقبل القيم في شكل tensor:

y = tf.nn.relu( x )

و تستخدم كأحد طبقات الشبكات العصبية، كما يمكن أيضاً التعامل مع relu بصورة مباشرة كدالة تنشيط و ذلك عن طريق:

tf.keras.activations.relu

وبالتالي فإن الدالة موجودة في activation module و يمكن إضافتها لأي نموذج بإضافة طبقة كالتالي:

model.add( keras.layers.Dense( 25 , activation=tf.keras.activations.relu  ) )

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

  • 1
نشر (معدل)

ReLU (Rectified Linear Unit) هو تابع تنشيط خطي على القسم الموجب وخطي على القسم السالب، لكن تركيبهما هو مابعطيه الصفة اللاخطية، له الشكل الرياضي البسيط التالي:

max(0,x)

بحيث من أجل دخل x>0 سيكون خرجه هو x نفسها  (أي لاتغيير أي كأننا لم نستخدم تابع تنشيط أي None ) ومن أجل دخل أصغر من الصفر يكون الخرج 0، هذا يعني أنه يسلك سلوك None من أجل الجزء الموجب وكما نعلم فإن أسعار المنازل هي دوماً موجبة وبالتالي استخدام relu سيكون مكافئاً ل None ولكن أفضل لأنه في حالة توقع النموذج قيمة سالبة للنموذج سوف يقصرها على 0 أي إذا توقع -5 سوف يجعلها 0 بسبب تابع ال relu ولهذا السبب كان استخدامه يعطي نتيجة أفضل، لكن هذا لايعني أن استخدامه صحيح وخصوصاً إذا كانت القيم السالبة ضمن مجال التوقع، وأيضاً استخدامه قد يضلل نموذجك قليلاً في الوصول للقيم الصغرى الشاملة لذا أنا أفضل عدم استخدامه. الشكل البياني للتابع:
1*m_0v2nY5upLmCU-0SuGZXg.png

كما نلاحظ فإن قيم المشتق تساوي الصفر أيضاً من أجل القيم السالبة (ليس أمراً جيداً لأنه يسبب بطء لكنه مهمل هنا)، بينما من أجل القيم الموجبة يكون حالة مثالية للتدريب حيث أن قيمة المشتق تكون كبيرة وثابتة (القيمة تساوي 1 كما نلاحظ في الرسم). وهذا يجعل عملية التدريب أسرع (التقارب من القيم الصغرى الشاملة). أحد سلبيات هذا التابع أنه يقوم بتحويل جميع القيم السالبة إلى صفر، اي أنه في حالة القيم السالبة سينظر إليها التابع بشكل واحد وهو الصفر, مما قد يتسبب بخسارة معلومات هامة أثناء تدريب الشبكة.
في كيراس أو تنسرفلو له الشكل التالي:

tf.keras.activations.relu(x, alpha=0.0, max_value=None, threshold=0)

بحيث أن x هي tensor أو متغير ما. أما alpha فيتحكم في ميل القيم الأقل من العتبة. أما max_value فهي التي تحدد عتبة التشبع (أكبر قيمة سترجعها الدالة). أما الوسيط الأخير فهو العتبة أي إعطاء القيمة الحدية لوظيفة التنشيط التي تحتها القيم التي سيتم تثبيطها أو ضبطها على الصفر. وافتراضياً تكون 0. ولاستخدامه في تدريب نموذجك يمكنك استخدامه مع جميع الطبقات في الشبكة عدا طبقة الخرج. وشخصياً أنصحك باستخدامه في جميع طبقات شبكتك  (عدا طبقة الخرج طبعاً) لأنه سيجعل نموذجك يتقارب من القيم الصغرى بشكل أسرع كما ذكرت. إليك المثال التالي الذي سأقوم فيه باستخدام هذا التابع في تدريب نموذجي، أول مثال لمهمة توقع:

from keras.datasets import boston_housing
(train_data, train_targets), (test_data, test_targets) =boston_housing.load_data()
mean = train_data.mean(axis=0)
train_data -= mean
std = train_data.std(axis=0)
train_data /= std
test_data -= mean
test_data /= std
from keras import models
from keras import layers
model = models.Sequential()
# يمكنك تمريره إلى طبقتك بالشكل التالي
# أو tf.keras.activations.relu()
model.add(layers.Dense(64, activation='relu',
input_shape=(train_data.shape[1],)))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(1))
model.compile(optimizer='rmsprop', loss='mse', metrics=['mae'])
history = model.fit(train_data, train_targets,epochs=7, batch_size=1, verbose=1)
-------------------------------------------------
Epoch 1/7
404/404 [==============================] - 1s 967us/step - loss: 338.1444 - mae: 15.1877
Epoch 2/7
404/404 [==============================] - 0s 1ms/step - loss: 21.6941 - mae: 3.1332
Epoch 3/7
404/404 [==============================] - 0s 1ms/step - loss: 17.6999 - mae: 2.8479
Epoch 4/7
404/404 [==============================] - 0s 947us/step - loss: 13.1258 - mae: 2.4018
Epoch 5/7
404/404 [==============================] - 0s 970us/step - loss: 15.7603 - mae: 2.6360
Epoch 6/7
404/404 [==============================] - 0s 1ms/step - loss: 12.1877 - mae: 2.3640
Epoch 7/7
404/404 [==============================] - 0s 965us/step - loss: 9.7259 - mae: 2.2152

و لاستخدامه مع مهام التصنيف، يكون أيضاً بنفس الطريقة.

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

تسمي دالة التنشيط  Rectified Linear Unit (ReLU) وتعني الدالة الخطية المعدلة، وذلك لانها ليست خطية بالكامل ، بل انها تكون خطية من 0 وحتي لانهاية اما قبل ال 0 (أي في الجزء السالب) فانها تساوي 0 كما هو موضح بالشكل البياني : 

ReLU-activation-function.png.9301bfd40e115e5302b2c1f1a4024e02.png

ويمكن كتابتها كدالة بالشكل التالي:

f(x) = max(0,x)

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

f`(x) = { 1 if x < 0
          0 if x > 0}

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

وتعتبر ReLU احدى اكثر الدوال المستخدمة كدوال تنشيط، خصوصا في عملية ال backpropagation، وذلك لعدة اسباب منها:

1) سهلة في تطبيقها حيث انها تختار فقط القيمة الاكبر بين القيم المدخلة والصفر.

2) بسبب كونها دالة خطية فانها تصبح ملائمة اكثر في عملية التحسين optimization

3) سريعة في استخدامها وتأخذ وقتها موارد أقل من غيرها. 

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

tf.keras.activations.relu(x, alpha=0.0, max_value=None, threshold=0)
# X هي البيانات المدخلة في هيئة متغير 
# alpha ميل القيم الاقل من الصفر وهي افتراضيا none
# max_value هي اقصي قيمة تقوم الدالة بارجاعها 
# threshold هي الحد الفاصل بين القيم الصحيحة والخطأ وهي افتراضيا 0 كما وضحنا سابقا
                      


ويمكن استخدامها بسهولة وتضاف الاسطر السابقة بين أي طبقتين من طبقات التعلم (layers) كالتالي:

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

model.add(layers.Dense(64))
model.add(layers.Activation(activations.relu))

 

 

تم التعديل في بواسطة 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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...