การฝึกอบรมเครือข่ายประสาทเพื่อการถดถอยจะทำนายค่าเฉลี่ยเสมอ


9

ฉันกำลังฝึกอบรมเครือข่ายประสาทเทียมแบบง่ายสำหรับการถดถอยซึ่งงานนี้จะทำนายตำแหน่ง (x, y) ของกล่องในภาพเช่น:

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

เอาต์พุตของเครือข่ายมีสองโหนดหนึ่งรายการสำหรับ x และอีกหนึ่งสำหรับ y ส่วนที่เหลือของเครือข่ายเป็นเครือข่ายประสาทเทียมมาตรฐาน การสูญเสียเป็นค่าเฉลี่ยความคลาดเคลื่อนกำลังสองระหว่างตำแหน่งที่ทำนายของกล่องและตำแหน่งจริงของพื้นดิน ฉันกำลังฝึกอบรมเกี่ยวกับ 10,000 ภาพเหล่านี้และการตรวจสอบในปี 2000

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

ป้อนคำอธิบายรูปภาพที่นี่

ฉันใช้งานสิ่งนี้ได้หลายครั้งมากกว่าที่แสดงในกราฟนี้และการสูญเสียยังไม่ลดลง น่าสนใจที่นี่การสูญเสียเพิ่มขึ้น ณ จุดหนึ่ง

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


หากคุณมีความสนใจในบางรหัสของฉัน (Keras) มันเป็นด้านล่าง:

# Create the model
model = Sequential()
model.add(Convolution2D(32, 5, 5, border_mode='same', subsample=(2, 2), activation='relu', input_shape=(3, image_width, image_height)))
model.add(Convolution2D(64, 5, 5, border_mode='same', subsample=(2, 2), activation='relu'))
model.add(Convolution2D(128, 5, 5, border_mode='same', subsample=(2, 2), activation='relu'))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(2, activation='linear'))


# Compile the model
adam = Adam(lr=0.01, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
model.compile(loss='mean_squared_error', optimizer=adam)


# Fit the model
model.fit(images, targets, batch_size=128, nb_epoch=1000, verbose=1, callbacks=[plot_callback], validation_split=0.2, shuffle=True)

ภาพในตัวอย่างด้านบนของตัวอย่างจริงของคุณหรือไม่ นั่นคือ 5 ตัวอย่างที่แยกกันหรือไม่ ดูเหมือนจะไม่มีข้อมูลในภาพที่จะช่วยให้พูดคุยกันได้ทั่วไป ฉันหมายความว่าคุณไม่จำเป็นต้องมีโครงข่ายประสาทเพื่อหาตำแหน่ง x, y ของสี่เหลี่ยมสีขาวคุณสามารถแยกวิเคราะห์รูปภาพและมองหาพิกเซลสีขาวได้ อธิบายเพิ่มเติมเกี่ยวกับวิสัยทัศน์ของคุณสำหรับโมเดลนี้ มีรูปแบบทางโลกซึ่งคุณคาดการณ์ตำแหน่งต่อไปหรือไม่?
photox

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

1
1) รูปร่างอินพุตของคุณใน Conv ชั้นแรกใช้แชแนล 3 (rbg) แต่ข้อมูลของคุณเป็นสีเทา (1 ช่อง) 2) คุณไม่จำเป็นต้องมีเลเยอร์ Conv และฟิลเตอร์จำนวนมากจริงๆแล้วฉันคิดว่าเป็นเลเยอร์เดียวและ เมล็ดเล็ก ๆ หนึ่งกำมือก็ดี
photox

คุณแน่ใจหรือไม่ว่าภาพต่าง ๆ สอดคล้องกับเป้าหมายจริง ๆ ?
user31264

1
เช่นเดียวกับ @photox พูดว่าคุณไม่จำเป็นต้องใช้เลเยอร์ Conv การเพิ่มสิ่งเหล่านี้ทำให้เพิ่มประสิทธิภาพได้ยากขึ้นเพื่อหาทางออกที่ดี หากคุณลบ 3 Conv layer ฉันสงสัยว่า "รุ่น" ของคุณจะใช้งานได้
ปีเตอร์

คำตอบ:


8

เครื่องมือเพิ่มประสิทธิภาพไม่สามารถรวมเข้ากับโซลูชันที่ดีที่สุด (ย่อย) ทำไม? ปัญหาของคุณง่ายเกินไปและ / หรือโมเดลของคุณซับซ้อนเกินไป

ปัญหาง่ายเกินไป

ดังที่ @photox กล่าวแล้วว่าปัญหานี้สามารถแก้ไขได้ด้วยเลเยอร์ที่ซ่อนอยู่เพียงชั้นเดียว ฉันยังสงสัยว่ามันสามารถทำได้โดยไม่มีเลเยอร์ที่ซ่อนอยู่ นั่นเป็นเพราะปัญหานี้เป็นเชิงเส้น seperable

