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

خوارزمية التحسين RMSprop واستخدامها في Keras

Meezo ML

السؤال

Recommended Posts

  • 1

هي اختصار لـ Root Mean Squared prop وهي خوارزمية تحسين تستخدم لتسريع خوارزمية gradient descent، وتحسين مسار التدرج.
نعلم خوارزمية mini-batch gradient descent تتقدم بشكل أسرع من خوارزمية gradient descent  الأساسية ولكن يكون الطريق الذي تسلكه هذه الخوارزمية متذبذب، لذلك لتخفيف هذا التذبذب تقوم هذه الخوارزمية بالتقدم مع الأخذ بعين الاعتبار الـ exponentially weighted average للمشتقات السابقة في الحسبان.
يتم في الخطوه الأولى حساب exponentially weighted average عن طريق القوانين:

Sdw = B2*Sdw + (1-B2)*dw^2
Sdb = B2*Sdb + (1-B2)*db^2

حيث Sdw هيي متوسط الأوزان الأسي لجميع الأوزان في الشبكة.
و Sdb متوسط الأوزان الاسي لل bias في الشبكة.
و B هي معامل من المعاملات العليا و يسمى الزخم يتراوح من 0 إلى 1 يستخدم لحساب المتوسط الاسي الجديد، وتحدد الوزن بين متوسط القيمة السابقة والقيمة الحالية.
بعد ذلك نقوم بتحديث الأوزان كما في gradient descent عن طريق القوانين:

w = w - a * dw / sqrt(Sdw)
b= b - a * db / sqrt(Sdb)

حيث w أوزان الشبكه العصبونية و b تمثل ال bias في الشبكة العصبونية.
و dw التغيير في الأوزان و db التغيير في ال bias.
و Sdw هيي متوسط الأوزان الاسي لجميع الأوزان في الشبكة.
و Sdb متوسط الأوزان الاسي لل bias في الشبكة.
و B هي معامل من المعاملات العليا و يسمى الزخم يتراوح من 0 إلى 1 يستخدم لحساب المتوسط الاسي الجديد، فإنها تحدد الوزن بين متوسط القيمة السابقة والقيمة الحالية.
أي أن الفرق الوحيد بين Rmsprop و gradient descent هو أنه في GD يتم تعديل الأوزان بالشكل التالي:

w = w - a * dw
b= b - a * db

و Rmsprop نفس الشئ مع قسمة كل من dw,db على جذر exponentially weighted average
يتم استيراد RMSprop في keras من خلال الوحدة optimizer
لاستخدامه مع النموذج نقوم بتمريره إلى الدالة compile بإحدى الطريقتين:

model.compile(
	optimizer=RMSprop(learning_rate=0.001),
	...
)
# أو
model.compile(
	optimizer='rmsprop',
	...
)
#0.001 لاحظ أنه في الطريقة الثانية سيتم استخدام معامل الخطوة الافتراضي وهو 
# لذا إذا أردت تغييره فعليك باستخدام الطريقة الأولى

مثال عملي لطريقة الاستخدام حيث يأخذ RMSprop الوسيط learning_rate الذي يمثل معامل التعلم أو مقدار الخطوة.

# استدعاء المكتبات
from keras.models import Sequential
from keras import layers
from keras.datasets import mnist
from keras.optimizers import RMSprop
# تحميل الداتا
(X_train,y_train),(X_test,y_test)=mnist.load_data()
# تقييس الداتا وتغيير حجم الدخل منعنا لحدوث خطأ
X_train = X_train.reshape((60000, 28 * 28))/255.0
X_test = X_test.reshape((10000, 28 * 28))/255.0
# بناء الشبكة العصبونية بطبقة واحدة وطبقة خرج ب 10 أصناف.
model = Sequential()
model.add(layers.Flatten())
model.add(layers.Dense(512, activation='relu', input_shape=( 28*28,)))
model.add(layers.Dense(10, activation='softmax'))
# استخدام compile مع Rmsprop مع معامل تعلم 0.001
model.compile(optimizer=RMSprop(learning_rate=0.001),
loss='sparse_categorical_crossentropy',metrics=['accuracy'])
# تدريب الموديل
model.fit(X_train,y_train)

 

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

  • 0

