Overfitting กับการแก้ปัญหา

Natratanon Kanraweekultana
3 min readOct 19, 2019

--

Overfitting คือการที่ Model ที่ได้จากการใช้ Training Data set มีค่าความถูกต้องในการบ่งบอกคลาสเป้าหมายสูง แต่เมื่อนำไปใช้กับข้อมูล Test Data set ได้ค่าความถูกต้องต่ำ หรือ กล่าวอีกนัยหนึ่งคือ ตัวแบบที่ได้เป็นการเรียนรู้ข้อมูลจาก Training Data set ดีมาก แต่ไม่สามารถนำไปใช้กับข้อมูลที่ไม่เคยพบมาก่อนได้ดี โดยการแก้ปัญหา Overfitting ก็คือการลดความซับซ้อนในการปรับ Parameter โดยทุกโหนดจากรูปนั้น มันมีอิทธิพลมากจนเกินไป จึงทำการสุ่มตัดไปอย่างใดอย่างหนึ่ง เพื่อลดความซับซ้อนที่มากเกินไปที่จะก่อให้เกิดการ Overfitting

Under- and Over-fitting examples

จากภาพ Under- and Over-fitting example ถ้าลดความซับซ้อนในการปรับค่าน้อยจนเกินไป ก็จะเกิดปัญหา Under-fitting แต่ถ้า ปรับค่าน้อยจนเกินไป ก็จะเกิดปัญหา Over-fitting ดังนั้นในการปรับค่าของ Parameter ควรทำให้เหมาะสม เพื่อให้ได้ Good Compromise

การแก้ปัญหา Overfitting

Data set fasion mnist ซึ่งเป็นชุดข้อมูลที่เก็บรูปภาพ ดังนั้นเพื่อเป็นการลดจำนวนพารามิเตอร์ที่สามารถปรับค่าได้ ให้เหลือน้อยที่สุด ด้วยการ Dropout ที่ใช้ในการแก้ปัญหา Overfitting

Train data เพื่อดูการกระจายตัวของข้อมูลในแต่ละ Class

Test data เพื่อดูการกระจายตัวของข้อมูลในแต่ละ Class

ภาพจากการสุ่มเลือก Train data

ภาพจากการสุ่มเลือก Test data

Label Data และ Normalization Data

Normalization ให้ค่าเล็กสุดคือ 1 สูงสุดคือ 255

แบ่งข้อมูลเป็นส่วนของ train valid และtest

Split Dataset สำหรับ Train และ Test

สร้าง model

-ทั้งหมด 32 แผ่น แผ่นละ 3*3
- model.add(MaxPooling2D((2, 2))) เพื่อลดขนาดของภาพให้ขนาดเล็กลง เป็นการ process ภาพไม่ได้อยู่ในส่วนของการทำนาย
- kernel_size=(3, 3), #กำหนดขนาดภาพ

สร้างModel เพื่อทำ Classification

conv2d_37 (Conv2D) >>> 3*3*32+32 = 320
conv2d_38 (Conv2D) >>> 3*3*64*32+64 = 18496
conv2d_42 (Conv2D) >>> 3*3*128*64+128 = 73856
dense_6 (Dense) >>> 1152*128+128 = 147584
dense_7 (Dense) >>> (128*10)+10= 1290

จำนวน parameter ทั้งหมด 320+8496+73856+147584+1290 = 241,546

Train Model

ประสิทธิภาพ Model

จากภาพแสดงให้เห็นว่า ค่า Validation loss อยู่ในภาวะ Overfitting ดังนั้นจะต้องแก้ปัญหานี่ด้วยการ Drop out ข้อมูลบางส่วน เพื่อลดจำนวน Node

นิยาม model ใหม่โดยเพิ่มการ Drop out ในแต่ละขั้น

model.add(MaxPooling2D((2, 2)))
ตัดออก หรือ drop out อยู่ที่ 25%

model.add(MaxPooling2D(pool_size=(2, 2)))
ตัดออก หรือ drop out อยู่ที่ 25%

model.add(Conv2D(128, (3, 3), activation=’relu’))
ตัดออก หรือ drop out อยู่ที่ 40%

model.add(Dense(128, activation=’relu’))
ตัดออก หรือ drop out อยู่ที่ 30%

Train Model

ดูประสิทธิภาพ Model ใหม่ หลัง drop out

ผลที่ได้หลังจากการแก้ปปัญหา overfitting เห็นได้ว่า ค่า Validation loss ลดลงเรื่อยๆ ถึงแม้จะทำให้ค่า Accuracy ลดลงก็ตาม

--

--