การสาธิตการเผยแพร่
$$ \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 สูตรก่อนหน้าจนกว่าเราจะคํานวณหาอนุพันธ์ของข้อผิดพลาดทั้งหมดสําเร็จ

สิ้นสุด

กําลังประมวลผล...