ฉันควรทำอย่างไรเมื่อเครือข่ายประสาทของฉันไม่ได้เรียนรู้


147

ฉันกำลังฝึกโครงข่ายประสาท แต่การสูญเสียการฝึกไม่ลดลง ฉันจะแก้ไขสิ่งนี้ได้อย่างไร

ฉันไม่ได้ถามเกี่ยวกับการบรรจุเกินหรือกำหนดมาตรฐาน ฉันขอเกี่ยวกับวิธีการแก้ปัญหาที่ประสิทธิภาพของเครือข่ายของฉันไม่ดีขึ้นในชุดฝึกอบรม


คำถามนี้เป็นคำถามทั่วไปที่จงใจเพื่อให้คำถามอื่น ๆ เกี่ยวกับวิธีการฝึกอบรมโครงข่ายประสาทเทียมสามารถปิดเป็นซ้ำกับคำถามนี้ได้ด้วยทัศนคติที่ว่า "ถ้าคุณให้ปลาแก่ผู้ชายคุณให้อาหารเขาหนึ่งวัน แต่ถ้าคุณสอน คุณสามารถให้อาหารเขาตลอดชีวิตที่เหลือของเขา " ดูกระทู้ Meta สำหรับการสนทนา: วิธีที่ดีที่สุดในการตอบคำถาม "เครือข่ายประสาทของฉันใช้งานไม่ได้โปรดแก้ไข" คำถามคืออะไร?

หากเครือข่ายประสาทของคุณไม่ได้พูดคุยกันดีดู: ฉันควรทำอย่างไรเมื่อเครือข่ายประสาทของฉันไม่ได้พูดคุยกันดี


1
นี่คือกรณีที่ NN ไม่สามารถดำเนินการได้ youtu.be/iakFfOmanJU?t=144
Joshua

4
บล็อกของ Ivanov " เหตุผลที่เครือข่ายประสาทของคุณไม่ทำงาน " โดยเฉพาะในส่วนที่ II, III และ IV อาจเป็นประโยชน์
user5228

คำตอบ:


187

การทดสอบหน่วยเป็นเพื่อนของคุณ

มีคำพูดในหมู่นักเขียนว่า "การเขียนทั้งหมดเป็นการเขียนใหม่" - นั่นคือส่วนใหญ่ของการเขียนกำลังแก้ไข สำหรับโปรแกรมเมอร์ (หรืออย่างน้อยนักวิทยาศาสตร์ข้อมูล) การแสดงออกอาจถูกเขียนซ้ำอีกครั้งว่า "การเข้ารหัสทั้งหมดกำลังดีบั๊ก"

เมื่อใดก็ตามที่คุณเขียนโค้ดคุณต้องตรวจสอบว่ามันทำงานได้ตามที่ต้องการ วิธีที่ดีที่สุดที่ฉันเคยพบในการตรวจสอบความถูกต้องคือการแบ่งรหัสของคุณออกเป็นส่วนย่อย ๆ และตรวจสอบว่าแต่ละส่วนทำงานได้หรือไม่ ซึ่งสามารถทำได้โดยการเปรียบเทียบเอาต์พุตเซ็กเมนต์กับสิ่งที่คุณรู้ว่าเป็นคำตอบที่ถูกต้อง นี้เรียกว่าการทดสอบหน่วย การเขียนการทดสอบหน่วยที่ดีเป็นส่วนสำคัญของการเป็นนักสถิติ / นักวิทยาศาสตร์ข้อมูล / ผู้เชี่ยวชาญด้านการเรียนรู้เครื่อง / ผู้ปฏิบัติงานเครือข่ายประสาทที่ดี ไม่มีอะไรมาทดแทน

คุณต้องตรวจสอบว่ารหัสของคุณปราศจากข้อบกพร่องก่อนจึงจะสามารถปรับประสิทธิภาพเครือข่ายได้! ไม่เช่นนั้นคุณอาจจะจัดเก้าอี้อาบแดดบนRMS Titanicอีกครั้ง

มีคุณสมบัติสองอย่างของโครงข่ายประสาทที่ทำให้การตรวจสอบมีความสำคัญมากกว่าการเรียนรู้ของเครื่องหรือแบบจำลองทางสถิติอื่น ๆ

  1. เครือข่ายนิวรัลไม่ใช่อัลกอริธึมแบบ "ไม่เก็บ" ในวิธีที่ฟอเรสต์แบบสุ่มหรือการถดถอยโลจิสติก แม้จะเป็นเครือข่ายที่เรียบง่ายและมีการส่งต่อไปยังเครือข่ายนั้นผู้ใช้ส่วนใหญ่จะทำการตัดสินใจมากมายเกี่ยวกับวิธีการกำหนดค่าเครือข่ายเชื่อมต่อเริ่มต้นและปรับให้เหมาะสม ซึ่งหมายถึงการเขียนรหัสและการเขียนรหัสหมายถึงการดีบัก

  2. แม้ว่ารหัสเครือข่ายประสาทจะดำเนินการโดยไม่มีข้อยกเว้น แต่เครือข่ายก็ยังมีข้อบกพร่องได้! ข้อผิดพลาดเหล่านี้อาจเป็นประเภทร้ายกาจที่เครือข่ายจะฝึกอบรม แต่ติดอยู่ที่การแก้ปัญหาย่อยที่ดีที่สุดหรือเครือข่ายที่เกิดขึ้นไม่ได้มีสถาปัตยกรรมที่ต้องการ ( นี่เป็นตัวอย่างของความแตกต่างระหว่างข้อผิดพลาดทางไวยากรณ์และความหมาย )

โพสต์ขนาดกลางนี้" วิธีการเรียนรู้การทดสอบหน่วยรหัสเครื่อง" โดย Chase Roberts กล่าวถึงการทดสอบหน่วยสำหรับแบบจำลองการเรียนรู้ของเครื่องโดยละเอียด ฉันยืมตัวอย่างรหัส buggy นี้จากบทความ:

def make_convnet(input_image):
    net = slim.conv2d(input_image, 32, [11, 11], scope="conv1_11x11")
    net = slim.conv2d(input_image, 64, [5, 5], scope="conv2_5x5")
    net = slim.max_pool2d(net, [4, 4], stride=4, scope='pool1')
    net = slim.conv2d(input_image, 64, [5, 5], scope="conv3_5x5")
    net = slim.conv2d(input_image, 128, [3, 3], scope="conv4_3x3")
    net = slim.max_pool2d(net, [2, 2], scope='pool2')
    net = slim.conv2d(input_image, 128, [3, 3], scope="conv5_3x3")
    net = slim.max_pool2d(net, [2, 2], scope='pool3')
    net = slim.conv2d(input_image, 32, [1, 1], scope="conv6_1x1")
    return net

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

