Thuta Learning
Deep Learning with PyTorch
IntermediateAIintermediate

Overfitting နှင့် Regularization

ဒီခန်းပြီးရင် ဘာတတ်သွားမလဲ

  • Overfitting နှင့် Regularization concept ကို နားလည်ရှင်းပြနိုင်ရန်
  • နမူနာ PyTorch code ကို ကိုယ်တိုင် run ပြီး output စစ်နိုင်ရန်
  • Tutorial Platform project နှင့် production scenario တွင် မှန်ကန်စွာအသုံးချနိုင်ရန်

နားလည်ထားရမယ့် အချက်

Model ရဲ့ training loss ကျနေတယ်ဆိုတာက training data ကို ပိုကောင်းကောင်း fit လုပ်နေတယ်ဆိုတဲ့ အချက်ကိုပဲ ပြောပေးတာဖြစ်ပြီး၊ ဒီ fit က data အသစ်တွေအပေါ် generalize ဖြစ်မယ်ဆိုတာကိုတော့ ဘာမှ မပြောပေးဘူး။ Capacity လုံလုံလောက်လောက်ရှိတဲ့ model တစ်ခုက training example တွေကို noise နဲ့ idiosyncrasy အထိ တိတိကျကျ memorize လုပ်နိုင်တယ်၊ training accuracy က almost perfect ဖြစ်နေချိန်မှာတောင် data အသစ်ပေါ်မှာတော့ random guess ထက် သိပ်မကောင်းလှတဲ့ performance ပဲ ရှိနိုင်တယ် — ဒါကို overfitting လို့ခေါ်တယ်။ ဒါကို ရှာဖွေတွေ့ရှိဖို့ တစ်ခုတည်းသော ယုံကြည်ရတဲ့နည်းလမ်းကတော့ training လုပ်နေစဉ်မှာ model မမြင်ဖူးတဲ့ validation ဒါမှမဟုတ် test set ကို ခွဲထားပြီး training loss ဆက်ကျနေပေမဲ့ validation loss စတင် တက်လာတဲ့ အချက်ကို ကြည့်နေတာပါ — ဒီ gap ကပဲ model က general pattern တွေကို သင်ယူတာ ရပ်သွားပြီး specific detail တွေကို memorize လုပ်နေပြီဆိုတာကို ပြသနေတဲ့ အချက်ဖြစ်တယ်။ ဒီပြဿနာကို တိုက်ရိုက်တိုက်ဖျက်ဖို့ regularization technique နှစ်မျိုး ရှိတယ်။ Dropout ကတော့ training လုပ်နေစဉ် forward pass တစ်ခုချင်းစီမှာ neuron အချို့ရာခိုင်နှုန်းကို random ဖျက်ပစ်လိုက်ခြင်းအားဖြင့် network ကို fragile pathway တစ်ခုတည်းအပေါ် မှီခိုမနေဘဲ useful signal ကို neuron များစွာအတွင်း ဖြန့်ကျက်အောင် တွန်းအားပေးတယ်၊ subnetwork သေးသေးလေးများစွာကို ensemble လုပ်ပြီး train လုပ်သလိုပဲ ဖြစ်တယ်။ Weight decay ကတော့ weight ရဲ့ magnitude squared နှင့်အချိုးကျတဲ့ penalty သေးသေးလေးတစ်ခုကို loss function ထဲ ထည့်ပေးလိုက်ခြင်းအားဖြင့် weight တစ်ခုချင်းစီ training example အထူးတစ်ခုကို memorize လုပ်နိုင်လောက်အောင် ကြီးမားလာတာကို ဟန့်တားပေးတယ်။

လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်

Tutorial Platform ရဲ့ recommendation model ကို ပြီးခဲ့တဲ့လ click data တွေနဲ့ပဲ train လုပ်ပြီး အဲဒီ data အတိုင်းပဲ evaluate လုပ်မယ်ဆိုရင် almost perfect ဖြစ်နေမယ့်ပုံစံ တွေ့ရလိမ့်မယ် — ဒါပေမဲ့ learner ဘယ်သူက lesson ဘယ်ခုကို click နှိပ်ခဲ့တယ်ဆိုတာကို memorize လုပ်ထားတာသာ ဖြစ်နိုင်ပြီး နောက်ထပ် lesson တစ်ခုကို တကယ် relevant ဖြစ်စေတာက ဘာလဲဆိုတာ သင်ယူထားတာ မဟုတ်ဘူး။ Ship မလုပ်ခင် ဒီအခြေအနေကို ဖမ်းမိဖို့ team က ပိုနောက်ကျတဲ့ activity data ခွဲထားတဲ့ batch တစ်ခုနဲ့ အမြဲစစ်ဆေးရမယ်။ Training လုပ်နေစဉ် model ကို ရိုးသားနေအောင် ထိန်းဖို့ recommender network ရဲ့ hidden layer တွေကြားမှာ dropout ထည့်ပြီး optimizer မှာ weight decay term သေးသေးလေး ထည့်ပေးမှာဖြစ်တယ်၊ နှစ်ခုစလုံးက model ကို individual click history တွေ memorize လုပ်မယ့်အစား 'Python basics ပြီးတဲ့ learner တွေက OOP ကို ဆက်လိုချင်တတ်တယ်' လို့ ကျယ်ပြန့်တဲ့ pattern တွေကို သင်ယူဖို့ တွန်းပေးလိမ့်မယ်။

