๐Ÿšฉ๋”ฅ๋Ÿฌ๋‹ ๊ธฐ์ดˆ - part18. Overfitting? ๊ณผ์ ํ•ฉ? ๊ทธ๊ฒŒ ๋ญ”๋ฐ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š” ๊ฑด๋ฐ

vincaยท2022๋…„ 12์›” 14์ผ
0

๐ŸŒ“ AI/DL - theory

๋ชฉ๋ก ๋ณด๊ธฐ
19/24

Introduction

๊ณผ๋Œ€์ ํ•ฉ๊ณผ ๊ณผ์†Œ์ ํ•ฉ ๊ทธ๋ฆฌ๊ณ  ํ•ด๊ฒฐํ•˜๊ธฐ์œ„ํ•œ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

๊ณผ์†Œ ์ ํ•ฉ์ด๋ž€?

๋ชจ๋ธ์˜ ์šฉ๋Ÿ‰์ด ์ž‘์•„์„œ ์˜ค์ฐจ๊ฐ€ ์ปค์ง€๋Š” ํ˜„์ƒ์„ ๋งํ•œ๋‹ค.
ํ‘œํ˜„ํ•˜๊ณ ์ž ํ•˜๋Š” data๋ฅผ ํ‘œํ˜„ํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ fitting์ด ์ ๊ฒŒ ์ด๋ฃจ์–ด ์ง„ ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ํ˜„์ƒ์ด ๋‚˜ํƒ€๋‚œ๋‹ค.

๊ณผ๋Œ€ ์ ํ•ฉ์ด๋ž€?

๋ชจ๋ธ์ด ๋„ˆ๋ฌด๋‚˜ ํ•™์Šต ๋ฐ์ดํ„ฐ ์„ธํŠธ์— ๋งž์ถฐ ์ง„๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
์ฆ‰, ์‚ฌ์†Œํ•œ ๋…ธ์ด์ฆˆ ์กฐ์ฐจ๋„ ๋ชจ๋ธ์— ํ•™์Šต๋œ ๊ฒƒ์„ ๋œปํ•œ๋‹ค. ๊ณผ๋„ํ•˜๊ฒŒ ์ ํ•ฉ๋œ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋กœ test data set์— ๋Œ€ํ•ด์„œ๋Š” ํฌ๊ฒŒ ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋œ๋‹ค.

๊ณผ๋Œ€์ ํ•ฉ์ƒํƒœ์˜ ์ •ํ™•๋„์™€ loss ๋ถ„์„

ํ•™์Šต์„ ์ง„ํ–‰ํ•จ์— ์žˆ์–ด train data์— ๋Œ€ํ•ด์„œ๋Š” ์˜ค์ฐจ๊ฐ€ ๊ฐ์†Œํ•˜๋‚˜
validation data์— ๋Œ€ํ•ด์„œ๋Š” ์˜คํžˆ๋ ค ์˜ค์ฐจ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ณผ๋Œ€์™€ ๊ณผ์†Œ์˜ ์˜ˆ์‹œ

3์ฐจ ํ•จ์ˆ˜์ •๋„๊ฐ€ ์ ๋‹นํ•˜๊ฒŒ ํ•™์Šต๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.
0์ฐจ์™€ 1์ฐจ๋Š” ๊ณผ์†Œ์ ํ•ฉ, 9์ฐจ๋Š” ๊ณผ๋Œ€์ ํ•ฉ์ด ์ด๋ฃจ์–ด ์ง„ ๊ฒƒ์ด๋‹ค.

bias์™€ variance

