Loading [MathJax]/jax/output/HTML-CSS/jax.js
การสาธิตการเผยแพร่

อัลกอริทึมการเผยแพร่

อัลกอริทึมการแพร่พันธุ์เป็นปัจจัยสําคัญสําหรับการฝึกโครงข่ายประสาทขนาดใหญ่ได้อย่างรวดเร็ว บทความนี้อธิบายวิธีการทํางานของอัลกอริทึม

โปรดเลื่อนลง...

โครงข่ายระบบประสาทเทียมแบบง่าย

ทางด้านขวา คุณจะเห็นโครงข่ายระบบประสาทเทียมที่มีอินพุต 1 โหนด โหนดเอาต์พุต 1 โหนด และเลเยอร์ 2 โหนดที่ซ่อนอยู่จาก 2 โหนด

โหนดในเลเยอร์ใกล้เคียงเชื่อมต่อกับน้ําหนัก wijซึ่งเป็นพารามิเตอร์เครือข่าย

ฟังก์ชันการเปิดใช้งาน

แต่ละโหนดมีอินพุตทั้งหมด xฟังก์ชันการเปิดใช้งาน f(x)และเอาต์พุต y=f(x) f(x) ต้องเป็นฟังก์ชันที่ไม่ใช่เชิงเส้น มิเช่นนั้น โครงข่ายระบบประสาทจะเรียนรู้ได้เฉพาะรูปแบบเชิงเส้นเท่านั้น

ฟังก์ชันเปิดใช้งานที่ใช้กันโดยทั่วไปคือ Sigmoid function: f(x)=11+ex

ฟังก์ชันข้อผิดพลาด

เป้าหมายคือการเรียนรู้น้ําหนักของเครือข่ายโดยอัตโนมัติจากข้อมูลที่มีเอาต์พุตที่คาดการณ์ไว้ youtput ใกล้เคียงกับเป้าหมาย ytarget สําหรับอินพุตทั้งหมด xinput

เราใช้ฟังก์ชันข้อผิดพลาด Eเพื่อวัดระยะห่างจากเป้าหมาย ฟังก์ชันข้อผิดพลาดที่ใช้กันโดยทั่วไปคือ E(youtput,ytarget)=12(youtputytarget)2

ส่งต่อการเผยแพร่

เราเริ่มต้นจากการป้อนข้อมูลตัวอย่าง (xinput,ytarget) และอัปเดตเลเยอร์อินพุตของเครือข่าย

เราถือว่าอินพุตมีลักษณะคล้ายกับโหนดอื่นๆ แต่ไม่มีฟังก์ชันการเปิดใช้งาน เอาต์พุตจึงเทียบเท่ากับอินพุตของฟังก์ชันดังกล่าว y1=xinput

ส่งต่อการเผยแพร่

ตอนนี้เราจะอัปเดตเลเยอร์ที่ซ่อนอยู่ชั้นแรก เรานําเอาต์พุต y ของโหนดในเลเยอร์ก่อนหน้าและใช้น้ําหนักในการคํานวณอินพุต x ของโหนดในเลเยอร์ถัดไป
xj=
iin(j)wijyi+bj

ส่งต่อการเผยแพร่

จากนั้นเราจะอัปเดตเอาต์พุตของโหนดในเลเยอร์ที่ซ่อนอยู่ชั้นแรก โดยเราจะใช้ฟังก์ชันการเปิดใช้งาน f(x)
y=f(x)

ส่งต่อการเผยแพร่

เราใช้ทั้ง 2 สูตรนี้เผยแพร่ในส่วนอื่นๆ ของเครือข่ายและรับเอาต์พุตสุดท้ายของเครือข่าย
y=f(x)
xj=
iin(j)wijyi+bj

ข้อผิดพลาดในการคัดลอก

