
์ฌ์ธต ์ ๊ฒฝ๋ง(DNN)์ ๋ค์ธต ํผ์
ํธ๋ก (MLP: Multi-Layer Perceptron)์ ์๋์ธต์ ์ฌ๋ฌ ๊ฐ ์ฌ์ฉํ ํํ์ด๋ค. ์ฆ, ๋จ์ผ ์๋์ธต์ ๋์ด์ ๊น์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ์ ๊ฒฝ๋ง์ ์๋ฏธํ๋ค.
์
๋ ฅ์ธต โ ์ฌ๋ฌ ๊ฐ์ ์๋์ธต โ ์ถ๋ ฅ์ธต ๊ตฌ์กฐMLP๋ ์๋์ธต์ด 1๊ฐ์ด์ง๋ง DNN์ ์๋์ธต์ด ๋ค์ ์กด์ฌํ๋ค.MLP์ DNN์ ๊ธฐ๋ณธ์ ์ธ ํ์ต ์๊ณ ๋ฆฌ์ฆ(ex. ์ญ์ ํ, ๊ฒฝ์ฌํ๊ฐ๋ฒ)์ด ๋์ผํ๋ค.
์๋์ธต์ด ๊น์ด์ง์๋ก ๊ทธ๋๋์ธํธ ์์ค ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
โก๏ธ ReLU์ BatchNorm์ผ๋ก ํด๊ฒฐ
ํ๋ จ ๋ฐ์ดํฐ๊ฐ ๋ถ์กฑํ๋ฉด ๊ณผ์ ํฉ์ด ๋ฐ์ํ์๋ค.
โก๏ธ ์ ๊ทํ์ Dropout ๋ฑ์ผ๋ก ํด๊ฒฐ
2012๋ AlexNet์ด ImageNet ๋ํ์์ ์ฐ์นํ๋ฉฐ, ๋ฅ๋ฌ๋ ํ๋ช ์ ์์์ ์ด ๋์๋ค.

DNN์ ํ์ต ์๋๋ ์๋นํ ๋๋ฆฌ๊ณ ๊ณ์ฐ ์ง์ฝ์ ์ด๊ธฐ ๋๋ฌธ์ ํ์ต์ ์๊ฐ๊ณผ ์์์ด ๋ง์ด ์๋ชจ๋์๋ค.
๊ฒ์ด๋จธ๋ค์ ์ํฅ์ผ๋ก GPU ๊ธฐ์ ์ด ๋ฐ์ ํ๋ฉด์ GPU์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ๋ฅ๋ฌ๋์ด ์ฌ์ฉํ๊ฒ ๋๋ ์ํฅ์ด ํฌ๊ฒ ์์ฉํ๋ค.
์๋จ์ ๊ฒฝ๊ณ์ (์์ง)๊ณผ ๊ฐ์ ์ ๊ธ ํน์ง๋ค์ ์ถ์ถํ๊ณ ๋ท๋จ์ ์ฝ๋์ ๊ฐ์ ๊ณ ๊ธ ํน์ง๋ค์ ์ถ์ถํ๋ค.
๊ธฐ์กด ์ ๊ฒฝ๋ง์ ๋ฌธ์
๊ทธ๋๋์ธํธ ์์ค ๋ฌธ์ (Gradient vanishing problem)์์คํจ์ ์ ํ ๋ฌธ์ (Loss function selection problem)๊ฐ์ค์น ์ด๊ธฐํ ๋ฌธ์ (Weight initialization problem)๋ฒ์ฃผํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฌธ์ (Categorical data problem)๋ฐ์ดํฐ ์ ๊ทํ ๋ฌธ์ (Data normalization problem)๊ณผ์ ์ ํฉ ๋ฌธ์ (Overfitting problem)

