Doctor AI

Dr. Savath Saypadith

240 ບົດຄວາມ

Dropout: ວິທີປ້ອງກັນບໍ່ໃຫ້ Neural Network ຈົດຈຳຂໍ້ມູນແບບນົກແກ້ວນົກຂຸນທອງ

ໂພສເມື່ອ # Neural Networks # Deep Learning # PyTorch # Machine Learning

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 ເຊັ່ນ: p=0.5p = 0.5. ໃນແຕ່ລະການອັບເດດນໍ້າໜັກ (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

ສະຫຼຸບ

ການສ້າງໂມເດວເພື່ອແກ້ໄຂບັນຫາໃນສັງຄົມລາວ ບໍ່ວ່າຈະເປັນການວິເຄາະຂໍ້ມູນຈະລາຈອນໃນນະຄອນຫຼວງວຽງຈັນ ຫຼື ການພະຍາກອນຜົນຜະລິດກະສິກຳລ້ວນແຕ່ຕ້ອງການຄວາມເຊື່ອຖືໄດ້. ການໃຊ້ພຽງຂໍ້ມູນຈິງອາດບໍ່ພຽງພໍຖ້າໂມເດວຂອງທ່ານມີແນວໂນ້ມທີ່ຈະ Overfit. ການເພີ່ມສອງສາມແຖວຂອງໂຄ້ດເພື່ອໃສ່ Dropout Layer ເຂົ້າໄປ ສາມາດປ່ຽນຈາກໂມເດວທີ່ພຽງແຕ່ “ຈົດຈຳ” ກາຍມາເປັນໂມເດວທີ່ສາມາດ “ຄິດວິເຄາະ” ແລະ ຮັບມືກັບສະຖານະການແປກໃໝ່ທີ່ມັນບໍ່ເຄີຍພົບເຫັນໃນອະດີດໄດ້ຢ່າງມະຫັດສະຈັນ. ຢ່າງລືມນຳເອົາເທັກນິກນີ້ໄປທົດລອງປັບໃຊ້ກັບໂປຣເຈັກຕໍ່ໄປຂອງທ່ານ!