목적
- MNIST 데이터셋을 사용하여 CNN의 학습 설정(batch size, 모델 구조, learning rate)에 따른 성능 변화를 분석
- AlexNet의 주요 기법(ReLU, Dropout, Overlapping Pooling 등)을 적용하여 학습 효율과 과적합 억제 효과를 검증
실험 1: BATCH_SIZE 비교
실험 환경
- 모델: SimpleCNN
- 변수: batch size [64, 128, 1024]
- 고정: optimizer=Adam, lr=0.001, epoch=5
- 데이터셋: MNIST (28×28 grayscale)
데이터 분할 및 전처리
- Train / Validation / Test = 48,000 : 12,000 : 10,000
- 검증 데이터 비율: 0.2 (20%)
모델 구조
- 입력: (1, 28, 28) MNIST 흑백 이미지
- Conv 블록 1: Conv2d(1→32, 3×3) → BatchNorm → ReLU → MaxPool(2×2)
- Conv 블록 2: Conv2d(32→64, 3×3) → BatchNorm → ReLU → MaxPool(2×2)
- FC 블록: Flatten → Linear(3136→128) → ReLU → Dropout(0.5) → Linear(128→10)
- 출력: (B, 10), softmax는 `CrossEntropyLoss`에서 처리
변수 요약
| 변수 | 유형 | 주요 파라미터 | 출력 크기 |
|---|---|---|---|
| conv1 | Conv2d | 1→32, k=3, p=1 | (B, 32, 28, 28) |
| pool1 | MaxPool2d | k=2, s=2 | (B, 32, 14, 14) |
| conv2 | Conv2d | 32→64, k=3, p=1 | (B, 64, 14, 14) |
| pool2 | MaxPool2d | k=2, s=2 | (B, 64, 7, 7) |
| fc1 | Linear | 3136→128 | (B, 128) |
| fc2 | Linear | 128→10 | (B, 10) |
실험 내용
- batch size 변화에 따른 학습 안정성과 일반화 성능 비교
- step 수 변화가 수렴 속도 및 손실 곡선에 미치는 영향 관찰
실험 상세
| Batch Size | Train Accuracy | Validation Accuracy | Train Loss | Validation Loss | Relative Time |
|---|---|---|---|---|---|
| 64 (녹색) | 0.944 | 0.9895 | 0.179 | 0.0375 | 1.157 min |
| 128 (주황) | 0.934 | 0.9843 | 0.212 | 0.0523 | 1.104 min |
| 1024 (회색) | 0.936 | 0.9832 | 0.217 | 0.0574 | 1.251 min |
- Small Batch (녹색)
- 손실 곡선의 진폭이 크고 진동이 많음 → 학습 과정이 불안정하게 보임
- gradient noise가 커 다양한 방향으로 탐색하며 빠르게 손실 감소
- Large Batch (회색)
- 손실 곡선이 부드럽고 진동이 거의 없음 → 학습이 안정적으로 진행
- gradient noise가 작아 수렴 방향이 일정하지만 탐색 범위가 제한적
- step 수 감소에도 불구하고 학습 시간 증가
- 가능한 요인
- step당 처리 데이터 증가로 인한 메모리 접근 및 I/O 비용 상승
- GPU 병렬 처리 포화로 인한 커널 실행 순차화
- CPU–GPU 간 데이터 전송 병목(transfer bottleneck) 발생
- step 수 감소보다 step당 연산 비용 증가 폭이 더 큼
결론
- 작은 Batch
- weight 업데이트 빈도가 높아 세밀한 학습이 가능
- gradient noise가 커서 flat minima 탐색에 유리 → 일반화 성능 우수
- 손실 곡선의 진동이 크고 학습 안정성이 낮음
- GPU 자원 활용 효율이 낮아 학습 속도가 느림
- 불안정한 학습 경향 때문에 작은 learning rate 설정이 적합
- 큰 Batch
- gradient 계산이 안정적이고 손실 곡선이 부드럽게 수렴
- 탐색 범위가 제한되어 sharp minima로 수렴할 가능성 있음 → 일반화 성능 저하
- GPU 자원 활용 효율이 높고 학습 속도가 빠름
- 안정적인 학습 특성 덕분에 큰 learning rate 적용이 가능
- 종합
- 작은 Batch: 높은 일반화 성능 / 낮은 안정성
- 큰 Batch: 높은 안정성 / 낮은 일반화 성능
- 학습 안정성과 일반화 성능 사이에 명확한 Trade-Off 존재
- 데이터 크기, 하드웨어 자원, 학습 목적에 따라 Batch Size–Learning Rate 조합을 조정하는 것이 중요
고찰
- LearningRate를 함께 조절하여 비교
실험 2: ReLU vs Sigmoid
실험 환경
- 모델: SimpleCNN_Sigmoid (ReLU → Sigmoid 적용)
- 변수: 활성화 함수 [ReLU, Sigmoid]
- 고정: optimizer=Adam, lr=0.001, epoch=5, batch size=64
- 데이터셋: MNIST (28×28 grayscale)
데이터 분할 및 전처리- Train / Validation / Test = 48,000 : 12,000 : 10,000
- 검증 데이터 비율: 0.2 (20%)
모델 구조
- 입력: (1, 28, 28) MNIST 흑백 이미지
- Conv 블록 1: Conv2d(1→32, 3×3) → BatchNorm → Sigmoid → MaxPool(2×2)
- Conv 블록 2: Conv2d(32→64, 3×3) → BatchNorm → Sigmoid → MaxPool(2×2)
- FC 블록: Flatten → Linear(3136→128) → Sigmoid → Dropout(0.5) → Linear(128→10)
- 출력: (B, 10), softmax는 `CrossEntropyLoss`에서 처리
변수 요약
| 변수 | 유형 | 주요 파라미터 | 출력 크기 |
|---|---|---|---|
| conv1 | Conv2d | 1→32, k=3, p=1 | (B, 32, 28, 28) |
| pool1 | MaxPool2d | k=2, s=2 | (B, 32, 14, 14) |
| conv2 | Conv2d | 32→64, k=3, p=1 | (B, 64, 14, 14) |
| pool2 | MaxPool2d | k=2, s=2 | (B, 64, 7, 7) |
| fc1 | Linear | 3136→128 | (B, 128) |
| fc2 | Linear | 128→10 | (B, 10) |
실험 내용
CNN의 활성화 함수를 ReLU와 Sigmoid로 각각 설정하였을 때 비교
- 학습 속도
- 손실 곡선의 형태
- 최종 정확도 비교
실험 상세
- ReLU (녹색)
- 손실이 빠르게 감소하며 학습 초반 수렴 속도가 매우 빠름
- 손실 곡선이 안정적이며 진동 폭이 작음 → gradient 흐름이 원활함
- Sigmoid (보라색)
- 초기 손실이 크게 시작하며 감소 속도가 느림
- 손실 곡선의 완만한 감소 → 학습 효율이 낮고 수렴 속도 저하
- Tanh(이미지상 X)
- ReLU와 크게 차이점 없음
결론
- ReLU(Rectified Linear Unit)
-
- 항상 양의 출력을 내보내기 때문에 기울기가 0에 수렴하지 않고 일정하게 유지
- 비선형성을 유지하면서도 계산이 단순하고, 학습 속도가 빠름.
- Sigmoid
-
- 입력의 절대값이 크면 gradient가 0으로 수렴함
- 출력이 포화(saturating)되는 구간 발생
- gradient가 0에 수렴하 gradient vanishing 현상으로 학습이 정체되는 구간 존재
고찰
- 데이터셋 변경 후 Tanh 함수 비교
실험 3: Dropout
실험 환경
- 모델: SimpleCNN_Dropout
- 변수: Dropout p [0.0, 0.3, 0.5]
- 고정: optimizer=Adam, lr=0.001, epoch=5, batch size=64
- 데이터셋: MNIST (28×28 grayscale)
데이터 분할 및 전처리
- Train / Validation / Test = 48,000 : 12,000 : 10,000
- 검증 데이터 비율: 0.2 (20%)
모델 구조
- 입력: (1, 28, 28) MNIST 흑백 이미지
- Conv 블록 1: Conv2d(1→32, 3×3) → BatchNorm → ReLU → MaxPool(2×2)
- Conv 블록 2: Conv2d(32→64, 3×3) → BatchNorm → ReLU → MaxPool(2×2)
- FC 블록: Flatten → Linear(3136→128) → ReLU → Dropout(p) → Linear(128→10)
- 출력: (B, 10), softmax는 `CrossEntropyLoss`에서 처리
변수 요약
| 변수 | 유형 | 주요 파라미터 | 출력 크기 |
|---|---|---|---|
| conv1 | Conv2d | 1→32, k=3, p=1 | (B, 32, 28, 28) |
| pool1 | MaxPool2d | k=2, s=2 | (B, 32, 14, 14) |
| conv2 | Conv2d | 32→64, k=3, p=1 | (B, 64, 14, 14) |
| pool2 | MaxPool2d | k=2, s=2 | (B, 64, 7, 7) |
| fc1 | Linear | 3136→128 | (B, 128) |
| fc2 | Linear | 128→10 | (B, 10) |
실험 내용
- Dropout 확률을 0.0, 0.3, 0.5로 설정하여 학습 성능 비교
- 동일한 초기 가중치 설정 및 학습 조건 유지
- 각 모델의 학습/검증 손실 곡선 및 최종 Test Accuracy를 비교
- 과적합 억제 효과 및 수렴 속도 차이를 분석
실험 상세
- 초록색: SimpleCNN (Dropout 고정 0.5)
- 모듈 기반 구조(ReLU·Pool 개별 정의) 연산 그래프가 단순 동일한 드롭아웃 비율임에도 학습 시간이 가장 짧음
- Dropout=0.0 (파랑색): SimpleCNN_Dropout
- 초기 손실 감소가 가장 빠름.
- 과적합 억제 장치가 없어서 네트워크가 빠르게 학습함.
- Dropout=0.3 (주황색): SimpleCNN_Dropout
- 약간 더 느리지만, 여전히 안정적인 감소.
- Dropout=0.5 (회색): SimpleCNN_Dropout
- 초반 학습 속도가 가장 느림.
- 절반의 뉴런이 비활성화되어 학습 정보가 줄어들기 때문.
결론
- Dropout 비율에 따라 학습 속도와 일반화 성능 간의 뚜렷한 트레이드오프가 존재.
- Dropout이 낮을수록 초반에 빠르게 손실이 감소
- Dropout이 높은 경우 초반 학습 속도는 비교적 느리지만, 손실 변동이 적고 안정적으로 수렴.
고찰
- 데이터셋을 변경하여 진행해볼 것.
- 가벼운 CNN일 경우 0.5의 Dropout은 학습이 느려지거나 underfitting이 생길 수 있음.
MNIST 실험 한계 및 고찰
- MNIST 데이터셋의 특성의 한계
- 입력 이미지가 단순함. (28×28, 1채널, 배경 없음)
- 클래스 수가 10개로 적고, 각 클래스 간 구분이 명확함.
- 데이터 복잡도가 낮아, 기본적인 CNN 구조만으로도 충분히 높은 정확도 달성 가능.
- 약간의 학습 곡선 차이는 존재하지만 크지 않음 > CIFAR-10 데이터셋으로 확장.