오늘은 현재 진행중인 DACON 공모전에 대해 진행 상황 및 모델 분석에 대해서 정리해본다.
이번 dinov2_large pretrain은 이전 붕괴 구간과 달리 정상적으로 학습되고 있다고 판단할 수 있다.
val logloss가0.6852 -> 0.4227 -> 0.3529 -> 0.3165 -> 0.3091 -> ... -> 0.1606으로 전반적으로 하락val acc가0.6219 -> 0.7910 -> 0.8365 -> 0.8565 -> 0.8668 -> ... -> 0.9422로 상승- warmup이 끝난 뒤 즉시 붕괴하지 않고, 오히려 지속적으로 개선됨
train acc와val acc가 함께 상승하고 있어 현재 시점에서는 학습이 깨진 것이 아니라 표현 학습이 안정적으로 진행 중임
1. 학습 진행 상황
1-1 초반 구간
- Epoch 1:
lr=2.08e-06val logloss=0.6852- 거의 랜덤에 가까운 시작점
- Epoch 2~5:
- learning rate가 warmup으로 점진 상승
val logloss=0.4227 -> 0.3529 -> 0.3165 -> 0.3091- 모델이 빠르게 안정화
이 구간은 이전 실험과 비교해 매우 중요하다. 이전에는 learning rate가 커지면서 feature가 무너졌지만, 이번에는 warmup과 낮아진 pretrain LR 덕분에 안정적으로 적응하고 있다.
1-2 중반 구간
Epoch 6~13 사이에는 개선과 소폭 흔들림이 같이 나타남
Epoch 8: 0.2918
Epoch 9: 0.2764
Epoch 10: 0.2756
Epoch 11: 0.2716
Epoch 12: 0.2492
Epoch 13: 0.2645
이 패턴은 이상하지 않다. 강한 증강, Mixup, CutMix, 작은 per-device batch, gradient accumulation이 동시에 들어가면 epoch 단위 metric이 약간 진동할 수 있다.
1-3 후반 구간
Epoch 18: val logloss=0.1966
Epoch 20: val logloss=0.1606
Epoch 21: val logloss=0.1784
이 구간은 전형적인 잘 되는 학습 후반부에 가깝다. 최저점을 갱신한 뒤, 그 주변에서 출렁이는 건 정상이다. 중요한 것은 전체 추세가 하방이라는 점이다.
1-4 분석
- learning rate 증가 과정에서 collapse 없음
- validation loss가 장기적으로 감소
- validation accuracy도 함께 증가
- best checkpoint가 반복적으로 갱신됨
2. 이번 안정화의 핵심
2-1 더 낮아진 pretrain learning rate
현재 models.py의 설정:
- pretrain batch size: 2
- finetune lr:
5e-5 - pretrain lr:
1e-5 - grad accumulation: 16
즉 effective batch size는
$$
2 \times 16 = 32
$$
이전 실험보다 learning rate는 더 낮고 effective batch size는 더 커져서 update variance가 줄었다.
2-2 warmup + cosine scheduler
warmup_ep = min(5, max(args.pretrain_epochs // 4, 2))
warmup = LinearLR(... total_iters=warmup_ep)
cosine = CosineAnnealingLR(...)
sched = SequentialLR(...)
- 초반에는 작은 learning rate에서 시작
- 몇 epoch 동안 선형적으로 올림
- 이후 cosine annealing으로 부드럽게 내림
이 구조는 pretrained ViT를 다룰 때 feature 파괴를 막는 데 매우 중요하다.
3. 모델 구조 분석: Dual-View Attention 기반 Stable/Unstable 분류
데이터를 다각도에서 분석하여 객체의 안정성(Stability)을 판단하는 Dual-View Fusion 모델의 구조를 정리합니다. 이 모델은 정적인 이미지의 공간적 정보와 동적인 비디오의 시계열 정보를 효율적으로 결합합니다.
3-1 입력 데이터 (Input Modality)
모델은 판단의 정확도를 높이기 위해 서로 다른 관점의 데이터를 입력받습니다.
- Front View (front.png): 정면에서 바라본 모습 (높이와 너비 중심의 정보).
- Top View (top.png): 위에서 내려다본 모습 (깊이와 평면 배치를 파악하기 용이).
- Video Frames (simulation.mp4): (선택적) 시뮬레이션 과정에서의 움직임 변화를 포함하는 프레임 시퀀스.
3-2 전체 프로세스 흐름 (Pipeline)
- Backbone Encoding: 각 이미지(Front, Top)는 사전 학습된 Backbone(예: ResNet, ViT)을 통과하여 고차원 특징 벡터(Feature Vector)로 변환됩니다.
- Attention Gating: 두 뷰에서 추출된 특징을 단순히 합치는 것이 아니라, 상황에 따라 어떤 뷰가 더 중요한지 모델이 스스로 판단(Weighting)하게 합니다.
- Video Feature Fusion: 비디오 프레임들이 있다면 이를 평균화(Temporal Pooling)하여 추가적인 컨텍스트 정보를 더합니다.
- Final Classification: 융합된 최종 벡터가 MLP(Multi-Layer Perceptron) Head를 거쳐 Stable 혹은 Unstable로 분류됩니다.
3-3 핵심 메커니즘: Attention Gate (수식 중심)
이 모델의 핵심은 "어떤 뷰를 더 신뢰할 것인가?"를 학습하는 과정에 있습니다.
① 특징 결합 (Concatenation)
먼저 두 뷰의 특징 벡터 $f$와 $t$를 하나로 이어 붙입니다.
② 가중치 산출 (Gate Network)
결합된 벡터를 소형 신경망에 통과시켜 두 뷰에 대한 가중치 $g = (g_1, g_2)$를 구합니다. 이때 활성화 함수로 GELU를 사용하여 비선형성을 부여하고, Softmax를 통해 가중치의 합이 1이 되도록 합니다.
③ 가중합 (Weighted Sum)
구해진 가중치를 각 특징에 곱해 더함으로써, 더 중요한 정보에 집중된 융합 특징 $\tilde{h}$를 얻습니다.
Insight: 예를 들어 정면 사진이 가려져(Occlusion) 정보가 부정확하다면, 모델은 학습을 통해 자동으로 Top 뷰의 가중치 $g_2$를 높이게 됩니다.
3-4 비디오 데이터의 활용 및 최종 융합
비디오 데이터는 시간의 흐름에 따른 정보를 담고 있습니다.
- Temporal Averaging: $T$개의 프레임 각각에서 특징을 추출한 뒤 산술 평균을 구하여 하나의 고정된 벡터 $v$로 만듭니다.
-
$$v = \frac{1}{T} \sum_{i=1}^{T} \text{Backbone}(x_i^{video})$$
- Late Fusion: 현재 구현에서는 이미지 융합 특징($\tilde{h}$)과 비디오 특징($v$)을 7:3의 고정 비율로 결합합니다. 이는 시각적 구도(Image)를 기본으로 하되, 움직임(Video)을 보조 지표로 활용하려는 전략입니다.
-
$$h = 0.7\tilde{h} + 0.3v$$
3-5 요약
이 구조는 "정보의 중요도에 따른 동적 가중치 할당"을 구현했다는 점에서 강력합니다.
- 장점: 단일 뷰에서 발생할 수 있는 정보 손실(사각지대 등)을 다른 뷰가 보완할 수 있습니다.
- 향후 개선 방향: 현재 0.7 vs 0.3으로 고정된 비디오 융합 비율 또한 Attention 메커니즘을 적용하여 데이터에 따라 유동적으로 변하게 만든다면 더 높은 성능을 기대할 수 있을 것입니다.
4. 모델 성능 최적화를 위한 8가지 핵심 학습 기법
모델의 구조만큼 중요한 것이 바로 *"어떻게 학습시키는가"입니다. 본 프로젝트에서는 대형 Vision Transformer(ViT) 모델을 안정적으로 학습시키기 위해 최신 라이브러리와 고도화된 파이프라인을 구축했습니다.
4-1 DINOv2 Backbone
단순한 ImageNet 사전 학습 모델이 아닌, DINOv2-Large를 선택했습니다.
- 특징: 자기지도학습(Self-supervised) 기반의 ViT-Large 모델입니다.
- 강점: 객체의 경계선(Shape)과 공간적 구조를 이해하는 능력이 매우 뛰어납니다. Dual-View 이미지에서 물체의 배치를 파악해야 하는 본 작업에 최적의 선택입니다.
4-2 데이터 강건성(Robustness)을 위한 Augmentation
단순한 리사이징을 넘어, 모델이 "억까(어려운 상황)"에서도 잘 버틸 수 있도록 강력한 증강 기법을 적용했습니다.
- 기하학적 변형: RandomResizedCrop, Affine, Perspective 등을 통해 다양한 각도와 거리에서의 대응력을 높였습니다.
- 환경 노이즈: Shadow/Fog, MotionBlur, ISONoise 등을 추가하여 실제 카메라 환경에서 발생할 수 있는 저품질 이미지에 대비했습니다.
- 규제화(Regularization): CoarseDropout을 통해 이미지 일부가 가려져도(Occlusion) 핵심 특징을 찾아내도록 유도했습니다.
4-3 데이터 믹싱 전략: Mixup & CutMix
학습 시 매 스텝마다 확률적으로 데이터를 섞어 모델의 일반화 성능을 높입니다.
- Mixup (30%): 두 이미지를 투명하게 겹쳐 경계선을 모호하게 학습시킵니다.
- CutMix (30%): 이미지의 일부를 잘라내어 다른 이미지로 대체합니다.
- Clean (40%): 원본 데이터의 특징도 놓치지 않도록 일정 비율을 유지합니다.
4-4 하이브리드 손실 함수 (Hybrid Loss)
단일 Cross Entropy의 한계를 극복하기 위해 두 가지 Loss를 조합하여 사용합니다.
- Focal Loss: "어려운 숙제에 집중하기"
- 잘 맞추는 샘플보다 틀리기 쉬운(Hard negative) 샘플에 더 큰 가중치를 부여합니다.
-
$$L_{focal} = \alpha (1-p_t)^\gamma \cdot CE$$
- Label Smoothing: "너무 확신하지 않기"
- 정답을 1.0이 아닌 0.9 정도로 낮추어, 모델이 특정 데이터에 과적합(Overfitting)되어 과도한 확신을 갖는 것을 방지합니다.
4-5 대형 모델 학습을 위한 최적화 (Efficiency & Stability)
| 기법 | 설명 | 효과 |
| AMP (Automatic Mixed Precision) | FP32 대신 FP16 연산을 혼합 사용 | 연산 속도 향상 및 메모리 30~50% 절약 |
| Gradient Accumulation | 16 step마다 가중치 업데이트 (Effective BS=32) | GPU 메모리 한계를 넘어 큰 배치 사이즈 효과 구현 |
| Gradient Clipping | Gradient의 Norm이 1.0을 넘지 않도록 제한 | ViT 학습 시 흔히 발생하는 수치적 폭주(Explosion) 방지 |
| Gradient Checkpointing | 중간 연산값을 저장하지 않고 재계산 | 12GB 등 적은 VRAM에서도 대형 모델(ViT-L) 학습 가능 |
5. 핵심 로직 요약
한 epoch 학습
for batch in loader:
front, top, video, mask, labels = unpack_batch(...)
if random() < 0.3:
mixup
elif random() < 0.6:
cutmix
else:
clean
logits = model(front, top, video, mask)
loss = combined_loss(...)
scaler.scale(loss / grad_accum).backward()
if step % grad_accum == 0:
scaler.unscale_(optimizer)
clip_grad_norm_(model.parameters(), 1.0)
scaler.step(optimizer)
scaler.update()
optimizer.zero_grad()
pretrain 흐름
1. ShapeStacks h=6 + Dacon(train + dev oversample) 결합
2. CombinedDataset 구성
3. backbone + fusion head 모델 생성
4. warmup + cosine scheduler 세팅
5. train / validate 반복
6. val logloss 개선 시 pretrained.pth 저장
7. 매 epoch ckpt 저장
finetune 흐름
1. Dacon train 샘플 로드
2. optional dev holdout 구성
3. StratifiedKFold로 5-fold split
4. fold별 학습
5. differential learning rate 적용
6. best fold weight 저장
7. ckpt 저장 및 patience 기반 early stopping
6. 앞으로의 실험 아이디어
- pretrain 30 epoch 완주 후 best pretrained weight 저장
- 같은 backbone으로 finetune 시 pretrain 유무 비교
- image-only vs video 사용 비교
- dev holdout 유지 vs include_dev 실험
- inference 단계 temperature scaling 조정
- 단일 backbone vs 멀티 backbone 앙상블 비교
7. 최종 요약
현재 dinov2_large pretrain은 이전 붕괴 패턴을 벗어나 안정적으로 수렴 중이다.
이 pretrain의 목표는 곧바로 대회 점수를 만드는 것이 아니라, 이후 finetune 단계에서 더 좋은 초기 가중치를 제공하는 것이다.
따라서 현재 실험은 충분히 의미가 있으며, 완주 후 finetune과 연결해 보는 가치가 높다.
'4. [팀] 프로젝트 및 공모전 > 4-4 구조물 안정성 물리 추론 AI 경진대회(DACON)' 카테고리의 다른 글
| [공모전] Vision AI 최종 실험 개인 "연구" 블로그 (2) (0) | 2026.03.30 |
|---|---|
| [공모전] Vision 시각화 검증 상세 분석 "개인 연구용" 블로그 (0) | 2026.03.24 |
| [DACON 공모전] 구조물 안정성 예측 대회: EVA-Giant Dual-View 모델과 Center Crop 추론 스터디 (2) (0) | 2026.03.21 |
