๋ฅ๋ฌ๋(Deep Learning) ์ ์ธ๊ฐ ๋์ ๋ด๋ฐ ๊ตฌ์กฐ๋ฅผ ๋ชจ๋ฐฉํ ์ธ๊ณต์ ๊ฒฝ๋ง(Artificial Neural Network, ANN) ์ ๋ค์ธต์ผ๋ก ์ฐ๊ฒฐํด
๋ฐ์ดํฐ์์ ํน์ง(feature)์ ์ค์ค๋ก ํ์ตํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
| ๊ตฌ๋ถ | ์ ํต์ ๋จธ์ ๋ฌ๋ | ๋ฅ๋ฌ๋ |
|---|---|---|
| ํน์ง ์ถ์ถ | ์ฌ๋์ด ์ง์ ์ค๊ณ | ๋คํธ์ํฌ๊ฐ ์๋ ์ถ์ถ |
| ๋ฐ์ดํฐ ์๊ตฌ๋ | ์ ์ | ๋ง์ |
| ์ฑ๋ฅ ํฅ์ ๋ฐฉ๋ฒ | ํน์ง๊ณตํ(Feature Engineering) | ์ธต(Layer)๊ณผ ํ๋ผ๋ฏธํฐ ํ์ฅ |
| ๋ํ ๋ชจ๋ธ | SVM, Random Forest | ANN, CNN, RNN, Transformer |
๋ฅ๋ฌ๋์ ๋น์ ํ์ ยท๋ณต์กํ ๋ฐ์ดํฐ ํจํด์ ์ค์ค๋ก ํ์ตํด,
์์ฑยท์ด๋ฏธ์งยทํ ์คํธ ์์ญ์์ ์ธ๊ฐ ์์ค์ ์ฑ๋ฅ์ ๋ฌ์ฑํ๋ค.
ํ๋์ ๋ด๋ฐ์ ์ฌ๋ฌ ์ ๋ ฅ์ ๋ฐ์, ๊ฐ์ค์น๋ฅผ ๊ณฑํ๊ณ ํฉํ ๋ค ํ์ฑํ ํจ์๋ฅผ ์ ์ฉํด ์ถ๋ ฅ์ ์์ฑํ๋ค.
| ํจ์ | ์์/๊ทธ๋ํ ํน์ง | ์ฌ์ฉ ๋ชฉ์ |
|---|---|---|
| Sigmoid | ํ๋ฅ ์ถ๋ ฅ (0~1), ๋ก์ง์คํฑ ํ๊ทํ ๋ฌธ์ | |
| Tanh | ๋ฒ์, ์ค์ฌ 0 | ๋์นญํ ํ์ฑํ |
| ReLU | CNNยทANN ๋๋ถ๋ถ์ ์๋์ธต์์ ์ฌ์ฉ | |
| Softmax | ํด๋์ค ํ๋ฅ ๋ถํฌ ์์ฑ | ๋ค์ค ๋ถ๋ฅ (output layer) |
๐ก ReLU๋ ๊ณ์ฐ๋์ด ์๊ณ ๊ธฐ์ธ๊ธฐ ์์ค(vanishing gradient) ๋ฌธ์ ๋ฅผ ์ํํ๋ค.
์ ๋ ฅ โ ๊ฐ์ค์น โ ํ์ฑํ โ ์ถ๋ ฅ ์์ธก.
์ถ๋ ฅ๊ณผ ์ค์ ๊ฐ ์ฐจ์ด(์ค์ฐจ)๋ฅผ ๊ณ์ฐํ์ฌ,
๊ฐ์ค์น๋ฅผ ๋ฏธ์ธ ์กฐ์ (Gradient Descent) ์ผ๋ก ํ์ต.
| ์ ํ | ์ค๋ช | ํน์ง |
|---|---|---|
| Batch GD | ์ ์ฒด ๋ฐ์ดํฐ๋ก ํ ๋ฒ ์ ๋ฐ์ดํธ | ์์ ์ , ๋๋ฆผ |
| Stochastic (SGD) | ์ํ 1๊ฐ์ฉ ์ ๋ฐ์ดํธ | ๋น ๋ฅด์ง๋ง ๋ ธ์ด์ฆ ํผ |
| Mini-Batch | ์ผ์ ํฌ๊ธฐ ์ํ๋ก ์ ๋ฐ์ดํธ | ๋๋ถ๋ถ์ ๋ฅ๋ฌ๋ ๊ธฐ๋ณธ ์ค์ |
์ด์ง ๋ถ๋ฅ (์: ๊ณ ๊ฐ์ ์ํ ์๋น์ค ํํด ์ฌ๋ถ)
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
# ๋ชจ๋ธ ์ ์
model = Sequential()
model.add(Dense(units=6, activation='relu', input_dim=11))
model.add(Dense(units=6, activation='relu'))
model.add(Dense(units=1, activation='sigmoid'))
# ์ปดํ์ผ
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
# ํ์ต
model.fit(X_train, y_train, batch_size=32, epochs=100)
# ์์ธก
y_pred = (model.predict(X_test) > 0.5)
๐ก ๊ตฌ์กฐ ์์ฝ:
library(h2o)
h2o.init()
model = h2o.deeplearning(
y = "Exited",
training_frame = train_h2o,
hidden = c(6,6),
activation = "Rectifier",
epochs = 100
)
pred = h2o.predict(model, test_h2o)
์ด๋ฏธ์ง ๋ฐ์ดํฐ์์ ๊ณต๊ฐ์ ํจํด(ํฝ์
๊ด๊ณ) ์ ํ์ตํ๋ ๋ฅ๋ฌ๋ ๋ชจ๋ธ.
ํน์ง(feature)์ ์ฌ๋์ด ์ ์ํ์ง ์๊ณ ์ปจ๋ณผ๋ฃจ์
(Convolution) ์ฐ์ฐ์ผ๋ก ์๋ ์ถ์ถํ๋ค.
| ๋จ๊ณ | ์ญํ | ์ฐ์ฐ ๋ฐฉ์ |
|---|---|---|
| 1๋จ๊ณ: Convolution | ํน์ง ์ถ์ถ | ํํฐ(kernel)๋ก ์ด๋ฏธ์ง ์ค์บ |
| 2๋จ๊ณ: ReLU | ๋น์ ํ์ฑ ์ถ๊ฐ | ์์ ์ ๊ฑฐ |
| 3๋จ๊ณ: Pooling | ์ฐจ์ ์ถ์ | Max Pooling / Average Pooling |
| 4๋จ๊ณ: Flattening | 2D โ 1D ๋ณํ | Fully Connected ์ธต ์ ๋ ฅ |
| 5๋จ๊ณ: Full Connection | ์ต์ข ๋ถ๋ฅ | Softmax๋ก ํด๋์ค ํ๋ฅ ๊ณ์ฐ |
ํํฐ(kernel)์ด ์ด๋ฏธ์ง ์ผ๋ถ๋ฅผ ์ฌ๋ผ์ด๋ฉํ๋ฉฐ ํจํด(๋ชจ์๋ฆฌ, ์ค๊ณฝ)์ ๊ฐ์ง.
| ์ ๋ ฅ | ์ปค๋ | ์ถ๋ ฅ(ํน์ง๋งต) |
|---|---|---|
| ์ด๋ฏธ์ง 5ร5 | 3ร3 | 3ร3 |
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
# ๋ชจ๋ธ ์ด๊ธฐํ
cnn = Sequential()
# 1. Convolution
cnn.add(Conv2D(32, (3,3), activation='relu', input_shape=(64,64,3)))
# 2. Pooling
cnn.add(MaxPooling2D(pool_size=(2,2)))
# 3. ์ถ๊ฐ Convolution + Pooling
cnn.add(Conv2D(32, (3,3), activation='relu'))
cnn.add(MaxPooling2D(pool_size=(2,2)))
# 4. Flattening
cnn.add(Flatten())
# 5. Fully Connected
cnn.add(Dense(units=128, activation='relu'))
cnn.add(Dense(units=1, activation='sigmoid'))
# 6. Compile
cnn.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
# ํ์ต
cnn.fit(X_train, y_train, epochs=25, batch_size=32)
๐ก CNN์ ํต์ฌ:
ํฝ์
๊ฐ โ์ง์ญ์ ํจํดโ์ ์๋ ํ์ตํ์ฌ
์ด๋ฏธ์ง ๋ด ํํยท์ค๊ณฝยท์์ ํน์ง์ ๊ณ์ธต์ ์ผ๋ก ์ถ์ถํ๋ค.
library(keras)
model <- keras_model_sequential() %>%
layer_conv_2d(filters=32, kernel_size=c(3,3), activation='relu', input_shape=c(64,64,3)) %>%
layer_max_pooling_2d(pool_size=c(2,2)) %>%
layer_flatten() %>%
layer_dense(units=128, activation='relu') %>%
layer_dense(units=1, activation='sigmoid')
model %>% compile(optimizer='adam', loss='binary_crossentropy', metrics='accuracy')
model %>% fit(X_train, y_train, epochs=25, batch_size=32)
๋ค์ค ํด๋์ค ๋ถ๋ฅ ์ ๊ฐ ํด๋์ค์ ํ๋ฅ ์ ๊ณ์ฐ.
์์ธก ํ๋ฅ ์ด ์ค์ ๋ ์ด๋ธ๊ณผ ์ผ๋ง๋ ์ฐจ์ด๋๋์ง ๊ณ์ฐ.
CNN์ ์ถ๋ ฅ์ธต์์ Softmax + CrossEntropy ์กฐํฉ์
์ด๋ฏธ์ง ๋ถ๋ฅ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ์ด๋ค.
| ํญ๋ชฉ | ANN | CNN |
|---|---|---|
| ์ ๋ ฅ ํํ | 1์ฐจ์ (ํญํ ๋ฐ์ดํฐ) | 2D/3D (์ด๋ฏธ์ง, ์์) |
| ํน์ง ์ถ์ถ | ์๋ ์ ๋ ฅ | ์๋ (ํํฐ ๊ธฐ๋ฐ) |
| ํ๋ผ๋ฏธํฐ ์ | ๋ง์ | ๊ณต์ ๋ก ๊ฐ์ |
| ์ ์ฉ ๋ถ์ผ | ํํ ๋ฐ์ดํฐ, ์์ธก | ์ด๋ฏธ์ง, ๋น์ |
๋ฅ๋ฌ๋์ ๋ณต์กํ ๋ฐ์ดํฐ์์ ์ค์ค๋ก ํจํด์ ํ์ตํ๋ ๊ธฐ์ ๋ก,
ANN์ ์ผ๋ฐ ๋ฐ์ดํฐ ์์ธก, CNN์ ์ด๋ฏธ์ง ์ธ์์ ํนํ๋์ด ์๋ค.
๐ ํต์ฌ ์์ฝ
| ๋ชจ๋ธ | ์ ๋ ฅ ํํ | ํน์ง | ์ฃผ์ ์์ฉ |
|---|---|---|---|
| ANN | ์ซ์ํ, ํํ ๋ฐ์ดํฐ | ๋ค์ธต ํผ์ ํธ๋ก ๊ตฌ์กฐ | ๊ณ ๊ฐ์ดํ, ์์ธก |
| CNN | ์ด๋ฏธ์ง, ๋น๋์ค | ์ง์ญ ํจํด ์๋ ํ์ต | ์ผ๊ตด์ธ์, ์๋ฃ์์ |
| ํ์ฑํ ํจ์ | ReLU / Sigmoid / Softmax | ๋น์ ํ์ฑ ๋ถ์ฌ | ๋๋ถ๋ถ์ ๋ฅ๋ฌ๋ ๊ณตํต |
| ํ์ต ๋ฐฉ์ | ๊ฒฝ์ฌํ๊ฐ๋ฒ + ์ญ์ ํ | ์์ค ์ต์ํ | ๋ฐ๋ณต์ ํ์ต์ผ๋ก ์๋ ด |