๊ทธ๋๋์ธํธ๊ฐ ์ ๋ฌ๋๋ค๊ฐ ์ ์ 0์ ๊ฐ๊น์์ง๋ ํ์์ผ๋ก, ์ถ๋ ฅ์ธต์์ ๋ฉ๋ฆฌ ๋จ์ด์ง ๊ฐ์ค์น๋ค์ ํ์ต์ด ๋์ง ์๋๋ค.์๊ทธ๋ชจ์ด๋(sigmoid) ํ์ฑํ ํจ์๊ฐ ๊ทธ ์์ธ์ด ๋๋ค.
โก๏ธ ๊ทธ๋๋์ธํธ๋ ์ ์ ์ ๊ธฐ์ธ๊ธฐ, ์ฝ๊ฐ ํฐ ์์๋ ์์๊ฐ ์๊ทธ๋ชจ์ด๋ ํจ์์ ๋ค์ด์ค๋ฉด ๊ธฐ์ธ๊ธฐ๊ฐ ๊ฑฐ์ 0์ด ๋จ
โก๏ธ ์๊ทธ๋ชจ์ด๋ ํจ์์ ๋ฏธ๋ถ๊ฐ์ ํญ์ 0์์ 1์ฌ์ด, 1๋ณด๋ค ์์ ๊ฐ์ด ์ฌ๋ฌ๋ฒ ๊ณฑํด์ง๋ฉด ๊ฒฐ๊ตญ 0์ผ๋ก ์๋ ดํจ


์๊ทธ๋ชจ์ด๋(sigmoid) ๋์ ReLU ํจ์๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค.ReLU ํจ์๋ ์
๋ ฅ๊ฐ์ 0๊ณผ 1์ฌ์ด๋ก ์์ถํ์ง ์๊ธฐ ๋๋ฌธ์, ๋ฏธ๋ถ๊ฐ์ด 0์ด ์๋๋ฉด 1์ด๋์ด ์ถ๋ ฅ์ธต์ ์ค์ฐจ๊ฐ ๊ฐ์ ๋์ง ์๊ณ ๊ทธ๋๋ก ์ญ์ ํ ๋๋ค.0์์๋ ๋ฏธ๋ถ ๋ถ๊ฐ๋ฅํ์ง๋ง ๋ฌธ์ ๋์ง ์๊ณ ์๋๊ฐ ๋น ๋ฅด๋ค๋ ์ฅ์ ์ด ์๋ค.
๊ธฐ์กด ์์ค ํจ์๋ก๋ MSE(ํ๊ท ์ ๊ณฑ์ค์ฐจ)๋ฅผ ์ฌ์ฉํ์๋ค.
where : ์ถ๋ ฅ ๋
ธ๋์ ๊ฐ์
์ ๋ต๊ณผ ์์ธก๊ฐ์ ์ฐจ์ด๊ฐ ์ปค์ง๋ฉด MSE๋ ์ปค์ง๋ฏ๋ก ์ถฉ๋ถํ ๊ฐ๋ฅํ ์์คํจ์์ง๋ง, ๋ถ๋ฅ๋ฌธ์ ๋ฅผ ์ํด์๋ ๋ ์ฑ๋ฅ์ด ์ข์ ๊ต์ฐจ ์ํธ๋กํผ ํจ์๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค.
์ด๋, ์ถ๋ ฅ์ธต์ ํ์ฑํ ํจ์๋ก ์ํํธ๋งฅ์ค(softmax) ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
์ํํธ๋งฅ์ค(softmax) ํ์ฑํ ใ ๋ง์
Max ํจ์์ ์ํํธํ ๋ฒ์ Max ํจ์์ ์ถ๋ ฅ์ ์ ์ ์ผ๋ก์ต๋ ์ ๋ ฅ ๊ฐ์ ์ํ์ฌ ๊ฒฐ์ ๋จ- ํฉ์ด
1์ด๋ฏ๋ก ํ๋ฅ ๊ฐ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ

2๊ฐ์ ํ๋ฅ ๋ถํฌ ์ ๋ํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ์ ์๋๋ค.
โก๏ธ ๋ชฉํ ์ถ๋ ฅ ํ๋ฅ ๋ถํฌ ์ ์ค์ ์ถ๋ ฅ ํ๋ฅ ๋ถํฌ ๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ์ธก์