ข้อผิดพลาดทั่วไปในการเขียนโปรแกรมที่เกี่ยวข้องกับเครือข่ายประสาทคือ

  • ตัวแปรถูกสร้างขึ้น แต่ไม่เคยใช้ (มักจะเป็นเพราะข้อผิดพลาดในการคัดลอกวาง);
  • นิพจน์สำหรับการปรับปรุงการไล่ระดับสีไม่ถูกต้อง
  • ไม่ใช้การอัปเดตน้ำหนัก
  • ฟังก์ชั่นการสูญเสียไม่ได้วัดในระดับที่ถูกต้อง (ตัวอย่างเช่นการสูญเสียข้ามเอนโทรปีสามารถแสดงในแง่ของความน่าจะเป็นหรือการบันทึก)
  • การสูญเสียไม่เหมาะสำหรับงาน (ตัวอย่างเช่นการใช้การสูญเสียข้ามเอนโทรปีอย่างเด็ดขาดสำหรับงานถดถอย)

คลานก่อนเดิน เดินก่อนวิ่ง

เครือข่ายประสาทที่กว้างและลึกและเครือข่ายประสาทที่มีการเดินสายแปลกใหม่เป็นสิ่งที่น่าสนใจในการเรียนรู้ของเครื่อง แต่เครือข่ายเหล่านี้ไม่ได้เกิดขึ้นอย่างสมบูรณ์ นักออกแบบสร้างขึ้นเพื่อพวกเขาจากหน่วยที่เล็กลง ขั้นแรกสร้างเครือข่ายขนาดเล็กที่มีเลเยอร์ที่ซ่อนอยู่เพียงชั้นเดียวและตรวจสอบว่าทำงานได้อย่างถูกต้อง จากนั้นเพิ่มความซับซ้อนของโมเดลเพิ่มเติมทีละส่วนและตรวจสอบว่าแต่ละชิ้นนั้นทำงานได้ดีเช่นกัน

  • มีเซลล์ประสาทในเลเยอร์น้อย เกินไปที่จะ จำกัด การเป็นตัวแทนที่เครือข่ายเรียนรู้ทำให้ไม่เหมาะสม เซลล์ประสาทมากเกินไปอาจทำให้เกิดความเหมาะสมมากเกินไปเนื่องจากเครือข่ายจะ "จดจำ" ข้อมูลการฝึกอบรม

    แม้ว่าคุณจะสามารถพิสูจน์ได้ว่ามีทางคณิตศาสตร์เพียงจำนวนน้อยของเซลล์ประสาทที่จำเป็นในการจำลองปัญหาก็มักจะเป็นกรณีที่มี "อีกไม่กี่" เซลล์ประสาททำให้มันง่ายขึ้นสำหรับการเพิ่มประสิทธิภาพในการหาการตั้งค่า "ดี" (แต่ฉันไม่คิดว่าทุกคนจะเข้าใจว่าเหตุใดในกรณีนี้) ฉันให้ตัวอย่างสิ่งนี้ในบริบทของปัญหา XOR ที่นี่: การทำซ้ำของฉันไม่จำเป็นต้องฝึกอบรม NN สำหรับ XOR ด้วย MSE <0.001 สูงเกินไปหรือไม่ .

  • การเลือกจำนวนเลเยอร์ที่ซ่อนอยู่ทำให้เครือข่ายเรียนรู้สิ่งที่เป็นนามธรรมจากข้อมูลดิบ การเรียนรู้อย่างลึกซึ้งนั้นเป็นสิ่งที่ทุกวันนี้และเครือข่ายที่มีเลเยอร์จำนวนมากได้แสดงผลลัพธ์ที่น่าประทับใจ แต่การเพิ่มเลเยอร์ที่ซ่อนอยู่มากเกินไปอาจทำให้เกิดความเสี่ยงสูงเกินไปหรือทำให้ยากที่จะเพิ่มประสิทธิภาพเครือข่าย

  • การเลือกการเดินสายเครือข่ายที่ฉลาดสามารถช่วยคุณได้มาก แหล่งข้อมูลของคุณรองรับสถาปัตยกรรมเครือข่ายเฉพาะหรือไม่ เครือข่ายประสาทเทียม Convolutional สามารถบรรลุผลลัพธ์ที่น่าประทับใจในแหล่งข้อมูล "โครงสร้าง" ภาพหรือข้อมูลเสียง เครือข่ายประสาทที่เกิดขึ้นซ้ำสามารถทำได้ดีกับชนิดข้อมูลที่เรียงตามลำดับเช่นภาษาธรรมชาติหรือข้อมูลอนุกรมเวลา การเชื่อมต่อที่เหลือสามารถปรับปรุงเครือข่ายการส่งต่อลึก

การฝึกอบรมเครือข่ายนิวรัลเหมือนกับการเลือกล็อค

เพื่อให้บรรลุรัฐของศิลปะหรือแม้กระทั่งดีเพียงผลลัพธ์ที่คุณต้องมีเพื่อให้มีการตั้งค่าทั้งหมดของชิ้นส่วนการกำหนดค่าให้ทำงานได้ดีร่วมกัน การตั้งค่าโครงข่ายประสาทเทียมที่เรียนรู้ได้จริงนั้นเป็นเรื่องมากเช่นการเลือกล็อค: ชิ้นส่วนทั้งหมดจะต้องเรียงกันอย่างถูกต้อง เนื่องจากมันไม่เพียงพอที่จะมีแก้วน้ำใบเดียวในสถานที่ที่เหมาะสมและไม่เพียงพอที่จะมีเพียงสถาปัตยกรรมหรือเครื่องมือเพิ่มประสิทธิภาพเท่านั้นตั้งค่าอย่างถูกต้อง

การปรับแต่งตัวเลือกการกำหนดค่านั้นไม่ง่ายอย่างที่บอกว่าตัวเลือกการกำหนดค่าประเภทหนึ่ง (เช่นอัตราการเรียนรู้) มีความสำคัญมากกว่าหรือน้อยกว่า (เช่นจำนวนหน่วย) เนื่องจากตัวเลือกทั้งหมดเหล่านี้มีปฏิสัมพันธ์กับตัวเลือกอื่นทั้งหมด ทางเลือกที่สามารถทำได้ดีในการทำงานร่วมกับทางเลือกอื่นทำที่อื่น

นี่คือรายการที่ไม่ครบถ้วนสมบูรณ์ของตัวเลือกการกำหนดค่าซึ่งไม่ใช่ตัวเลือกการทำให้เป็นปกติหรือตัวเลือกการเพิ่มประสิทธิภาพเชิงตัวเลข

หัวข้อทั้งหมดเหล่านี้เป็นพื้นที่การวิจัยที่ใช้งานอยู่

