Doctor AI

Dr. Savath Saypadith

240 ບົດຄວາມ

Batch Normalization: ວິທີເລັ່ງຄວາມໄວ ແລະ ສ້າງຄວາມສະຖຽນໃນການເທຣນ Neural Networks

ໂພສເມື່ອ # Deep Learning # Optimization # 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 B={x1,x2,...,xm}\mathcal{B} = \{x_1, x_2, ..., x_m\} ປະກອບມີ 4 ຂັ້ນຕອນດັ່ງນີ້:

  1. ຄິດໄລ່ Mini-batch Mean: μB=1mi=1mxi\mu_{\mathcal{B}} = \frac{1}{m} \sum_{i=1}^{m} x_i

  2. ຄິດໄລ່ Mini-batch Variance: σB2=1mi=1m(xiμB)2\sigma^2_{\mathcal{B}} = \frac{1}{m} \sum_{i=1}^{m} (x_i - \mu_{\mathcal{B}})^2

  3. Normalize (ປັບຄ່າມາດຕະຖານ): x^i=xiμBσB2+ϵ\hat{x}_i = \frac{x_i - \mu_{\mathcal{B}}}{\sqrt{\sigma^2_{\mathcal{B}} + \epsilon}} (ຄ່າ ϵ\epsilon ຖືກສະແດງໄວ້ເພື່ອປ້ອງກັນການຫານດ້ວຍສູນ)

  4. Scale and Shift (ຮຽນຮູ້ການປັບສະເກວ): yi=γx^i+βy_i = \gamma \hat{x}_i + \beta

ຈຸດສຳຄັນທີ່ສຸດຄືສົມຜົນທີ 4. ໂມເດລຈະມີພາຣາມິເຕີທີ່ສາມາດຮຽນຮູ້ໄດ້ (Learnable Parameters) ຄື γ\gamma (Scale) ແລະ β\beta (Shift). ຖ້າ Network ພົບວ່າການ Normalize ຂໍ້ມູນເຮັດໃຫ້ປະສິດທິພາບຫຼຸດລົງ, ມັນສາມາດປັບຄ່າ γ\gamma ແລະ β\beta ເພື່ອຄືນສະພາບຂໍ້ມູນໃຫ້ກັບໄປເປັນແບບເດີມໄດ້! ຈຸດນີ້ຊ່ວຍເພີ່ມຄວາມຢືດຍຸ່ນໃຫ້ກັບ 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.

ຈຸດສຳຄັນທີ່ຄວນຈື່ (Key Takeaways)

ບົດສະຫຼຸບ

Batch Normalization ຖືເປັນນະວັດຕະກໍາທາງ Deep Learning ທີ່ຍົກລະດັບປະສິດທິພາບຂອງ Neural Networks ຢ່າງແທ້ຈິງ. ບໍ່ວ່າທ່ານຈະເຮັດໂມເດລ Computer Vision ສໍາລັບກວດຈັບປ້າຍທະບຽນລົດໃນປະເທດ, ການຄາດຄະເນລະດັບນໍ້າຂອງ (Mekong River), ຫຼື ກ່ຽວກັບ Smart Agriculture ໃນພາກໃຕ້ຂອງລາວສະເຕັບການເພີ່ມພຽງ Layer ດຽວເຂົ້າໄປໃນ Architecture ກໍສາມາດຫຼຸດເວລາການເທຣນຈາກຫຼາຍມື້ລົງມາເຫຼືອພຽງບໍ່ເທົ່າໃດຊົ່ວໂມງ. ການເຂົ້າໃຈກົນໄກລວມທັງຄະນິດສາດເບື້ອງຫຼັງ ຈະຊ່ວຍໃຫ້ນັກພັດທະນາ AI ໃນລາວສາມາດປັບແຕ່ງໂມເດລຂັ້ນສູງໄດ້ຢ່າງຊ່ຽວຊານ ແລະ ມີປະສິດທິພາບສູງສຸດ.