အတူတူ စမ်းရေးကြည့်မယ်

python
import torch
import torch.nn as nn

class SmallNet(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc1 = nn.Linear(4, 8)
        self.dropout = nn.Dropout(p=0.5)
        self.fc2 = nn.Linear(8, 1)

    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = self.dropout(x)
        return self.fc2(x)

model = SmallNet()
x = torch.ones(1, 4)

model.train()  # dropout is active
print("Train mode:", model(x).item(), model(x).item())

model.eval()  # dropout is disabled
print("Eval mode: ", model(x).item(), model(x).item())
You should see
Train mode မှာ forward pass နှစ်ခုက dropout က call တစ်ခုချင်းစီအတွက် neuron အမတူညီ random ဖျက်ပစ်နေတာကြောင့် ကွဲပြားတဲ့ ဂဏန်းတွေကို print ထုတ်ပြီး၊ eval mode မှာတော့ dropout ပိတ်ထားတာကြောင့် call နှစ်ခုစလုံးက အတူတူဂဏန်းကို print ထုတ်တယ်။

၅ မိနစ် စမ်းကြည့်

Dropout probability ကို 0.5 ကနေ 0.1 နဲ့ 0.9 အဖြစ် ပြောင်းကြည့်ပြီး `model.train()` output ထပ်ခါထပ်ခါ ခေါ်ရင် ရလဒ်တွေအကြား ကွာခြားမှု ဘယ်လိုပြောင်းလဲသွားလဲ လေ့လာပါ။

သတိလေးတစ်ချက်

Inference ဒါမှမဟုတ် evaluation မလုပ်ခင် `model.eval()` ကို ခေါ်ဖို့ မေ့ကျန်ခဲ့ခြင်း — model က neuron တွေကို random ဆက်ဖျက်နေတာကြောင့် evaluation အစစ်အတွက် လိုအပ်တဲ့ deterministic output အစား noisy ပြီး မတည်ငြိမ်တဲ့ prediction တွေ ထွက်လာမယ်။

Validation set ကို တစ်ခါမှ မစစ်ဆေးဘဲ training loss ကျနေတဲ့ graph တစ်ခုတည်းကိုသာ ကြည့်ပြီး model 'ကောင်းနေတယ်' လို့ ဆုံးဖြတ်ခြင်း — training loss ကတော့ ဆက်ကျနေနိုင်ပေမဲ့ real-world performance က ပိုဆိုးသွားနေတာကို ဒီနည်းက လုံးဝမှတ်မိမှာ မဟုတ်ဘူး။

Wikipedia — Regularization (mathematics)Deep Learning

ဒီနေရာမှာ လူအများမှားတတ်တယ်

  • Inference ဒါမှမဟုတ် evaluation မလုပ်ခင် `model.eval()` ကို ခေါ်ဖို့ မေ့ကျန်ခဲ့ခြင်း — model က neuron တွေကို random ဆက်ဖျက်နေတာကြောင့် evaluation အစစ်အတွက် လိုအပ်တဲ့ deterministic output အစား noisy ပြီး မတည်ငြိမ်တဲ့ prediction တွေ ထွက်လာမယ်။
  • Validation set ကို တစ်ခါမှ မစစ်ဆေးဘဲ training loss ကျနေတဲ့ graph တစ်ခုတည်းကိုသာ ကြည့်ပြီး model 'ကောင်းနေတယ်' လို့ ဆုံးဖြတ်ခြင်း — training loss ကတော့ ဆက်ကျနေနိုင်ပေမဲ့ real-world performance က ပိုဆိုးသွားနေတာကို ဒီနည်းက လုံးဝမှတ်မိမှာ မဟုတ်ဘူး။
  • နမူနာ code ကို production system ပေါ် တိုက်ရိုက်မစမ်းဘဲ local/test environment တွင် အရင်အတည်ပြုပါ။

လေ့ကျင့်ခန်း

Dropout probability ကို 0.5 ကနေ 0.1 နဲ့ 0.9 အဖြစ် ပြောင်းကြည့်ပြီး `model.train()` output ထပ်ခါထပ်ခါ ခေါ်ရင် ရလဒ်တွေအကြား ကွာခြားမှု ဘယ်လိုပြောင်းလဲသွားလဲ လေ့လာပါ။

You'll know it worked when: Train mode မှာ forward pass နှစ်ခုက dropout က call တစ်ခုချင်းစီအတွက် neuron အမတူညီ random ဖျက်ပစ်နေတာကြောင့် ကွဲပြားတဲ့ ဂဏန်းတွေကို print ထုတ်ပြီး၊ eval mode မှာတော့ dropout ပိတ်ထားတာကြောင့် call နှစ်ခုစလုံးက အတူတူဂဏန်းကို print ထုတ်တယ်။

Overfitting နှင့် Regularization | Thuta Learning