การปรับให้เหมาะสมแบบไม่มีนูนนั้นยาก

ฟังก์ชั่นวัตถุประสงค์ของเครือข่ายนิวรัลเป็นเพียงการนูนเมื่อไม่มีหน่วยที่ซ่อนอยู่การเปิดใช้งานทั้งหมดเป็นแบบเชิงเส้นและเมทริกซ์การออกแบบเต็ม - เนื่องจากการกำหนดค่านี้เป็นปัญหาการถดถอยแบบปกติ

ในกรณีอื่น ๆ ทั้งหมดปัญหาการปรับให้เหมาะสมไม่ใช่แบบนูนและการปรับให้เหมาะสมแบบไม่นูนนั้นยาก ความท้าทายของการฝึกอบรมโครงข่ายประสาทเทียมเป็นที่รู้จักกันดี (ดู: ทำไมการฝึกโครงข่ายประสาทเทียมจึงเป็นเรื่องยาก? ) นอกจากนี้โครงข่ายใยประสาทเทียมมีพารามิเตอร์จำนวนมากซึ่ง จำกัด ให้เราใช้วิธีการสั่งซื้อครั้งแรกเท่านั้น (ดู: ทำไมวิธีการของนิวตันจึงไม่ได้ใช้อย่างกว้างขวางในการเรียนรู้ของเครื่อง? ) นี่เป็นงานวิจัยที่กระตือรือร้นมาก

  • การตั้งค่าอัตราการเรียนรู้ที่ใหญ่เกินไปจะทำให้การปรับให้เหมาะสมแตกต่างเพราะคุณจะกระโดดจากด้านหนึ่งของ "แคนยอน" ไปอีกด้านหนึ่ง การตั้งค่านี้เล็กเกินไปจะทำให้คุณไม่สามารถทำการคืบหน้าได้จริงและอาจทำให้เกิดเสียงรบกวนในหน่วยดอลลาร์สิงคโปร์เพื่อประเมินการไล่ระดับสีของคุณ

  • การไล่ระดับสีจะปรับขนาดบรรทัดฐานของการไล่ระดับสีใหม่หากสูงกว่าเกณฑ์ ฉันเคยคิดว่านี่เป็นพารามิเตอร์ set-and-forget ซึ่งปกติแล้วจะอยู่ที่ 1.0 แต่ฉันพบว่าฉันสามารถทำให้รูปแบบภาษา LSTM ดีขึ้นอย่างมากโดยตั้งเป็น 0.25 ฉันไม่รู้ว่าทำไม

  • การกำหนดตารางอัตราการเรียนรู้สามารถลดอัตราการเรียนรู้ในระหว่างการฝึกอบรม จากประสบการณ์ของฉันการลองใช้การกำหนดเวลาเป็นเหมือนregex : มันแทนที่ปัญหาหนึ่ง ("ฉันจะเรียนรู้ที่จะดำเนินการต่อหลังจากช่วงเวลาหนึ่งได้อย่างไร") มีสองปัญหา ("ฉันจะเรียนรู้ที่จะดำเนินต่อไปหลังจากช่วงเวลาหนึ่ง) ? "และ" ฉันจะเลือกตารางเวลาที่ดีได้อย่างไร ") คนอื่น ๆ ยืนยันว่าการกำหนดตารางเวลาเป็นสิ่งจำเป็น ฉันจะให้คุณตัดสินใจ

  • การเลือกที่ดีขนาด minibatchสามารถมีอิทธิพลต่อกระบวนการเรียนรู้ทางอ้อมตั้งแต่ minibatch ขนาดใหญ่จะมีแนวโน้มที่จะมีความแปรปรวนขนาดเล็ก ( ) กว่า minibatch ขนาดเล็ก คุณต้องการให้ mini-batch มีขนาดใหญ่พอที่จะให้ข้อมูลเกี่ยวกับทิศทางของการไล่ระดับสี แต่มีขนาดเล็กพอที่ SGD สามารถทำให้เครือข่ายของคุณเป็นปกติ

  • มีหลายสายพันธุ์ในการไล่ระดับสีแบบสุ่มซึ่งใช้โมเมนตัมอัตราการเรียนรู้ที่ปรับตัวได้การปรับปรุง Nesterov และอื่น ๆ เพื่อปรับปรุงเมื่อวานิลลา SGD การออกแบบเครื่องมือเพิ่มประสิทธิภาพที่ดีขึ้นนั้นเป็นส่วนสำคัญของการวิจัย ตัวอย่างบางส่วน:

  • เมื่อมันออกมาเป็นครั้งแรกเครื่องมือเพิ่มประสิทธิภาพของอดัมสร้างความสนใจอย่างมาก แต่งานวิจัยเมื่อไม่นานมานี้พบว่า SGD ที่มีแรงผลักดันสามารถทำวิธีไล่ระดับสีแบบปรับตัวได้สำหรับเครือข่ายประสาทเทียม " คุณค่าส่วนต่างของวิธีการไล่ระดับสีแบบปรับตัวในการเรียนรู้ของเครื่อง " โดย Ashia C. Wilson, Rebecca Roelofs, Mitchell Stern, Nathan Srebro, Benjamin Recht

  • แต่ในทางกลับกันบทความล่าสุดนี้เสนอตัวปรับอัตราการเรียนรู้แบบปรับตัวแบบใหม่ซึ่งคาดว่าจะปิดช่องว่างระหว่างวิธีการปรับอัตรากับ SGD ด้วยแรงผลักดัน " ปิดช่องว่างทั่วไปของวิธีการไล่ระดับสีแบบปรับตัวในการฝึกอบรมเครือข่ายประสาทลึก " โดย Jinghui Chen, Quanquan Gu

    วิธีการไล่ระดับสีแบบ Adaptive ซึ่งใช้ข้อมูลการไล่ระดับสีในอดีตเพื่อปรับอัตราการเรียนรู้โดยอัตโนมัติได้รับการสังเกตเพื่อพูดคุยที่เลวร้ายยิ่งกว่าเชื้อสายการไล่ระดับสีแบบสุ่ม (SGD) ด้วยโมเมนตัมในการฝึกอบรมโครงข่ายประสาทเทียม นี่จะทำให้วิธีปิดช่องว่างทั่วไปของวิธีการไล่ระดับสีแบบปรับตัวเป็นปัญหาเปิด ในงานนี้เราแสดงให้เห็นว่าวิธีการไล่ระดับสีแบบปรับตัวเช่นอดัมอัมสกราดบางครั้ง "ถูกดัดแปลง" เราออกแบบอัลกอริทึมใหม่ที่เรียกว่าวิธีการประมาณค่าโมเมนตัมที่ปรับตัวได้บางส่วน (Padam) ซึ่งรวม Adam / Amsgrad กับ SGD เพื่อให้ได้สิ่งที่ดีที่สุดจากทั้งสองโลก การทดสอบเกณฑ์มาตรฐานแสดงให้เห็นว่า Padam สามารถรักษาอัตราการบรรจบกันอย่างรวดเร็วเช่น Adam / Amsgrad ในขณะที่ใช้งานทั่วไปและ SGD ในการฝึกอบรมโครงข่ายประสาทเทียม

