เหตุใดการเพิ่มเลเยอร์เพิ่มเติมให้กับโครงข่ายประสาทเทียมนี้จึงทำให้เอาต์พุตแย่ลง

ฉันเพิ่งเริ่มต้นใช้งานโครงข่ายประสาทเทียมและใช้ Synaptic เพื่อเริ่มต้น (ฉันรู้ว่าโครงข่ายประสาทเทียมใน JavaScript หายใจไม่ออก!)

นี่คือโค้ดตัวอย่าง ที่ให้ไว้ในส่วนนี้ สำหรับการสร้างโครงข่ายประสาทเทียมสำหรับการเรียนรู้ฟังก์ชัน XOR:

var myPerceptron = new Architect.Perceptron(2, 3, 1);
var myTrainer = new Trainer(myPerceptron);

myTrainer.XOR();

console.log(myPerceptron.activate([0, 0])); // 0.0268581547421616
console.log(myPerceptron.activate([1, 0])); // 0.9829673642853368
console.log(myPerceptron.activate([0, 1])); // 0.9831714267395621
console.log(myPerceptron.activate([1, 1])); // 0.02128894618097928

ฉันกำลังทดลองเพิ่มเลเยอร์และดูว่าเกิดอะไรขึ้น การเพิ่มเลเยอร์ที่ซ่อนอยู่อีกหนึ่งเลเยอร์ไม่มีผลมากนัก แต่การเพิ่ม 2 เลเยอร์จะทำให้เอาต์พุตเหมือนกันโดยไม่คำนึงถึงอินพุต

var myPerceptron = new Architect.Perceptron(2, 3, 3, 3, 1);
var myTrainer = new Trainer(myPerceptron);

myTrainer.XOR();

console.log(myPerceptron.activate([0, 0])); // 0.521076904986927
console.log(myPerceptron.activate([1, 0])); // 0.5210769149857782
console.log(myPerceptron.activate([0, 1])); // 0.5210769118775331
console.log(myPerceptron.activate([1, 1])); // 0.5210769209325651

ทำไมสิ่งนี้ถึงเกิดขึ้น? นี่เป็นเพียงเพราะเครือข่ายที่ซับซ้อนมากขึ้นต้องการการฝึกอบรมที่มากขึ้น หรือเป็นเพราะเครือข่ายประเภทนี้ไม่เหมาะกับปัญหาประเภทนี้โดยเนื้อแท้?


person Aron    schedule 06.01.2016    source แหล่งที่มา
comment
สำหรับฉันแล้ว การเรียนรู้โครงข่ายประสาทเทียมหลายระดับเป็นเรื่องยาก เท่าที่ฉันรู้ ไม่มีกลไกที่ตรงไปตรงมาในการเรียนรู้เครือข่ายดังกล่าวเพื่อการเพิ่มประสิทธิภาพสูงสุด   -  person Willem Van Onsem    schedule 06.01.2016
comment
เป็นการยากที่จะบอกก่อนที่จะเห็นประเภทข้อมูลที่คุณมี วิธีการฝึกอบรมเครือข่าย การทำให้เป็นมาตรฐานที่ใช้ และ ... โดยทั่วไปแล้ว ยิ่งโมเดลมีความซับซ้อนมากขึ้นเท่าใด คุณจะต้องมีข้อมูลมากขึ้นเพื่อเรียนรู้ฟังก์ชัน right   -  person Amir    schedule 06.01.2016


คำตอบ (1)


ฉันไม่คุ้นเคยกับ Synaptic มากนัก (แต่มันดูดีมาก) แต่นี่คือปัญหาทั่วไปบางประการที่คุณอาจพิจารณา:

  • การเริ่มต้นน้ำหนักเป็นสิ่งสำคัญ การเริ่มต้นน้ำหนักที่เหมาะสมช่วยให้การไล่ระดับสีของเราย้อนกลับผ่านเครือข่ายของเราและเพื่อให้การเรียนรู้เกิดขึ้น มีตัวเลือกในการเริ่มต้นตุ้มน้ำหนักในเครือข่ายของคุณหรือไม่? รูปแบบการเริ่มต้นทั่วไปคือการกำหนดค่าเริ่มต้นของ Xavier Glorot ที่ให้ไว้ใน การทำความเข้าใจความยากลำบากของการฝึกโครงข่ายประสาทเทียมแบบป้อนลึก และล่าสุดใน เจาะลึกเข้าไปในวงจรเรียงกระแส: เหนือกว่าประสิทธิภาพระดับมนุษย์ในการจัดประเภท ImageNet

  • ขนาดก้าวของคุณหรือที่เรียกว่าอัตราการเรียนรู้ใหญ่เกินไปหรือไม่? ดูเหมือนว่าเครือข่ายของคุณกำลังส่งออกค่าคงที่ หากคุณกำลังใช้ความไม่เชิงเส้นแบบอิ่มตัว (เช่น ฟังก์ชันการเปิดใช้งานที่มีขอบเขตเช่น sigmoid หรือ tanh) การเรียนรู้ขนาดใหญ่อาจทำให้ความไม่เชิงเส้นของคุณอิ่มตัว และการเรียนรู้หยุดลงอย่างมีประสิทธิภาพ และอาจส่งผลให้เกิดเอาต์พุตค่าคงที่

  • เกี่ยวข้องกับประเด็นก่อนหน้า: คุณใช้ความไม่เชิงเส้นประเภทใดในเลเยอร์ที่ซ่อนอยู่ ขอย้ำอีกครั้ง หากมันเป็นความไม่เชิงเส้นจนอิ่มตัว สิ่งนี้อาจขัดขวางการฝึกของคุณได้ คุณสามารถลองแก้ไขหน่วยเชิงเส้น (ReLU) ซึ่งมีรูปแบบ $f(x) = \max(0,x)$ พวกมันไม่มีขอบเขต ดังนั้นพวกมันจึงไม่อิ่มตัว และพวกมันมีการไล่ระดับสีเท่ากับ 1 เมื่อ $x > 0$ พวกเขามีการตีความว่า "เปิดใช้งาน" เมื่ออินพุตมากกว่า 0 ในกรณีนี้พวกมันจะทำหน้าที่เหมือนสวิตช์และปล่อยให้การไล่ระดับสีแพร่กระจายผ่าน

อาจมีประเด็นอื่นๆ ที่หวังว่าคนอื่นๆ จะสามารถแสดงความคิดเห็นได้เช่นกัน 3 สิ่งเหล่านี้คือสิ่งที่เข้ามาในใจฉันทันที

ฉันไม่คุ้นเคยกับ Synaptic ดังนั้นฉันจึงไม่แน่ใจว่ามีการควบคุมมากเพียงใด หรือการตั้งค่าหรือพารามิเตอร์เริ่มต้นคืออะไร

หวังว่านี่จะช่วยได้!

person Indie AI    schedule 06.01.2016