حين تدريب نموذج Neural Network نقوم بالخطوات التالية:

  • إنشاء أوزان عشوائية للقيام بالعمليات الجبرية اللازمة لتدريب النموذج،
  • في كل دورة تدريب (epoch) يتم مقارنة القيم الناتجة من النموذج مع الحقيقية بإستخدام Loss function،
  • يتم حساب الخطأ (الفرق بين القيم المتوقعة و الحقيقية) لتعديل الأوزان،
  • يتم تعديل الأوزان في النموذج و القيام بإعادة الخطوات (2و3و4) إلى إنتهاء عدد الدورات أو الوصول لقيمة توقف محددة.

عملية تعديل الأوزان للوصول للدقة المطلوبة تتم بإستخدام optimizers للوصول للدقة المطلوبة، لأنها في الإصل عملية موازنة بين إنقاص دالة الخسارة loss function و الوصول للأوزان المناسبة.

Keras يوفر العديد من optimizers الجاهزة التي يمكن التعامل معاها مباشرة، والتي يمكن التعامل معها بإحدي الطريقتين:

  1. بعد إستيراد المكتبات اللازمة، تم تعريف نموذج و إضافة عدد 2Layers الأولى تحتوي على شكل البيانات المدخلة و عدد الneurons الثانية تحتوي على دالة التنشيط activation function وهي المسؤولة عن إضافة non-linearity للنموذج. بعد ذلك عرفنا دالة الموانة RMSprop و تم تمرير 0.01 learning rate. ومن ثم نقوم بتعريف الoptimizer في model.compile .
    from tensorflow import keras
    from tensorflow.keras import layers
    
    model = keras.Sequential()
    model.add(layers.Dense(64, kernel_initializer='uniform', input_shape=(10,)))
    model.add(layers.Activation('softmax'))
    
    opt = keras.optimizers.RMSprop(learning_rate=0.01)
    model.compile(loss='categorical_crossentropy', optimizer=opt)

    تذكر أن model.compile تقوم بالأتي:

    اقتباس

    Compile defines the loss function, the optimizer and the metrics.

    بالتالي نحن نحتاج إلى عملية التجميع قبل أن نقوم بأي عملية تدريب للنموذج.

يمكننا أن نقوم بتمرير الoptimizer إلى دالة التجميع مباشرة دون التعريف المسبق كالتالي:

model.compile(loss='categorical_crossentropy', optimizer='RMSprop')

والان لنتعرف RMSprop optimizer وهو إختصار ل Root Mean Squared Propagation و يقوم بالتقليل / الإنقاص من متوسط مربعات الأخطاء (البعد عن القيمة الحقيقية gradient)، و الذي يتم بضرب الأوزان بقيم محددة كما تم شرحه من قبل @Ali Haidar Ahmad لكن الفرق الذي يجعل  RMSprop دالة موازنة جيدة هو learning rate معامل التعلم و هو القيمة التي تحافظ على النموذج في حالة توازن و إذا كانت قيمته عالية فإن النموذج سيأخذ زمن قفزات طويلة قد لا تضمن الوصول ل local minima أما إن كان قيمته صغيرة فإن النموذج يأخذ زمن طويل جداً للوصول.

0*V6bRtFXFaDl9LXE3.jpg

لاحظ في الشكل السابق ما نود الوصول إليه هو النقطة الحمراء (الدقة المثالية التي نسبة الخطأ فيها قليلة)، وعند الإبتداء من A لنتمكن من التحرك في صورة إفقية نستخدم الأوزان، لكن لنعرف الإتجاهات و نحدد مقدار القفزات نحتاج لدالة الموازنة التي تستخدم ما قمنا بتعريفه سابقاً learning rate.

 

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

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...