normalization

ขนาดของข้อมูลสามารถสร้างความแตกต่างใหญ่ในการฝึกอบรม

regularization

การเลือกและการปรับจูนเครือข่ายให้สม่ำเสมอเป็นส่วนสำคัญของการสร้างแบบจำลองที่สรุปได้ดี (นั่นคือแบบจำลองที่ไม่เหมาะสมกับข้อมูลการฝึกอบรม) อย่างไรก็ตามในเวลาที่เครือข่ายของคุณกำลังพยายามลดการสูญเสียข้อมูลการฝึกอบรม - เมื่อเครือข่ายไม่ได้เรียนรู้ - การทำให้เป็นมาตรฐานสามารถปิดบังสิ่งที่เป็นปัญหา

เมื่อเครือข่ายของฉันไม่เรียนรู้ฉันจะปิดการทำให้เป็นมาตรฐานทั้งหมดและตรวจสอบว่าเครือข่ายที่ไม่ทำให้เป็นปกติทำงานได้อย่างถูกต้อง จากนั้นฉันเพิ่มชิ้นส่วนการทำให้เป็นปกติแต่ละชิ้นกลับมาและตรวจสอบว่าชิ้นงานแต่ละชิ้นทำงานไปพร้อมกัน

ชั้นเชิงนี้สามารถระบุตำแหน่งที่อาจทำให้การกำหนดมาตรฐานบางอย่างไม่ดี ตัวอย่างบางส่วนคือ

เก็บสมุดบันทึกการทดลอง

เมื่อฉันตั้งค่าเครือข่ายประสาทฉันไม่ได้ยากรหัสการตั้งค่าพารามิเตอร์ใด ๆ แต่ฉันทำเช่นนั้นในไฟล์การกำหนดค่า (เช่น JSON) ที่อ่านและใช้เพื่อเติมรายละเอียดการกำหนดค่าเครือข่ายตอนรันไทม์ ฉันเก็บไฟล์การกำหนดค่าเหล่านี้ทั้งหมด หากฉันแก้ไขพารามิเตอร์ใด ๆ ฉันจะสร้างไฟล์กำหนดค่าใหม่ ในที่สุดฉันก็ผนวกความคิดเห็นทั้งหมดของการสูญเสียต่อยุคสำหรับการฝึกอบรมและการตรวจสอบ

k

เป็นตัวอย่างฉันต้องการเรียนรู้เกี่ยวกับรูปแบบภาษา LSTM ดังนั้นฉันจึงตัดสินใจสร้างบอต Twitter ที่เขียนทวีตใหม่เพื่อตอบสนองผู้ใช้ Twitter คนอื่น ฉันทำงานนี้ในเวลาว่างระหว่างเรียนจบและงานของฉัน ใช้เวลาประมาณหนึ่งปีและฉันทำซ้ำโมเดลประมาณ 150 แบบก่อนที่จะไปยังแบบจำลองที่ทำในสิ่งที่ฉันต้องการ: สร้างข้อความภาษาอังกฤษใหม่ที่ (เรียงลำดับ) เข้าท่า (จุดยึดหลักหนึ่งจุดและส่วนหนึ่งของเหตุผลที่ต้องใช้ความพยายามหลายครั้งก็คือมันไม่เพียงพอที่จะทำให้เกิดการสูญเสียตัวอย่างน้อยเนื่องจากแบบจำลองการสูญเสียต่ำรุ่นแรก ๆ สามารถจดจำข้อมูลการฝึกอบรมได้ ดังนั้นมันจึงเป็นเพียงการสร้างบล็อคของคำต่อคำแบบข้อความเพื่อตอบสนองต่อข้อความแจ้ง - มันใช้เวลาปรับแต่งบางอย่างเพื่อทำให้แบบจำลองเป็นธรรมชาติมากขึ้นและยังคงมีการสูญเสียต่ำ)


11
คำแนะนำที่ดีมากมาย เป็นที่น่าสนใจว่าความคิดเห็นของคุณจะคล้ายกับความคิดเห็นที่ฉันทำ (หรือเคยเห็นคนอื่นทำ) เกี่ยวกับการดีบักการประมาณค่าพารามิเตอร์หรือการทำนายสำหรับโมเดลที่ซับซ้อนด้วยแผนการสุ่มตัวอย่าง MCMC (ตัวอย่างเช่นรหัสอาจทำงานได้เมื่อไม่ได้ใช้อย่างถูกต้อง)
Glen_b

11
@Glen_b ฉันไม่คิดว่าการเขียนโค้ดวิธีปฏิบัติที่ดีที่สุดจะได้รับการเน้นย้ำอย่างเพียงพอในหลักสูตรการเรียนรู้สถิติ / เครื่องส่วนใหญ่ซึ่งเป็นเหตุผลที่ฉันเน้นจุดนั้นอย่างหนัก ฉันเห็นโพสต์ของ NN จำนวนหนึ่งที่ OP ฝากความคิดเห็นไว้เช่น“ โอ้ฉันพบข้อผิดพลาดแล้วตอนนี้มันใช้งานได้แล้ว”
Sycorax

7
ฉันสอนการเขียนโปรแกรมสำหรับหลักสูตรวิทยาศาสตร์ข้อมูลในหลามและเราทำการทดสอบฟังก์ชั่นและหน่วยในวันแรกเป็นแนวคิดหลัก การต่อสู้การต่อสู้ที่ดี
Matthew Drury

8
+1 สำหรับ "การเข้ารหัสทั้งหมดกำลังดีบั๊ก" ฉันประหลาดใจที่มีผู้โพสต์จำนวนมากบน SO ดูเหมือนว่าการเขียนโค้ดเป็นการออกกำลังกายอย่างง่าย ๆ ที่ต้องใช้ความพยายามเพียงเล็กน้อย ผู้ที่คาดหวังว่ารหัสของพวกเขาจะทำงานอย่างถูกต้องในครั้งแรกที่พวกเขาเรียกใช้ และผู้ที่ดูเหมือนจะไม่สามารถดำเนินการต่อเมื่อไม่ได้ สิ่งที่ตลกคือว่าพวกเขากำลังครึ่งขวา: การเขียนโปรแกรมเป็นเรื่องง่าย - แต่การเขียนโปรแกรมเป็นเรื่องยาก
บ๊อบจาร์วิส

