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

الفرق بين خوارزميات Batch, Mini Batch & Stochastic Gradient Descent وكيف يتم تطبيقهم في Keras

Meezo ML

السؤال

Recommended Posts

  • 2

معظم مسائل الـ deep learning تعمل بشكل أفضل عندما تعتمد على داتاست كبيرة الحجم مثلاً من رتبة 10 مليون أو أعلى (big data) وستصبح عملية التدريب في الشبكات العصبونية بطيئة نظراً لضخامة الداتاست وفي هذه الحالات نحتاج لوجود خوارزميات تحسين سريعة والتي تساعد في زيادة الفعالية.
خوارزمية Batch Gradient Descent هي النوع المعروف والشكل الأصلي لخوارزمية Gradient Descent حيث تمر على كل الداتاست ثم تتقدم خطوة واحدة (تحدث قيم الأوزان) ثم تمر على كامل الداتاست مرة أخرى ثم تتقدم خطوة ثانية وهكذا حتى يتم التقارب Converge. لكن المشكلة فيها أنه عندما تكون الداتاست كبيرة مثلاً من رتبة 5 مليون (طبعاً هذا الرقم ضخم وفي الحقيقة حتى عندما تكون الداتا من رتبة مئات الآلاف يظهر عيبها) ستصبح الخوارزمية بطيئة في التقدم أو التدرج لأنه في كل تكرار تمر على كامل الداتاست، لذلك في Mini Batch Gradient Descent يتم تقسيم الداتاست إلى مجموعات داتاست أصغر وهذه المجموعات تسمى mini-batches والوسيط batch_size يدل على حجم هذه المجموعة في كيراس وتنسرفلو. إن هذا التقسيم يجعل عملية التقارب أسرع بكثير من الطريقة العادية فهو لاينتظر المرور على كامل الداتاسيت حتى يتقدم خطوة (تحديث الأوزان) وإنما على جزء منها.
أما فيما يتعلق بالخوارزمية الأخيرة Stochastic Gradient Descent فهي الأسرع، حيث يتم تحديث الأوزان بعد المرور على عينة واحدة فقط أي من أجل كل عينة في الداتاسيت سيتم تحديث الأوزان، لكن عيبها هو أنها في غالب الأحيان لن تستطيع التقارب من القيم الدنيا للتكلفة.
لذا فالخيار الأفضل هو تجنب النوع الأول والثالث واستخدام ال Mini-Batch (فهي توازن بين الاثنين -السرعة والدقة-).
Batch Gradient Descent: بطيئة ودقيقة.
Stochastic Gradient Descent: سريعة جداً وغير دقيقة.
Mini Batch Gradient Descent: توازن بين السرعة والدقة.
وفي كيراس نستخدم الوسيط batch_size لتحديد عدد الباتشات (عدد التقسيمات للداتا)، فمثلاً 64 باتش تعني أنه سيتم تقسيم البيانات إلى 64 قسم وكل قسم يحوي عدد عينات يساوي (عدد العينات في الداتا مقسوم على 64).
عدم تعيين قيمة لل batch_size  يعني أنك ستستخدم Batch Gradient Descent واختيارك ل 1 يعني أنك ستستخدم Stochastic .
لنأخذ مثال ونلاحظ الفرق:
دربنا الموديل على الداتا المعرفه في keras والتي تدعى mnist وسوف نقوم بتدريب نفس الموديل ولكن مع اختلاف أن الأول ينفذ Batch Gradient Descent والثاني Mini Batch Gradient Descent:

