แนวคิด AI ด้วย Python

Gradient descent และ backpropagation ใน Python

การฝึกคือการปรับน้ำหนักเพื่อลดความสูญเสีย เกรเดียนต์บอกทิศที่ทำให้ความสูญเสียเพิ่มขึ้น gradient descent จึงก้าวเล็ก ๆ ไปในทิศตรงข้าม ส่วน backpropagation ใช้กฎลูกโซ่คำนวณเกรเดียนต์นั้นสำหรับน้ำหนักทุกตัว

แนวคิดแบบเข้าใจง่าย

การฝึกคือการปรับน้ำหนักเพื่อลดความสูญเสีย เกรเดียนต์บอกทิศที่ทำให้ความสูญเสียเพิ่มขึ้น gradient descent จึงก้าวเล็ก ๆ ไปในทิศตรงข้าม ส่วน backpropagation ใช้กฎลูกโซ่คำนวณเกรเดียนต์นั้นสำหรับน้ำหนักทุกตัว

ฝึกนิวรอนด้วย gradient descent: ใช้กฎลูกโซ่หาว่าน้ำหนักแต่ละตัวส่งผลต่อความสูญเสียอย่างไร แล้วก้าวลงเนิน

ประเด็นสำคัญ

  • เกรเดียนต์คือความชันของความสูญเสียเทียบกับน้ำหนักแต่ละตัว
  • learning rate กำหนดขนาดก้าว: ใหญ่ไปจะเลยจุดต่ำสุด เล็กไปจะช้า
  • backpropagation ใช้กฎลูกโซ่ย้อนจากเอาต์พุตกลับไปจนถึงชั้นแรก
  • หนึ่ง epoch คือการวนผ่านข้อมูลฝึกทั้งหมดหนึ่งรอบ

ควรใช้เมื่อใด?

  • เข้าใจสิ่งที่เกิดขึ้นภายในโครงข่ายประสาทเทียมและไลบรารี AI
  • เข้าใจแนวคิดก่อนลงมือเขียนเองในโจทย์ที่เกี่ยวข้อง
  • เตรียมตัวสำหรับคอร์สแมชชีนเลิร์นนิง การสัมภาษณ์งาน และโปรเจกต์

ลองดูการทำงานจริง

กด เล่น เพื่อเริ่มฝึก เส้นตรงจะเข้าใกล้จุดต่าง ๆ ขณะที่เส้นทางสีส้มเดินลงเนินบนภูมิประเทศความสูญเสียไปยังจุดต่ำสุด

โค้ดตัวอย่าง

รันโค้ด →
main.py
# 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 และทดสอบกรณีขอบก่อนใช้ชุดข้อมูลที่ใหญ่ขึ้น

  1. เปลี่ยนอินพุตหรือน้ำหนัก แล้วลองทายผลลัพธ์ก่อนรัน
  2. พิมพ์ค่าระหว่างทางออกมาเพื่อดูการคำนวณทีละขั้น
  3. แก้โจทย์ที่ลิงก์ไว้ด้านล่างเพื่อเขียนแนวคิดนี้ด้วยตัวเอง
รันใน Python IDE →

ฝึกด้วยโจทย์

ใช้สิ่งที่เรียนในบทนี้แก้ปัญหาจริง ทุกโจทย์รันในเบราว์เซอร์ พร้อมการทดสอบทันทีและรีวิวจาก AI

โจทย์ทั้งหมด