์๋ฒฝํ๊ฒ ์ผ์นํ๋ค๋ฉด:
์ถ๋ ฅ ๋
ธ๋๊ฐ 3๊ฐ ์๋ ์ ๊ฒฝ๋ง์์ ๊ต์ฐจ ์ํธ๋กํผ ๊ณ์ฐ (๊ฐ ์ํ ๋ณ ๊ณ์ฐ)

์ฒซ๋ฒ์งธ ์ํ
๋๋ฒ์งธ ์ํ
์ธ๋ฒ์งธ ์ํ
3๊ฐ ์ํ์ ํ๊ท ๊ต์ฐจ ์ํธ๋กํผ ์ค๋ฅ ๊ณ์ฐ
์ถ๋ ฅ ์ ๋์ด ํ๋์ธ ๊ฒฝ์ฐ
ํ๊ท ์ ๊ณฑ ์ค์ฐจ (MSE)
์ด์ง ๊ต์ฐจ ์ํธ๋กํผ (Binary Cross Entropy)
MSE
์ ๋ต์ด 0์ผ ๋,
์ ๋ต์ด 1์ผ ๋,
BCE
์ ๋ต์ด 0์ผ ๋,
์ ๋ต์ด 1์ผ ๋,

๊ต์ฐจ ์ํธ๋กํผ์ ์ค์ฐจ๊ฐMSE์ ์ค์ฐจ๋ณด๋ค ํผ์ ์์ ์๋ค.
๋ฏธ๋ถ ๊ฐ์ ๋ ์ฐจ์ด๊ฐ ๋๋ฉฐ ์ด ๋ฏธ๋ถ๊ฐ์ด ๊ณฑํด์ ธ์ ๊ฐ์ค์น๊ฐ ๋ณ๊ฒฝ๋จ์ผ๋ก์ด์ง ๋ถ๋ฅ๋ฌธ์ ์์ MSE๋ณด๋ค ๊ต์ฐจ ์ํธ๋กํผ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์ฌ ์ ๋ฆฌ
โก๏ธ ์ด์ง ๋ถ๋ฅ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ ์ฌ์ฉ (ex. ์ด๋ฏธ์ง๋ฅผ "๊ฐ์์ง" vs "๊ฐ์์ง ์๋" ์ผ๋ก ๋ถ๋ฅํ ๋)


