0Pricing
R Academy · บทเรียน

การฝึก การตรวจสอบ และการป้องกันการเรียนรู้เกิน

ติดตาม 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 data

callback_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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การตั้งค่า Keras และ TensorFlow ใน R
  2. การสร้างโมเดลแบบลำดับ
  3. พื้นฐานโครงข่ายประสาทเทียมแบบคอนโวลูชัน
  4. การฝึก การตรวจสอบ และการป้องกันการเรียนรู้เกิน
← กลับไปที่ R Academy