Batch Normalization: ວິທີເລັ່ງຄວາມໄວ ແລະ ສ້າງຄວາມສະຖຽນໃນການເທຣນ Neural Networks
Batch Normalization: ວິທີເລັ່ງຄວາມໄວ ແລະ ສ້າງຄວາມສະຖຽນໃນການເທຣນ Neural Networks
ການເທຣນ Deep Neural Networks (DNNs) ສໍາລັບໂປຣເຈັກໃຫຍ່ໆ ມັກຈະພົບກັບແນວໂນ້ມຂອງ Loss ທີ່ຫຼຸດລົງຊ້າ ຫຼື ບາງຄັ້ງກໍບໍ່ລູ່ເຂົ້າຫາຈຸດຕໍ່າສຸດ (Convergence) ເລີຍ. ໃນແວດວົງຂອງ AI ຂັ້ນສູງ, ໜຶ່ງໃນເຕັກນິກການແກ້ໄຂບັນຫານີ້ທີ່ຊົງພະລັງທີ່ສຸດກໍຄື Batch Normalization (BN).
ລອງນຶກພາບເຖິງການຈັດການຈະລາຈອນຢູ່ສີ່ແຍກໄຟແດງໃນນະຄອນຫຼວງວຽງຈັນ ໃນຊົ່ວໂມງເລັ່ງດ່ວນ. ຖ້າປະລິມານລົດຍົນ (Activations) ທີ່ປ່ອຍອອກມາຈາກສີ່ແຍກກ່ອນໜ້າ (Previous Layers) ບໍ່ມີຄວາມສະໝໍ່າສະເໝີ ດຽວມາກໜ້ອຍ ດຽວມາໄວ ດຽວມາຊ້າ (Internal Covariate Shift), ຕໍາຫຼວດຈະລາຈອນຢູ່ສີ່ແຍກຕໍ່ໄປກໍຈະເຮັດວຽກຍາກ ແລະ ບໍ່ສາມາດປັບຈັງຫວະໄຟແດງໄດ້ທັນ. Batch Normalization ປຽບເໝືອນລະບົບຈະລາຈອນອັດສະລິຍະໃນທຸກໆ ສີ່ແຍກ ທີ່ຊ່ວຍຈັດລະບຽບການໄຫຼຂອງລົດໃຫ້ມີຄວາມສະໝໍ່າສະເໝີ, ເຮັດໃຫ້ການຈາລະຈອນລວມທັງໝົດລ່ຽນໄຫຼໄດ້ໄວຂຶ້ນ.
ໃນບົດຄວາມນີ້, ເຮົາຈະມາເຈາະເລິກເຖິງເບື້ອງຫຼັງທາງຄະນິດສາດ ແລະ ການນຳໃຊ້ Batch Normalization ເພື່ອປັບປຸງການເທຣນໂມເດລຂອງທ່ານໃຫ້ມີປະສິດທິພາບ.
ບັນຫາ Internal Covariate Shift (ICS)
ໃນຂະນະທີ່ Neural Network ກໍາລັງຮຽນຮູ້, Weight ຂອງ Layer ທໍາອິດຈະຖືກປັບປ່ຽນ. ການປັບປ່ຽນນີ້ຈະສົ່ງຜົນໃຫ້ການກະຈາຍຕົວ (Distribution) ຂອງຂໍ້ມູນ Output ທີ່ສົ່ງໄປຫາ Layer ຕໍ່ໄປປ່ຽນແປງຕາມໄປນຳ. ເມື່ອເຄືອຂ່າຍມີຄວາມເລິກ (Deep) ຫຼາຍຂຶ້ນ, ການປ່ຽນແປງນີ້ຈະຖືກຂະຫຍາຍໃຫ້ໃຫຍ່ຂຶ້ນກວ່າເກົ່າ. ເຮົາເອີ້ນປະກົດການນີ້ວ່າ Internal Covariate Shift.
ຜົນກະທົບຄື: Layer ຕ່າງໆ ທີ່ຢູ່ເລິກລົງໄປ ຈະຕ້ອງປັບຕົວເຂົ້າກັບການປ່ຽນແປງຂອງຂໍ້ມູນທີ່ເຂົ້າມາໃໝ່ຢູ່ຕະຫຼອດເວລາ (Non-stationary inputs), ເຮັດໃຫ້ເຮົາບໍ່ສາມາດຕັ້ງຄ່າ Learning Rate ໃຫ້ສູງໄດ້ ແລະ ໃຊ້ເວລາໃນການເທຣນດົນຂຶ້ນຢ່າງມະຫາສານ.
ກົນໄກທາງຄະນິດສາດຂອງ Batch Normalization
Batch Normalization ຈະເຮັດການແກ້ໄຂບັນຫານີ້ໂດຍການປັບຄ່າ (Normalize) ຂໍ້ມູນທີ່ສົ່ງອອກມາໃນແຕ່ລະ Mini-batch ໃຫ້ມີຄ່າສະເລ່ຍ (Mean) ເປັນ 0 ແລະ ຄ່າຜັນປ່ຽນມາດຕະຖານ (Variance) ເປັນ 1.
ຂັ້ນຕອນສຳລັບ Mini-batch ປະກອບມີ 4 ຂັ້ນຕອນດັ່ງນີ້:
-
ຄິດໄລ່ Mini-batch Mean:
-
ຄິດໄລ່ Mini-batch Variance:
-
Normalize (ປັບຄ່າມາດຕະຖານ): (ຄ່າ ຖືກສະແດງໄວ້ເພື່ອປ້ອງກັນການຫານດ້ວຍສູນ)
-
Scale and Shift (ຮຽນຮູ້ການປັບສະເກວ):
ຈຸດສຳຄັນທີ່ສຸດຄືສົມຜົນທີ 4. ໂມເດລຈະມີພາຣາມິເຕີທີ່ສາມາດຮຽນຮູ້ໄດ້ (Learnable Parameters) ຄື (Scale) ແລະ (Shift). ຖ້າ Network ພົບວ່າການ Normalize ຂໍ້ມູນເຮັດໃຫ້ປະສິດທິພາບຫຼຸດລົງ, ມັນສາມາດປັບຄ່າ ແລະ ເພື່ອຄືນສະພາບຂໍ້ມູນໃຫ້ກັບໄປເປັນແບບເດີມໄດ້! ຈຸດນີ້ຊ່ວຍເພີ່ມຄວາມຢືດຍຸ່ນໃຫ້ກັບ Network ຂັ້ນສຸດ.
ການຂຽນໂຄດຕົວຈິງດ້ວຍ PyTorch: ໂມເດລພະຍາກອນຜົນຜະລິດກາເຟປາກຊ່ອງ
ລອງມາເບິ່ງການນຳໃຊ້ໃນສະຖານະການຕົວຈິງ. ສົມມຸດວ່າເຮົາກຳລັງສ້າງ Deep Learning ໂມເດລ ເພື່ອພະຍາກອນຜົນຜະລິດກາເຟຢູ່ເມືອງປາກຊ່ອງ ໂດຍໃຊ້ຂໍ້ມູນເຊັ່ນ: ອຸນຫະພູມ, ລະດັບຄວາມຊຸ່ມ, pH ຂອງດິນ, ແລະ ປະລິມານນໍ້າຝົນ. ເນື່ອງຈາກຄຸນລັກສະນະເຫຼົ່ານີ້ມີ Scale ທີ່ແຕກຕ່າງກັນຫຼວງຫຼາຍ, ການໃຊ້ BatchNorm ຈຶ່ງເຂົ້າບົດບາດສຳຄັນ.
import torch
import torch.nn as nn
class PaksongCoffeeYieldPredictor(nn.Module):
def __init__(self, input_dim):
super(PaksongCoffeeYieldPredictor, self).__init__()
# Layer 1
self.fc1 = nn.Linear(input_dim, 256)
# ການໃສ່ Batch Normalization ຫຼັງຈາກ Linear layer ກ່ອນ Activation function
self.bn1 = nn.BatchNorm1d(256)
self.relu1 = nn.ReLU()
# Layer 2
self.fc2 = nn.Linear(256, 128)
self.bn2 = nn.BatchNorm1d(128)
self.relu2 = nn.ReLU()
# Output Layer
self.fc3 = nn.Linear(128, 1)
def forward(self, x):
# Forward pass ຜ່ານ Layer 1
out = self.fc1(x)
out = self.bn1(out) # ປັບຂໍ້ມູນໃຫ້ສະຖຽນກ່ອນເຂົ້າ ReLU
out = self.relu1(out)
# Forward pass ຜ່ານ Layer 2
out = self.fc2(out)
out = self.bn2(out)
out = self.relu2(out)
# ພະຍາກອນຜົນຜະລິດ
out = self.fc3(out)
return out
# ທົດສອບສ້າງໂມເດລ ໂດຍມີ 4 Features ຫຼັກ
model = PaksongCoffeeYieldPredictor(input_dim=4)
print(model)
ຂໍ້ສັງເກດ: ຕາມຫຼັກການດັ້ງເດີມ, ການວາງຕຳແໜ່ງຂອງ Batch Normalization ແມ່ນຈະວາງໄວ້ຫຼັງຈາກ Linear (ຫຼື Convolution) layer ແຕ່ກ່ອນທີ່ຈະເຂົ້າ Activation Function (ເຊັ່ນ: ReLU).
ຂໍ້ດີ ແລະ ຜົນກະທົບຕໍ່ Loss Landscape
ໃນມຸມມອງທາງຄະນິດສາດລະດັບສູງ (Advanced Perspective), Batch Normalization ບໍ່ພຽງແຕ່ແກ້ບັນຫາ Internal Covariate Shift ເທົ່ານັ້ນ, ແຕ່ເຫດຜົນຫຼັກທີ່ມັນເຮັດໃຫ້ໂມເດລເທຣນໄດ້ໄວ ແມ່ນການສ້າງຄວາມລຽບນຽນໃຫ້ກັບ Loss Landscape.
- ການປັບພື້ນທີ່ Optimization ໃຫ້ລຽບຂຶ້ນ: ມັນເຮັດໃຫ້ Gradients ມີຄວາມສະຖຽນຫຼາຍຂຶ້ນ (Lipschitz continuous gradients) ເຊິ່ງປ້ອງກັນບໍ່ໃຫ້ເກີດບັນຫາ Vanishing ຫຼື Exploding Gradients.
- ສາມາດໃຊ້ Higher Learning Rates: ຍ້ອນວ່າ Loss Landscape ລຽບຂຶ້ນແລະຄາດເດົາໄດ້ຫຼາຍຂຶ້ນ, ທ່ານຈຶ່ງສາມາດເພີ່ມຄ່າ Learning Rate ໃຫ້ສູງກວ່າປົກກະຕິໄດ້, ຊ່ວຍໃຫ້ໂມເດລຮຽນຮູ້ໄດ້ໄວຂຶ້ນ.
- ຜົນກະທົບທາງອ້ອມໃນການສ້າງ Regularization: ການໃຊ້ Mini-batch ເຮັດໃຫ້ມີການເພີ່ມສຽງລົບກວນ (Noise) ບາງຢ່າງເຂົ້າໄປໃນ Mean ແລະ Variance ແຕ່ລະຮອບ. ສິ່ງນີ້ເຮັດໜ້າທີ່ຄ້າຍຄືກັບ Regularization ອ່ອນໆ ທີ່ຊ່ວຍຫຼຸດຜ່ອນບັນຫາການຈື່ຈຳໂມເດລ (Overfitting) ໄດ້ໃນລະດັບໜຶ່ງ.
ຈຸດສຳຄັນທີ່ຄວນຈື່ (Key Takeaways)
- Training ໄວຂຶ້ນ: ຊ່ວຍໃຫ້ເຄືອຂ່າຍເຄື່ອນທີ່ສູ່ຈຸດ Optimal ໄວຂຶ້ນຫຼາຍເທົ່າຕົວ.
- ຫຼຸດການເອື່ອຍອີງການຕັ້ງຄ່າເລີ່ມຕົ້ນ (Initialization): ເຮັດໃຫ້ Network ບໍ່ຈຳເປັນຕ້ອງອາໄສການ Initialize weight ທີ່ສົມບູນແບບ.
- ຄຳເຕືອນສຳລັບ Batch Size ຂະໜາດນ້ອຍ: ຖ້າທ່ານໃຊ້ Batch size ນ້ອຍກວ່າ 16, ຄ່າ Mean ແລະ Variance ຈະມີຄວາມຜັນຜວນສູງ ເຊິ່ງອາດເຮັດໃຫ້ປະສິດທິພາບຕົກລົງໄດ້ (ໃນກໍລະນີນີ້ Group Normalization ອາດເປັນທາງເລືອກທີ່ດີກວ່າ).
ບົດສະຫຼຸບ
Batch Normalization ຖືເປັນນະວັດຕະກໍາທາງ Deep Learning ທີ່ຍົກລະດັບປະສິດທິພາບຂອງ Neural Networks ຢ່າງແທ້ຈິງ. ບໍ່ວ່າທ່ານຈະເຮັດໂມເດລ Computer Vision ສໍາລັບກວດຈັບປ້າຍທະບຽນລົດໃນປະເທດ, ການຄາດຄະເນລະດັບນໍ້າຂອງ (Mekong River), ຫຼື ກ່ຽວກັບ Smart Agriculture ໃນພາກໃຕ້ຂອງລາວສະເຕັບການເພີ່ມພຽງ Layer ດຽວເຂົ້າໄປໃນ Architecture ກໍສາມາດຫຼຸດເວລາການເທຣນຈາກຫຼາຍມື້ລົງມາເຫຼືອພຽງບໍ່ເທົ່າໃດຊົ່ວໂມງ. ການເຂົ້າໃຈກົນໄກລວມທັງຄະນິດສາດເບື້ອງຫຼັງ ຈະຊ່ວຍໃຫ້ນັກພັດທະນາ AI ໃນລາວສາມາດປັບແຕ່ງໂມເດລຂັ້ນສູງໄດ້ຢ່າງຊ່ຽວຊານ ແລະ ມີປະສິດທິພາບສູງສຸດ.