ອະທິບາຍ Activation Functions: ReLU, Sigmoid, ແລະ Tanh
ອະທິບາຍ Activation Functions: ຄວນເລືອກໃຊ້ ReLU, Sigmoid ຫຼື Tanh?
ສະບາຍດີນັກພັດທະນາ ແລະ ຜູ້ທີ່ສົນໃຈໃນດ້ານ AI ທຸກທ່ານ! ຖ້າທ່ານເຄີຍສ້າງໂຄງຂ່າຍປະສາດທຽມ (Neural Networks) ມາແດ່ແລ້ວ, ທ່ານຄົງຈະເຄີຍເຫັນຄຳວ່າ “Activation Function” ຜ່ານຕາແນ່ນອນ. ແຕ່ເຄີຍສົງໄສບໍ່ວ່າ ເປັນຫຍັງເຮົາຈຶ່ງຕ້ອງມີມັນ? ແລະ ລະຫວ່າງ ReLU, Sigmoid, ກັບ Tanh ເຮົາຄວນເລືອກໃຊ້ຕົວໃດໃນສະຖານະການໃດ?
ໃນບົດຄວາມນີ້, ເຮົາຈະມາເຈາະເລິກທາງດ້ານເຕັກນິກຂອງ Activation Functions ເຫຼົ່ານີ້, ພ້ອມກັບຍົກຕົວຢ່າງການນຳໃຊ້ຈິງໃນບໍລິບົດຂອງປະເທດລາວ ເຊັ່ນ: ການສ້າງໂມເດວທຳນາຍລາຄາກາເຟປາກຊ່ອງ ຫຼື ການວິເຄາະລະດັບນ້ຳຂອງ.
Activation Function ແມ່ນຫຍັງ ແລະ ເປັນຫຍັງຈຶ່ງສຳຄັນ?
ໃນ Neural Network, ຂໍ້ມູນຈະຖືກສົ່ງຜ່ານຊັ້ນຕ່າງໆ (Layers). ຖ້າເຮົາຄູນຄ່ານ້ຳໜັກ (Weights) ແລະ ບວກຄ່າອະຄະຕິ (Bias) ໄປເລື້ອຍໆໂດຍບໍ່ມີ Activation Function, ໂມເດວຂອງທ່ານກໍຈະເປັນພຽງສົມຜົນເສັ້ນຊື່ (Linear Regression) ທຳມະດາ, ບໍ່ວ່າຈະມີຈຳນວນຊັ້ນ (Hidden Layers) ຫຼາຍປານໃດກໍຕາມ.
Activation Function ເປັນຕົວເພີ່ມ Non-linearity (ຄວາມບໍ່ເປັນເສັ້ນຊື່) ເຂົ້າໄປໃນຄະນິດສາດຂອງເຄືອຂ່າຍ ເຊິ່ງປຽບເໝືອນກັບການຕັດສິນໃຈຂອງພະນັກງານກວດປີ້ລົດໄຟລາວ-ຈີນ ວ່າຈະໃຫ້ຜູ້ໂດຍສານຜ່ານເຂົ້າໄປໄດ້ຫຼືບໍ່ (ສົ່ງສັນຍານຕໍ່ໄປ ຫຼື ຢຸດໄວ້). ມັນຊ່ວຍໃຫ້ໂມເດວສາມາດຮຽນຮູ້ຮູບແບບທີ່ຊັບຊ້ອນໄດ້.
1. Sigmoid Function (ຊິກມອຍ)
Sigmoid ເປັນຟັງຊັນທີ່ເກົ່າແກ່ ແລະ ໜ້າຈະເປັນທີ່ຮູ້ຈັກຫຼາຍທີ່ສຸດ. ມັນຈະປ່ຽນທຸກໆຄ່າອິນພຸດໃຫ້ກາຍເປັນຄ່າທີ່ຢູ່ລະຫວ່າງ 0 ຫາ 1.
- ສົມຜົນທາງຄະນິດສາດ:
- ຊ່ວງຂອງຄ່າ (Range): ຂອບເຂດແມ່ນ
ການນຳໃຊ້ໃນບໍລິບົດຕົວຈິງ: ຖ້າທ່ານກຳລັງສ້າງໂມເດວ Binary Classification ທີ່ຈະທຳນາຍວ່າ “ມື້ນີ້ຝົນຈະຕົກຢູ່ຊ່ວງນະຄອນຫຼວງວຽງຈັນຫຼືບໍ່?” ຄຳຕອບຄື “ຕົກ (1)” ຫຼື “ບໍ່ຕົກ (0)“. Sigmoid ຈະປ່ຽນຜົນລັບສຸດທ້າຍໃຫ້ກາຍເປັນເປີເຊັນຄວາມເປັນໄປໄດ້ ເຊັ່ນ: 0.85 (ໝາຍຄວາມວ່າມີໂອກາດ 85% ທີ່ຝົນຈະຕົກ). ສະນັ້ນ, Sigmoid ຈຶ່ງເໝາະສົມທີ່ສຸດສຳລັບ Output Layer ຂອງ Binary Classification.
ຂໍ້ຄວນລະວັງ: ບັນຫາໃຫຍ່ຂອງ Sigmoid ຄື “Vanishing Gradient” (ບັນຫາ Gradient ຫາຍໄປ). ຖ້າຄ່າ ມີຂະໜາດໃຫຍ່ເກີນໄປ ຫຼື ນ້ອຍເກີນໄປ, ຄວາມຊັນ (Gradient) ຈະກາຍເປັນ 0, ເຮັດໃຫ້ໂມເດວຢຸດການຮຽນຮູ້ໃນຊັ້ນ Hidden Layers ອື່ນໆ.
2. Tanh Function (ໄຮເປີໂບລິກ ແທນເຈັນ)
Tanh ມີລັກສະນະຄ້າຍຄືກັບ Sigmoid ແຕ່ມັນເປັນການຂະຫຍາຍຊ່ວງຄ່າໃຫ້ກວ້າງຂຶ້ນ ແລະ ມີຈຸດສູນກາງຢູ່ທີ່ 0.
- ສົມຜົນທາງຄະນິດສາດ:
- ຊ່ວງຂອງຄ່າ (Range): ຂອບເຂດແມ່ນ
ການນຳໃຊ້ໃນບໍລິບົດຕົວຈິງ: ສົມມຸດວ່າທ່ານກຳລັງສ້າງໂມເດວ NLP ເພື່ອວິເຄາະຄວາມຮູ້ສຶກ (Sentiment Analysis) ຂອງຄອມເມັ້ນໃນ Facebook ກ່ຽວກັບງານບຸນທາດຫຼວງ. ຄ່າທີໄດ້ອາດເປັນ “ລົບໜ້ອຍທີ່ສຸດ (-1)” ຈົນເຖິງ “ບວກຫຼາຍທີ່ສຸດ (1)“. Tanh ມັກຈະເຮັດວຽກໄດ້ດີກວ່າ Sigmoid ໃນ Hidden Layers ເພາະຄ່າສະເລ່ຍຂອງມັນຢູ່ໃກ້ 0, ຊ່ວຍໃຫ້ຂໍ້ມູນຖືກປັບໃຫ້ເປັນສູນກາງ (Zero-centered) ເຊິ່ງເຮັດໃຫ້ Optimization algorithm ເຮັດວຽກໄດ້ງ່າຍຂຶ້ນ.
ຂໍ້ຄວນລະວັງ: Tanh ຍັງຄົງມີບັນຫາ Vanishing Gradient ເຊັ່ນດຽວກັບ Sigmoid ເມື່ອຄ່າມີຂະໜາດໃຫຍ່ຫຼາຍ.
3. ReLU (Rectified Linear Unit)
ໃນປັດຈຸບັນ, ReLU ແມ່ນ Activation Function ທີ່ໄດ້ຮັບຄວາມນິຍົມສູງສຸດ ສຳລັບ Deep Learning ແລະ ເປັນຄ່າເລີ່ມຕົ້ນ (Default) ຮູບແບບມາດຕະຖານ ສຳລັບຊັ້ນ Hidden Layers ເກືອບທຸກປະເພດ.
- ສົມຜົນທາງຄະນິດສາດ:
- ຊ່ວງຂອງຄ່າ (Range): ຂອບເຂດແມ່ນ
ຄວາມໝາຍຄື: ຖ້າຄ່າອິນພຸດຕິດລົບ ມັນຈະປ່ຽນເປັນ 0 ທັນທີ ແຕ່ຖ້າຄ່າເປັນບວກ ມັນກໍຈະສົ່ງຄ່ານັ້ນຕໍ່ໄປເລີຍ.
ການນຳໃຊ້ໃນບໍລິບົດຕົວຈິງ: ເນື່ອງຈາກມູນຄ່າຕົວຈິງໃນບາງສະຖານະການບໍ່ສາມາດຕິດລົບໄດ້, ເຊັ່ນ: ການທຳນາຍ “ປະລິມານຜົນຜະລິດກາເຟຢູ່ປາກຊ່ອງ (ໂຕນ)“. ການໃຊ້ ReLU ໃນ Hidden Layers ຈະຊ່ວຍໃຫ້ການຄິດໄລ່ໄວຂຶ້ນຫຼາຍ (ເພາະບໍ່ມີ ໃຫ້ຕ້ອງຄິດໄລ່). ທີ່ສຳຄັນ, ມັນຊ່ວຍແກ້ບັນຫາ Vanishing Gradient ສຳລັບຄ່າທີ່ເປັນບວກ, ເຮັດໃຫ້ເຮົາສາມາດສ້າງ Neural Network ທີ່ມີຄວາມເລິກ (Deep) ໄດ້ຫຼາຍຂຶ້ນ.
ຂໍ້ຄວນລະວັງ: ບັນຫາ “Dying ReLU” ໝາຍຄວາມວ່າຖ້າ Node ໃດໜຶ່ງໄດ້ຮັບຄ່າຕິດລົບຕະຫຼອດ ມັນຈະປ່ຽນເປັນ 0 ສະເໝີ, ເຮັດໃຫ້ Gradient ເປັນ 0 ຕະຫຼອດໄປ. ວິທີແກ້ອາດຈະຕ້ອງລອງພິຈາລະນາໃຊ້ Leaky ReLU ແທນ.
ຕົວຢ່າງໃນການຂຽນໂຄດດ້ວຍ PyTorch
ເພື່ອໃຫ້ເຫັນພາບທີ່ຊັດເຈນຂຶ້ນ, ລອງມາເບິ່ງວິທີການສ້າງໂຄງຂ່າຍປະສາດທຽມລຸ້ນງ່າຍໆ ທີ່ນຳໃຊ້ທັງສາມ Activation Function ຮ່ວມກັນໃນ PyTorch.
import torch
import torch.nn as nn
class PaksongCoffeePredictor(nn.Module):
def __init__(self):
super(PaksongCoffeePredictor, self).__init__()
# ກຳນົດຊັ້ນຂອງເຄືອຂ່າຍ (Layers)
self.layer1 = nn.Linear(in_features=10, out_features=64)
self.layer2 = nn.Linear(in_features=64, out_features=32)
self.output_layer = nn.Linear(in_features=32, out_features=1)
# ກຳນົດ Activation Functions
self.relu = nn.ReLU()
self.tanh = nn.Tanh()
self.sigmoid = nn.Sigmoid()
def forward(self, x):
# ຊັ້ນທີ 1 ໃຊ້ ReLU ເພື່ອຄວາມໄວ ແລະ ແກ້ບັນຫາ Vanishing Gradient
x = self.layer1(x)
x = self.relu(x)
# ຊັ້ນທີ 2 ໃຊ້ Tanh ສໍາລັບຈັດລຽງຄ່າໃຫ້ຢູ່ລະຫວ່າງ -1 ຫາ 1
x = self.layer2(x)
x = self.tanh(x)
# ຊັ້ນຜົນລັບ ໃຊ້ Sigmoid ເểພື່ອທຳນາຍຄວາມເໝາະສົມທີ່ຈະລົງທຶນ (ເປີເຊັນ 0 ຫາ 1)
x = self.output_layer(x)
score = self.sigmoid(x)
return score
# ທົດລອງສ້າງໂມເດວ
model = PaksongCoffeePredictor()
print(model)
ໃນໂຄດຕົວຢ່າງນີ້, ເຮົາຈັດວາງ ReLU ແລະ Tanh ໄວ້ໃນຊັ້ນ Hidden Layers ເພື່ອສະກັດຮູບແບບຂອງຂໍ້ມູນ, ແລະ ໃຊ້ Sigmoid ໃນຊັ້ນສຸດທ້າຍ (Output) ເພື່ອໃຫ້ໄດ້ຜົນລັບເປັນຄວາມໜ້າຈະເປັນ (Probability).
Key Takeaways (ສິ່ງສຳຄັນທີ່ຄວນຈຳ)
- ຢ່າໃຊ້ໂມເດວໂດຍບໍ່ມີ Activation Function: ຖ້າບໍ່ມີມັນ, Neural Network ກໍຄື Linear Regression ດີໆນີ້ເອງ.
- Hidden Layers ຄວນເລີ່ມດ້ວຍ ReLU: ReLU ແມ່ນທາງເລືອກທຳອິດທີ່ດີທີ່ສຸດໃນປັດຈຸບັນ ເພາະຄິດໄລ່ປະມວນຜົນໄວ ແລະ ຝຶກໂມເດວໃນຊັ້ນເລິກໆໄດ້ງ່າຍ.
- Sigmoid ມີໄວ້ສຳລັບ Output: ໃຊ້ Sigmoid ສະເພາະຕອນທີ່ທ່ານຕ້ອງການຜົນລັບເປັນ Binary Classification ເທົ່ານັ້ນ. ການໃຊ້ມັນໃນ Hidden Layers ອາດຈະພາໃຫ້ເກີດບັນຫາ Vanishing Gradient ໄດ້.
- Tanh ໃຊ້ສຳລັບ Zero-centered: ຖ້າຕ້ອງການໃຫ້ຂໍ້ມູນມີຄ່າສະເລ່ຍເປັນສູນ Tanh ຊ່ວຍໄດ້ດີກວ່າ Sigmoid ເລັກນ້ອຍ, ແຕ່ຍັງຄົງຫຼີກລ່ຽງໄດ້ຍາກຈາກບັນຫາລະດັບ Gradient ຕ່ຳ.
ບົດສະຫຼຸບ
ການເລືອກ Activation Function ທີ່ເໝາະສົມແມ່ນຂຶ້ນຢູ່ກັບວ່າ ທ່ານກຳລັງອອກແບບຊັ້ນໃດຂອງໂມເດວ. ການເຂົ້າໃຈຫຼັກການຄະນິດສາດທີ່ຢູ່ເບື້ອງຫຼັງ ຈະຊ່ວຍໃຫ້ວິສະວະກອນ AI ແລະ ນັກພັດທະນາໃນລາວ ສາມາດປັບແຕ່ງ (Tune) ແລະ ອອກແບບໂມເດວໃຫ້ແກ້ໄຂບັນຫາຕົວຈິງພາຍໃນປະເທດໄດ້ຢ່າງຖືກຈຸດ ແລະ ມີປະສິດທິຜົນສູງສຸດ. ຈາກການຄາດຄະເນລະດັບນ້ຳຂອງ ໄປຈົນເຖິງການອ່ານປ້າຍທະບຽນລົດໃນນະຄອນຫຼວງ, Activation Function ລ້ວນແຕ່ເປັນຜູ້ນຳທາງໃຫ້ແກ່ Neural Network ຂອງທ່ານ! ອາດຈະເລີ່ມຕົ້ນດ້ວຍ ReLU ສຳລັບຊັ້ນ Hidden, ແລ້ວຈຶ່ງຄ່ອຍທົດລອງປັບປ່ຽນໄປຕາມສະພາບຂອງໂມເດວໃນພາຍຫຼັງ.