본문 바로가기
C.W.K.
Stream
Lesson 03 of 12 · published

CNN 직관: 경계에서 객체로

~18 min · cnn, feature-hierarchy, interpretability

Level 0호기심
0 XP0/73 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

CNN은 실제로 무엇을 학습할까

학습된 CNN의 필터를 시각화하면 아름다운 패턴이 나타나. 초기 층은 방향성이 있는 경계 검출기와 색상 덩어리를 학습해. 포유류 시각 피질의 단순세포와 비슷하지. 중간 층은 질감과 형태의 일부를 학습해. 눈, 바퀴, 털의 무늬 같은 것들이야. 후기 층으로 갈수록 객체 형태의 특징과 특정 범주에 특화된 개념을 학습해.

이런 특징 계층을 사람이 미리 설계해 넣은 건 아니야. 학습 과정에서 스스로 나타나지. 지역성, 매개변수 공유, 비선형성, 깊이를 갖춘 아키텍처면 충분해. 구체적인 특징 계층은 데이터와 기울기에서 만들어져.

팁: 딥러닝이 정말 무언가를 학습하는지 의심된다면 AlexNet 첫 층의 필터를 시각화해서 봐. 사람이 설계한 경계 검출기인 Gabor 필터와 신경망이 처음부터 학습한 필터가 거의 똑같이 생겼어.

수용 영역은 깊이에 따라 커져

1층의 뉴런은 입력에서 작은 영역만 봐. 5층의 뉴런은 더 큰 영역을 보지. 합성곱 층을 거치며 그 뉴런에 입력을 전달하는 모든 1층 영역이 합쳐지기 때문이야. 30층의 뉴런은 이미지 대부분을 봐. CNN은 이런 방식으로 국소적인 경계부터 전체 구조까지 쌓아 올려.

풀링과 다운샘플링

대부분의 CNN은 합성곱과 다운샘플링을 번갈아 적용해. 다운샘플링에는 stride-2 conv나 MaxPool을 사용하지. 다운샘플링할 때마다 공간 차원은 절반으로 줄고 채널 수는 보통 두 배로 늘어. 그 결과 피라미드 구조가 만들어져. 시작 부분에는 해상도가 높고 얕은 특징이 있고, 끝부분에는 해상도가 낮고 깊은 특징이 있어.

내부에서 일어나는 일을 시각화해 봐

쓸 수 있는 도구는 여러 가지야. 기울기 기반 saliency map은 어떤 입력 픽셀이 예측에 영향을 주는지 보여줘. Grad-CAM은 예측된 클래스에 어느 공간 영역이 활성화됐는지 보여주지. 특징 inversion은 특정 필터를 가장 강하게 활성화하는 입력이 무엇인지 보여줘. 해석 가능성을 다룰 때 꼭 알아둘 기본 도구들이야.

원칙: CNN은 30분만 들여다봐도 더 이상 깜깜한 블랙박스가 아니야. 필터 시각화와 Grad-CAM heatmap을 보면 모델이 실제로 무엇을 하는지 알 수 있어. 어떤 정확도 그래프보다 더 많은 걸 가르쳐 주지.

Code

20줄로 구현하는 Grad-CAM·python
import torch
import torch.nn.functional as F

def gradcam(model, x, target_class, target_layer):
    activations, gradients = [], []
    h1 = target_layer.register_forward_hook(lambda m, i, o: activations.append(o))
    h2 = target_layer.register_full_backward_hook(lambda m, gi, go: gradients.append(go[0]))

    model.eval()
    logits = model(x)
    model.zero_grad()
    logits[0, target_class].backward()

    act = activations[0][0]                  # [C, H, W]
    grad = gradients[0][0]                   # [C, H, W]
    weights = grad.mean(dim=(1, 2))           # [C]
    cam = (weights[:, None, None] * act).sum(dim=0)
    cam = F.relu(cam)
    cam = cam / cam.max()

    h1.remove(); h2.remove()
    return cam.cpu()

External links

Exercise

사전학습 CNN을 아무거나 하나 골라. 서로 다른 이미지 3개와 서로 다른 목표 클래스 3개에 Grad-CAM을 실행해. Heatmap을 확인했을 때 무작위 잡음이 아니라 공간적으로 타당한 영역을 강조해야 해. 실전에서 '모델이 옳은 것을 보고 있다'는 건 바로 이런 뜻이야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.