๋ฐ”์ด์–ด์Šค์™€ ๋ถ„์‚ฐ

  • bias๋Š” ํŽธํ–ฅ์„ ๋œปํ•œ๋‹ค. ์ •๋‹ต๊ณผ์˜ ์–ผ๋งˆ๋‚˜ ๋–จ์–ด์ ธ ์žˆ๋Š”๊ฐ€๋ฅผ ์˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • variance์€ ๋ถ„์‚ฐ์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ผ๋งˆ๋‚˜ ํผ์ ธ์žˆ๋Š”๊ฐ€๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ณผ๋… ๐ŸŽฏ์˜ ์ค‘์•™(์ •๋‹ต)์— ๊ฐ€๊นŒ์›Œ์ง€๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‘ ๊ฐ’์ด ๋ชจ๋‘ ๋‚ฎ์•„์•ผํ•œ๋‹ค.
ํ•˜์ง€๋งŒ ์ด๋“ค์€ trade-off๊ด€๊ณ„๋กœ ์ ์ • ์„ ์„ ์ฐพ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ์œ ํ˜•

ํ•™์Šต๋ฐ์ดํ„ฐ, ํ•™์Šต์‹œ์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒ€์ฆ๋ฐ์ดํ„ฐ, ํ•™์Šต์ด ๋๋‚œ ํ›„ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋กœ ๋‚˜๋‰œ๋‹ค.

from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, 
Y, test_size=0.3, random_state=seed)

k-fold cross validation

ํ•™์Šต์— ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์ˆ˜๊ฐ€ ์ ์–ด๋„ ์ ๋‹นํ•˜๊ฒŒ ํ•™์Šต์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค!

๋ฐ์ดํ„ฐ์˜ ์ฆ๊ฐ•๊ณผ๋Š” ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ์˜ ์ˆ˜๊ฐ€ ์ ์–ด๋„ ํ•™์Šต์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

1. ๋ฐ์ดํ„ฐ์…‹์„ k๊ฐœ๋กœ ๋‚˜๋ˆ  k๋ฒˆ ๊ฒ€์ฆํ•˜๋Š” ๊ฒƒ์ธ๋ฐ, ์ด๋•Œ ๋ฐ์ดํ„ฐ ์…‹์€ k-1๊ฐœ์˜ ํ•™์Šต๋ฐ์ดํ„ฐ์™€ 1๊ฐœ์˜ test๋ฐ์ดํ„ฐ๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค.
2. ์ด๋•Œ StratifiedKfold๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ„๋ฅ˜์— ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ํด๋ž˜์Šค์˜ ์ข…๋ฅ˜๊ฐ€ ํ•˜๋‚˜๋กœ ํŽธํ–ฅ๋˜์ง€ ์•Š๋„๋ก ๊ฐ ๋ถ„๋ฆฌ๋œ ๋ฐ์ดํ„ฐ์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.
3. ์ด๋ ‡๊ฒŒ k๊ฐœ๋กœ ๋‚˜๋ˆ ์ง„ ๋ฐ์ดํ„ฐ์…‹๋“ค์€ ์ด k๋ฒˆ์„ ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉฐ test๋ฐ์ดํ„ฐ ์…‹์˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
4. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ด k๋ฒˆ์˜ ํ•™์Šต์ด ์ด๋ฃจ์–ด์ง€๊ณ  Loss์™€ Accuracy๋˜ํ•œ k๊ฐœ๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋˜๊ณ ,
์ดํ›„ ์˜ค์ฐจ์˜ ํ‰๊ท ์„ ํ†ตํ•ด ์ตœ์ ์˜ ๋ชจ๋ธ์„ ์„ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

