๋ค์ธต ํผ์ ํธ๋ก (MLP) ๋ฅ๋ฌ๋์ ์ถ๋ฐ์ ์ธ MLP์ ๊ตฌ์กฐ์ ์๋ ์๋ฆฌ๋ฅผ ์์๋ณด๊ณ , Python์ผ๋ก ์ง์ ๊ตฌํํด๋ณธ๋ค.
๋ค์ด๊ฐ๋ฉฐ
๋ฅ๋ฌ๋์ ์ธ๊ณ์ ์ฒซ๋ฐ์ ๋ด๋๋ ๋ ๊ฐ์ฅ ๋จผ์ ๋ง์ฃผํ๊ฒ ๋๋ ๋ชจ๋ธ์ ๋ฐ๋ก ๋ค์ธต ํผ์ ํธ๋ก (Multilayer Perceptron, MLP)์ผ ๊ฒ์ด๋ค. MLP๋ ์ธ๊ณต์ ๊ฒฝ๋ง์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ํํ๋ก, ๋ณต์กํ ๋ฅ๋ฌ๋ ์ํคํ ์ฒ์ ๊ทผ๊ฐ์ ์ด๋ฃจ๋ ์ค์ํ ๊ฐ๋ ์ด๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ ๋ฅ๋ฌ๋์ ์ถ๋ฐ์ ์ด๋ผ ํ ์ ์๋ MLP์ ๊ตฌ์กฐ์ ์๋ ์๋ฆฌ๋ฅผ ์์๋ณด๊ณ , ๊ฐ๋จํ Python ์์ ์ฝ๋๋ฅผ ํตํด ์ง์ ๋ชจ๋ธ์ ๊ตฌํํด๋ณด์๋ค.
1. ๋ค์ธต ํผ์ ํธ๋ก (MLP)์ด๋?
MLP๋ ์ ๋ ฅ์ธต(Input Layer)๊ณผ ์ถ๋ ฅ์ธต(Output Layer) ์ฌ์ด์ ํ๋ ์ด์์ ์๋์ธต(Hidden Layer)์ ํฌํจํ๋ ์ธ๊ณต์ ๊ฒฝ๋ง ๊ตฌ์กฐ๋ค. ๊ฐ ์ธต์ ์ฌ๋ฌ ๊ฐ์ ๋ ธ๋(๋ด๋ฐ)๋ก ๊ตฌ์ฑ๋๋ฉฐ, ํ ์ธต์ ๋ ธ๋๋ค์ ๋ค์ ์ธต์ ๋ชจ๋ ๋ ธ๋์ ์์ ํ ์ฐ๊ฒฐ๋(Fully-connected) ํน์ง์ ๊ฐ์ง๋ค.
๊ฐ์ฅ ๋จ์ํ ์ ๊ฒฝ๋ง์ธ ํผ์ ํธ๋ก ์ ์ ํ ๋ถ๋ฆฌ๊ฐ ๊ฐ๋ฅํ ๋ฌธ์ ๋ง ํด๊ฒฐํ ์ ์๋ค๋ ํ๊ณ๊ฐ ์์๋ค. ํ์ง๋ง MLP๋ ์ฌ๋ฌ ๊ฐ์ ์๋์ธต์ ์๊ณ ๊ฐ ์ธต์ ๋น์ ํ ํ์ฑํ ํจ์(Non-linear Activation Function, ์: ReLU, Sigmoid)๋ฅผ ๋์ ํจ์ผ๋ก์จ, ๋ณต์กํ ๋น์ ํ ๋ฌธ์ ๊น์ง ํด๊ฒฐํ ์ ์๋ ๋ฅ๋ ฅ์ ๊ฐ์ถ๊ฒ ๋์๋ค.