อัลกอริทึม Backpagation ตัดสินใจว่าจะอัปเดตแต่ละน้ําหนักของเครือข่ายเท่าใดหลังจากเปรียบเทียบผลลัพธ์ที่คาดการณ์ไว้กับผลลัพธ์ที่ต้องการสําหรับตัวอย่างที่เฉพาะเจาะจง เราจึงต้องคํานวณการเปลี่ยนแปลงของข้อผิดพลาดตามน้ําหนักแต่ละประเภท dEdwij
เมื่อเราอัปเดตข้อผิดพลาดแล้ว เราจะอัปเดตน้ําหนักโดยใช้กฎการอัปเดตง่ายๆ ดังนี้
wij=wijαdEdwij
โดยที่ α คือค่าคงที่เชิงบวก หรือที่เรียกว่าอัตราการเรียนรู้ ซึ่งเราจําเป็นต้องปรับแต่งแบบเน้นผลลัพธ์

[หมายเหตุ] กฎการอัปเดตจะเรียบง่ายมาก เช่น หากข้อผิดพลาดลดลงเมื่อน้ําหนักเพิ่มขึ้น (dEdwij<0) ให้เพิ่มน้ําหนัก ไม่เช่นนั้นถ้าข้อผิดพลาดเพิ่มขึ้นเมื่อน้ําหนักเพิ่มขึ้น (dEdwij>0) ให้ลดน้ําหนัก

อนุพันธ์เพิ่มเติม

นอกจากนี้เรายังจัดเก็บโหนดสําหรับอนุพันธ์อีก 2 โหนดเพื่อช่วยคํานวณ dEdwijเพิ่มเติม ดังนี้ ข้อผิดพลาดจะเปลี่ยนแปลงไปอย่างไร
  • อินพุตทั้งหมดของโหนด dEdx และ
  • เอาต์พุตของโหนด dEdy

การเผยแพร่ด้านหลัง

มาเริ่มนําอนุพันธ์ของข้อผิดพลาดไปใช้อีกครั้งกัน เนื่องจากเรามีเอาต์พุตที่คาดการณ์ไว้ของตัวอย่างอินพุตนี้ เราจึงสามารถคํานวณวิธีที่ข้อผิดพลาดเปลี่ยนแปลงกับเอาต์พุตนั้นได้ ฟังก์ชันความผิดพลาดของเรา E=12(youtputytarget)2 มีดังนี้
Eyoutput=youtputytarget

การเผยแพร่ด้านหลัง

ตอนนี้เรามี dEdy กฎ dEdx ให้ใช้งานแล้ว
Ex=dydxEy=ddxf(x)Ey
โดยที่ ddxf(x)=f(x)(1f(x)) เมื่อ f(x) เป็นฟังก์ชันการเปิดใช้งาน Sigmoid

การเผยแพร่ด้านหลัง

ทันทีที่เราได้รับข้อผิดพลาดเกี่ยวกับอินพุตของโหนดทั้งหมด เราอาจได้รับข้อความแสดงข้อผิดพลาดเกี่ยวกับน้ําหนักของโหนดนั้น
Ewij=xjwijExj=yiExj

การเผยแพร่ด้านหลัง

และเรายังใช้กฎ dEdy จากเลเยอร์ก่อนหน้าได้โดยใช้กฎเชน เราสร้างวงกลมทั้งหมดแล้ว
Eyi=jout(i)xjyiExj=jout(i)wijExj

การเผยแพร่ด้านหลัง

ที่เหลือก็แค่ทําตามสูตร 3 สูตรก่อนหน้าจนกว่าเราจะคํานวณหาอนุพันธ์ของข้อผิดพลาดทั้งหมดสําเร็จ

สิ้นสุด

1y1xinput2y2x2dE/dy2dE/dx2fw12dE/dw3y3x3dE/dy3dE/dx3fw13dE/dw4y4x4dE/dy4dE/dx4fw24dE/dww34dE/dw5y5x5dE/dy5dE/dx5fw25dE/dww35dE/dw6youtputx6dE/dy6dE/dx6fw46dE/dww56dE/dwEytarget
กําลังประมวลผล...