import numpy as np
import tensorflow as tf
y_true = [[1], [0], [0], [1]]
y_pred = [[0.8], [0.3], [0.5], [1.9]]
bce = tf.keras.losses.BinaryCrossentropy()
print(bce(y_tre, y_pred).numpy
# 0.34458154
โก๏ธ ๋ค์ค ๋ถ๋ฅ ๋ถ์ ๋ฅผ ํด๊ฒฐํ ๋ ์ฌ์ฉ (ex. ์ด๋ฏธ์ง๋ฅผ "๊ฐ์์ง" vs "๊ณ ์์ด" vs "ํธ๋์ด" ์ผ๋ก ๋ถ๋ฅํ ๋)
โก๏ธ ์ ๋ต์ onehot ์ธ์ฝ๋ฉ์ผ๋ก ์ ๊ณตํ๋ค.

y_true = [[0.0, 1.0, 0.0], [0.0, 0.0, 1.0], [1.0, 0.0, 0.0]] # ๊ณ ์์ด, ํธ๋์ด, ๊ฐ์์ง
y_pred = [[0.6, 0.3, 0.1], [0.3, 0.6, 0.1], [0.1, 0.7, 0.2]]
cce = tf.keras.losses.CategoricalCrossentropy()
print(cce(y_true, y_pred).numpy())
# 1.936381
โก๏ธ ์ ๋ต ๋ ์ด๋ธ์ด onehot ์ธ์ฝ๋ฉ์ด ์๋๊ณ ์ ์๋ก ์ฃผ์ด์ง ๋ ์ฌ์ฉ(ex. ์ด๋ฏธ์ง๋ฅผ "0(๊ฐ์์ง)" vs "1(๊ณ ์์ด)" vs "2(ํธ๋์ด)" ์ผ๋ก ๋ถ๋ฅํ ๋)

y_true = np.array([1, 2, 0])# ๊ณ ์์ด, ํธ๋์ด, ๊ฐ์์ง
y_pred = np.array([[0.6, 0.3, 0.1], [0.3, 0.6, 0.1], [0.1, 0.7, 0.2]])
scce = tf.keras.losses.SparseCategoricalCrossentropy()
print(scce(y_true, y_pred))
# 1.936381
โก๏ธ ํ๊ท๋ฌธ์ ์์ ์์ธก๊ฐ๊ณผ ์ค์ ๊ฐ ์ฌ์ด์ ํ๊ท ์ ๊ณฑ์ค์ฐจ๋ฅผ ๊ณ์ฐํ ๋ ์ฌ์ฉํ๋ค.
y_true = [ 12 , 20 , 29 , 60 ]
y_pred = [ 14 , 18 , 27 , 55 ]
mse = tf.keras.losses.MeanSquaredError ()
print(mse(y_true, y_pred).numpy())
# 9.25
โก๏ธ ์ค์ ๊ฐ๊ณผ ์์ธก๊ฐ์ ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉํ๋ ํจ์๋ฅผ ์ ์ํ์ฌ ๋ง๋ค ์ ์๋ค.
โก๏ธ ๋ชจ๋ธ์ ์ปดํ์ผ ๋จ๊ณ์์ ํจ์๋ฅผ ์ ๋ฌํ์ฌ ์์ฑํ๋ค.
def custom_loss_function(y_true, y_pred) :
squared_difference = tf.square (y_true-y_pred)
return tf.reduce_mean (squared_difference, axis = -1 )
model.compile(optimizer=โadamโ, loss= custom_loss_function)
๊ฐ์ค์น๋ฅผ 0์ผ๋ก ์ด๊ธฐํํ๋ฉด ์ญ์ ํ๊ฐ ์ ๋๋ก ์ด๋ค์ง์ง ์๋๋ค.
๋ชจ๋ ๊ฐ์ค์น๊ฐ ๋์ผํ๋ฉด ๋
ธ๋๋ค์ด ๋์ผํ ์ญํ ๋ง ํ๊ฒ ๋๋ฏ๋ก ๋์นญ์ ๊นจ์ผ ํ๋ค.
๊ฐ์ค์น๊ฐ ๋์ผํ ๋์ ๋ฌธ์ ์
์ด๋ฅผ ์ํด ๊ฐ์ค์น๋ ๋์๋ก ์ด๊ธฐํํด์ผ ํ๋ค.
๋๋ฌด ํฐ ์ด๊ธฐ ๊ฐ์ค์น๋ ๊ทธ๋๋์ธํธ ํญ๋ฐ์ ์ ๋ฐํ์ฌ ํ์ต์ด ๋ฐ์ฐํ๊ฒ ๋๋ค.
์ ์์์ ๊ฐ์ค์น๊ฐ
0์ด๋ผ๋ฉด ๋ธํ๊ฐ ์ ๋ฌ๋์ง ์๋๋ค.
โก๏ธ Xavier ๋ฐฉ๋ฒ
โก๏ธ He์ ๋ฐฉ๋ฒ

W = np.random.randn(N_in, N_out)*np.sqrt(1/N_in) # Xavier์ ๋ฐฉ๋ฒ
W = np.random.randn(N_in, N_out)*np.sqrt(2/(N_in+N_out)) # He์ ๋ฐฉ๋ฒ
# layers, initializers ๋ชจ๋ import
from tensorflow.keras import layers
from tensorflow.keras import initializers
# initializers๋ฅผ ์ด์ฉํ์ฌ ๊ฐ์ค์น ์ด๊ธฐํ
layer = layers.Dense(units=64, kernel_initializer=initializers.RandomNormal(stddev=0.01),
bias_initializer=initializers.Zeros())
# ๋ฌธ์์ด ์๋ณ์๋ฅผ ํตํด ์ ๋ฌ
layer = layers.Dense(units=64, kernel_initializer='random_normal', bias_initializer='zeros')
# RandomNormal ํด๋์ค: ์ ๊ท ๋ถํฌ๋ก ํ
์๋ฅผ ์์ฑํ๋ ์ด๋์
๋ผ์ด์
initializer = tf.keras.initializers.RandomNormal(mean=0, stddev=1.)
layers = tf.keras.layers.Dense(3, kernel_initializer=initializer)
# RandomUniform ํด๋์ค: ๊ท ์ผ ๋ถํฌ๋ก ํ
์๋ฅผ ์์ฑํ๋ ์ด๋์
๋ผ์ด์
initializer = tf.keras.initializers.RandomUniform(minval=0, maxval=1.)
layers = tf.keras.layers.Dense(3, kernel_initializer=initializer)
์
๋ ฅ ๋ฐ์ดํฐ ์ค์๋ โmaleโ, โfemaleโ๊ณผ ๊ฐ์ด ์นดํ
๊ณ ๋ฆฌ๋ฅผ ๊ฐ์ง๋ ๋ฐ์ดํฐ๋ค์ด ์์ฃผ ๋ง๋ค.
โก๏ธ ์ซ์๋ก ๋ฐ๊พธ์ด ์ฃผ์ด์ผ ํจ
for ix in train.index:
if train.loc[ix, 'Sex']=="male":
train.loc[ix, 'Sex']=1
else:
train.loc[ix, 'Sex']=0
๐ ๋ฒ์ฃผํ ๋ณ์๋ฅผ ์ธ์ฝ๋ฉํ๋ 3๊ฐ์ง ๋ฐฉ๋ฒ
- ์ ์ ์ธ์ฝ๋ฉ(Integer Encoding): ๊ฐ ๋ ์ด๋ธ์ด ์ ์๋ก ๋งคํ๋๋ ๊ฒฝ์ฐ
- ์-ํซ ์ธ์ฝ๋ฉ(One-Hot Encoding): ๊ฐ ๋ ์ด๋ธ์ด ์ด์ง ๋ฒกํฐ์ ๋งคํ๋๋ ๊ฒฝ์ฐ
- ์๋ฒ ๋ฉ(Embedding): ๋ฒ์ฃผ์ ๋ถ์ฐ๋ ํํ์ด ํ์ต๋๋ ๊ฒฝ์ฐ โ ์ถํ ํฌ์คํ ์ ๋ค๋ฃธ
import numpy as np
X = np.array([['Korea', 44, 7200], ['Japan', 27, 4800], ['China', 30, 6100]])
from sklearn.preprocessing import LabelEncoder
labelencoder = LabelEncoder()
X[:, 0] = labelencoder.fit_transform(X[:, 0])
print(X)
[['2' '44' '7200']
['1' '27' '4800']
['0' '30' '6100']]

import numpy as np
X = np.array([['Korea', 38, 7200], ['Japan', 27, 4800], ['China', 30, 3100]])
from sklearn.preprocessing import OneHotEncoder
onehotencoder = OneHotEncoder()
# ์ํ๋ ์ด์ ๋ฝ์์ 2์ฐจ์ ๋ฐฐ์ด๋ก ๋ง๋ค์ด์ ์ ๋ฌํ์ฌ์ผ ํ๋ค.
XX = onehotencoder.fit_transform(X[:,0].reshape(-1,1)).toarray()
print(XX)
X = np.delete(X, [0], axis=1) # 0๋ฒ์งธ ์ด ์ญ์
X = np.concatenate((XX, X), axis = 1) # X์ XX๋ฅผ ๋ถ์ธ๋ค.
print(X)
[[0. 0. 1.]
[0. 1. 0.]
[1. 0. 0.]]
[['0.0' '0.0' '1.0' '38' '7200']
['0.0' '1.0' '0.0' '27' '4800']
['1.0' '0.0' '0.0' '30' '3100']]
to_categorical()์ ํธ์ถํ์ฌ ๊ตฌํclass_vector =[2, 6, 6, 1]
from tensorflow.keras.utils import to_categorical
output = to_categorical(class_vector, num_classes = 7)
print(output)
[[0 0 1 0 0 0 0]
[0 0 0 0 0 0 1]
[0 0 0 0 0 0 1]
[0 1 0 0 0 0 0]]
์ ๊ฒฝ๋ง์ ์
๋ ฅ๋ง๋ค ๋ค๋ฅธ ๋ฒ์์ ๋งค๊ฐ๋ณ์๋ฅผ ํ์ตํ๋ฏ๋ก, ์
๋ ฅ ๊ฐ์ ๋ฒ์๊ฐ ์ค์ํ๋ค.
๋ถ๋์์์ ์ ๋ฐ๋ ๋ฌธ์ ๋ฅผ ํผํ๋ ค๋ฉด ์
๋ ฅ์ ๋๋ต -1.0 ~ 1.0 ๋ฒ์๋ก ๋ง์ถ๋ ๊ฒ์ด ์ข๋ค.
์ผ๋ฐ์ ์ผ๋ก ํ๊ท ์ด 0์ด ๋๋๋ก ์ ๊ทํํ๊ณ , ๋ฒ์๋ฅผ ์ผ์ ํ๊ฒ ์กฐ์ ํ๋ค.


โก๏ธ ์ฌ๋์ ๋์ด, ์ฑ๋ณ, ์ฐ๊ฐ ์์ ์ ๊ธฐ์ค์ผ๋ก, ์ ํธํ๋ ์๋์ฐจ์ ํ์ (์ธ๋จ ์๋๋ฉด SUV)์ ์์ธกํ ์ ๊ฒฝ๋ง์ ๋ง๋ค๊ณ ์ถ๋ค๊ณ ๊ฐ์
๋์ด, ์ฑ๋ณ, ์ฐ๊ฐ์์ , ์๋์ฐจ
[0] 30 male 3800 SUV
[1] 36 female 4200 SEDAN
[2] 52 male 4000 SUV
[3] 42 female 4400 SEDAN
์ ๊ทํํ์ ๋ฒ์ฃผํ๋ฐ์ดํฐ ์-ํซ์ธ์ฝ๋ฉ
[0] -1.23 -1.0 -1.34 (1.0 0.0)
[1] -0.49 1.0 0.45 (0.0 1.0)
[2] 1.48 -1.0 -0.45 (1.0 0.0)
[3] 0.25 1.0 1.34 (0.0 1.0)
sklearn์ MinmaxScaler ํด๋์ค๋ ๋ค์์ Numpy ์์์ ์ฌ์ฉํ์ฌ ์ ๊ทํํ๋ค.
from sklearn.preprocessing import MinMaxScaler
data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
scaler = MinMaxScaler()
scaler.fit(data) # ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ ์์๋ธ๋ค.
print(scaler.transform(data)) # ๋ฐ์ดํฐ๋ฅผ ๋ณํํ๋ค.
[[0. 0. ]
[0.25 0.25]
[0.5 0.5 ]
[1. 1. ]]
๋ฐ์ดํฐ ์ ๊ทํ๊ฐ ํ์ํ๋ฉด ์ผ๋ผ์ค์ Normalization ๋ ์ด์ด๋ฅผ ์ค๊ฐ์ ๋ฃ์ผ๋ฉด ๋๋ค.
tf.keras.preprocessing.Normalization(
axis=-1, dtype=None, mean=None, variance=None, **kwargs
)
# axis: ์ ์งํด์ผ ํ๋ ์ถ, mean: ์ ๊ทํ ์ค ์ฌ์ฉํ ํ๊ท ๊ฐ, variance=์ ๊ทํ ์ค ์ฌ์ฉํ ๋ถ์ฐ๊ฐ
# ์ด ๋ ์ด์ด๋ ์
๋ ฅ์ ํ๊ท ์ด 0์ด๊ณ ํ์คํธ์ฐจ๊ฐ 1์ธ ๋ถํฌ๋ก ์ ๊ทํ์ํด
import tensorflow as tf
import numpy as np
adapt_data = np.array([[1.], [2.], [3.], [4.], [5.]], dtype=np.float32)
input_data = np.array([[1.], [2.], [3.]], np.float32)
layer = tf.keras.layers.Normalization()
layer.adapt(adapt_data)
layer(input_data)
#<tf.Tensor: shape=(3, 1), dtype=float32, numpy=
#array([[-1.4142135 ],
# [-0.70710677],
# [ 0. ]], dtype=float32)>
๊ณผ์ ์ ํฉ(overfitting)์ ์ง๋์น๊ฒ ํ๋ จ ๋ฐ์ดํฐ์ ํนํ๋ผ ์ค์ ์ ์ฉ ์ ์ข์ง ๋ชปํ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ ๊ฒ์๋งค๊ฐ๋ณ์๊ฐ ๋ง์ ๋ ๋ฐ์ํ๋ค.๊ฒ์ฆ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์์ค(MSE)๋ฅผ ๊ณ์ฐํด ๋ณด๋ฉด U shape์ ํ์ต ์ปค๋ธ๊ฐ ๋์จ๋ค.


import numpy as numpy
import tensorflow as tf
import matplotlib.pyplot as plt
# ๋ฐ์ดํฐ ๋ค์ด๋ก๋ (์์ 1000๊ฐ ๋จ์ด๋ฅผ ์ ํ)
(train_data, train_labels), (test_data, test_labels) = \
tf.keras.datasets.imdb.load_data(num_words=1000)
# ์-ํซ ์ธ์ฝ๋ฉ์ผ๋ก ๋ณํํ๋ ํจ์
def one_hot_sequences(sequences, dimension=1000):
results = numpy.zeros((len(sequences), dimension))
for i, word_index in enumerate(sequences):
results[i, word_index] = 1.
return results
train_data = one_hot_sequences(train_data)
test_data = one_hot_sequences(test_data)
# ์ ๊ฒฝ๋ง ๋ชจ๋ธ ๊ตฌ์ถ
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(16, activation='relu', input_shape=(1000,)))
model.add(tf.keras.layers.Dense(16, activation='relu'))
model.add(tf.keras.layers.Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# ์ ๊ฒฝ๋ง ํ๋ จ, ๊ฒ์ฆ ๋ฐ์ดํฐ ์ ๋ฌ
history = model.fit(train_data,
train_labels,
epochs=20,
batch_size=512,
validation_data=(test_data, test_labels),
verbose=2)
# ํ๋ จ ๋ฐ์ดํฐ์ ์์ค๊ฐ๊ณผ ๊ฒ์ฆ ๋ฐ์ดํฐ์ ์์ค๊ฐ์ ๊ทธ๋ํ์ ์ถ๋ ฅ
history_dict = history.history
loss_values = history_dict['loss'] # ํ๋ จ ๋ฐ์ดํฐ ์์ค๊ฐ
val_loss_values = history_dict['val_loss'] # ๊ฒ์ฆ ๋ฐ์ดํฐ ์์ค๊ฐ
acc = history_dict['accuracy'] # ์ ํ๋
epochs = range(1, len(acc) + 1) # ์ํฌํฌ ์
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Loss Plot')
plt.ylabel('loss')
plt.xlabel('epochs')
plt.legend(['train error', 'val error'], loc='upper left')
plt.show()

๊ฐ์ค์น(weight)์ ๊ฐ์๋ฅผ ์ค์ด๊ฑฐ๋ ์ ํํ๊ณ ํ๋ จ ๋ฐ์ดํฐ(traing data)์ ์์ ๋๋ฆฌ๋ฉด ๋๋ค.
์กฐ๊ธฐ ์ข ๋ฃ(early stopping): ๊ฒ์ฆ ์์ค์ด ์ฆ๊ฐํ๋ฉด ํ๋ จ์ ์กฐ๊ธฐ์ ์ข ๋ฃํ๋ค.๊ฐ์ค์น ๊ท์ ๋ฐฉ๋ฒ(weight regularization): ๊ฐ์ค์น์ ์ ๋๊ฐ์ ์ ํํ๋ค.๋๋กญ์์ ๋ฐฉ๋ฒ(dropout): ๋ช ๊ฐ์ ๋ด๋ฐ์ ์ฌ๊ฒ ํ๋ค.๋ฐ์ดํฐ ์ฆ๊ฐ ๋ฐฉ๋ฒ(data augmentation): ๋ฐ์ดํฐ๋ฅผ ๋ง์ด ๋ง๋ ๋ค.
โก๏ธ ๋ชจ๋ธ์ด ๋
ธ์ด์ฆ๋ฅผ ๋๋ฌด ์ด์ฌํ ํ์ตํ๋ฉด ํ์ต ์ค์ ๊ฒ์ฆ ์์ค์ด ๋ฐ์ํ ์ ์๋ค.
โก๏ธ ๊ฒ์ฆ ์์ค์ด ๋ ์ด์ ๊ฐ์ํ์ง ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ ๋๋ง๋ค ํ๋ จ์ ์ค๋จํ ์ ์๋ค.

โก๏ธ ๊ฐ์ค์น์ ๊ฐ์ด ๋๋ฌด ํฌ๋ฉด, ํ๋จ ๊ฒฝ๊ณ์ ์ด ๋ณต์กํด์ง๊ณ ๊ณผ์ ์ ํฉ์ด ์ผ์ด๋๋ค๋ ์ฌ์ค์ ๋ฐ๊ฒฌํ์๋ค.
L1 ๊ท์ : L2 ๊ท์ : โก๏ธ L1 ๊ท์ ๋ ๊ฐ์ค์น๋ฅผ 0์ผ๋ก ๋ง๋๋ ๋จ์ ์ด ์์ด์ L2๊ท์ ๋ฅผ ๋ ๋ง์ด ์ฌ์ฉํ๋ค.
# ์ ๊ฒฝ๋ง ๋ชจ๋ธ ๊ตฌ์ถ
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(16, kernel_regularizer=tf.keras.regularizers.l2(0.001), activation='relu', input_shape=(1000,)))
model.add(tf.keras.layers.Dense(16, kernel_regularizer=tf.keras.regularizers.l2(0.001), activation='relu'))
model.add(tf.keras.layers.Dense(1, activation='sigmoid'))

