การส่งผ่านไปข้างหน้าและฟังก์ชันความสูญเสียใน Python
โครงข่ายประสาทเทียมประกอบด้วยนิวรอนหลายชั้น ในการส่งผ่านไปข้างหน้า อินพุตจะไหลผ่านแต่ละชั้นจนได้คำทำนาย และฟังก์ชันความสูญเสียจะให้คะแนนว่าคำทำนายนั้นห่างจากคำตอบที่ถูกแค่ไหน
แนวคิดแบบเข้าใจง่าย
โครงข่ายประสาทเทียมประกอบด้วยนิวรอนหลายชั้น ในการส่งผ่านไปข้างหน้า อินพุตจะไหลผ่านแต่ละชั้นจนได้คำทำนาย และฟังก์ชันความสูญเสียจะให้คะแนนว่าคำทำนายนั้นห่างจากคำตอบที่ถูกแค่ไหน
ส่งอินพุตผ่านโครงข่ายประสาทเทียมขนาดเล็กทีละชั้น แล้ววัดความคลาดเคลื่อนด้วยค่าคลาดเคลื่อนกำลังสองและ cross-entropy
ประเด็นสำคัญ
- ชั้น dense เชื่อมอินพุตทุกตัวเข้ากับนิวรอนทุกตัวในชั้น
- เอาต์พุตของชั้นหนึ่งคืออินพุตของชั้นถัดไป
- ความสูญเสียคือตัวเลขเดียว ยิ่งต่ำยิ่งแปลว่าทำนายได้ดี
- ใช้ค่าคลาดเคลื่อนกำลังสองกับตัวเลข และใช้ cross-entropy กับความน่าจะเป็นและการจำแนกประเภท
ควรใช้เมื่อใด?
- เข้าใจสิ่งที่เกิดขึ้นภายในโครงข่ายประสาทเทียมและไลบรารี AI
- เข้าใจแนวคิดก่อนลงมือเขียนเองในโจทย์ที่เกี่ยวข้อง
- เตรียมตัวสำหรับคอร์สแมชชีนเลิร์นนิง การสัมภาษณ์งาน และโปรเจกต์
ลองดูการทำงานจริง
เปลี่ยนอินพุตและเป้าหมาย ติดตามค่าที่ไหลผ่านชั้นซ่อน และดูว่าความสูญเสียทั้งสองแบบตอบสนองต่อคำทำนายอย่างไร
โค้ดตัวอย่าง
import math
def dense(inputs, weights, biases, activation):
# Each row of weights belongs to one neuron in the layer.
return [activation(sum(x * w for x, w in zip(inputs, row)) + b) for row, b in zip(weights, biases)]
relu = lambda z: max(0.0, z)
sigmoid = lambda z: 1 / (1 + math.exp(-z))
x = [1.0, 2.0]
hidden = dense(x, [[0.5, -0.2], [0.3, 0.8]], [0.0, -0.5], relu)
output = dense(hidden, [[1.0, -1.0]], [0.2], sigmoid)
print("hidden layer:", [round(h, 3) for h in hidden])
print("prediction:", round(output[0], 3))
# A loss function measures how wrong the prediction is.
target = 1.0
mse = (output[0] - target) ** 2
bce = -(target * math.log(output[0]) + (1 - target) * math.log(1 - output[0]))
print("squared error:", round(mse, 3))
print("cross-entropy:", round(bce, 3))
ผลลัพธ์ที่คาดหวัง
hidden layer: [0.1, 1.4]
prediction: 0.25
squared error: 0.563
cross-entropy: 1.387
หลักการทำงาน
dense() คำนวณหนึ่งชั้น โดยน้ำหนักแต่ละแถวคือนิวรอนหนึ่งตัว ชั้นซ่อนใช้ ReLU และชั้นเอาต์พุตใช้ sigmoid เพื่อให้ได้ความน่าจะเป็น ค่าคลาดเคลื่อนกำลังสองและ cross-entropy ต่างวัดช่องว่างระหว่างคำทำนาย 0.25 กับเป้าหมาย 1.0 และการฝึกจะพยายามทำให้ค่าเหล่านี้เล็กลง
เปลี่ยนค่าและรันโปรแกรมด้วย คอมไพเลอร์ Python ออนไลน์ของ CodeUtility โดยไม่ต้องติดตั้ง Python
แบบฝึกหัด
ลองเปลี่ยน input และทดสอบกรณีขอบก่อนใช้ชุดข้อมูลที่ใหญ่ขึ้น
- เปลี่ยนอินพุตหรือน้ำหนัก แล้วลองทายผลลัพธ์ก่อนรัน
- พิมพ์ค่าระหว่างทางออกมาเพื่อดูการคำนวณทีละขั้น
- แก้โจทย์ที่ลิงก์ไว้ด้านล่างเพื่อเขียนแนวคิดนี้ด้วยตัวเอง
ฝึกด้วยโจทย์
ใช้สิ่งที่เรียนในบทนี้แก้ปัญหาจริง ทุกโจทย์รันในเบราว์เซอร์ พร้อมการทดสอบทันทีและรีวิวจาก AI
- การส่งผ่านไปข้างหน้าในเลเยอร์แบบ dense คำนวณเอาต์พุตของเลเยอร์นิวรอนที่เชื่อมต่อกันทั้งหมด โดยเลือกฟังก์ชันกระตุ้นได้ ปานกลาง
- การส่งผ่านไปข้างหน้าในโครงข่ายสองชั้น ส่งอินพุตผ่านเลเยอร์ซ่อนที่ใช้ ReLU และเลเยอร์เอาต์พุตที่ใช้ sigmoid ปานกลาง
- ฟังก์ชันค่าสูญเสีย: MSE, MAE และครอสเอนโทรปี วัดว่าการทำนายของโมเดลผิดมากแค่ไหน ด้วยค่าคลาดเคลื่อนกำลังสองเฉลี่ย ค่าคลาดเคลื่อนสัมบูรณ์เฉลี่ย หรือไบนารีครอสเอนโทรปี ง่าย