2. MLP์ ํ์ต ๊ณผ์
MLP์ ํ์ต์ ํฌ๊ฒ ์์ ํ(Forward Propagation)์ ์ญ์ ํ(Backward Propagation) ๋ ๋จ๊ณ๋ก ์ด๋ฃจ์ด์ง๋ค.
- ์์ ํ (Forward Propagation): ์ ๋ ฅ ๋ฐ์ดํฐ๊ฐ ์ ๋ ฅ์ธต์์ ์์ํ์ฌ ์๋์ธต์ ๊ฑฐ์ณ ์ถ๋ ฅ์ธต๊น์ง ์ ๋ฌ๋๋ ๊ณผ์ ์ด๋ค. ๊ฐ ๋ ธ๋์์๋ ์ด์ ์ธต์ผ๋ก๋ถํฐ ๋ค์ด์จ ์ ํธ๋ค์ ๊ฐ์ค์น(weight)๋ฅผ ๊ณฑํ๊ณ , ํธํฅ(bias)์ ๋ํ ๋ค, ํ์ฑํ ํจ์๋ฅผ ๊ฑฐ์ณ ๋ค์ ์ธต์ผ๋ก ์ ํธ๋ฅผ ์ ๋ฌํ๋ค. ์ด๋ ๊ฒ ๊ณ์ฐ๋ ์ต์ข ์ถ๋ ฅ๊ฐ(์์ธก๊ฐ)๊ณผ ์ค์ ๊ฐ(์ ๋ต)์ ์ฐจ์ด๋ฅผ ์์ค(Loss)์ด๋ผ๊ณ ํ๋ค.
- ์ญ์ ํ (Backward Propagation): ๊ณ์ฐ๋ ์์ค์ ์ต์ํํ๋ ๋ฐฉํฅ์ผ๋ก ๊ฐ ์ฐ๊ฒฐ์ ๊ฐ์ค์น์ ํธํฅ์ ์ ๋ฐ์ดํธํ๋ ๊ณผ์ ์ด๋ค. ์ถ๋ ฅ์ธต์์๋ถํฐ ์ ๋ ฅ์ธต ๋ฐฉํฅ์ผ๋ก, ๊ฐ ๊ฐ์ค์น๊ฐ ์์ค์ ์ผ๋ง๋ ์ํฅ์ ๋ฏธ์ณค๋์ง(๊ธฐ์ฌ๋)๋ฅผ ๊ณ์ฐํ๊ณ , ๊ฒฝ์ฌ ํ๊ฐ๋ฒ(Gradient Descent)๊ณผ ๊ฐ์ ์ต์ ํ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ๊ฐ์ค์น๋ฅผ ์กฐ์ ํ๋ค. ์ด ๊ณผ์ ์ ์์์ด ๋ฐ๋ณตํ๋ฉฐ ๋ชจ๋ธ์ ์ต์ ์ ๊ฐ์ค์น๋ฅผ ์ฐพ์๊ฐ๋ค.
3. Python์ผ๋ก MLP ๊ตฌํํ๊ธฐ
๊ฐ๋
๋ง์ผ๋ก๋ ์๋ฟ์ง ์์ ์ ์๋ค. ์ด๋ฒ์๋ scikit-learn์ Iris ๋ฐ์ดํฐ์
๊ณผ TensorFlow/Keras๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ MLP ๋ชจ๋ธ์ ์ง์ ๋ง๋ค์ด ๋ณด์๋ค.
๊ฐ. ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
๋จผ์ , ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํด์ผ ํ๋ค.
sudo pip3 install tensorflow scikit-learn
๋. ์์ ์์ค ์ฝ๋
๋ถ๊ฝ์ ๊ฝ์๊ณผ ๊ฝ๋ฐ์นจ์ ๊ธธ์ด/๋๋น(4๊ฐ ํน์ฑ)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก 3๊ฐ์ง ํ์ข (Setosa, Versicolor, Virginica) ์ค ํ๋๋ก ๋ถ๋ฅํ๋ ๊ฐ๋จํ MLP ๋ชจ๋ธ์ด๋ค.
import tensorflow as tf
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.datasets import load_iris
import numpy as np
# 1. ๋ฐ์ดํฐ ๋ก๋ ๋ฐ ์ ์ฒ๋ฆฌ
# ๋ถ๊ฝ ๋ฐ์ดํฐ์
๋ก๋
iris = load_iris()
X = iris.data
y = iris.target.reshape(-1, 1) # (n_samples,) -> (n_samples, 1)
# ์
๋ ฅ ๋ฐ์ดํฐ(X) ํ์คํ
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# ํ๊ฒ ๋ฐ์ดํฐ(y) ์-ํซ ์ธ์ฝ๋ฉ
# 0 -> [1, 0, 0]
# 1 -> [0, 1, 0]
# 2 -> [0, 0, 1]
encoder = OneHotEncoder(sparse_output=False)
y_onehot = encoder.fit_transform(y)
# ํ์ต ๋ฐ์ดํฐ์ ํ
์คํธ ๋ฐ์ดํฐ ๋ถ๋ฆฌ
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y_onehot, test_size=0.2, random_state=42)
# 2. MLP ๋ชจ๋ธ ๊ตฌ์ถ (Keras ์ฌ์ฉ)
model = tf.keras.Sequential([
# ์
๋ ฅ์ธต (ํน์ฑ 4๊ฐ), ์ฒซ ๋ฒ์งธ ์๋์ธต (๋
ธ๋ 10๊ฐ), ํ์ฑํ ํจ์ ReLU
tf.keras.layers.Dense(10, activation='relu', input_shape=(4,)),
# ๋ ๋ฒ์งธ ์๋์ธต (๋
ธ๋ 10๊ฐ), ํ์ฑํ ํจ์ ReLU
tf.keras.layers.Dense(10, activation='relu'),
# ์ถ๋ ฅ์ธต (ํด๋์ค 3๊ฐ), ํ์ฑํ ํจ์ Softmax (๋ค์ค ๋ถ๋ฅ์ฉ)
tf.keras.layers.Dense(3, activation='softmax')
])
# 3. ๋ชจ๋ธ ์ปดํ์ผ
# ์ต์ ํ ์๊ณ ๋ฆฌ์ฆ: Adam
# ์์ค ํจ์: categorical_crossentropy (๋ค์ค ๋ถ๋ฅ์ฉ)
# ํ๊ฐ ์งํ: accuracy (์ ํ๋)
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
# ๋ชจ๋ธ ๊ตฌ์กฐ ์์ฝ ์ถ๋ ฅ
model.summary()