41

คำตอบที่โพสต์นั้นยอดเยี่ยมและฉันต้องการเพิ่ม "การตรวจสุขภาพจิต" ซึ่งช่วยฉันได้มากในอดีต

1) ฝึกโมเดลของคุณในจุดข้อมูลเดียว หากวิธีนี้ใช้งานได้ให้ฝึกกับอินพุตทั้งสองด้วยเอาต์พุตที่ต่างกัน

สิ่งนี้จะตรวจสอบบางสิ่ง ก่อนอื่นมันจะแสดงให้คุณเห็นอย่างรวดเร็วว่าแบบจำลองของคุณสามารถเรียนรู้ได้ด้วยการตรวจสอบว่าแบบจำลองของคุณสามารถทำให้ข้อมูลของคุณเหมาะสมหรือไม่ ในกรณีของฉันฉันทำผิดพลาดอย่างต่อเนื่องในการทำDense(1,activation='softmax')vs Dense(1,activation='sigmoid')สำหรับการทำนายแบบไบนารีและอันแรกให้ผลลัพธ์ขยะ

หากแบบจำลองของคุณไม่สามารถจัดให้มีจุดข้อมูลน้อยเกินไปแสดงว่ามันเล็กเกินไป (ซึ่งไม่น่าเป็นไปได้ในยุคปัจจุบัน) หรือมีสิ่งผิดปกติในโครงสร้างหรืออัลกอริทึมการเรียนรู้

2) ให้ความสนใจกับการสูญเสียครั้งแรกของคุณ

L=0.3ln(0.5)0.7ln(0.5)0.7

0.3ln(0.99)0.7ln(0.01)=3.2

คุณสามารถศึกษาสิ่งนี้เพิ่มเติมได้โดยสร้างแบบจำลองของคุณทำนายจากตัวอย่างสองสามพันตัวอย่างจากนั้นฮิสโตแกรมที่แสดงผลลัพธ์ สิ่งนี้มีประโยชน์อย่างยิ่งสำหรับการตรวจสอบว่าข้อมูลของคุณได้รับการทำให้เป็นมาตรฐานอย่างถูกต้อง ตัวอย่างเช่นหากคุณคาดหวังว่าผลลัพธ์ของคุณจะเบ้อย่างหนักเป็น 0 อาจเป็นความคิดที่ดีที่จะแปลงผลลัพธ์ที่คาดหวัง (ข้อมูลการฝึกอบรม) โดยการหาสแควร์รูทของผลลัพธ์ที่คาดหวัง สิ่งนี้จะหลีกเลี่ยงปัญหาการไล่ระดับสีสำหรับ sigmoids ที่อิ่มตัวที่เอาต์พุต

3) วางรูปแบบทั่วไปของคุณในการดีบัก

ตัวอย่างเช่นสมมติว่าคุณกำลังใช้ LSTM เพื่อทำการคาดการณ์จากข้อมูลอนุกรมเวลา บางทีในตัวอย่างของคุณคุณสนใจเพียงการคาดการณ์ล่าสุดดังนั้น LSTM ของคุณจะแสดงผลเป็นค่าเดียวไม่ใช่ลำดับ สลับ LSTM เพื่อกลับการคาดการณ์ในแต่ละขั้นตอน (ใน keras นี่คือreturn_sequences=True) จากนั้นคุณสามารถดูผลลัพธ์ที่ซ่อนของคุณหลังจากทุกขั้นตอนและตรวจสอบให้แน่ใจว่าพวกเขาจะแตกต่างกันจริง แอปพลิเคชันของสิ่งนี้คือการตรวจสอบให้แน่ใจว่าเมื่อคุณปิดบังลำดับของคุณ (เช่นการใส่ข้อมูลเพื่อให้มีความยาวเท่ากัน) LSTM จะละเว้นข้อมูลที่ถูกปิดบังอย่างถูกต้อง โดยไม่ต้อง generalizing รูปแบบของคุณคุณจะไม่พบปัญหานี้

4) ดูแต่ละเลเยอร์

Tensorboard ให้เป็นวิธีที่มีประโยชน์ของการแสดงผลชั้นของคุณ สิ่งนี้สามารถช่วยให้แน่ใจได้ว่าอินพุต / เอาต์พุตมีการปรับมาตรฐานให้เหมาะสมในแต่ละชั้น นอกจากนี้ยังสามารถรับการเปิดใช้งานแบบบั๊กกี้ นอกจากนี้คุณยังสามารถสืบค้นผลลัพธ์เลเยอร์เป็น keras จากชุดการคาดคะเนจากนั้นมองหาเลเยอร์ที่มีการเปิดใช้งานที่เบ้อย่างน่าสงสัย (ทั้ง 0 หรือทั้งหมดที่ไม่ใช่ศูนย์)

5) สร้างแบบจำลองที่ง่ายกว่าก่อน

คุณได้ตัดสินใจแล้วว่าวิธีที่ดีที่สุดในการแก้ปัญหาของคุณคือการใช้ CNN ร่วมกับเครื่องมือตรวจจับขอบเขตเพื่อประมวลผลภาพพืชแล้วใช้ LSTM เพื่อรวมทุกอย่างเข้าด้วยกัน ใช้เวลา 10 นาทีสำหรับ GPU ของคุณในการเริ่มต้นแบบจำลองของคุณ

ให้สร้างชุดของข้อมูลปลอม (รูปร่างเดียวกัน) และแบ่งโมเดลของคุณเป็นส่วนประกอบ จากนั้นสร้างโมเดลจำลองแทนแต่ละองค์ประกอบ ("CNN" ของคุณอาจเป็น 2x2 20-stride convolution เดียว LSTM ที่มีเพียง 2 ยูนิตที่ซ่อนอยู่) สิ่งนี้จะช่วยให้คุณตรวจสอบให้แน่ใจว่าโครงสร้างโมเดลของคุณถูกต้องและไม่มีประเด็นที่ไม่เกี่ยวข้อง ฉันพยายามอยู่กับนางแบบมาซักพักหนึ่งและเมื่อฉันลองรุ่นที่เรียบง่ายขึ้นฉันพบว่าหนึ่งในเลเยอร์ไม่ได้ถูกปกปิดอย่างเหมาะสมเนื่องจากข้อผิดพลาดของ keras คุณสามารถสืบค้นเลเยอร์โมเดลภายในได้อย่างง่ายดาย (และรวดเร็ว ) และดูว่าคุณได้ตั้งค่ากราฟของคุณอย่างถูกต้องหรือไม่

6) สร้างมาตรฐานการประมวลผลล่วงหน้าและเวอร์ชันแพ็คเกจของคุณ

