Gradient descent และ backpropagation ใน Python
การฝึกคือการปรับน้ำหนักเพื่อลดความสูญเสีย เกรเดียนต์บอกทิศที่ทำให้ความสูญเสียเพิ่มขึ้น gradient descent จึงก้าวเล็ก ๆ ไปในทิศตรงข้าม ส่วน backpropagation ใช้กฎลูกโซ่คำนวณเกรเดียนต์นั้นสำหรับน้ำหนักทุกตัว
แนวคิดแบบเข้าใจง่าย
การฝึกคือการปรับน้ำหนักเพื่อลดความสูญเสีย เกรเดียนต์บอกทิศที่ทำให้ความสูญเสียเพิ่มขึ้น gradient descent จึงก้าวเล็ก ๆ ไปในทิศตรงข้าม ส่วน backpropagation ใช้กฎลูกโซ่คำนวณเกรเดียนต์นั้นสำหรับน้ำหนักทุกตัว
ฝึกนิวรอนด้วย gradient descent: ใช้กฎลูกโซ่หาว่าน้ำหนักแต่ละตัวส่งผลต่อความสูญเสียอย่างไร แล้วก้าวลงเนิน
ประเด็นสำคัญ
- เกรเดียนต์คือความชันของความสูญเสียเทียบกับน้ำหนักแต่ละตัว
- learning rate กำหนดขนาดก้าว: ใหญ่ไปจะเลยจุดต่ำสุด เล็กไปจะช้า
- backpropagation ใช้กฎลูกโซ่ย้อนจากเอาต์พุตกลับไปจนถึงชั้นแรก
- หนึ่ง epoch คือการวนผ่านข้อมูลฝึกทั้งหมดหนึ่งรอบ
ควรใช้เมื่อใด?
- เข้าใจสิ่งที่เกิดขึ้นภายในโครงข่ายประสาทเทียมและไลบรารี AI
- เข้าใจแนวคิดก่อนลงมือเขียนเองในโจทย์ที่เกี่ยวข้อง
- เตรียมตัวสำหรับคอร์สแมชชีนเลิร์นนิง การสัมภาษณ์งาน และโปรเจกต์
ลองดูการทำงานจริง
กด เล่น เพื่อเริ่มฝึก เส้นตรงจะเข้าใกล้จุดต่าง ๆ ขณะที่เส้นทางสีส้มเดินลงเนินบนภูมิประเทศความสูญเสียไปยังจุดต่ำสุด
โค้ดตัวอย่าง
# Train one neuron y = w * x + b to fit points on the line y = 2x + 1.
data = [(0, 1), (1, 3), (2, 5), (3, 7)]
w, b = 0.0, 0.0
learning_rate = 0.05
for epoch in range(1, 201):
grad_w = grad_b = 0.0
for x, y in data:
error = (w * x + b) - y # prediction minus target
# Chain rule: d(error²)/dw = 2 * error * x, d(error²)/db = 2 * error
grad_w += 2 * error * x
grad_b += 2 * error
# Step against the gradient to make the loss smaller.
w -= learning_rate * grad_w / len(data)
b -= learning_rate * grad_b / len(data)
if epoch in (1, 10, 50, 200):
loss = sum(((w * x + b) - y) ** 2 for x, y in data) / len(data)
print(f"epoch {epoch:>3}: w={w:.3f} b={b:.3f} loss={loss:.4f}")
ผลลัพธ์ที่คาดหวัง
epoch 1: w=0.850 b=0.400 loss=7.0587
epoch 10: w=2.009 b=0.958 loss=0.0009
epoch 50: w=2.005 b=0.989 loss=0.0000
epoch 200: w=2.000 b=1.000 loss=0.0000
หลักการทำงาน
สำหรับแต่ละจุด ค่าคลาดเคลื่อนคือคำทำนายลบเป้าหมาย กฎลูกโซ่ให้เกรเดียนต์ของค่าคลาดเคลื่อนกำลังสองเป็น 2·error·x สำหรับ w และ 2·error สำหรับ b เมื่อเฉลี่ยทั้งชุดข้อมูลแล้วก้าวสวนเกรเดียนต์ w และ b จะเข้าใกล้ 2 และ 1 และความสูญเสียลดลงเกือบเป็น 0
เปลี่ยนค่าและรันโปรแกรมด้วย คอมไพเลอร์ Python ออนไลน์ของ CodeUtility โดยไม่ต้องติดตั้ง Python
แบบฝึกหัด
ลองเปลี่ยน input และทดสอบกรณีขอบก่อนใช้ชุดข้อมูลที่ใหญ่ขึ้น
- เปลี่ยนอินพุตหรือน้ำหนัก แล้วลองทายผลลัพธ์ก่อนรัน
- พิมพ์ค่าระหว่างทางออกมาเพื่อดูการคำนวณทีละขั้น
- แก้โจทย์ที่ลิงก์ไว้ด้านล่างเพื่อเขียนแนวคิดนี้ด้วยตัวเอง
ฝึกด้วยโจทย์
ใช้สิ่งที่เรียนในบทนี้แก้ปัญหาจริง ทุกโจทย์รันในเบราว์เซอร์ พร้อมการทดสอบทันทีและรีวิวจาก AI
- อนุพันธ์ของฟังก์ชันกระตุ้น คำนวณอนุพันธ์ของ sigmoid, ReLU, Leaky ReLU หรือ tanh ที่แต่ละค่า ซึ่งเป็นความชันที่ backpropagation ต้องใช้ ง่าย
- เกรเดียนต์ของนิวรอนหนึ่งตัว ใช้กฎลูกโซ่หาว่าค่าสูญเสียเปลี่ยนไปอย่างไรตามน้ำหนักแต่ละค่าและไบแอสของนิวรอน sigmoid ปานกลาง
- การแพร่ย้อนกลับในโครงข่ายสองชั้น คำนวณเกรเดียนต์ของน้ำหนักและไบแอสทั้งหมดในโครงข่ายที่มีเลเยอร์ซ่อน sigmoid หนึ่งชั้นและเอาต์พุต sigmoid หนึ่งตัว ยาก
- ฝึกนิวรอนด้วยการลดเกรเดียนต์ ทำการส่งผ่านไปข้างหน้า คำนวณเกรเดียนต์ และปรับน้ำหนักซ้ำๆ เพื่อสอนนิวรอน sigmoid จากตัวอย่าง ปานกลาง
- ฝึกโครงข่ายประสาทเทียมให้แก้ปัญหา XOR รวมทุกอย่างเข้าด้วยกัน: ฝึกโครงข่าย sigmoid แบบ 2-2-1 ด้วยการแพร่ย้อนกลับจนเรียนรู้ XOR ได้ ยาก