Dropout: ວິທີປ້ອງກັນບໍ່ໃຫ້ Neural Network ຈົດຈຳຂໍ້ມູນແບບນົກແກ້ວນົກຂຸນທອງ
Dropout: ວິທີປ້ອງກັນບໍ່ໃຫ້ Neural Network ຈົດຈຳຂໍ້ມູນແບບນົກແກ້ວນົກຂຸນທອງ
ໃນການພັດທະນາໂມເດວ AI ລອງຈິນຕະນາການວ່າ: ທ່ານກຳລັງສ້າງໂມເດວເພື່ອທຳນາຍ “ລາຄາກາເຟປາກຊ່ອງ” ໂດຍອີງໃສ່ຂໍ້ມູນສະພາບອາກາດໃນອະດີດ. ໂມເດວຂອງທ່ານເຮັດວຽກໄດ້ຢ່າງສົມບູນແບບກັບຂໍ້ມູນເກົ່າ (Training Data) ໂດຍມີຄວາມຖືກຕ້ອງເຖິງ 100%. ແຕ່ເມື່ອນຳເອົາໄປໃຊ້ພະຍາກອນລາຄາໃນເດືອນໜ້າແທ້ໆ, ໂມເດວພັດໃຫ້ຄຳຕອບທີ່ຜິດພາດຢ່າງຮ້າຍແຮງ.
ບັນຫານີ້ເກີດຂຶ້ນຍ້ອນຫຍັງ? ຄຳຕອບຄື: ໂມເດວຂອງທ່ານບໍ່ໄດ້ “ຮຽນຮູ້” ຮູບແບບ (Patterns) ຂອງຂໍ້ມູນ, ແຕ່ມັນພຽງແຕ່ “ຈົດຈຳ” ຂໍ້ມູນເກົ່າແບບນົກແກ້ວນົກຂຸນທອງເທົ່ານັ້ນ. ໃນທາງເຕັກນິກ, ພວກເຮົາເອີ້ນອາການນີ້ວ່າ Overfitting.
ມື້ນີ້ ພວກເຮົາຈະມາລົງເລິກວິທີການແກ້ໄຂບັນຫານີ້ດ້ວຍເທັກນິກທີ່ເປັນມາດຕະຖານໃນວົງການ Deep Learning ນັ້ນກໍຄື Dropout ພ້ອມທັງວິທີການທົດລອງຂຽນໂຄ້ດດ້ວຍ PyTorch.
Dropout ແມ່ນຫຍັງ?
Dropout ແມ່ນເທັກນິກການເຮັດ Regularization ຊະນິດໜຶ່ງໃນ Neural Networks. ແນວຄວາມຄິດຫຼັກຂອງມັນແມ່ນການ “ປິດການເຮັດວຽກແບບສຸ່ມ” ຂອງ Neuron ບາງຕົວໃນແຕ່ລະຮອບຂອງຂະບວນການ Training.
ເພື່ອໃຫ້ເຫັນພາບທີ່ຊັດເຈນຂຶ້ນ ໃນບໍລິບົດຂອງລາວ: ລອງນຶກພາບເຖິງບໍລິສັດ Tech Startup ໃນນະຄອນຫຼວງວຽງຈັນ. ຖ້າທີມງານມີ Senior Developer ທີ່ເກັ່ງຫຼາຍຜູ້ໜຶ່ງ ທີ່ຄອຍແກ້ໄຂບັນຫາທຸກຢ່າງ (Over-reliance). ບັນດາ Junior Developers ກໍຈະບໍ່ໄດ້ຮຽນຮູ້ການແກ້ໄຂບັນຫາດ້ວຍຕົນເອງ. ແຕ່ຖ້າມື້ໜຶ່ງ Senior ລາພັກວຽກແບບກະທັນຫັນ (Dropout), ບັນດາ Junior ຈະຖືກບັງຄັບໃຫ້ຕ້ອງຊ່ວຍເຫຼືອກັນ ແລະ ຮຽນຮູ້ທີ່ຈະແກ້ໄຂບັນຫາດ້ວຍຕົນເອງ.
ໃນ Neural Network ກໍເຊັ່ນດຽວກັນ ການເຮັດ Dropout ປ້ອງກັນບໍ່ໃຫ້ Neurons ຍຶດຕິດກັບ Neurons ໃດໜຶ່ງຫຼາຍເກີນໄປ (Co-adaptation) ເຮັດໃຫ້ໂມເດວຮຽນຮູ້ຈຸດເດັ່ນ (Features) ທີ່ຫຼາກຫຼາຍ ແລະ ມີຄວາມແຂງແກ່ນຫຼາຍຂຶ້ນ.
ກົນໄກການເຮັດວຽກ (The Mechanism)
ເມື່ອເຮົາກຳນົດຄ່າຄວາມໜ້າຈະເປັນ (Probability) ໃຫ້ກັບ Dropout ເຊັ່ນ: . ໃນແຕ່ລະການອັບເດດນໍ້າໜັກ (Forward/Backward pass), ແຕ່ລະ Neuron ໃນ Layer ທີ່ຖືກກຳນົດຈະມີໂອກາດ 50% ທີ່ຈະຖືກປ່ຽນຄ່າຊົ່ວຄາວໃຫ້ເປັນ 0.
ສິ່ງນີ້ເຮັດໃຫ້ເຄືອຂ່າຍທີ່ໃຊ້ໃນການ Training ມີການປ່ຽນແປງໂຄງສ້າງຢູ່ຕະຫຼອດເວລາ ເຊິ່ງປຽບສະເໝືອນການຝຶກຝົນໂມເດວຈຳນວນມະຫາສານໄປພ້ອມໆກັນ ແລ້ວນຳເອົາມາລວມກັນໃນຕອນນຳໃຊ້ຈິງ.
Tutorial: ການສ້າງ Dropout Layer ດ້ວຍ PyTorch
ເຮົາມາເບິ່ງວິທີການຈັດຕັ້ງປະຕິບັດຈິງ. ສົມມຸດວ່າເຮົາຈະສ້າງ Neural Network ເພື່ອທຳນາຍຜົນຜະລິດກາເຟປາກຊ່ອງ (Paksong Coffee Yield Prediction) ໂດຍໃຊ້ຂໍ້ມູນ Input 10 ຢ່າງ (ເຊັ່ນ: ປະລິມານນ້ຳຝົນ, ອຸນຫະພູມ, ຄວາມຊຸ່ມ ແລະ ອື່ນໆ).
1. ການສ້າງໂມເດວພ້ອມກັບ Dropout
ການນຳໃຊ້ Dropout ໃນ PyTorch ແມ່ນງ່າຍດາຍຫຼາຍ ຜ່ານ torch.nn.Dropout.
import torch
import torch.nn as nn
import torch.nn.functional as F
class PaksongCoffeePredictor(nn.Module):
def __init__(self):
super(PaksongCoffeePredictor, self).__init__()
# Input Layer: ຮັບຂໍ້ມູນ 10 Features, ສົ່ງອອກ 50
self.fc1 = nn.Linear(10, 50)
# ກຳນົດ Dropout Layer ທີ່ມີໂອກາດ 50% ໃນການປິດການເຮັດວຽກຂອງ Neuron
self.dropout = nn.Dropout(p=0.5)
# Hidden Layer & Output Layer
self.fc2 = nn.Linear(50, 20)
self.fc3 = nn.Linear(20, 1) # Output: ທຳນາຍຜົນຜະລິດ (ໂຕນ/ເຮັກຕາ)
def forward(self, x):
# ຜ່ານຊັ້ນທຳອິດ ແລະ ໃຊ້ Activation Function (ReLU)
x = F.relu(self.fc1(x))
# ນຳໃຊ້ Dropout ຫຼັງຈາກ Activation
x = self.dropout(x)
x = F.relu(self.fc2(x))
# ທ່ານສາມາດໃຊ້ dropout layer ດຽວກັນໄດ້ຫຼາຍຄັ້ງຫຼັງຈາກແຕ່ລະ Hidden layer
x = self.dropout(x)
x = self.fc3(x)
return x
2. ຂໍ້ຄວນລະວັງ: ໂໝດ Training ກັບ ໂໝດ Evaluation
ນີ້ຄືຈຸດທີ່ນັກພັດທະນາລະດັບ Intermediate ມັກຈະພາດ! Dropout ຄວນເຮັດວຽກສະເພາະຕອນ ຝຶກສອນໂມເດວ (Training) ເທົ່ານັ້ນ. ເມື່ອທ່ານນຳໂມເດວໄປໃຊ້ງານຈິງ (Inference / Evaluation), ທ່ານຕ້ອງການໃຫ້ Neuron ທຸກຕົວເຮັດວຽກເຕັມ 100% ເພື່ອໃຫ້ໄດ້ຜົນລວມທີ່ດີທີ່ສຸດ.
ໃນ PyTorch, ເຮົາຄວບຄຸມສະຖານະນີ້ໄດ້ຜ່ານ model.train() ແລະ model.eval().
# ປະກາດໃຊ້ໂມເດວ
model = PaksongCoffeePredictor()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
criterion = nn.MSELoss()
# --- ຊ່ວງ Training Loop ---
model.train() # ສຳຄັນຫຼາຍ! ເປີດໃຫ້ Dropout ເຮັດວຽກ
for epoch in range(100):
# ສົມມຸດວ່າ inputs ແລະ labels ແມ່ນຂໍ້ມູນສະພາບອາກາດ ແລະ ຜົນຜະລິດກາເຟ
# outputs = model(inputs)
# loss = criterion(outputs, labels)
# loss.backward()
# optimizer.step()
pass
# --- ຊ່ວງ ການນຳໄປໃຊ້ຈິງ ຫຼື ທົດສອບ (Testing/Inference) ---
model.eval() # ສຳຄັນຍິ່ງກວ່າ! ປິດ Dropout, ອະນຸຍາດໃຫ້ Neurons ທັງໝົດເຮັດວຽກ
with torch.no_grad():
# predictions = model(test_inputs)
pass
ໝາຍເຫດ: ເມື່ອເຮົາໃຊ້ model.eval(), PyTorch ຈະທຳການປັບນໍ້າໜັກ (Scale weights) ໃຫ້ອັດຕະໂນມັດເພື່ອຊົດເຊີຍພະລັງງານຈາກ Neuron ທີ່ຖືກປິດໄປໃນຕອນແລກ ເຮັດໃຫ້ເຮົາບໍ່ຕ້ອງຄຳນວນເອງ.
Key Takeaways
- ປ້ອງກັນ Overfitting: Dropout ຊ່ວຍທຳລາຍການເພິ່ງພາອາໄສກັນຫຼາຍເກີນໄປຂອງ Neurons, ບັງຄັບໃຫ້ທຸກ Feature ຕ້ອງຮຽນຮູ້ສິ່ງທີ່ເປັນປະໂຫຍດດ້ວຍຕົວມັນເອງ.
- ຕຳແໜ່ງການວາງ: ໂດຍທົ່ວໄປແລ້ວ ພວກເຮົາຈະວາງ Dropout Layer ໄວ້ຫຼັງຈາກ Activation Function ຂອງ Fully Connected Layers (ແຕ່ໃນບາງ Architecture ອາດມີການວາງຕ່າງອອກໄປ).
- ຢ່າລືມປ່ຽນໂໝດ: ຈື່ໄວ້ສະເໝີວ່າຕ້ອງເອີ້ນໃຊ້
model.train()ໃນຕອນຝຶກສອນ ແລະmodel.eval()ໃນຕອນທົດສອບ ຫຼື ນຳໄປໃຊ້ງານຈິງ.
ສະຫຼຸບ
ການສ້າງໂມເດວເພື່ອແກ້ໄຂບັນຫາໃນສັງຄົມລາວ ບໍ່ວ່າຈະເປັນການວິເຄາະຂໍ້ມູນຈະລາຈອນໃນນະຄອນຫຼວງວຽງຈັນ ຫຼື ການພະຍາກອນຜົນຜະລິດກະສິກຳລ້ວນແຕ່ຕ້ອງການຄວາມເຊື່ອຖືໄດ້. ການໃຊ້ພຽງຂໍ້ມູນຈິງອາດບໍ່ພຽງພໍຖ້າໂມເດວຂອງທ່ານມີແນວໂນ້ມທີ່ຈະ Overfit. ການເພີ່ມສອງສາມແຖວຂອງໂຄ້ດເພື່ອໃສ່ Dropout Layer ເຂົ້າໄປ ສາມາດປ່ຽນຈາກໂມເດວທີ່ພຽງແຕ່ “ຈົດຈຳ” ກາຍມາເປັນໂມເດວທີ່ສາມາດ “ຄິດວິເຄາະ” ແລະ ຮັບມືກັບສະຖານະການແປກໃໝ່ທີ່ມັນບໍ່ເຄີຍພົບເຫັນໃນອະດີດໄດ້ຢ່າງມະຫັດສະຈັນ. ຢ່າງລືມນຳເອົາເທັກນິກນີ້ໄປທົດລອງປັບໃຊ້ກັບໂປຣເຈັກຕໍ່ໄປຂອງທ່ານ!