เครือข่ายนิวรัลโดยเฉพาะอย่างยิ่งมีความไวต่อการเปลี่ยนแปลงเล็กน้อยในข้อมูลของคุณ เป็นตัวอย่างที่สองความนิยมแพคเกจโหลดภาพอยู่และcv2 PILเพียงแค่อาศัยการเปิด JPEG แพคเกจทั้งสองนี้จะให้ภาพที่แตกต่างกันเล็กน้อย ความแตกต่างนั้นมักจะเล็กมาก แต่บางครั้งคุณจะเห็นประสิทธิภาพของแบบจำลองลดลงเนื่องจากสิ่งของประเภทนี้ นอกจากนี้ยังทำให้การดีบักฝันร้าย: คุณได้รับคะแนนการตรวจสอบในระหว่างการฝึกอบรมและหลังจากนั้นคุณก็ใช้ตัวโหลดที่แตกต่างกันและได้รับความแม่นยำที่แตกต่างกันในชุดข้อมูลเดียวกัน

ดังนั้นหากคุณกำลังดาวน์โหลดโมเดลของใครบางคนจาก GitHub ให้ใส่ใจกับกระบวนการของพวกเขาก่อน พวกเขาใช้รถตักภาพอะไร พวกเขาใช้รูทีนการประมวลผลภาพล่วงหน้าอะไรบ้าง เมื่อปรับขนาดรูปภาพพวกเขาใช้การแก้ไขแบบใด พวกเขาปรับขนาดก่อนแล้วจึงทำให้รูปภาพเป็นปกติหรือไม่ หรือวิธีอื่น ๆ ช่องสั่งซื้อสำหรับภาพ RGB คืออะไร?

วิธีที่ปลอดภัยที่สุดของแพคเกจมาตรฐานคือการใช้requirements.txtไฟล์ที่แสดงแพคเกจทั้งหมดของคุณเช่นเดียวกับในการตั้งค่าระบบการฝึกอบรมของคุณลงไปที่keras==2.1.5หมายเลขรุ่น ในทางทฤษฎีแล้วการใช้ Docker พร้อมกับ GPU เดียวกันกับระบบการฝึกอบรมของคุณควรสร้างผลลัพธ์ที่เหมือนกัน


7
(+1) การตรวจสอบการสูญเสียครั้งแรกเป็นข้อเสนอแนะที่ดี ฉันเสียใจที่ฉันทิ้งมันไว้จากคำตอบของฉัน
Sycorax

7
การทำให้แน่ใจว่าแบบจำลองของคุณสามารถ overfit เป็นความคิดที่ยอดเยี่ยม ฉันเคยคิดที่จะคิดมากเกินไปว่าเป็นจุดอ่อนที่ฉันไม่เคยคิดอย่างชัดเจน (จนกว่าคุณจะพูดถึงมัน) ว่าความสามารถในการ overfit นั้นเป็นจุดแข็ง
จอห์นโคลแมน

15

อย่าฝึกเครือข่ายประสาทเพื่อเริ่มต้นด้วย!

คำตอบทั้งหมดนั้นยอดเยี่ยม แต่มีจุดหนึ่งที่ควรกล่าวถึง: มีอะไรที่ต้องเรียนรู้จากข้อมูลของคุณ? (ซึ่งอาจถือได้ว่าเป็นการทดสอบบางประเภท)

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

แต่ให้เริ่มปรับเทียบการถดถอยเชิงเส้นซึ่งเป็นฟอเรสต์แบบสุ่ม (หรือวิธีการใด ๆ ที่คุณต้องการซึ่งมีพารามิเตอร์ไฮเปอร์พารามิเตอร์ต่ำและพฤติกรรมที่คุณเข้าใจได้)

จากนั้นหากคุณได้รับประสิทธิภาพที่ดีในแบบจำลองเหล่านี้ (ดีกว่าการคาดเดาแบบสุ่ม) คุณสามารถเริ่มปรับจูนเครือข่ายประสาท (และคำตอบของ @Sycorax จะแก้ปัญหาส่วนใหญ่ได้)


5
xk

11