from keras.models import Sequential
from keras import layers
from keras.datasets import mnist
(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
model = Sequential()
model.add(layers.Dense(512, activation='relu', input_shape=(28*28,)))
model.add(layers.Dense(10, activation='softmax'))
model.compile(optimizer='Adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
model.fit(X_train,y_train,epochs=1)
#الخرج
'''
1875/1875 [==============================] - 8s 4ms/step - loss: 0.3400 - accuracy: 0.9004
الكود الثاني نفس السابق مع إضافة batch_size
'''
#Mini-Batch
model = Sequential()
model.add(layers.Dense(512, activation='relu', input_shape=(28*28,)))
model.add(layers.Dense(10, activation='softmax'))
model.compile(optimizer='Adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
model.fit(X_train,y_train, batch_size=60,epochs=1)
#الخرج
'''
1000/1000 [==============================] - 5s 5ms/step - loss: 0.3865 - accuracy: 0.8889
الفرق واضح من الخرج في كل كود 
الأول الذي يحوي gradient descent كان أبطئ واستغرف 8s 
في حين الثاني الذي يحوي mini-batch gradient descent صحيح أن الدقه ليست كالأول ولكن السرعه كانت أفضل استغرق 5s 
وطبعا هنا كانت الداتاست صغيره مقارنتا بالداتاست المعياريه
'''

 

تم التعديل في بواسطة Ali Haidar Ahmad
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1

خوارزمية Stochastic Gradient Descent(SGD) هو أحد خوارزميات الoptimization التي لا تتبع لنوع معين من خوارزميات الذكاء الإصطناعي، و هي طريقة لتدريب البيانات بإستخدام convex loss function. يمكن إستخدام SDG لعمليات classifiaction, regression بإستخدام SGDClassifier, SGDRegressor على التوالي.

import numpy as np
from sklearn.linear_model import SGDClassifier
X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
Y = np.array([1, 1, 2, 2])
clf = SGDClassifier()
clf.fit(X, Y)
print(clf.predict([[-0.8, -1]]))

البرنامج أعلاه عبارة عن مثال لإستخدام SGDClassifier لتدريب 4 مدخلات و التي تحتوي على 2features. في البرنامج أدناه، SGDRegressor تستقبل عدد 10 عينات لكل منها 5features للقيام بعملية التدريب.

import numpy as np
from sklearn.linear_model import SGDRegressor
n_samples, n_features = 10, 5
y = np.random.randn(n_samples)
X = np.random.randn(n_samples, n_features)
reg = SGDRegressor()
reg.fit(X, y)

وهي عبارة عن iterative algorithm حيث أن عملية التدريب تتطلب مجموعة خطوات لتزيد من دقة النموذج، حيث أن كل خطوة تنبؤ لقيمة عينة تتم بإستخدام parameters ثم مقارنة القيم المتوقعة مع الحقيقية و حساب الخطأ و من ثم تعديل الparameters، هنالك طرق مختلفة للتعديل لكن أشهرها back-propagation والتي تستخدم في artificial neural networks. والان مجموعة القيم التي تؤخذ في المرة الواحدة تسمى batch و الان لنعرف الفروقات بين batch, stochastic, mini-batch:

  • Batch Gradient Descent : حجم الbatch = عدد العينات
  •  Stochastic Gradient Descent : حجم الbatch = عينة واحدة
  • Mini-Batch Gradient Descent : عينة واحدة < حجم الbatch < حجم العينات

إستخدام SGDClassifier, SGDRegressor بدون تغيير في parameters عبارة عن SDG و الذي يتم بنداء عينة كل مرة لتحسين النموذج، لكن لتحديد batch أو mini-batch يمكننا إستخدام الدالة partial_fit والتي تكون مهمتها تدريب العينة، تنفيذ النموذج و مقارنة النتائج لتحسين parameters لعدد محدد من العينات، لاحظ البرنامج التالي:

def iter_minibatches(batchsize, datasetsize):
    batchstart = 0
    while batchstart < datasetsize:
        batchrows = range(batchstart,batchstart+batchsize)
        X_batch, y_batch = getrows(batchrows)
        yield X_batch, y_batch
        batchstart += batchsize
 

batchcreator = iter_minibatches(batchsize=2, datasetsize=10)
n_samples, n_features = 10, 5
y = np.random.randn(n_samples)
X = np.random.randn(n_samples, n_features)

reg = SGDRegressor()
for X, y in batchcreator:
    reg.partial_fit(X, y)
y_predicted = reg.predict(X_test)

لاحظ أن البرنامج المنفذ عبارة عن mini-batch SGDRegressor و الذي يمكن تحويله لbatch بزيادة chunck_size لعدد العينات الكلي في مجموعة التدريب.

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

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...