ການປັບແຕ່ງ Hyperparameters ໃນ Neural Network: ວິທີການປັບ Learning Rate ແລະ Batch Size
ການປັບແຕ່ງ Hyperparameters ໃນ Neural Network: ວິທີການປັບ Learning Rate ແລະ Batch Size
ສະບາຍດີນັກພັດທະນາ ແລະ ຜູ້ສົນໃຈ AI ທຸກທ່ານ! ຖ້າທ່ານກຳລັງຝຶກ (Train) ໂມເດວ Neural Network ເພື່ອພະຍາກອນສະພາບການສັນຈອນຢູ່ສີ່ແຍກສີໄຄ ຫຼື ຄາດເດົາລະດັບນ້ຳຂອງໃນຊ່ວງລະດູຝົນ ແລ້ວພົບວ່າໂມເດວຂອງທ່ານບໍ່ຍອມຮຽນຮູ້, ຄວາມແມ່ນຍຳຕໍ່າ, ຫຼື ໃຊ້ເວລາເທຣນດົນຜິດປົກກະຕິ, ບັນຫາເຫຼົ່ານີ້ມັກຈະເກີດມາຈາກການຕັ້ງຄ່າ “Hyperparameters” ທີ່ບໍ່ເໝາະສົມ.
ໃນບົດຄວາມນີ້, ເຮົາຈະມາເຈາະເລິກວິທີການປັບແຕ່ງສອງຕົວແປທີ່ສຳຄັນທີ່ສຸດໃນການເຮັດ Deep Learning ນັ້ນກໍຄື: Learning Rate ແລະ Batch Size ວ່າມັນເຮັດວຽກແນວໃດ ແລະ ຈະຂຽນໂຄດນຳໃຊ້ໃນ PyTorch ແນວໃດໃຫ້ມີປະສິດທິພາບ.
Hyperparameters ແມ່ນຫຍັງ?
ໃນໂລກຂອງ Neural Networks ເຮົາແບ່ງຕົວແປອອກເປັນສອງປະເພດຄື:
- Parameters (Weights & Biases): ແມ່ນຄ່າທີ່ໂມເດວ “ຮຽນຮູ້” ແລະ ປັບປ່ຽນດ້ວຍຕົວມັນເອງໂດຍອັດຕະໂນມັດ ຜ່ານຂໍ້ມູນທີ່ເຮົາປ້ອນເຂົ້າໄປ.
- Hyperparameters: ແມ່ນຄ່າທີ່ ຕົວເຮົາເອງ (Developer) ຕ້ອງເປັນຜູ້ກຳນົດກ່ອນທີ່ຈະກົດປຸ່ມເລີ່ມ Train ຊຶ່ງມັນຈະເປັນຕົວຄວບຄຸມ “ວິທີການຮຽນຮູ້” ຂອງໂມເດວ.
ວິເຄາະ: ການປັບ Learning Rate (ອັດຕາການຮຽນຮູ້)
Learning Rate (LR) ແມ່ນຂະໜາດຂອງບາດກ້າວທີ່ໂມເດວໃຊ້ໃນການປັບປ່ຽນນໍ້າໜັກ (Weights) ເພື່ອລຸດຜ່ອນຄ່າຄວາມຜິດພາດ (Loss).
ລອງນຶກພາບວ່າ ໂມເດວຂອງທ່ານຄືນັກເດີນປ່າທີ່ຫຼົງທາງຢູ່ເທິງ ຈອມພູເຂົາຄວາຍ ໃນຕອນກາງຄືນ. ເປົ້າໝາຍແມ່ນການຍ່າງລົງມາຫາພື້ນຮ່ອມພູທີ່ຕໍ່າທີ່ສຸດ (ຈຸດທີ່ Loss = 0). Learning Rate ກໍຄືຄວາມກວ້າງຂອງບາດກ້າວຍ່າງໃນແຕ່ລະກ້າວ:
- Learning Rate ນ້ອຍເກີນໄປ (Low LR - ຕົວຢ່າງ: 0.00001): ປຽບເໝືອນການຍ່າງຊອຍບາດກ້າວນ້ອຍໆ ເທື່ອລະຄືບ. ຂໍ້ດີຄືມີຄວາມແນ່ນອນສູງ ບໍ່ພາດເປົ້າໝາຍ, ແຕ່ຂໍ້ເສຍຄືຕ້ອງໃຊ້ເວລາດົນຫຼາຍ (Training Time ສູງ) ແລະ ອາດຈະໄປຕິດເຫງັກຢູ່ໃນຫຼຸມນ້ອຍໆເທິງໜ້າຜາ (Local Minima) ໂດຍບໍ່ຮອດພື້ນດິນລຸ່ມສຸດ.
- Learning Rate ໃຫຍ່ເກີນໄປ (High LR - ຕົວຢ່າງ: 0.1): ປຽບເໝືອນການກ້າວກະໂດດບາດກ້າວໃຫຍ່. ມັນອາດຈະຊ່ວຍໃຫ້ລົງພູໄດ້ໄວໃນຕອນທຳອິດ, ແຕ່ເມື່ອໃກ້ຈະຮອດຈຸດຕໍ່າສຸດ ບາດກ້າວທີ່ໃຫຍ່ເກີນໄປຈະເຮັດໃຫ້ກະໂດດກາຍໄປກາຍມາ (Overshooting) ແລະ ບໍ່ສາມາດລູ່ເຂົ້າຫາ (Converge) ຈຸດທີ່ດີທີ່ສຸດໄດ້.
- Learning Rate ທີ່ເໝາະສົມ (Optimal LR - ຕົວຢ່າງ: 0.001): ແມ່ນບາດກ້າວທີ່ພໍດີ ທີ່ຊ່ວຍໃຫ້ໂມເດວເຄື່ອນທີ່ລົງມາໄດ້ຢ່າງວ່ອງໄວໃນຕອນຕົ້ນ ແລະ ສະໝໍ່າສະເໝີຈົນຮອດຈຸດປາຍທາງ.
ວິເຄາະ: ຜົນກະທົບຂອງ Batch Size (ຂະໜາດຂອງແບັດສ໌)
Batch Size ແມ່ນຈຳນວນຊຸດຂໍ້ມູນທີ່ເຮົາປ້ອນໃຫ້ໂມເດວ “ເບິ່ງ” ກ່ອນທີ່ຈະທຳການອັບເດດນໍ້າໜັກ 1 ຄັ້ງ.
ລອງນຶກພາບວ່າ ທ່ານມີທຸລະກິດ SME ສົ່ງອອກກາເຟ ແລະ ຕ້ອງຂົນສົ່ງເມັດກາເຟຈຳນວນ 10,000 ກິໂລ ຈາກ ປາກຊ່ອງ ລົງມາ ປາກເຊ. ທ່ານຈະຂົນສົ່ງແນວໃດ?
- Batch Size ໃຫຍ່ (Full-Batch): ຄືການໃຊ້ລົດບັນທຸກ 18 ລໍ້ ຂົນກາເຟທັງໝົດ 10,000 ກິໂລ ໄປໃນຖ້ຽວໂຄງດຽວ.
- ຂໍ້ດີ: ທິດທາງການອັບເດດມີຄວາມຊັດເຈນຫຼາຍ ກົງໄປຫາເປົ້າໝາຍ.
- ຂໍ້ເສຍ: ຕ້ອງໃຊ້ Memory ຂອງ GPU (VRAM) ມະຫາສານ ແລະ ໂມເດວອັບເດດຊ້າ (ເພາະຕ້ອງອ່ານຂໍ້ມູນຈົນຄົບກ່ອນຈຶ່ງອັບເດດ 1 ເທື່ອ).
- Batch Size = 1 (Stochastic / Onet-by-One): ຄືການໃຊ້ລົດຈັກຂົນກາເຟເທື່ອລະ 1 ກິໂລ.
- ຂໍ້ດີ: ອັບເດດໄວຫຼາຍ! ບໍ່ກິນ Memory.
- ຂໍ້ເສຍ: ທິດທາງການອັບເດດຈະແກວ່ງໄປແກວ່ງມາ (Noisy) ພາໃຫ້ຂະບວນການ Training ຂາດຄວາມສະຖຽນລະພາບ.
- Batch Size ຂະໜາດກາງ (Mini-Batch - ຕົວຢ່າງ: 16, 32, 64): ຄືການໃຊ້ລົດກະບະ (Pickup) ຂົນເທື່ອລະ 32 ຖົງ. ນີ້ຄືວິທີທີ່ນິຍົມທີ່ສຸດໃນວົງການ Deep Learning ເພາະມັນເປັນການດຸ່ນດ່ຽງທີ່ສົມບູນແບບລະຫວ່າງຄວາມໄວໃນການອັບເດດ, ຄວາມສະຖຽນຂອງທິດທາງ, ແລະ ການໃຊ້ງານ Hardware ຢ່າງມີປະສິດທິພາບ.
ຕົວຢ່າງການຂຽນໂຄດດ້ວຍ PyTorch
ເພື່ອໃຫ້ເຫັນພາບແຈ້ງຂຶ້ນ, ເຮົາມາເບິ່ງວິທີການກຳນົດ Learning Rate ແລະ Batch Size ໃນການສ້າງໂມເດວພະຍາກອນປະລິມານລົດຕິດຢູ່ສີ່ແຍກໄຟແດງ ດ້ວຍ PyTorch ກັນເລີຍ.
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset
# ---------------------------------------------------------
# 1. ສ້າງ Dummy Data ສະຳລັບຕົວຢ່າງການພະຍາກອນລົດຕິດ
# ---------------------------------------------------------
# X = ຂໍ້ມູນ Feature ຕ່າງໆ (ເຊັ່ນ: ເວລາ, ວັນ, ອຸນຫະພູມ) ຈຳນວນ 1,000 ແຖວ, 10 ຟີເຈີ
# y = ປະລິມານລົດຕົວຈິງທີ່ນັບໄດ້ (Labels)
X = torch.randn(1000, 10)
y = torch.randn(1000, 1)
dataset = TensorDataset(X, y)
# ---------------------------------------------------------
# 2. ຕັ້ງຄ່າ BATCH SIZE - ໃຊ້ Data Loader ເພື່ອແບ່ງຂໍ້ມູນ
# ---------------------------------------------------------
# ເຮົາໃຊ້ Mini-batch ທີ່ 32 ເພື່ອດຸ່ນດ່ຽງ Memory ແລະ ຄວາມໄວ
BATCH_SIZE = 32
dataloader = DataLoader(dataset, batch_size=BATCH_SIZE, shuffle=True)
# ---------------------------------------------------------
# 3. ສ້າງແບບຈຳລອງ Neural Network ຄ່າພື້ນຖານ
# ---------------------------------------------------------
model = nn.Sequential(
nn.Linear(10, 64),
nn.ReLU(),
nn.Linear(64, 1)
)
# ---------------------------------------------------------
# 4. ກຳນົດ Loss Function ແລະ ຕັ້ງຄ່າ LEARNING RATE
# ---------------------------------------------------------
# ເຮົາເລີ່ມຕົ້ນດ້ວຍ 0.001 ຖ້າ Training ແລ້ວ Loss ບໍ່ລຸດລົງ ໃຫ້ລອງພິຈາລະນາກຳນົດເປັນ 0.01
LEARNING_RATE = 0.001
criterion = nn.MSELoss()
# ສົ່ງ Parameter ຂອງໂມເດວເຂົ້າໄປໃນ Optimizer ພ້ອມກຳນົດຄ່າ lr (Learning Rate)
optimizer = optim.Adam(model.parameters(), lr=LEARNING_RATE)
# ---------------------------------------------------------
# 5. ຂັ້ນຕອນການຝຶກສອນໂມເດວ (Training Loop)
# ---------------------------------------------------------
epochs = 5
for epoch in range(epochs):
epoch_loss = 0.0
for batch_X, batch_y in dataloader:
# ກ້າວທີ 1: Forward pass (ຄາດເດົາ)
predictions = model(batch_X)
loss = criterion(predictions, batch_y)
# ກ້າວທີ 2: Backward pass (ຄິດໄລ່ຄວາມຜິດພາດແຕ່ລະຈຸດ - Gradients)
optimizer.zero_grad()
loss.backward()
# ກ້າວທີ 3: Optimization step (ອັບເດດນໍ້າໜັກຕາມ Learning Rate ທີ່ຕັ້ງໄວ້)
optimizer.step()
epoch_loss += loss.item()
# ສະແດງຜົນ Loss ຫຼັງຈາກຈົບແຕ່ລະ Epoch
avg_loss = epoch_loss / len(dataloader)
print(f"Epoch [{epoch+1}/{epochs}], Average Loss: {avg_loss:.4f}")
💡 Key Takeaways (ສິ່ງສຳຄັນທີ່ຄວນຈື່)
- ເປັນຂອງຄູ່ກັນ: Learning Rate ແລະ Batch Size ເຮັດວຽກຮ່ວມກັນສະເໝີ. ຫາກທ່ານເພີ່ມ Batch Size ໃຫ້ໃຫຍ່ຂຶ້ນ ທ່ານມັກຈະຕ້ອງເພີ່ມ Learning Rate ນຳເພື່ອຊົດເຊີຍຈຳນວນຮອບການອັບເດດທີ່ໜ້ອຍລົງ.
- ເລີ່ມຈາກຄ່າກາງໆ: ເວລາທົດລອງໃໝ່ ແນະນຳໃຫ້ເລີ່ມ LR ປະມານ
3e-4(0.0003) ຫຼື1e-3(0.001) ສຳລັບ Adam Optimizer ແລະ ໃຊ້ Batch Size32ຫຼື64. - ເຝົ້າສັງເກດ Loss Curve: ຖ້າ Loss ແກວ່ງຂຶ້ນໆລົງໆ ບໍ່ມີທ່າທີຈະລຸດລົງ ແປວ່າ LR ໃຫຍ່ເກີນໄປ. ຖ້າ Loss ລຸດລົງຊ້າໆເປັນເສັ້ນຕັດຊື່ໆ ແປວ່າ LR ນ້ອຍເກີນໄປ.
ສະຫຼຸບ
ການປັບຮາຍເປີພາຣາມິເຕີຄືສິລະປະແລະວິທະຍາສາດທີ່ຕ້ອງອາໄສທັງການທົດລອງແລະຄວາມເຂົ້າໃຈ. ການເຂົ້າໃຈກົນໄກຂອງອັດຕາການຮຽນຮູ້ (Learning Rate) ແລະ ຂະໜາດຂອງແບັດສ໌ (Batch Size) ຈະຊ່ວຍໃຫ້ທ່ານສາມາດພັດທະນາໂມເດວ AI ທີ່ແກ້ໄຂບັນຫາໃນທ້ອງຖິ່ນຂອງລາວເຮົາ ບໍ່ວ່າຈະເປັນການທຳນາຍການຈະລາຈອນ, ວິເຄາະຜົນຜະລິດກະສິກຳ, ຫຼື ລະບົບແນະນຳສິນຄ້າໃນ SME ໄດ້ຢ່າງມີປະສິດທິພາບ ແລະ ປະຢັດເວລາຫຼາຍຂຶ້ນ. ລອງນຳເອົາໂຄດເບື້ອງຕົ້ນໄປດັດແປງ ແລະ ທົດສອບກັບຂໍ້ມູນຂອງທ່ານເບິ່ງເດີ!