ที่เป็นแกนหลักเวิร์กโฟลว์พื้นฐานสำหรับการฝึกอบรมแบบจำลอง NN / DNN จะมากหรือน้อยกว่าเสมอกัน:

  1. กำหนดสถาปัตยกรรม NN (จำนวนชั้นซึ่งชนิดของชั้นการเชื่อมต่อระหว่างชั้นฟังก์ชั่นการเปิดใช้งาน ฯลฯ )

  2. อ่านข้อมูลจากแหล่งข้อมูลบางส่วน (อินเทอร์เน็ตฐานข้อมูลชุดไฟล์ภายในเครื่อง ฯลฯ ) ดูตัวอย่างบางส่วน (เพื่อให้แน่ใจว่าการนำเข้าทำงานได้ดี) และดำเนินการล้างข้อมูลหากจำเป็น ขั้นตอนนี้ไม่สำคัญเหมือนคนทั่วไปมักคิดเอาเอง เหตุผลก็คือสำหรับ DNN เรามักจะจัดการกับชุดข้อมูลขนาดใหญ่คำสั่งขนาดใหญ่กว่าที่เราเคยทำเมื่อเราพอดีกับแบบจำลองเชิงสถิติแบบไม่เชิงเส้นมากกว่ามาตรฐาน(NNs เป็นของครอบครัวนี้ตามทฤษฎี)

  3. ทำให้เป็นมาตรฐานหรือทำให้ข้อมูลเป็นมาตรฐานในบางวิธี เนื่องจาก NN เป็นโมเดลที่ไม่ใช่เชิงเส้นการทำให้ข้อมูลเป็นมาตรฐานไม่เพียงส่งผลต่อเสถียรภาพเชิงตัวเลข แต่ยังรวมถึงเวลาในการฝึกอบรมและเอาท์พุท NN ด้วย (ฟังก์ชันเชิงเส้นเช่นการทำให้เป็นมาตรฐาน

  4. แยกข้อมูลในชุดฝึกอบรม / ตรวจสอบ / ทดสอบหรือในหลายเท่าหากใช้การตรวจสอบข้าม

  5. ฝึกอบรมโครงข่ายประสาทเทียมในขณะเดียวกันก็ควบคุมการสูญเสียในชุดการตรวจสอบความถูกต้อง ที่นี่คุณสามารถเพลิดเพลินไปกับความสุขของการเพิ่มประสิทธิภาพแบบไม่มีการนูนซึ่งคุณไม่ทราบว่ามีวิธีการแก้ปัญหาใดหรือไม่หากมีวิธีการแก้ปัญหาอยู่หลายตัวซึ่งเป็นทางออกที่ดีที่สุดในแง่ของข้อผิดพลาดทั่วไป มัน. การเปรียบเทียบระหว่างการสูญเสียการฝึกอบรมและเส้นโค้งการสูญเสียการตรวจสอบจะแนะนำคุณอย่างแน่นอน แต่อย่าประมาททัศนคติที่แข็งกระด้างของ NNs (และโดยเฉพาะอย่างยิ่ง DNNs): พวกเขามักจะแสดงการสูญเสียการฝึกอบรม / การตรวจสอบความถูกต้องการทำลายข้อบกพร่องในรหัสของคุณ

  6. ตรวจสอบความถูกต้องของชุดทดสอบและทำการแปลง / ตารางการวินิจฉัยบางอย่าง

  7. กลับไปที่จุด 1 เพราะผลลัพธ์ไม่ดี คงคำแนะนำน่าชัง

แน่นอนว่ารายละเอียดจะเปลี่ยนไปตามกรณีการใช้งานเฉพาะ แต่ด้วยความคำนึงถึงผืนผ้าใบคร่าวๆนี้เราสามารถคิดได้ว่าอะไรจะเกิดความผิดพลาดมากขึ้น

ตรวจสอบสถาปัตยกรรมพื้นฐาน

นี่อาจเป็นสาเหตุของปัญหา ฉันมักจะทำการตรวจสอบเบื้องต้นเหล่านี้:

  • มองหาสถาปัตยกรรมอย่างง่ายที่ทำงานได้ดีกับปัญหาของคุณ (ตัวอย่างเช่น MobileNetV2 ในกรณีของการจำแนกภาพ) และใช้การเริ่มต้นที่เหมาะสม (ในระดับนี้โดยปกติจะเป็นการสุ่ม) หากการฝึกอบรมนี้ถูกต้องกับข้อมูลของคุณอย่างน้อยคุณก็รู้ว่าไม่มีปัญหาการจ้องมองในชุดข้อมูล ถ้าคุณไม่สามารถหาง่ายสถาปัตยกรรมการทดสอบที่ทำงานในกรณีของคุณคิดพื้นฐานที่เรียบง่าย ตัวอย่างเช่นตัวจําแนก Naive Bayes สําหรับการจําแนก (หรือแม้กระทั่งการจําแนกประเภทคลาสที่พบบ่อยที่สุดเสมอ) หรือแบบจําลอง ARIMA สําหรับการพยากรณ์อนุกรมเวลา

  • สร้างการทดสอบหน่วย การละเลยที่จะทำสิ่งนี้ (และการใช้โน๊ตบุ๊คเลือด Jupyter) มักเป็นสาเหตุของปัญหาในรหัส NN ที่ฉันขอให้ตรวจสอบโดยเฉพาะอย่างยิ่งเมื่อโมเดลควรจะถูกปรับใช้ในการผลิต เนื่องจากคำตอบที่ได้รับการโหวตมากที่สุดครอบคลุมการทดสอบหน่วยแล้วฉันจะเพิ่มว่ามีไลบรารีที่สนับสนุนการพัฒนาการทดสอบหน่วยสำหรับ NN (เฉพาะใน Tensorflow แต่น่าเสียดาย)

ชุดฝึกอบรม

ตรวจสอบข้อมูลอินพุตอีกครั้ง ดูว่าคุณคว่ำฉลากชุดฝึกอบรมและชุดทดสอบหรือไม่ (เกิดขึ้นกับฉันหนึ่งครั้ง -___-) หรือถ้าคุณนำเข้าไฟล์ผิด ดูที่ตัวอย่างอินพุตและเลเบลที่เกี่ยวข้องและดูให้แน่ใจว่าเหมาะสม ตรวจสอบว่าข้อมูลที่ทำให้เป็นมาตรฐานได้รับการทำให้เป็นมาตรฐานจริงๆ (ดูช่วงของพวกเขา) ยิ่งไปกว่านั้นชุดข้อมูลในโลกแห่งความจริงสกปรก: สำหรับการจำแนกประเภทอาจมีระดับเสียงรบกวนของฉลาก (ตัวอย่างที่มีป้ายกำกับคลาสที่ไม่ถูกต้อง) หรือสำหรับการพยากรณ์อนุกรมเวลาหลายตัวแปรส่วนประกอบของอนุกรมเวลาบางส่วนอาจมีข้อมูลหายไปจำนวนมาก ฉันเห็นตัวเลขสูงถึง 94% สำหรับอินพุตบางตัว)

ลำดับที่ชุดฝึกอบรมจะถูกป้อนเข้าสู่เน็ตระหว่างการฝึกอาจมีผลกระทบ ลองสุ่มชุดการฝึกอบรมแบบสุ่ม ( โดยไม่ทำลายความสัมพันธ์ระหว่างอินพุตและเอาต์พุต ) และดูว่าการสูญเสียการฝึกอบรมลดลงหรือไม่

ในที่สุดวิธีที่ดีที่สุดในการตรวจสอบว่าคุณมีปัญหาชุดฝึกอบรมหรือไม่ก็คือใช้ชุดฝึกอบรมอื่น หากคุณกำลังจัดหมวดหมู่ภาพแทนที่จะเป็นภาพที่คุณรวบรวมให้ใช้ชุดข้อมูลมาตรฐานเช่น CIFAR10 หรือ CIFAR100 (หรือ ImageNet หากคุณสามารถที่จะฝึกอบรมได้) ชุดข้อมูลเหล่านี้ได้รับการทดสอบอย่างดี: หากการสูญเสียการฝึกอบรมของคุณลดลงที่นี่ แต่ไม่ได้อยู่ในชุดข้อมูลดั้งเดิมของคุณคุณอาจมีปัญหาในชุดข้อมูล

ทำแบบทดสอบทองคำ

มีการทดสอบสองแบบที่ฉันเรียกว่า Golden Tests ซึ่งมีประโยชน์มากในการค้นหาปัญหาใน NN ที่ไม่ได้ฝึกฝน:

  • ลดชุดฝึกอบรมเป็น 1 หรือ 2 ตัวอย่างและฝึกฝนในสิ่งนี้ NN ควรเหมาะสมกับชุดการฝึกอบรมในทันทีโดยมีความแม่นยำ 100% ในชุดฝึกอบรมอย่างรวดเร็วในขณะที่ความแม่นยำของชุดการตรวจสอบ / การทดสอบจะเป็น 0% หากไม่เกิดขึ้นแสดงว่ามีข้อผิดพลาดในรหัสของคุณ

  • การทดสอบที่ตรงข้าม: คุณเก็บชุดการฝึกอบรมไว้เต็ม แต่คุณสับเปลี่ยนฉลาก วิธีเดียวที่ NN สามารถเรียนรู้ได้ในตอนนี้คือการจำชุดฝึกอบรมซึ่งหมายความว่าการสูญเสียการฝึกอบรมจะลดลงช้ามากในขณะที่การสูญเสียการทดสอบจะเพิ่มขึ้นอย่างรวดเร็วมาก โดยเฉพาะอย่างยิ่งที่คุณควรจะถึงการสูญเสียโอกาสสุ่มในชุดทดสอบ ซึ่งหมายความว่าหากคุณมี 1,000 คลาสคุณควรมีความแม่นยำถึง 0.1% หากคุณไม่เห็นความแตกต่างระหว่างการสูญเสียการฝึกอบรมก่อนและหลังการสับฉลากหมายความว่ารหัสของคุณเป็นรถ (โปรดจำไว้ว่าเราได้ตรวจสอบฉลากของชุดฝึกอบรมในขั้นตอนก่อนหน้าแล้ว)

