ວິທີການເບິ່ງເຫັນພາບ Weights ແລະ Biases ຂອງ Neural Network ດ້ວຍ TensorBoard
ວິທີການເບິ່ງເຫັນພາບ Weights ແລະ Biases ຂອງ Neural Network ດ້ວຍ TensorBoard
ຫຼາຍຄົນມັກຈະປຽບທຽບວ່າ ໂຄງຂ່າຍປະສາດທຽມ (Neural Networks) ແລະ Deep Learning ເປັນຄືກັບ “ກ່ອງດຳ” (Black Box). ເຮົາປ້ອນຂໍ້ມູນເຂົ້າໄປ (ເຊັ່ນ: ຂໍ້ມູນສະພາບອາກາດໃນປາກຊ່ອງ), ໂມເດວທຳການຄຳນວນບາງຢ່າງ, ແລະ ມັນກໍສົ່ງຜົນການຄາດຄະເນອອກມາ (ເຊັ່ນ: ຄຸນນະພາບຂອງເມັດກາເຟ). ແຕ່ສິ່ງທີ່ເກີດຂຶ້ນພາຍໃນກ່ອງນັ້ນມັກຈະເປັນສິ່ງທີ່ເຂົ້າໃຈຍາກສຳລັບນັກພັດທະນາຖ້າບໍ່ມີເຄື່ອງມືທີ່ເໝາະສົມ.
ໃນບົດຄວາມນີ້, ເຮົາຈະມາເປີດກ່ອງດຳນັ້ນອອກ! ສຳລັບນັກພັດທະນາ (Developers) ລະດັບປານກາງທີ່ຄຸ້ນເຄີຍກັບການສ້າງໂມເດວມາແດ່ແລ້ວ, ການເຂົ້າໃຈວິທີການປ່ຽນແປງຂອງ ພາຣາມິເຕີ (Parameters) ພາຍໃນໂມເດວ ເຊັ່ນ: Weights ແລະ Biases ແມ່ນສິ່ງສຳຄັນຫຼາຍໃນການແກ້ໄຂບັນຫາ (Debugging) ແລະ ປັບແຕ່ງໂມເດວໃຫ້ດີຂຶ້ນ. ເຮົາຈະມາໃຊ້ເຄື່ອງມືທີ່ຊື່ວ່າ TensorBoard ຮ່ວມກັບ PyTorch ເພື່ອເບິ່ງພາຍໃນໂມເດວກັນ.
ທົບທວນກັນໜ້ອຍໜຶ່ງ: Weights ແລະ Biases ແມ່ນຫຍັງ?
ຊັ້ນເຊື່ອງ (Hidden Layers) ຂອງ Neural Network ປະກອບດ້ວຍໂນດ (Nodes) ທີ່ເຊື່ອມຕໍ່ກັນ, ເຊິ່ງແຕ່ລະການເຊື່ອມຕໍ່ຈະມີຄ່າທີ່ເອີ້ນວ່າ:
- Weights (ນໍ້າໜັກ): ເປັນຕົວບອກເຖິງ “ຄວາມສຳຄັນ” ຂອງຂໍ້ມູນທີ່ເຂົ້າມາ. ຕົວຢ່າງ: ຖ້າເຮົາກຳລັງຄາດຄະເນຄຸນນະພາບກາເຟປາກຊ່ອງ, Weight ທີ່ຕິດກັບໂຕປ່ຽນ “ລະດັບຄວາມສູງຈາກໜ້ານໍ້າທະເລ” ອາດຈະມີຄ່າສູງຫຼາຍ ເພາະມັນມີຜົນຕໍ່ລົດຊາດກາເຟໂດຍກົງ.
- Biases (ຄ່າອຽງ): ເປັນຄ່າພື້ນຖານທີ່ຊ່ວຍປັບ (Shift) ຜົນຮັບຂອງການຄຳນວນກ່ອນຈະສົ່ງຜ່ານ Activation Function. ເພື່ອໃຫ້ໂມເດວມີຄວາມຍືດຫຍຸ່ນຫຼາຍຂຶ້ນໃນການຮຽນຮູ້.
ເປັນຫຍັງເຮົາຈຶ່ງຕ້ອງເບິ່ງເຫັນພາບ (Visualize) ພວກມັນ?
ການເບິ່ງພຽງແຕ່ຄ່າ Loss ຫຼື Accuracy ບາງຄັ້ງອາດບໍ່ພຽງພໍ. ການເບິ່ງເຫັນການກະຈາຍຕົວທີເປັນຮູບແບບຮິສໂຕແກຣມ (Histogram) ຂອງ Weights ແລະ Biases ຈະຊ່ວຍໃຫ້ເຮົາສັງເກດເຫັນບັນຫາເຊັ່ນ:
- Vanishing Gradients: ເມື່ອ Weights ກາຍເປັນ 0 ໝົດ, ໂມເດວຈະຢຸດການຮຽນຮູ້.
- Exploding Gradients: ເມື່ອ Weights ມີຄ່າໃຫຍ່ຜິດປົກກະຕິ ຈົນເຮັດໃຫ້ໂມເດວບໍ່ສະຖຽນລົງ (NaN).
- Dead Neurons: ເມື່ອຄ່າ Biases ຖືກຕັ້ງໃຫ້ຕິດລົບຫຼາຍເກີນໄປ (ໂດຍສະເພາະເມື່ອໃຊ້ ReLU) ເຮັດໃຫ້ Nodes ເຫຼົ່ານັ້ນບໍ່ເຄີຍຖືກເປີດນຳໃຊ້.
ລົງມືປະຕິບັດ: ການໃຊ້ TensorBoard ໃນ PyTorch
ລອງມາຈິນຕະນາການວ່າ ເຮົາກຳລັງສ້າງໂມເດວໃຫ້ກັບບໍລິສັດ SME ທີ່ສົ່ງອອກກາເຟໃນພາກໃຕ້ຂອງລາວ. ເຮົາວາງໂຄງສ້າງເຄືອຂ່າຍປະສາດທຽມ (Neural Network) ແບບງ່າຍໆ ເພື່ອວິເຄາະຂໍ້ມູນ, ແລະ ນີ້ຄືວິທີທີ່ເຮົາຈະດຶງຄ່າ Weights/Biases ອອກມາເບິ່ງດ້ວຍ SummaryWriter.
ຂັ້ນຕອນທີ 1: ສ້າງ Model ແລະ Setup TensorBoard
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.tensorboard import SummaryWriter
# ໂມເດວຄາດຄະເນຄຸນນະພາບກາເຟປາກຊ່ອງ (PaksongCoffeeNet)
class PaksongCoffeeNet(nn.Module):
def __init__(self):
super(PaksongCoffeeNet, self).__init__()
# Input: ລະດັບຄວາມສູງ, ປະລິມານນໍ້າຝົນ, ອຸນຫະພູມ
self.fc1 = nn.Linear(3, 16)
self.fc2 = nn.Linear(16, 8)
self.fc3 = nn.Linear(8, 1) # Output: ຄະແນນຄຸນນະພາບ (Quality Score)
self.relu = nn.ReLU()
def forward(self, x):
x = self.relu(self.fc1(x))
x = self.relu(self.fc2(x))
return self.fc3(x)
# ສ້າງ Instant ຂອງໂມເດວ
model = PaksongCoffeeNet()
# ກະກຽມ TensorBoard writer ໂດຍການລະບຸໂຟນເດີທີ່ຈະເກັບ Log
writer = SummaryWriter('runs/paksong_coffee_experiment')
ຂັ້ນຕອນທີ 2: ການ Training Loop ແລະ ບັນທຶກຄ່າ (Logging)
ທຸກໆຄັ້ງທີ່ໂມເດວທຳການ Update, ເຮົາຢາກຈະບັນທຶກຄ່າການກະຈາຍຕົວຂອງ Weights ໄວ້. ເຮົາໃຊ້ add_histogram() ຂອງ TensorBoard.
optimizer = optim.SGD(model.parameters(), lr=0.01)
criterion = nn.MSELoss()
for epoch in range(200):
# ຈຳລອງຂໍ້ມູນ (Dummy Data) ສຳລັບການ Train
inputs = torch.randn(20, 3) # 20 ຕົວຢ່າງ, 3 features
targets = torch.randn(20, 1)
# Forward & Backward Pass ຕາມປົກກະຕິ
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, targets)
loss.backward()
optimizer.step()
# --- ສ່ວນສຳຄັນ ---
# ບັນທຶກ Weights, Biases ແລະ Gradients ລົງໃນ TensorBoard ທຸກໆ 10 epochs
if epoch % 10 == 0:
for name, param in model.named_parameters():
# ບັນທຶກ Histogram ຂອງ Weights/Biases ປັດຈຸບັນ
writer.add_histogram(name, param.data, epoch)
# ບັນທຶກ Histogram ຂອງ Gradients ຖ້າມີການປ່ຽນແປງ
if param.grad is not None:
writer.add_histogram(f'{name}.grad', param.grad, epoch)
# ບັນທຶກຄ່າ Loss ເພື່ອເບິ່ງກຣາຟ
writer.add_scalar('Training/Loss', loss.item(), epoch)
# ປິດ Writer ເມື່ອຮຽນຮູ້ສຳເລັດ
writer.close()
ຂັ້ນຕອນທີ 3: ເປີດເບິ່ງ TensorBoard
ຫຼັງຈາກທີ່ Code ເຮັດວຽກສຳເລັດ, ໃຫ້ທ່ານເປີດ Terminal (ຫຼື Command Prompt) ໃນໂຟນເດີດຽວກັນແລ້ວພິມຄຳສັ່ງ:
tensorboard --logdir=runs
ຈາກນັ້ນໃຫ້ເປີດ Browser ຂຶ້ນມາແລ້ວເຂົ້າໄປທີ່ http://localhost:6006/. ເມື່ອເຂົ້າໄປໃນແຖບ Histograms ຫຼື Distributions, ທ່ານຈະເຫັນແຜນວາດທີ່ສະແດງໃຫ້ເຫັນການປ່ຽນແປງຂອງ Layer fc1, fc2 ແລະ fc3.
ວິທີການຕີຄວາມໝາຍຈາກຮິສໂຕແກຣມ (Histogram)
ເມື່ອທ່ານເຫັນກຣາຟໃນ TensorBoard ແລ້ວ ຄວນສັງເກດຫຍັງແດ່?
- ການກະຈາຍຕົວທີ່ດີ (Healthy Distribution): ຮິສໂຕແກຣມຂອງ Weights ຄວນຈະຄ່ອຍໆປ່ຽນແປງໄປຕາມຮອບ Epochs, ສະແດງໃຫ້ເຫັນວ່າໂມເດວກຳລັງຮຽນຮູ້ຢ່າງຕໍ່ເນື່ອງໃນແຕ່ລະຊັ້ນ (Layers). ມັນບໍ່ຄວນກະຈຸກຢູ່ຈຸດດຽວທັງໝົດ.
- ກຣາຟເປັນຮູບເຫຼັມ (Spiky around Zero): ຖ້າຈູ່ໆນ້ຳໜັກໄປຮວມກັນຢູ່ທີ່ເລກ 0 ນັ້ນສະແດງວ່າໂມເດວຂອງທ່ານອາດຈະເຈິບັນຫາ Dead Neurons ἢ Vanishing Gradients ແລ້ວ (ໂມເດວບໍ່ຍອມຮຽນຮູ້ຫຍັງເພີ່ມ!). ການເພີ່ມຄ່າ Learning Rate ຫຼື ປ່ຽນ Activation Function ອາດຈະຊ່ວຍໄດ້.
- ກຣາຟແບນ ແລະ ກວ້າງອອກຫຼາຍ (Expanding Wildly): ຖ້າຄ່ານ້ຳໜັກຂະຫຍາຍຕົວອອກໄປຮອດຫຼັກຮ້ອຍຫຼັກພັນ, ສະແດງວ່າທ່ານອາດຈະກຳລັງເຜະຊີນກັບ Exploding Gradients. ການເຮັດ Gradient Clipping ຫຼື ການ Normalized ຂໍ້ມູນອາກາດກາເຟກ່ອນປ້ອນເຂົ້າມາຈະເປັນການແກ້ໄຂທີ່ດີ.
ສິ່ງທີ່ຄວນຈື່ (Key Takeaways)
- AI ບໍ່ຈຳເປັນຕ້ອງເປັນ Black box ສະເໝີໄປ. ການຕິດຕາມພາຣາມິເຕີເຮັດໃຫ້ເຮົາວິເຄາະບັນຫາໄດ້ເລິກເຊິ່ງກວ່າການເບິ່ງແຕ່ຄ່າ Loss.
- TensorBoard
add_histogramແມ່ນຟັງຊັນທີ່ຊົງພະລັງທີ່ສຸດສຳລັບການເບິ່ງນໍ້າໜັກ (Weights) ແລະ ຄ່າອຽງ (Biases). - ການເຝົ້າລະວັງ Gradients ໃນແຕ່ລະ Layer ຈະຊ່ວຍໃຫ້ເຮົາຮູ້ໄດ້ວ່າ ສະຖາປັດຕະຍະກຳທີ່ເຮົາອອກແບບນັ້ນເລິກເກີນໄປມັກຈະເຮັດໃຫ້ຂໍ້ມູນຫາຍລົງກາງທາງ ຫຼື ບໍ່.
ສະຫຼຸບ
ສຳລັບນັກພັດທະນາໃນລາວ ທີ່ກຳລັງນຳໃຊ້ Machine Learning ເຂົ້າມາຊ່ວຍແກ້ໄຂບັນຫາໃນຊີວິດຈິງ ບໍ່ວ່າຈະເປັນການກວດຈັບພະຍາດພືດ, ລະບົບແນະນຳສິນຄ້າ, ຫຼື ການເກັບກຳຂໍ້ມູນກະສິກຳ; ການສ້າງໂມເດວໃຫ້ແລ່ນໄດ້ເປັນພຽງກ້າວທຳອິດເທົ່ານັ້ນ. ການໃຊ້ເຄື່ອງມືເຊັ່ນ TensorBoard ເພື່ອ “ແນມທະລຸ” ເຂົ້າໄປເບິ່ງພາຍໃນ Weights ແລະ Biases ຈະຍົກລະດັບທັກສະການປັບແຕ່ງ (Tuning) ໂມເດວຂອງທ່ານໃຫ້ມີຄວາມໝັ້ນຄົງ, ແມ່ນຢຳ, ແລະ ແກ້ໄຂບັນຫາໄດ້ຢ່າງຖືກຈຸດຫຼາຍຂຶ້ນ. ເທື່ອໜ້າທີ່ທົດລອງ Train AI ຢ່າລືມລອງວາດພາບນໍ້າໜັກໂມເດວຂອງທ່ານເບິ່ງ!