$$
\definecolor{input}{RGB}{66, 133, 244}
\definecolor{output}{RGB}{219, 68, 55}
\definecolor{dinput}{RGB}{244, 180, 0}
\definecolor{doutput}{RGB}{15, 157, 88}
\definecolor{dweight}{RGB}{102, 0, 255}
$$
อัลกอริทึมการเผยแพร่
อัลกอริทึมการแพร่พันธุ์เป็นปัจจัยสําคัญสําหรับการฝึกโครงข่ายประสาทขนาดใหญ่ได้อย่างรวดเร็ว บทความนี้อธิบายวิธีการทํางานของอัลกอริทึม
โปรดเลื่อนลง...
โครงข่ายระบบประสาทเทียมแบบง่าย
ทางด้านขวา คุณจะเห็นโครงข่ายระบบประสาทเทียมที่มีอินพุต 1 โหนด โหนดเอาต์พุต 1 โหนด และเลเยอร์ 2 โหนดที่ซ่อนอยู่จาก 2 โหนด
โหนดในเลเยอร์ใกล้เคียงเชื่อมต่อกับน้ําหนัก \(w_{ij}\)ซึ่งเป็นพารามิเตอร์เครือข่าย
ฟังก์ชันการเปิดใช้งาน
แต่ละโหนดมีอินพุตทั้งหมด \(\color{input}x\)ฟังก์ชันการเปิดใช้งาน \(f(\color{input}x\color{black})\)และเอาต์พุต \(\color{output}y\color{black}=f(\color{input}x\color{black})\)
\(f(\color{input}x\color{black})\) ต้องเป็นฟังก์ชันที่ไม่ใช่เชิงเส้น มิเช่นนั้น โครงข่ายระบบประสาทจะเรียนรู้ได้เฉพาะรูปแบบเชิงเส้นเท่านั้น
ฟังก์ชันเปิดใช้งานที่ใช้กันโดยทั่วไปคือ Sigmoid function:
\(f(\color{input}x\color{black}) = \frac{1}{1+e^{-\color{input}x}}\)
ฟังก์ชันข้อผิดพลาด
เป้าหมายคือการเรียนรู้น้ําหนักของเครือข่ายโดยอัตโนมัติจากข้อมูลที่มีเอาต์พุตที่คาดการณ์ไว้ \(\color{output}y_{output}\)
ใกล้เคียงกับเป้าหมาย \(\color{output}y_{target}\) สําหรับอินพุตทั้งหมด \(\color{input}x_{input}\)
เราใช้ฟังก์ชันข้อผิดพลาด \(E\)เพื่อวัดระยะห่างจากเป้าหมาย
ฟังก์ชันข้อผิดพลาดที่ใช้กันโดยทั่วไปคือ \(E(\color{output}y_{output}\color{black},\color{output}y_{target}\color{black}) = \frac{1}{2}(\color{output}y_{output}\color{black} - \color{output}y_{target}\color{black})^2 \)
ส่งต่อการเผยแพร่
เราเริ่มต้นจากการป้อนข้อมูลตัวอย่าง \((\color{input}x_{input}\color{black},\color{output}y_{target}\color{black})\) และอัปเดตเลเยอร์อินพุตของเครือข่าย
เราถือว่าอินพุตมีลักษณะคล้ายกับโหนดอื่นๆ แต่ไม่มีฟังก์ชันการเปิดใช้งาน เอาต์พุตจึงเทียบเท่ากับอินพุตของฟังก์ชันดังกล่าว \( \color{output}y_1 \color{black} = \color{input} x_{input} \)
ส่งต่อการเผยแพร่
ตอนนี้เราจะอัปเดตเลเยอร์ที่ซ่อนอยู่ชั้นแรก เรานําเอาต์พุต \(\color{output}y\) ของโหนดในเลเยอร์ก่อนหน้าและใช้น้ําหนักในการคํานวณอินพุต \(\color{input}x\) ของโหนดในเลเยอร์ถัดไป
$$ \color{input} x_j \color{black} = $$$$ \sum_{i\in in(j)} w_{ij}\color{output} y_i\color{black} +b_j$$
ส่งต่อการเผยแพร่
จากนั้นเราจะอัปเดตเอาต์พุตของโหนดในเลเยอร์ที่ซ่อนอยู่ชั้นแรก
โดยเราจะใช้ฟังก์ชันการเปิดใช้งาน \( f(x) \)
$$ \color{output} y \color{black} = f(\color{input} x \color{black})$$
ส่งต่อการเผยแพร่
เราใช้ทั้ง 2 สูตรนี้เผยแพร่ในส่วนอื่นๆ ของเครือข่ายและรับเอาต์พุตสุดท้ายของเครือข่าย
$$ \color{output} y \color{black} = f(\color{input} x \color{black})$$
$$ \color{input} x_j \color{black} = $$$$ \sum_{i\in in(j)} w_{ij}\color{output} y_i \color{black} + b_j$$
ข้อผิดพลาดในการคัดลอก
อัลกอริทึม Backpagation ตัดสินใจว่าจะอัปเดตแต่ละน้ําหนักของเครือข่ายเท่าใดหลังจากเปรียบเทียบผลลัพธ์ที่คาดการณ์ไว้กับผลลัพธ์ที่ต้องการสําหรับตัวอย่างที่เฉพาะเจาะจง
เราจึงต้องคํานวณการเปลี่ยนแปลงของข้อผิดพลาดตามน้ําหนักแต่ละประเภท \(\color{dweight}\frac{dE}{dw_{ij}}\)
เมื่อเราอัปเดตข้อผิดพลาดแล้ว เราจะอัปเดตน้ําหนักโดยใช้กฎการอัปเดตง่ายๆ ดังนี้
$$w_{ij} = w_{ij} - \alpha \color{dweight}\frac{dE}{dw_{ij}}$$
โดยที่ \(\alpha\) คือค่าคงที่เชิงบวก หรือที่เรียกว่าอัตราการเรียนรู้ ซึ่งเราจําเป็นต้องปรับแต่งแบบเน้นผลลัพธ์
[หมายเหตุ] กฎการอัปเดตจะเรียบง่ายมาก เช่น หากข้อผิดพลาดลดลงเมื่อน้ําหนักเพิ่มขึ้น (\(\color{dweight}\frac{dE}{dw_{ij}}\color{black} < 0\)) ให้เพิ่มน้ําหนัก ไม่เช่นนั้นถ้าข้อผิดพลาดเพิ่มขึ้นเมื่อน้ําหนักเพิ่มขึ้น (\(\color{dweight}\frac{dE}{dw_{ij}} \color{black} > 0\))
ให้ลดน้ําหนัก
อนุพันธ์เพิ่มเติม
นอกจากนี้เรายังจัดเก็บโหนดสําหรับอนุพันธ์อีก 2 โหนดเพื่อช่วยคํานวณ \(\color{dweight}\frac{dE}{dw_{ij}}\)เพิ่มเติม ดังนี้
ข้อผิดพลาดจะเปลี่ยนแปลงไปอย่างไร
- อินพุตทั้งหมดของโหนด \(\color{dinput}\frac{dE}{dx}\) และ
- เอาต์พุตของโหนด \(\color{doutput}\frac{dE}{dy}\)
การเผยแพร่ด้านหลัง
มาเริ่มนําอนุพันธ์ของข้อผิดพลาดไปใช้อีกครั้งกัน
เนื่องจากเรามีเอาต์พุตที่คาดการณ์ไว้ของตัวอย่างอินพุตนี้ เราจึงสามารถคํานวณวิธีที่ข้อผิดพลาดเปลี่ยนแปลงกับเอาต์พุตนั้นได้
ฟังก์ชันความผิดพลาดของเรา \(E = \frac{1}{2}(\color{output}y_{output}\color{black} - \color{output}y_{target}\color{black})^2\) มีดังนี้
$$ \color{doutput} \frac{\partial E}{\partial y_{output}} \color{black} = \color{output} y_{output} \color{black} - \color{output} y_{target}$$
การเผยแพร่ด้านหลัง
ตอนนี้เรามี \(\color{doutput} \frac{dE}{dy}\) กฎ \(\color{dinput}\frac{dE}{dx}\) ให้ใช้งานแล้ว
$$\color{dinput} \frac{\partial E}{\partial x} \color{black} = \frac{dy}{dx}\color{doutput}\frac{\partial E}{\partial y} \color{black} = \frac{d}{dx}f(\color{input}x\color{black})\color{doutput}\frac{\partial E}{\partial y}$$
โดยที่ \(\frac{d}{dx}f(\color{input}x\color{black}) = f(\color{input}x\color{black})(1 - f(\color{input}x\color{black}))\) เมื่อ \(f(\color{input}x\color{black})\) เป็นฟังก์ชันการเปิดใช้งาน Sigmoid
การเผยแพร่ด้านหลัง
ทันทีที่เราได้รับข้อผิดพลาดเกี่ยวกับอินพุตของโหนดทั้งหมด เราอาจได้รับข้อความแสดงข้อผิดพลาดเกี่ยวกับน้ําหนักของโหนดนั้น
$$\color{dweight} \frac{\partial E}{\partial w_{ij}} \color{black} = \frac{\partial x_j}{\partial w_{ij}} \color{dinput}\frac{\partial E}{\partial x_j} \color{black} = \color{output}y_i \color{dinput} \frac{\partial E}{\partial x_j}$$
การเผยแพร่ด้านหลัง
และเรายังใช้กฎ \(\frac{dE}{dy}\) จากเลเยอร์ก่อนหน้าได้โดยใช้กฎเชน เราสร้างวงกลมทั้งหมดแล้ว
$$ \color{doutput} \frac{\partial E}{\partial y_i} \color{black} = \sum_{j\in out(i)} \frac{\partial x_j}{\partial y_i} \color{dinput} \frac{\partial E}{\partial x_j} \color{black} = \sum_{j\in out(i)} w_{ij} \color{dinput} \frac{\partial E}{\partial x_j}$$
การเผยแพร่ด้านหลัง
ที่เหลือก็แค่ทําตามสูตร 3 สูตรก่อนหน้าจนกว่าเราจะคํานวณหาอนุพันธ์ของข้อผิดพลาดทั้งหมดสําเร็จ