ขอผมอธิบายสิ่งนี้ ลองนึกภาพเครือข่ายประสาทโดยไม่มีเลเยอร์ที่ซ่อนอยู่และฟังก์ชั่นการเปิดใช้งานเชิงเส้น (คุณอาจเรียกว่าการถดถอยเชิงเส้น) ในการคำนวณตำแหน่ง x ของสี่เหลี่ยมแต่ละพิกเซลเชื่อมต่อกับ x-output คอลัมน์แรกของพิกเซลเชื่อมต่อกับน้ำหนัก1/ความกว้าง. คอลัมน์ที่สองเชื่อมต่อกับน้ำหนัก2/ความกว้าง. สิ่งนี้จะดำเนินต่อไปจนถึงคอลัมน์สุดท้าย (เช่นคอลัมน์n) ซึ่งเชื่อมต่อกับน้ำหนัก n/ความกว้าง. เนื่องจากพิกเซลบางพิกเซลไม่เป็นศูนย์การเปิดใช้งานเอาต์พุตจึงเป็นเส้นตรงไปยังพิกัด x ของจตุรัส ดังนั้นฟังก์ชั่นเชิงเส้นสามารถคำนวณตำแหน่งของสแควร์

มีหลายวิธี:

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

โมเดลที่ซับซ้อนเกินไป

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

ตัวอย่างเช่นเลเยอร์ convolutional ชั้นแรกมีตัวกรองขนาด 32 convolutional5×5. คุณคาดหวังว่าตัวกรองเหล่านี้จะเรียนรู้อะไร ในการจัดประเภทภาพตัวกรองเหล่านี้เรียนรู้ที่จะตรวจจับขอบมุมการไล่ระดับสีและ blobs แต่ในกรณีนี้มีเพียงไม่กี่ตัวกรองที่เหมาะสม ฉันสามารถนึกถึงขอบจากซ้ายไปขวาและในทางกลับกันและจากบนลงล่างและในทางกลับกัน ในกรณีของคุณมีตัวกรองประมาณ 28 ตัวที่เพิ่มสัญญาณรบกวนแบบสุ่ม การลบเหล่านี้ (หรือเพียงแค่ทั้งชั้น) ทำให้เครื่องมือเพิ่มประสิทธิภาพง่ายขึ้นในการค้นหาสิ่งที่ดีที่สุดที่ใช้งานได้

อีกตัวอย่างหนึ่งคือเครื่องมือเพิ่มประสิทธิภาพของอดัมที่มีพารามิเตอร์พิเศษจำนวนมาก เครื่องมือเพิ่มประสิทธิภาพ Adam อาจทำงานได้ดีกับพารามิเตอร์เหล่านี้ แต่ทำไมคุณไม่เริ่มด้วยSGDเครื่องมือเพิ่มประสิทธิภาพอย่างง่ายพร้อมค่าเริ่มต้น

ดังนั้นคุณสามารถทำการเพิ่มประสิทธิภาพหลายอย่าง:

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

ps

ฉันคิดว่าคุณจะชอบบล็อกนี้โดย Adit Deshpande


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

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

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

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

> "ฉันไม่ได้ซื้อสิ่งเหล่านี้เป็นสาเหตุของปัญหานี้" - มองย้อนกลับไปที่คำตอบพวกเขาเขียนจากมุมมองของการฝึกฝน หากรูปแบบที่ซับซ้อนของคุณไม่ได้มาบรรจบกันอย่างเหมาะสมวิธีหนึ่งในการแก้ไขข้อบกพร่องก็คือการใช้แบบจำลองที่ง่ายขึ้น
Pieter

0

ฉันกำลังประสบปัญหาเดียวกันกับชุดข้อมูลของฉัน ปรากฎว่าในกรณีของฉันผู้ทำนายมีความเข้มข้นสูงและมีความแปรปรวนน้อยมาก คุณควรตรวจสอบความแปรปรวนของตัวแปรการทำนายของคุณและดูว่ามันกระจายอย่างไรการกระจายของตัวแปรฉันพยายามทำนาย

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


-1

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


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

-1

