-
혼공머신 CH 07 딥러닝의 시작: 인공신경망Study/머신러닝 딥러닝 2025. 9. 27. 13:46

목차
- 들어가며: 케라스(Keras)를 이용한 심층 신경망 모델 훈련
- 인공 신경망과 Fashion MNIST 데이터 준비
- 로지스틱 회귀를 통한 성능 비교
- 기본 심층 신경망(DNN) 모델 구성 및 훈련
- 심층 신경망: 렐루(ReLU)와 옵티마이저(Optimizer) 최적화
- 모델 훈련 과정 분석 및 과대적합(Overfitting) 제어
- 마치며: 효율적인 신경망 훈련을 위한 핵심 전략
1. 들어가며: 심층 신경망 모델 훈련
안녕하세요! 이 글은 인공 신경망(Artificial Neural Network, ANN) 모델을 구현하고 훈련하는 실습 과정입니다.
먼저 이 글에서는 Fashion MNIST 데이터셋을 사용하여 옷 이미지를 10가지 클래스로 분류하는 다중 분류(Multi-class Classification) 문제를 해결합니다. 초기 로지스틱 회귀 모델에서 시작하여, 층을 추가한 심층 신경망(DNN)을 구성하고, 활성화 함수와 옵티마이저를 최적화하는 과정을 다룹니다. 특히, 훈련 과정의 핵심 기술인 검증 손실 곡선 분석, 드롭아웃(Dropout)을 이용한 과대적합 방지, 그리고 콜백(Callback)을 활용한 모델 최적화 전략을 상세히 설명합니다.
2. 인공 신경망과 Fashion MNIST 데이터 준비
2-1. Fashion MNIST 데이터 로드 및 확인
Fashion MNIST는 10가지 범주(티셔츠, 바지, 운동화 등)로 분류된 6만 개의 훈련 이미지와 1만 개의 테스트 이미지로 구성된 데이터셋입니다. 각 이미지는 픽셀의 흑백 이미지입니다.
import keras (train_input, train_target), (test_input, test_target) = \ keras.datasets.fashion_mnist.load_data() print(train_input.shape, train_target.shape) # (60000, 28, 28) (60000,) print(np.unique(train_target, return_counts=True)) # 모든 클래스(0~9)가 6000개씩 균등하게 분포함을 확인2-2. 데이터 전처리 및 평탄화 (Flatten)
인공 신경망 훈련을 위해 데이터를 전처리합니다.
- 정규화: 픽셀 값()을 범위로 나누어 정규화합니다.
- 평탄화 (Flatten): 이미지를 길이 784인 1차원 배열로 펼쳐서 모델의 입력층에 전달할 준비를 합니다.
- 데이터 분리: 훈련 데이터를 훈련 세트(48,000개)와 검증 세트(12,000개)로 나눕니다.
train_scaled = train_input / 255.0 train_scaled = train_scaled.reshape(-1, 28*28) # 평탄화 from sklearn.model_selection import train_test_split train_scaled, val_scaled, train_target, val_target = train_test_split( train_scaled, train_target, test_size=0.2, random_state=42)
3. 로지스틱 회귀를 통한 성능 비교
인공 신경망 모델을 도입하기 전, 기본적인 로지스틱 회귀(Logistic Regression) 분류기의 성능을 확인하여 베이스라인(기준 성능)을 설정합니다. 로지스틱 회귀는 사실상 뉴런 1개만으로 구성된 가장 단순한 형태의 인공 신경망으로 볼 수 있습니다. SGDClassifier를 사용하여 5-겹 교차 검증을 수행한 결과, 평균 정확도는 약 0.819였습니다.
from sklearn.linear_model import SGDClassifier from sklearn.model_selection import cross_validate # 로지스틱 회귀 모델 훈련 및 교차 검증 sc = SGDClassifier(loss='log_loss', max_iter=5, random_state=42) scores = cross_validate(sc, train_scaled, train_target, n_jobs=-1) # print(np.mean(scores['test_score'])) # 0.8194...
4. 기본 심층 신경망(DNN) 모델 구성 및 훈련
4-1. 심층 신경망의 기본 구조 (입력, 은닉, 출력층)
케라스의 Sequential API를 사용하여 인공 신경망 모델을 구성합니다.
- 입력층: 크기의 평탄화된 데이터(784개 특성)를 받습니다.
- 은닉층 (Hidden Layer): 100개의 뉴런을 가지며, 초기에는 시그모이드(sigmoid) 활성화 함수를 사용합니다.
- 출력층 (Output Layer): 10개의 클래스를 분류하기 위해 10개의 뉴런을 가지며, softmax 활성화 함수를 사용하여 확률을 출력합니다.
# Sequential 모델 생성 (입력층과 출력층) inputs = keras.layers.Input(shape=(784,)) dense = keras.layers.Dense(10, activation='softmax') model = keras.Sequential([inputs, dense]) # 2개 층 (은닉층 포함) 구성 예 dense1 = keras.layers.Dense(100, activation='sigmoid') # 은닉층 dense2 = keras.layers.Dense(10, activation='softmax') # 출력층 model = keras.Sequential([inputs, dense1, dense2])4-2. 모델 컴파일 및 훈련
다중 분류 문제이므로 손실 함수로 sparse_categorical_crossentropy를 사용합니다.
model.compile(loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.fit(train_scaled, train_target, epochs=5) # 검증 세트 평가: [0.4444..., 0.8458...] (약 84.6% 정확도)초기 단순 모델의 정확도는 로지스틱 회귀(81.9%)보다 향상된 약 84.6%를 기록했습니다.
5. 심층 신경망: 렐루(ReLU)와 옵티마이저(Optimizer) 최적화
5-1. 렐루(ReLU) 활성화 함수와 Flatten 층 추가
시그모이드 함수는 은닉층이 깊어질수록 학습 속도를 느리게 하는 기울기 소실(Vanishing Gradient) 문제를 야기할 수 있습니다. 따라서 일반적으로 더 좋은 성능을 보이는 relu (Rectified Linear Unit) 함수를 은닉층에 적용합니다.
또한, 데이터 전처리 단계에서 명시적으로 평탄화하지 않고, 모델 내에 Flatten 층을 추가하여 입력 이미지를 바로 모델에 전달할 수 있습니다.
model = keras.Sequential() model.add(keras.layers.Input(shape=(28,28))) # 28x28 형태의 입력 model.add(keras.layers.Flatten()) # 여기서 784개 특성으로 평탄화 model.add(keras.layers.Dense(100, activation='relu')) model.add(keras.layers.Dense(10, activation='softmax'))5-2. 다양한 옵티마이저 비교 (SGD, Adagrad, RMSprop, Adam)
경사 하강법(Gradient Descent) 기반의 옵티마이저는 모델 훈련의 효율성을 결정하는 중요한 요소입니다. 케라스는 sgd 외에도 여러 옵티마이저를 제공하며, 그중 adam 옵티마이저가 일반적으로 가장 좋은 성능과 안정적인 수렴 속도를 보입니다.
# SGD 옵티마이저 (학습률, 모멘텀, 네스테로프 모멘텀 설정 가능) sgd = keras.optimizers.SGD(learning_rate=0.1, momentum=0.9, nesterov=True) # Adagrad, RMSprop 옵티마이저 adagrad = keras.optimizers.Adagrad() rmsprop = keras.optimizers.RMSprop() # Adam 옵티마이저 적용 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.fit(train_scaled, train_target, epochs=5) # Adam 옵티마이저 적용 결과: [0.3521..., 0.8723...] (약 87.2% 정확도)relu와 adam을 적용한 결과, 정확도는 약 87.2%로 초기 모델(84.6%)보다 크게 향상되었습니다.
6. 모델 훈련 과정 분석 및 과대적합(Overfitting) 제어
6-1. 손실 곡선 분석을 통한 과대적합 확인
모델을 20 에포크 동안 훈련시키고 훈련 세트와 검증 세트의 손실을 비교하는 것은 과대적합 여부를 판단하는 핵심 단계입니다.
- 진단: 훈련 손실은 지속적으로 감소하는 반면, 검증 손실은 특정 시점(약 5~10 에포크) 이후 다시 증가하는 현상은 과대적합을 나타냅니다.
- 해결책: 과대적합이 시작되기 전에 훈련을 멈추거나, 모델의 복잡도를 낮춰야 합니다.
6-2. 드롭아웃(Dropout)을 이용한 과대적합 방지
드롭아웃은 훈련 단계에서 무작위로 은닉층 뉴런의 일부(예: 30%)를 끔으로써, 특정 뉴런에 대한 과도한 의존을 방지하고 모델의 일반화 성능을 높이는 규제(Regularization) 기법입니다.
# 30% 드롭아웃 층 추가 model = model_fn(keras.layers.Dropout(0.3)) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])드롭아웃 적용 후, 검증 손실이 증가하는 시점이 늦춰지거나, 더 안정적으로 유지되어 과대적합이 완화되는 것을 확인할 수 있습니다.
6-3. 콜백(Callback)을 이용한 모델 최적화
콜백은 모델 훈련 중 특정 시점에 호출되는 함수로, 훈련 과정을 효율적으로 제어합니다.
콜백 기능 설명 ModelCheckpoint 최적 모델 저장 검증 세트 성능이 가장 좋을 때(손실이 가장 낮을 때) 모델을 파일로 자동 저장합니다. EarlyStopping 조기 종료 검증 세트의 성능이 더 이상 개선되지 않으면(예: patience=2 동안) 훈련을 자동으로 멈춥니다.
또한, restore_best_weights=True 옵션으로 최적의 가중치를 복원할 수 있습니다.checkpoint_cb = keras.callbacks.ModelCheckpoint('best-model.keras', save_best_only=True) early_stopping_cb = keras.callbacks.EarlyStopping(patience=2, restore_best_weights=True) history = model.fit(train_scaled, train_target, epochs=20, verbose=0, validation_data=(val_scaled, val_target), callbacks=[checkpoint_cb, early_stopping_cb]) # EarlyStopping으로 인해 12번째 에포크에서 훈련이 중지됨 # print(early_stopping_cb.stopped_epoch) # 12
7. 마치며: 효율적인 신경망 훈련을 위한 핵심 전략
이 실습을 통해 우리는 단순한 로지스틱 회귀 모델에서 시작하여,
relu 활성화 함수와 adam 옵티마이저를 도입하고, 드롭아웃으로 규제를 적용했습니다.
최종적으로 EarlyStopping 및 ModelCheckpoint 콜백을 사용하여 불필요한 훈련 시간을 줄이고 검증 세트 성능이 가장 좋았던 시점의 모델을 성공적으로 확보했습니다.
효율적인 딥러닝 모델 훈련을 위해서는 이와 같은 성능 최적화 및 과대적합 방지 전략을 복합적으로 사용하는 것이 중요합니다.
코드 출처:
https://github.com/rickiepark/hg-mldl2/blob/main/07-1.ipynb
hg-mldl2/07-1.ipynb at main · rickiepark/hg-mldl2
<혼자 공부하는 머신러닝+딥러닝(개정판)>(한빛미디어, 2025)의 코드 저장소입니다. Contribute to rickiepark/hg-mldl2 development by creating an account on GitHub.
github.com
https://github.com/rickiepark/hg-mldl2/blob/main/07-2.ipynb
hg-mldl2/07-2.ipynb at main · rickiepark/hg-mldl2
<혼자 공부하는 머신러닝+딥러닝(개정판)>(한빛미디어, 2025)의 코드 저장소입니다. Contribute to rickiepark/hg-mldl2 development by creating an account on GitHub.
github.com
https://github.com/rickiepark/hg-mldl2/blob/main/07-3.ipynb
hg-mldl2/07-3.ipynb at main · rickiepark/hg-mldl2
<혼자 공부하는 머신러닝+딥러닝(개정판)>(한빛미디어, 2025)의 코드 저장소입니다. Contribute to rickiepark/hg-mldl2 development by creating an account on GitHub.
github.com
내용 및 이미지 출처:
https://www.youtube.com/watch?v=uX8rdP2wWp4&list=PLVsNizTWUw7E2RxZ4aspcR9vNamXccmFE&index=18
https://www.youtube.com/watch?v=PPJTxFcc5MA&list=PLVsNizTWUw7E2RxZ4aspcR9vNamXccmFE&index=19
https://www.youtube.com/watch?v=8_PV6aipk6w&list=PLVsNizTWUw7E2RxZ4aspcR9vNamXccmFE&index=20
'Study > 머신러닝 딥러닝' 카테고리의 다른 글
혼공머신 CH 09 텍스트를 위한 인공 신경망 (0) 2025.09.29 혼공머신 CH 08 합성곱 신경망 (CNN) (0) 2025.09.28 혼공머신 CH 06 비지도 학습 (0) 2025.09.26 혼공머신 CH 05 트리 알고리즘 (0) 2025.09.25 혼공머신 Ch 04 다양한 분류 알고리즘 (0) 2025.09.24