การฝึก การตรวจสอบ และการป้องกันการเรียนรู้เกิน
ติดตาม val_loss ใช้ Dropout และใช้การเรียกกลับเพื่อหยุดก่อนกำหนด
การฝึก การตรวจสอบ และการป้องกันการเรียนรู้เกิน เป็นบทเรียน R Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 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')
}การวอร์มอัปอัตราการเรียนรู้
การเริ่มด้วยอัตราการเรียนรู้ที่ต่ำมากแล้วค่อย ๆ เพิ่มขึ้นในช่วงยุคแรก ๆ (การวอร์มอัป) อาจช่วยให้การฝึกมีเสถียรภาพ โดยเฉพาะกับโมเดลขนาดใหญ่หรือชุดข้อมูลขนาดเล็ก คุณสามารถใช้ callback 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
)คำถามที่พบบ่อย
บทเรียน “การฝึก การตรวจสอบ และการป้องกันการเรียนรู้เกิน” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การฝึก การตรวจสอบ และการป้องกันการเรียนรู้เกิน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส R Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การฝึก การตรวจสอบ และการป้องกันการเรียนรู้เกิน”
ติดตาม val_loss ใช้ Dropout และใช้การเรียกกลับเพื่อหยุดก่อนกำหนด คุณปฏิบัติ R Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน R Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน R Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การฝึก การตรวจสอบ และการป้องกันการเรียนรู้เกิน” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน R Academy นี้ได้ไหม
ได้ บทเรียน R Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การตั้งค่า Keras และ TensorFlow ใน R
- การสร้างโมเดลแบบลำดับ
- พื้นฐานโครงข่ายประสาทเทียมแบบคอนโวลูชัน
- การฝึก การตรวจสอบ และการป้องกันการเรียนรู้เกิน