from sklearn.model_selection import StratifiedKFold
skf = StratifiedKFold(n_splits=n_fold, shuffle=True, 
random_state=seed)
model = Sequential()
model.add(Dense(24, input_dim=60, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(1, activation='sigmoidโ€™))
model.compile(loss='mean_squared_error',
optimizer='adam',
metrics=['accuracyโ€™])
for train, test in skf.split(X, Y):
model.fit(X[train], Y[train], epochs=100, batch_size=5)

โœจ๊ณผ์ ํ•ฉ์„ ํ”ผํ•˜๋Š” ๋ฐฉ๋ฒ•

๋งค์šฐ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค!

1. ๋ฐ์ดํ„ฐ ์ฆ์‹

ํ•™์Šต๋˜๋Š” ๋ฐ์ดํ„ฐ ์„ธํŠธ๊ฐ€ ์ ์œผ๋ฉด ํ•˜๋‚˜ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ๋ธ์˜ ์ž…์žฅ์—์„œ๋Š” ์†Œ์ค‘ํ•˜๋‹ค.
๋”ฐ๋ผ์„œ ํ•ด๋‹น ๋ช‡๋ช‡ ๋ฐ์ดํ„ฐ๋งŒ์„ ๋ณด๊ณ  ํ•™์Šตํ•˜๋Š” ๋ชจ๋ธ์€ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋“ค์—๊ฒŒ ํŽธํ–ฅ๋œ ๋ชจ๋ธ์ด ๋  ์ˆ˜ ๋ฐ–์— ์—†๊ณ , ์ด๋Š” ๊ณผ์ ํ•ฉ์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฅผ ๋ง‰๊ธฐ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฆ๊ฐ• ์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค. ๋ฐ์ดํ„ฐ ์ฆ๊ฐ•์— ๋Œ€ํ•ด์„œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ part 19์—์„œ ๋‹ค๋ฃฌ๋‹ค.

2. Dropout


epoch๋งˆ๋‹ค 0~1์‚ฌ์ด์˜ ํ™•๋ฅ ๋กœ ๋‰ด๋Ÿฐ์ด ๊บผ์ง€๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
์ฆ‰, ๊บผ์ง€๊ฒŒ ๋œ ํ•ด๋‹น ๋‰ด๋Ÿฐ์€ ํ•™์Šต์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋Š” ์ด์œ ๋Š” ํŠน์ • feature์— ๋Œ€ํ•ด์„œ ๊ณผ๋„ํ•˜๊ฒŒ ํ•™์Šต๋˜๋Š” ๊ฒƒ์„ ๋ง‰๋Š” ๊ฒƒ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐฐ, ๋ฐ”๋‚˜๋‚˜, ์‚ฌ๊ณผ๋ฅผ ๋ถ„๋ฅ˜ํ•˜๋Š” ๋ฌธ์ œ์—์„œ ์ตœ์ข… Classfication์„ ๋‚ด๋ฆฌ๋Š”๋ฐ ์žˆ์–ด์„œ "ํฌ๊ธฐ" ์ •๋ณด๊ฐ€ ํฐ ์ƒ๊ด€ ๊ด€๊ณ„์— ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.
๊ทธ๋ ‡๋‹ค๋ฉด ํ•™์Šต์‹œ์— "ํฌ๊ธฐ"์ •๋ณด์— ๋Œ€ํ•ด์„œ ํฐ ๊ฐ€์ค‘์น˜๊ฐ€ ์„ค์ •๋˜๊ณ , "ํฌ๊ธฐ"์ •๋ณด๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ Feature๋“ค์€ ์ œ๋Œ€๋กœ ํ•™์Šต์ด ์–ด๋ ต๋‹ค. ๋”ฐ๋ผ์„œ "ํฌ๊ธฐ"์ •๋ณด๋ฅผ dropoutํ•˜๊ณ  ํ•™์Šต์„ ์‹œํ‚จ๋‹ค๋ฉด "ํฌ๊ธฐ"์ •๋ณด๊ฐ€ ์•„๋‹Œ ๋‚˜๋จธ์ง€ "๋ฌด๊ฒŒ", "์ด์‹ฌ๋ฅ "๋˜ํ•œ ์ข…ํ•ฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

3. ๊ฐ€์ค‘์น˜ ๊ทœ์ œ(Weight Regularzation)


๊ฐ feature์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ๊ฐ€์ง€๋Š” ํŠน์„ฑ์„ ๊ทœ์ œ์‹œํ‚ด์œผ๋กœ์จ ํŠน์ • ๋ฐ์ดํ„ฐ๋“ค์— ๋Œ€ํ•ด์„œ๋งŒ ์ ํ•ฉํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ๋ชจ๋ธ์˜ ์ผ๋ฐ˜ํ™” ๋Šฅ๋ ฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค.

4. ๋ฐฐ์น˜ ์ •๊ทœํ™”(Batch Normalization)


hidden Layer์—์„œ ์ด์ „ ๋ ˆ์ด์–ด์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๋ณ€ํ™”๋กœ ์ž…๋ ฅ์˜ ๋ถ„ํฌ๊ฐ€ ๋ณ€ํ™”ํ•˜๋ฉด์„œ ์ž…๋ ฅ์˜ ๋ถ„ํฌ๊ฐ€ ๋‹ฌ๋ผ์ง€๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ์ž…๋ ฅ์˜ ๋ถ„ํฌ๊ฐ€ ๋‹ฌ๋ผ์กŒ์„ ๋•Œ ์ถœ๋ ฅ๊ฐ’์„ ์ •๊ทœํ™” ํ•˜๋Š” ์ธต์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฐฐ์น˜๋ฅผ ์ •๊ทœํ™” ํ•ด์ฃผ๋Š” ๊ณผ์ •์„ ์‹œํ–‰ํ•œ๋‹ค. ๋ฐฐ์น˜ ์ •๊ทœํ™”๋ฅผ ํ†ตํ•ด ํฐ lr๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์„๋ฟ๋”๋Ÿฌ, ํ•™์Šตํ•˜๋Š” ๊ณผ์ • ์ž์ฒด๋ฅผ ์ „์ฒด์ ์œผ๋กœ ์•ˆ์ •ํ™”์‹œ์ผœ ๊ณผ์ ํ•ฉ์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค.

  • Covariate Shift : ์ด์ „ ๋ ˆ์ด์–ด์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ณ€ํ™”๋กœ ์ธํ•˜์—ฌ ํ˜„์žฌ ๋ ˆ์ด์–ด์˜ ์ž…๋ ฅ์˜ ๋ถ„ํฌ๊ฐ€ ๋ฐ”๋€Œ๋Š” ํ˜„์ƒ
  • Internal Covariate Shift : ๋ ˆ์ด์–ด๋ฅผ ํ†ต๊ณผํ•  ๋•Œ ๋งˆ๋‹ค Covariate Shift ๊ฐ€ ์ผ์–ด๋‚˜๋ฉด์„œ ์ž…๋ ฅ์˜ ๋ถ„ํฌ๊ฐ€ ์•ฝ๊ฐ„์”ฉ ๋ณ€ํ•˜๋Š” ํ˜„์ƒ

5. ์กฐ๊ธฐ ํ•™์Šต ์ค‘๋‹จ (Early Stopping)

๋ชจ๋ธ์ด ๊ฒฐ๊ตญ overfitting์ด ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ๊ฐ€ ๋ฌด์—‡์ผ๊นŒ?
๋ฐ”๋กœ ํ•™์Šต์ด ๊ณ„์† ์ง„ํ–‰๋œ๋‹ค๋Š” ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
Vaildata์˜ Loss๊ฐ€ ์ตœ์†Œ๊ฐ€ ๋˜๋Š” ์ง€์ ๊นŒ์ง€๋งŒ ํ•™์Šต์„ ์ง„ํ–‰ํ•˜๊ณ  Loss๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ์ˆœ๊ฐ„ ์กฐ๊ธฐ์— ํ•™์Šต์„ ์ค‘๋‹จ์‹œ์ผœ, ๊ณผ์ ํ•ฉ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

profile
๋ถ‰์€ ๋ฐฐ ์˜ค์ƒ‰ ๋”ฑ๋‹ค๊ตฌ๋ฆฌ ๊ฐœ๋ฐœ์ž ๐ŸฆƒCloud & DevOps

0๊ฐœ์˜ ๋Œ“๊ธ€