โก๏ธ ๋๋กญ์์์ ๋ช ๊ฐ์ ๋
ธ๋๋ค์ ํ์ต ๊ณผ์ ์์ ๋๋คํ๊ฒ ์ ์ธํ๋ ๊ฒ์ด๋ค.
โก๏ธ ๋ณดํต 0.2์์ 0.5์ฌ์ด์ ๊ฐ์ ์ฌ์ฉํ๋ค.

# ์ ๊ฒฝ๋ง ๋ชจ๋ธ ๊ตฌ์ถ
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(16, activation='relu', input_shape=(10000,)))
model.add(tf.keras.layers.Dropout(0.5))
model.add(tf.keras.layers.Dense(16, activation='relu'))
model.add(tf.keras.layers.Dropout(0.5))
model.add(tf.keras.layers.Dense(1, activation='sigmoid'))

โก๏ธ ์๋์ ํ๋ จ ๋ฐ์ดํฐ์์ ๋ง์ ํ๋ จ ๋ฐ์ดํฐ๋ฅผ ๋ฝ์๋ด๋ ๋ฐฉ๋ฒ์ด๋ค.
โก๏ธ ์ด๋ฏธ์ง๋ฅผ ์ข์ฐ๋ก ํ๋ํ๋ค๊ฑฐ๋ ํ์ ์์ผ์ ๋ณํ๋ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ์ฌ ์ด๊ฒ์ ์๋ก์ด ํ๋ จ ๋ฐ์ดํฐ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.

โก๏ธ ์ฌ๋ฌ ์ ๋ฌธ๊ฐ๋ฅผ ๋์์ ํ๋ จ์ํค๋ ๊ฒ๊ณผ ๊ฐ๋ค. ์ด ๋ฐฉ๋ฒ์ ๋์ผํ ๋ฅ๋ฌ๋ ์ ๊ฒฝ๋ง์ N๊ฐ๋ฅผ ๋ง๋๋ ๊ฒ์ด๋ค.
์ฝ 2~5%์ ๋์ ์ฑ๋ฅ ํฅ์์ ๊ธฐ๋ํ ์ ์๋ค.โก๏ธ ๊ฐ ์ ๊ฒฝ๋ง์ ๋
๋ฆฝ์ ์ผ๋ก ํ์ต์ํจ ํ์ ๋ง์ง๋ง์ ํฉ์น๋ ๊ฒ์ด๋ค.