ตรวจสอบว่าตัวชี้วัดการฝึกอบรมของคุณสมเหตุสมผลแล้ว

ความแม่นยำ (การสูญเสีย 0-1) เป็นตัวชี้วัดเส็งเคร็งถ้าคุณมีระดับความไม่สมดุลที่แข็งแกร่ง ลองทำสิ่งที่มีความหมายมากขึ้นเช่นการสูญเสียข้ามเอนโทรปี: คุณไม่ต้องการจัดประเภทอย่างถูกต้อง แต่คุณต้องการจัดประเภทด้วยความแม่นยำสูง

นำปืนใหญ่ออกมา

ถ้าไม่มีอะไรช่วยตอนนี้ถึงเวลาที่จะเริ่มเล่นซอกับพารามิเตอร์ นี่เป็นส่วนที่แย่ที่สุดของการฝึกอบรม NN แต่นี่คือโมเดลขนาดยักษ์ที่ไม่สามารถระบุตัวตนได้ซึ่งพารามิเตอร์เหมาะสมโดยการแก้ปัญหาการเพิ่มประสิทธิภาพแบบไม่นูนดังนั้นการทำซ้ำเหล่านี้จึงไม่สามารถหลีกเลี่ยงได้

  • ลองใช้เครื่องมือเพิ่มประสิทธิภาพที่แตกต่างกัน: รถไฟสิงคโปร์ช้าลง แต่มันนำไปสู่ข้อผิดพลาดในการวางนัยทั่วไปที่ต่ำกว่าขณะที่อดัมฝึกได้เร็วขึ้น
  • ลองลดขนาดชุด
  • เพิ่มอัตราการเรียนรู้เริ่มแรกจากนั้นสลายตัวหรือใช้อัตราการเรียนรู้แบบวนรอบ
  • เพิ่มเลเยอร์
  • เพิ่มหน่วยที่ซ่อนอยู่
  • ลบการทำให้เป็นมาตรฐานอย่างค่อยเป็นค่อยไป (อาจสลับบรรทัดฐานแบทช์สำหรับสองสามเลเยอร์) การสูญเสียการฝึกอบรมควรลดลง แต่การสูญเสียการทดสอบอาจเพิ่มขึ้น
  • เห็นภาพการกระจายน้ำหนักและอคติสำหรับแต่ละชั้น ฉันไม่เคยมาที่นี่ แต่ถ้าคุณใช้ BatchNorm คุณจะคาดหวังการแจกแจงปกติมาตรฐานโดยประมาณ ดูว่าบรรทัดฐานของตุ้มน้ำหนักเพิ่มขึ้นอย่างผิดปกติกับยุคหรือไม่
  • ถ้าคุณได้รับข้อผิดพลาดบางอย่างในช่วงเวลาการฝึกอบรมgoogle ข้อผิดพลาดที่ ฉันเสียวันหนึ่งในขณะที่พยายามแก้ไขสถาปัตยกรรมที่ทำงานได้อย่างสมบูรณ์ แต่พบว่ารุ่นของ Keras ที่ฉันติดตั้งนั้นมีการสนับสนุน GPU หลายตัวและฉันต้องอัปเดต บางครั้งฉันก็ต้องทำตรงกันข้าม (ลดรุ่นแพ็คเกจ)
  • อัปเดตประวัติของคุณและเริ่มหางานอื่น :-)

+1 แต่ "โน๊ตบุ๊ค Jupyter เลือด" สนใจที่จะแสดงความคิดเห็นในที่? :)
อะมีบา

2
นี่คือเหตุผลที่ผมเกลียด Jupyter โน้ตบุ๊ค TL; DR: สถานะที่ซ่อนอยู่การกระจายเป็นความเจ็บปวดปัญหาด้านความปลอดภัยและสนับสนุนการฝึกเขียนโปรแกรมที่ไม่ดีเช่นไม่ใช้การทดสอบหน่วย / การถดถอย / การรวมระบบ การฝึกอบรม NNs นั้นยากพอแล้วโดยไม่มีใครลืมเรื่องพื้นฐานของการเขียนโปรแกรม
DeltaIV

2
ฉันอาจจะเป็นลบเกินไป แต่ตรงไปตรงมาฉันมีเพียงพอกับคนโคลนสมุดบันทึก Jupyter จาก GitHub คิดว่ามันจะใช้เวลาไม่กี่นาทีในการปรับรหัสให้เหมาะกับการใช้งานของพวกเขาและจากนั้นฉันก็บ่นว่าไม่มีอะไรทำงาน เพื่อประโยชน์ของ cripes รับ IDE จริงเช่น PyCharm หรือ VisualStudio Code และสร้างรหัสที่มีโครงสร้างดีแทนที่จะทำโน๊ตบุ๊ค! โดยเฉพาะถ้าคุณวางแผนที่จะส่งแบบจำลองไปยังการผลิตมันจะทำให้สิ่งต่าง ๆ ง่ายขึ้นมาก
DeltaIV

2
ฮ่า ๆ. 'โน๊ตบุ๊ค Jupyter' และ 'การทดสอบหน่วย' นั้นมีความสัมพันธ์เชิงต่อต้าน
Sycorax

2
(+1) นี่เป็นบทความที่ดี คำแนะนำสำหรับการทดสอบการสุ่มเป็นวิธีที่ยอดเยี่ยมในการหาเครือข่ายที่บั๊ก
Sycorax

6

หากแบบจำลองไม่ได้เรียนรู้อาจเป็นไปได้ที่การ backpropagation ของคุณจะไม่ทำงาน แต่มีหลายสิ่งหลายอย่างที่ผิดไปได้กับโมเดลกล่องดำเช่น Neural Network มีหลายสิ่งที่คุณต้องตรวจสอบ ฉันคิดว่า Sycorax และ Alex ทั้งคู่ให้คำตอบที่ครอบคลุมดีมาก เพียงแค่ต้องการเพิ่มเทคนิคเดียวที่ยังไม่ได้กล่าวถึง

ϵ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.