التدريب والتحقق ومنع فرط التكيّف
راقب val_loss، وطبّق Dropout، واستخدم عمليات الاستدعاء للإيقاف المبكر
التدريب والتحقق ومنع فرط التكيّف درس مجاني في R Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.
تقسيم البيانات إلى تدريب وتحقق واختبار
يتطلب التعلّم العميق تقسيم البيانات إلى ثلاثة أجزاء: التدريب (يتعلّم النموذج المعاملات)، والتحقق (مراقبة التعميم أثناء التدريب وضبط المعاملات الفائقة)، والاختبار (التقييم النهائي غير المتحيّز). تنشئ الوسيطة validation_split في fit() مجموعة التحقق تلقائياً.
# validation_split = 0.2 reserves last 20% as validation
history <- model |> fit(
x_train, y_train,
epochs = 50,
batch_size = 32,
validation_split = 0.2,
verbose = 0
)
# history contains train and val metrics per epoch
names(history$metrics)كائن سجل التدريب
يحتوي الكائن الذي تعيده fit() على قائمة $metrics تتضمن إدخالاً واحداً لكل مقياس مسجّل في كل حقبة. استدعِ plot(history) لعرض منحنيات التدريب والتحقق جنباً إلى جنب. وتشير المنحنيات المتباعدة (تحسّن التدريب وثبات التحقق) إلى فرط التخصيص.
# Training loss and accuracy over epochs
head(history$metrics$loss)
head(history$metrics$val_loss)
# Plot training curves
plot(history)
# Or create a custom ggplot
library(ggplot2)
df <- data.frame(
epoch = seq_along(history$metrics$loss),
train = history$metrics$loss,
val = history$metrics$val_loss
)
ggplot(df, aes(epoch)) +
geom_line(aes(y = train, colour = 'Train')) +
geom_line(aes(y = val, colour = 'Validation')) +
labs(y = 'Loss', title = 'Training Curves')اكتشاف فرط التخصيص
يحدث فرط التخصيص عندما تستمر خسارة التدريب في الانخفاض، بينما تبدأ خسارة التحقق في الارتفاع. يحفظ النموذج بيانات التدريب بدلاً من تعلّم أنماط قابلة للتعميم. ومن علاماته: وجود فجوة كبيرة بين دقة التدريب والتحقق، وبلوغ خسارة التحقق حداً أدنى واضحاً ثم ارتفاعها.
# Overfitting is visible in the history
# Example of overfitting signatures:
cat('Epoch 5 — Train loss: 0.12, Val loss: 0.18\n')
cat('Epoch 10 — Train loss: 0.06, Val loss: 0.21\n')
cat('Epoch 20 — Train loss: 0.02, Val loss: 0.31\n')
# The model should have stopped at epoch 5!
# Strategies: early stopping, dropout, regularisation, more datacallback_early_stopping()
توقف callback_early_stopping(monitor, patience, restore_best_weights) التدريب عندما يتوقف المقياس المُراقَب عن التحسّن. وتمثل patience عدد الحقب التي ينبغي انتظارها بعد آخر تحسّن. اضبط restore_best_weights = TRUE للعودة تلقائياً إلى أوزان أفضل حقبة.
early_stop <- callback_early_stopping(
monitor = 'val_loss',
patience = 10, # wait 10 epochs
restore_best_weights = TRUE # rollback to best
)
history <- model |> fit(
x_train, y_train,
epochs = 200,
batch_size = 32,
validation_split = 0.2,
callbacks = list(early_stop),
verbose = 0
)
cat('Stopped at epoch:', length(history$metrics$loss))callback_reduce_lr_on_plateau()
عندما يتعثر التدريب، غالباً ما يؤدي خفض معدل التعلّم إلى استئناف التقدم. تضرب callback_reduce_lr_on_plateau(monitor, factor, patience) معدل التعلّم الحالي في factor عندما لا يتحسن المقياس المُراقَب خلال patience من الحقب.
reduce_lr <- callback_reduce_lr_on_plateau(
monitor = 'val_loss',
factor = 0.5, # halve the learning rate
patience = 5, # after 5 stagnant epochs
min_lr = 1e-6 # floor for learning rate
)
history <- model |> fit(
x_train, y_train,
epochs = 100,
batch_size = 64,
validation_split = 0.2,
callbacks = list(early_stop, reduce_lr),
verbose = 1
)callback_model_checkpoint()
تحفظ callback_model_checkpoint(filepath, save_best_only) أوزان النموذج على القرص في نهاية كل حقبة (أو تحفظها فقط عند تحسّن الأداء باستخدام save_best_only = TRUE). ويحمي ذلك من تعطل التدريب، ويتيح تحميل أفضل نموذج حتى إذا استمر التدريب بعد الوصول إلى النقطة المثلى.
checkpoint <- callback_model_checkpoint(
filepath = '/tmp/best_model.h5',
monitor = 'val_accuracy',
save_best_only = TRUE,
mode = 'max', # higher accuracy = better
verbose = 1
)
history <- model |> fit(
x_train, y_train,
epochs = 100,
batch_size = 32,
validation_split = 0.2,
callbacks = list(early_stop, reduce_lr, checkpoint)
)
# Reload best model
best_model <- load_model_hdf5('/tmp/best_model.h5')validation_data مقابل validation_split
تأخذ validation_split آخر N% من بيانات التدريب. وإذا كانت بياناتك مرتبة (مثل السلاسل الزمنية)، فسيكون ذلك متحيّزاً. استخدم validation_data = list(x_val, y_val) بدلاً منه لتوفير مجموعة تحقق مُعدّة مسبقاً من تقسيم عشوائي طبقي.
# Manually create a random validation split
set.seed(42)
val_idx <- sample(nrow(x_train), size = 0.2 * nrow(x_train))
x_val <- x_train[val_idx, ]
y_val <- y_train[val_idx, ]
x_tr <- x_train[-val_idx, ]
y_tr <- y_train[-val_idx, ]
history <- model |> fit(
x_tr, y_tr,
epochs = 50,
batch_size = 32,
validation_data = list(x_val, y_val), # explicit val set
callbacks = list(early_stop)
)تأثير حجم الدفعة
يُعد حجم الدفعة من المعاملات الفائقة الأساسية للتدريب. تُدخل الدفعات الأصغر مزيداً من الضوضاء في تقديرات التدرج (فتعمل كنوع من التنظيم)، مما يساعد على التعميم. أما الدفعات الأكبر فتكون أسرع، لكنها قد تتقارب إلى نقاط دنيا أكثر حدّة وأقل قابلية للتعميم. القيم الشائعة هي: 32 و64 و128. ابدأ بتجربة 32.
# Compare training with different batch sizes
for (bs in c(32, 128, 512)) {
set_weights(model, init_weights) # reset
h <- model |> fit(
x_train, y_train,
epochs = 20,
batch_size = bs,
validation_split = 0.2,
verbose = 0
)
cat('Batch:', bs, '| Val Acc:',
tail(h$metrics$val_accuracy, 1), '\n')
}إحماء معدل التعلّم
يمكن أن يؤدي البدء بمعدل تعلّم صغير جداً وزيادته تدريجياً خلال الحقب الأولى (الإحماء) إلى استقرار التدريب، ولا سيما مع النماذج الكبيرة أو مجموعات البيانات الصغيرة. ويتيح استدعاء LearningRateScheduler المخصص تطبيق هذا النمط.
# Custom learning rate schedule with warmup
lr_schedule <- function(epoch, lr) {
if (epoch < 5) {
return(lr * (epoch + 1) / 5) # warmup
} else if (epoch < 30) {
return(lr) # constant
} else {
return(lr * 0.95) # decay
}
}
lr_callback <- callback_learning_rate_scheduler(lr_schedule)
history <- model |> fit(
x_train, y_train,
epochs = 50,
callbacks = list(lr_callback, early_stop),
validation_split = 0.2
)ملخص التنظيم
ينبغي الجمع بين عدة تقنيات تنظيم للحصول على تعلّم عميق متين:
- الإسقاط العشوائي: تصفير الخلايا العصبية عشوائياً أثناء التدريب.
- اضمحلال الأوزان (L2): معاقبة الأوزان الكبيرة في الخسارة.
- الإيقاف المبكر: إيقاف التدريب قبل أن يفرط النموذج في التخصيص.
- زيادة البيانات: زيادة حجم مجموعة التدريب اصطناعياً.
- تطبيع الدفعات: تثبيت التنشيطات وتقليل انزياح التغاير.
model <- keras_model_sequential(input_shape = c(784)) |>
layer_dense(512, use_bias = FALSE,
kernel_regularizer = regularizer_l2(1e-4)) |>
layer_batch_normalization() |>
layer_activation('relu') |>
layer_dropout(0.4) |>
layer_dense(256, kernel_regularizer = regularizer_l2(1e-4)) |>
layer_batch_normalization() |>
layer_activation('relu') |>
layer_dropout(0.3) |>
layer_dense(10, activation = 'softmax')
model |> compile('adam', 'categorical_crossentropy', 'accuracy')رسم منحنيات التدريب
اعرض دائماً مقاييس التدريب والتحقق جنباً إلى جنب. ينبغي أن يبيّن النموذج المدرَّب جيداً تقارب المنحنيين وبقاءهما متقاربين. وإذا تباعدا، فأضف تقنيات تنظيم أو قلّل سعة النموذج. وإذا استقر كلا المنحنيين عند خسارة مرتفعة، فالنموذج يعاني من نقص التخصيص.
# Detailed training curve plot
df <- data.frame(
epoch = seq_along(history$metrics$loss),
train_loss = history$metrics$loss,
val_loss = history$metrics$val_loss,
train_acc = history$metrics$accuracy,
val_acc = history$metrics$val_accuracy
)
par(mfrow = c(1, 2))
plot(df$epoch, df$train_loss, type = 'l', col = 'blue',
xlab = 'Epoch', ylab = 'Loss', main = 'Loss')
lines(df$epoch, df$val_loss, col = 'red')
legend('topright', c('Train', 'Val'), col = c('blue','red'), lty=1)
plot(df$epoch, df$train_acc, type = 'l', col = 'blue',
xlab = 'Epoch', ylab = 'Accuracy', main = 'Accuracy')
lines(df$epoch, df$val_acc, col = 'red')تحقق سريع
ماذا يفعل ضبط restore_best_weights = TRUE في callback_early_stopping()؟
مراجعة التدريب وفرط التخصيص
أهم النقاط من درس التدريب والتحقق ومنع فرط التخصيص:
- استخدم
validation_splitأوvalidation_dataلمراقبة التعميم أثناء التدريب. - يعرض
plot(history)منحنيات التدريب — وتشير المنحنيات المتباعدة إلى فرط التخصيص. - يوقف
callback_early_stopping(patience, restore_best_weights=TRUE)التدريب عند الحقبة المثلى. - يقلّل
callback_reduce_lr_on_plateau()معدل التعلّم عندما يتعثر التقدم. - يحفظ
callback_model_checkpoint(save_best_only=TRUE)أفضل نموذج على القرص. - اجمع بين الإسقاط العشوائي وتنظيم L2 وتطبيع الدفعات وزيادة البيانات للحصول على تدريب متين.
# Best practice training setup
callbacks <- list(
callback_early_stopping(
monitor = 'val_loss', patience = 15,
restore_best_weights = TRUE
),
callback_reduce_lr_on_plateau(
monitor = 'val_loss', factor = 0.5, patience = 5
),
callback_model_checkpoint(
'/tmp/best.h5', monitor = 'val_accuracy',
save_best_only = TRUE
)
)
model |> fit(
x_train, y_train,
epochs = 200, batch_size = 64,
validation_split = 0.2,
callbacks = callbacks, verbose = 0
)الأسئلة الشائعة
هل درس «التدريب والتحقق ومنع فرط التكيّف» مجاني؟
نعم — نص درس «التدريب والتحقق ومنع فرط التكيّف» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.
ماذا ستتعلم في «التدريب والتحقق ومنع فرط التكيّف»؟
راقب val_loss، وطبّق Dropout، واستخدم عمليات الاستدعاء للإيقاف المبكر تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟
لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «التدريب والتحقق ومنع فرط التكيّف»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟
نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- إعداد Keras وTensorFlow في R
- بناء النماذج التسلسلية
- أساسيات الشبكات العصبية الالتفافية
- التدريب والتحقق ومنع فرط التكيّف