จริง ๆ แล้วฉันกำลังทำงานกับปัญหาที่คล้ายกันมาก โดยทั่วไปฉันมีจุดหลายจุดบนพื้นหลังสีขาวและฉันฝึก NN ให้รู้จักจุดที่วางบนพื้นหลังก่อน วิธีที่ฉันพบในการทำงานก็คือใช้ชั้นของเซลล์ประสาทที่เชื่อมต่อกันอย่างเต็มชั้น (ดังนั้น NN 1 ชั้น) ตัวอย่างเช่นสำหรับภาพขนาด 100x100 ฉันจะมีเซลล์ประสาทรับเข้า 10,000 (พิกเซล) เชื่อมต่อโดยตรงกับเซลล์ประสาทขาออก 2 (พิกัด) ใน PyTorch เมื่อฉันแปลงค่าพิกเซลเป็นเมตริกซ์มันทำให้ข้อมูลของฉันเป็นปกติโดยอัตโนมัติโดยการลบค่าเฉลี่ยและหารด้วยค่าเบี่ยงเบนมาตรฐาน ในปัญหาการเรียนรู้ของเครื่องปกตินี่เป็นสิ่งที่ดี แต่ไม่ใช่สำหรับภาพที่อาจมีความแตกต่างของจำนวนพิกเซลสีในภาพ (เช่นของคุณที่มีพิกเซลสีขาวเพียงไม่กี่) ดังนั้น, ฉันปรับมาตรฐานด้วยตนเองโดยการหารค่าความเข้มของพิกเซลทั้งหมดด้วย 255 (ดังนั้นตอนนี้พวกเขาอยู่ในช่วง 0-1 โดยไม่ต้องใช้เทคนิคการปรับสภาพทั่วไปที่พยายามปรับค่าความเข้มทั้งหมดให้เข้ากับการแจกแจงแบบปกติ) จากนั้นฉันยังคงมีปัญหาเพราะคาดคะเนพิกัดเฉลี่ยของพิกเซลในชุดการฝึกอบรม ดังนั้นทางออกของฉันคือตั้งค่าอัตราการเรียนรู้ที่สูงมากซึ่งเทียบกับอาจารย์และแบบฝึกหัด ML เกือบทุกคน แทนที่จะใช้ 1e-3, 1e-4, 1e-5 เหมือนกับที่คนส่วนใหญ่พูดว่าฉันใช้อัตราการเรียนรู้ 1 หรือ 0.1 กับการไล่ระดับสีแบบสุ่ม สิ่งนี้แก้ไขปัญหาของฉันและในที่สุดเครือข่ายของฉันก็เรียนรู้ที่จะจดจำชุดการฝึกอบรมของฉัน มันไม่ได้พูดคุยกับชุดการทดสอบด้วยเช่นกัน แต่อย่างน้อยมันก็ใช้งานได้ซึ่งเป็นวิธีแก้ปัญหาที่ดีกว่าคนอื่น ๆ ที่แนะนำคำถามของคุณ ตอนนี้อยู่ในช่วง 0-1 โดยไม่มีเทคนิคการทำให้เป็นมาตรฐานโดยทั่วไปซึ่งพยายามที่จะปรับค่าความเข้มทั้งหมดให้เข้ากับการแจกแจงแบบปกติ) จากนั้นฉันยังคงมีปัญหาเพราะคาดคะเนพิกัดเฉลี่ยของพิกเซลในชุดการฝึกอบรม ดังนั้นทางออกของฉันคือตั้งค่าอัตราการเรียนรู้ที่สูงมากซึ่งเทียบกับอาจารย์และแบบฝึกหัด ML เกือบทุกคน แทนที่จะใช้ 1e-3, 1e-4, 1e-5 เหมือนกับที่คนส่วนใหญ่พูดว่าฉันใช้อัตราการเรียนรู้ 1 หรือ 0.1 กับการไล่ระดับสีแบบสุ่ม สิ่งนี้แก้ไขปัญหาของฉันและในที่สุดเครือข่ายของฉันก็เรียนรู้ที่จะจดจำชุดการฝึกอบรมของฉัน มันไม่ได้พูดคุยกับชุดการทดสอบด้วยเช่นกัน แต่อย่างน้อยมันก็ใช้งานได้ซึ่งเป็นวิธีแก้ปัญหาที่ดีกว่าคนอื่น ๆ ที่แนะนำคำถามของคุณ ตอนนี้อยู่ในช่วง 0-1 โดยไม่มีเทคนิคการทำให้เป็นมาตรฐานโดยทั่วไปซึ่งพยายามที่จะปรับค่าความเข้มทั้งหมดให้เข้ากับการแจกแจงแบบปกติ) จากนั้นฉันยังคงมีปัญหาเพราะคาดคะเนพิกัดเฉลี่ยของพิกเซลในชุดการฝึกอบรม ดังนั้นทางออกของฉันคือตั้งค่าอัตราการเรียนรู้ที่สูงมากซึ่งเทียบกับอาจารย์และแบบฝึกหัด ML เกือบทุกคน แทนที่จะใช้ 1e-3, 1e-4, 1e-5 เหมือนกับที่คนส่วนใหญ่พูดว่าฉันใช้อัตราการเรียนรู้ 1 หรือ 0.1 กับการไล่ระดับสีแบบสุ่ม สิ่งนี้แก้ไขปัญหาของฉันและในที่สุดเครือข่ายของฉันก็เรียนรู้ที่จะจดจำชุดการฝึกอบรมของฉัน มันไม่ได้พูดคุยกับชุดการทดสอบด้วยเช่นกัน แต่อย่างน้อยมันก็ใช้งานได้ซึ่งเป็นวิธีแก้ปัญหาที่ดีกว่าคนอื่น ๆ ที่แนะนำคำถามของคุณ

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