นิวรอนและฟังก์ชันกระตุ้นใน Python
นิวรอนเทียมคือฟังก์ชันเล็ก ๆ มันคูณอินพุตแต่ละตัวด้วยน้ำหนัก บวกไบแอส แล้วส่งผลลัพธ์ผ่านฟังก์ชันกระตุ้นซึ่งตัดสินว่ามันจะ "ทำงาน" แรงแค่ไหน
แนวคิดแบบเข้าใจง่าย
นิวรอนเทียมคือฟังก์ชันเล็ก ๆ มันคูณอินพุตแต่ละตัวด้วยน้ำหนัก บวกไบแอส แล้วส่งผลลัพธ์ผ่านฟังก์ชันกระตุ้นซึ่งตัดสินว่ามันจะ "ทำงาน" แรงแค่ไหน
สร้างนิวรอนเทียมด้วย Python ล้วน: ผลรวมถ่วงน้ำหนักของอินพุตบวกไบแอส แล้วส่งผ่าน sigmoid หรือ ReLU
ประเด็นสำคัญ
- น้ำหนักบอกว่าอินพุตแต่ละตัวสำคัญแค่ไหน ส่วนไบแอสเลื่อนผลลัพธ์ขึ้นหรือลง
- ถ้าไม่มีฟังก์ชันกระตุ้น การซ้อนนิวรอนหลายชั้นก็ยังได้แค่โมเดลเชิงเส้น (เส้นตรง)
- sigmoid ให้ค่าระหว่าง 0 ถึง 1 จึงเหมาะกับความน่าจะเป็น
- ReLU คำนวณเร็วและเป็นตัวเลือกที่ใช้กันทั่วไปในชั้นซ่อนของโครงข่ายสมัยใหม่
ควรใช้เมื่อใด?
- เข้าใจสิ่งที่เกิดขึ้นภายในโครงข่ายประสาทเทียมและไลบรารี AI
- เข้าใจแนวคิดก่อนลงมือเขียนเองในโจทย์ที่เกี่ยวข้อง
- เตรียมตัวสำหรับคอร์สแมชชีนเลิร์นนิง การสัมภาษณ์งาน และโปรเจกต์
ลองดูการทำงานจริง
เลื่อนแถบเพื่อเปลี่ยนอินพุต น้ำหนัก และไบแอส แล้วดูผลรวมถ่วงน้ำหนัก z เคลื่อนไปบนเส้นโค้ง sigmoid และ ReLU
โค้ดตัวอย่าง
import math
# A neuron multiplies each input by a weight, adds them up and adds a bias.
def dot(a, b):
return sum(x * y for x, y in zip(a, b))
def sigmoid(z):
return 1 / (1 + math.exp(-z)) # squashes any number into (0, 1)
def relu(z):
return max(0.0, z) # keeps positives, turns negatives into 0
inputs = [0.5, -1.0, 2.0]
weights = [0.8, 0.2, -0.5]
bias = 0.1
z = dot(inputs, weights) + bias # weighted sum
print("weighted sum z =", round(z, 3))
print("sigmoid(z) =", round(sigmoid(z), 3))
print("relu(z) =", relu(z))
# The activation decides how strongly the neuron "fires".
for value in [-2, 0, 2]:
print(f"z={value:>2} sigmoid={sigmoid(value):.3f} relu={relu(value)}")
ผลลัพธ์ที่คาดหวัง
weighted sum z = -0.7
sigmoid(z) = 0.332
relu(z) = 0.0
z=-2 sigmoid=0.119 relu=0.0
z= 0 sigmoid=0.500 relu=0.0
z= 2 sigmoid=0.881 relu=2
หลักการทำงาน
dot() คำนวณผลรวมถ่วงน้ำหนัก z ส่วน sigmoid บีบ z ให้อยู่ระหว่าง 0 ถึง 1 ขณะที่ ReLU เก็บค่าบวกไว้และเปลี่ยนค่าลบเป็น 0 ลูปแสดงให้เห็นว่าฟังก์ชันกระตุ้นแต่ละแบบตอบสนองต่ออินพุตที่เป็นลบ ศูนย์ และบวกอย่างไร
เปลี่ยนค่าและรันโปรแกรมด้วย คอมไพเลอร์ Python ออนไลน์ของ CodeUtility โดยไม่ต้องติดตั้ง Python
แบบฝึกหัด
ลองเปลี่ยน input และทดสอบกรณีขอบก่อนใช้ชุดข้อมูลที่ใหญ่ขึ้น
- เปลี่ยนอินพุตหรือน้ำหนัก แล้วลองทายผลลัพธ์ก่อนรัน
- พิมพ์ค่าระหว่างทางออกมาเพื่อดูการคำนวณทีละขั้น
- แก้โจทย์ที่ลิงก์ไว้ด้านล่างเพื่อเขียนแนวคิดนี้ด้วยตัวเอง
ฝึกด้วยโจทย์
ใช้สิ่งที่เรียนในบทนี้แก้ปัญหาจริง ทุกโจทย์รันในเบราว์เซอร์ พร้อมการทดสอบทันทีและรีวิวจาก AI
- ผลคูณจุดของเวกเตอร์สองตัว คูณเวกเตอร์สองตัวทีละสมาชิกแล้วรวมผลลัพธ์ ซึ่งเป็นการคำนวณหลักของทุกนิวรอน ง่าย
- ฟังก์ชันกระตุ้น ใช้ sigmoid, ReLU, Leaky ReLU หรือ tanh กับทุกค่าในลิสต์ ง่าย
- นิวรอนเทียมหนึ่งตัว คำนวณเอาต์พุตของนิวรอนหนึ่งตัว: ผลรวมถ่วงน้ำหนักของอินพุตบวกไบแอส แล้วส่งผ่าน sigmoid ง่าย