0-4. CNN과 U-Net
이미지를 다루는 신경망은 "작은 필터를 그림 전체에 미끄러뜨리는" 구조를 쓴다. 그 구조로 그림을 줄였다가 다시 키우는 것이 U-Net이다. 초기 이미지 생성 모델의 몸통이 전부 U-Net이다.
0-3의 층을 그대로 쓰면 안 되는 이유
0-3의 층은 모든 입력을 모든 출력에 잇는다. 이미지에 쓰면 문제가 둘 생긴다.
손잡이가 너무 많다. 1024×1024 컬러 이미지는 숫자가 약 314만 개다. 같은 크기의 층 하나로 이으면 가중치가 314만 × 314만, 약 10조 개다. 층 하나가 이렇다.
위치를 따로따로 배운다. 왼쪽 위의 눈과 오른쪽 아래의 눈을 서로 다른 손잡이로 배워야 한다. 눈은 어디에 있든 눈인데 말이다.
합성곱: 작은 필터를 미끄러뜨린다
해법은 이렇다. 3×3짜리 작은 필터 하나를 만든다. 이 필터를 그림 왼쪽 위에서 오른쪽 아래까지 한 칸씩 옮기며 같은 계산을 한다.
그림의 3×3 조각 × 필터의 3×3 가중치 → 더해서 숫자 하나
이것이 합성곱(convolution)이다. 합성곱을 쓰는 신경망을 CNN이라고 한다.
- 필터 하나는 무늬 하나를 찾는다. 세로선, 모서리, 점 같은 것이다.
- 같은 필터를 모든 위치에 쓴다. 눈이 어디에 있든 같은 필터가 찾는다.
- 손잡이가 확 줄어든다. 필터 크기만큼만 있으면 된다.
채널
컬러 그림은 빨강, 초록, 파랑 세 장이 겹친 것이다. 이 "장 수"를 채널이라고 한다.
합성곱 층은 필터를 여러 개 쓴다. 필터가 64개면 결과도 64장이 나온다. 각 장은 "이 무늬가 어디에 있는가"를 표시한 지도다. 이것을 특징 맵이라고 한다.
손잡이를 세어 보자. 입력 3채널, 출력 64채널, 3×3 필터라면:
3 × 3 × 3 × 64 + 64 = 1,792개
10조 개가 1,792개가 됐다. 그림이 커져도 이 숫자는 그대로다.
줄이면 멀리 본다
3×3 필터는 바로 옆 칸만 본다. 그림 전체의 구도를 보려면 어떻게 할까.
그림을 절반 크기로 줄인 뒤 다시 3×3 필터를 쓴다. 줄인 그림의 한 칸은 원래 그림의 2×2 칸이다. 같은 필터가 두 배 넓은 범위를 보게 된다. 또 줄이면 네 배다.
- 큰 해상도: 선, 질감 같은 디테일을 본다.
- 작은 해상도: 구도, 큰 형태를 본다.
줄이는 것을 다운샘플, 다시 키우는 것을 업샘플이라고 한다.
U-Net: 줄였다가 키운다
노이즈를 예측하는 모델은 출력이 입력과 같은 크기여야 한다. 그림이 들어가서 같은 크기의 노이즈 지도가 나와야 하니까.
U-Net은 이렇게 생겼다.
입력 ─[블록]───────────────────────────→[블록]─ 출력 큰 해상도
↓ 줄임 ↑ 키움
[블록]───────────────→[블록] 중간
↓ 줄임 ↑ 키움
[블록]──→[블록] 작은 해상도
- 왼쪽(내려가는 길): 줄이면서 큰 그림을 파악한다.
- 가운데(바닥): 가장 작은 해상도. 전체 구도를 다룬다.
- 오른쪽(올라가는 길): 키우면서 디테일을 되살린다.
모양이 U자라서 U-Net이다.
건너뛰는 연결
줄이는 과정에서 디테일은 사라진다. 바닥까지 내려갔다가 올라오면 어디에 무엇이 있었는지 정확히 알 수 없다.
그래서 왼쪽의 각 단계 결과를 오른쪽의 같은 해상도 단계로 바로 넘겨 준다. 위 그림의 가로 화살표다. 이것을 스킵 연결이라고 한다.
- 올라오는 길은 "큰 그림"을 들고 온다.
- 스킵 연결은 "디테일"을 건네준다.
- 둘을 합쳐서 정확한 위치에 정확한 디테일을 그린다.
스킵 연결이 U-Net의 핵심이다. 이것이 없으면 결과가 뭉개진다.
노이즈 비율을 알려 준다
모델은 지금 그림에 노이즈가 얼마나 섞였는지 알아야 한다. t = 0.9일 때와 t = 0.1일 때 할 일이 다르다. 많이 섞였으면 큰 형태를 잡아야 하고, 조금 섞였으면 디테일을 다듬어야 한다.
그래서 t를 숫자 묶음(벡터)으로 바꿔서 모든 블록에 넣어 준다. 이것을 시간 임베딩이라고 한다. 0-6 실습에서 직접 짜 본다.
실제 모델에서
- Stable Diffusion 1.5: U-Net, 파라미터 약 8.6억 개
- SDXL: U-Net, 파라미터 약 26억 개
실제 U-Net의 블록에는 합성곱만 있지 않다. 다음 수업에서 배울 어텐션이 사이사이에 들어 있다. 그리고 최신 모델(Flux, Wan 등)은 U-Net을 버리고 어텐션만으로 만든 구조로 넘어갔다. 그래도 "큰 그림과 디테일을 함께 본다"는 생각은 그대로 이어진다.
확인 문제
- 입력 64채널, 출력 128채널, 3×3 필터인 합성곱 층의 파라미터는 몇 개인가?
- 28×28 그림을 두 번 절반으로 줄이면 크기는?
- U-Net에서 스킵 연결을 빼면 어떤 문제가 생기나?
풀이
- 73,856개다. 3 × 3 × 64 × 128 = 73,728에 편향 128을 더한다.
- 7×7이다. 28 → 14 → 7.
- 줄이는 과정에서 사라진 디테일을 되살릴 수 없다. 형태는 맞아도 결과가 흐릿하게 뭉개진다.