# 4. ๋ชจ๋ธ ํ์ต
# 100๋ฒ์ epoch(์ ์ฒด ๋ฐ์ดํฐ์
๋ฐ๋ณต ํ์ต ํ์) ๋์ ํ์ต
# batch_size: ํ ๋ฒ์ ์ฒ๋ฆฌํ ๋ฐ์ดํฐ ์ํ ๊ฐ์
history = model.fit(X_train, y_train, epochs=100, batch_size=5, verbose=1)
# 5. ๋ชจ๋ธ ํ๊ฐ
# ํ
์คํธ ๋ฐ์ดํฐ๋ก ๋ชจ๋ธ์ ์ฑ๋ฅ ํ๊ฐ
loss, accuracy = model.evaluate(X_test, y_test, verbose=0)
print(f'\nTest Accuracy: {accuracy*100:.2f}%')
# 6. ์๋ก์ด ๋ฐ์ดํฐ๋ก ์์ธก
# ์์์ ์๋ก์ด ๋ถ๊ฝ ๋ฐ์ดํฐ ์์ฑ (ํ์คํ ํ์)
new_flower_data = np.array([[5.1, 3.5, 1.4, 0.2]]) # Setosa ํ์ข
์ ๊ฐ๊น์ด ๋ฐ์ดํฐ
new_flower_data_scaled = scaler.transform(new_flower_data)
# ์์ธก ์ํ
prediction = model.predict(new_flower_data_scaled)
predicted_class = np.argmax(prediction, axis=1)
print(f'\nNew data prediction: {prediction}')
print(f'Predicted class: {iris.target_names[predicted_class][0]}')
# print
New data prediction: [[9.9966228e-01 3.3776104e-04 1.1798655e-13]]
Predicted class: setosa
๋ง์น๋ฉฐ
MLP๋ ์ ํ ๋ฐ์ดํฐ(ํ
์ด๋ธ ํํ์ ๋ฐ์ดํฐ)์ ๋ํ ๋ถ๋ฅ๋ ํ๊ท ๋ฌธ์ ์์ ์ฌ์ ํ ๊ฐ๋ ฅํ๊ณ ํจ๊ณผ์ ์ธ ๋ชจ๋ธ์ด๋ค.
๋ํ, CNN์ด๋ RNN๊ณผ ๊ฐ์ ๋ณต์กํ ๋ชจ๋ธ์ ์ผ๋ถ(์ฃผ๋ก ๋ง์ง๋ง ์ถ๋ ฅ๋จ)๋ก๋ ํ์ฉ๋๋ ๋งํผ,
๊ทธ ๊ตฌ์กฐ์ ์๋ฆฌ๋ฅผ ๋ช
ํํ ์ดํดํ๋ ๊ฒ์ ๋ฅ๋ฌ๋ ํ์ต์ ํผํผํ ๊ธฐ์ด๊ฐ ๋ ๊ฒ์ด๋ค.
์ฐธ๊ณ ์๋ฃ
- TensorFlow Core, Basic classification: Classify images of clothing
- scikit-learn, 3.1. Cross-validation: evaluating estimator performance
'๐ Data Science & AI > Deep Learning' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ํธ๋์คํฌ๋จธ(Transformer)์ ์ดํ ์ (Attention) (1) | 2026.06.07 |
|---|---|
| ์ํ ์ ๊ฒฝ๋ง(Recurrent Neural Network, RNN) (0) | 2026.03.02 |
| ํฉ์ฑ๊ณฑ ์ ๊ฒฝ๋ง(Convolutional Neural Network, CNN) (0) | 2026.03.02 |