Meezo ML نشر 29 يونيو 2021 أرسل تقرير نشر 29 يونيو 2021 (معدل) كيف نقوم بتطبيق خوارزميات Batch, Mini Batch & Stochastic Gradient Descent في كيراس؟وما الفرق بينهم؟ تم التعديل في 29 يونيو 2021 بواسطة Meezo ML اقتباس
2 Ali Haidar Ahmad نشر 29 يونيو 2021 أرسل تقرير نشر 29 يونيو 2021 (معدل) معظم مسائل الـ 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 وطبعا هنا كانت الداتاست صغيره مقارنتا بالداتاست المعياريه ''' تم التعديل في 29 يونيو 2021 بواسطة Ali Haidar Ahmad 2 اقتباس
1 ريم المهدي نشر 30 يونيو 2021 أرسل تقرير نشر 30 يونيو 2021 خوارزمية 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 لعدد العينات الكلي في مجموعة التدريب. اقتباس
السؤال
Meezo ML
كيف نقوم بتطبيق خوارزميات Batch, Mini Batch & Stochastic Gradient Descent في كيراس؟وما الفرق بينهم؟
تم التعديل في بواسطة Meezo ML2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.