배우기 · 9
잔차 신경망
5번 레슨은 합성곱을 쌓았다. 충분히 쌓으면 학습이 멈춘다 — 모델이 작아서가 아니라
맨 앞 층까지 거의 아무것도 도달하지 못해서다. 잔차 신경망은 블록마다 한 줄,
+ x 를 더한다. 그 한 줄이 전부다. 여기서는 그것이 무엇을 실어 나르는지
직접 잴 수 있다.
블록
BasicBlock 은 합성곱 둘과 되돌아오는 길이다. 블록이 모양을 바꾸면 — 채널이 늘거나 stride 가 그림을 반으로 줄이면 — 되돌아오는 길이 입력 그 자체일 수 없으니 1×1 합성곱이 모양을 맞춰 준다. 모양이 그대로면 지름길에 층이 아예 없다. 텐서가 온 그대로 더해진다.
지름길이 실어 나르는 것
+ x 의 근거는 보통 재는 대신 그림으로 설명된다. 그럴 필요가 없다.
아래는 같은 합성곱 여덟 개를 두 번 쌓는다 — 한 번은 그냥, 한 번은 층마다 출력을
입력에 더해서 — 그리고 맨 앞 층의 가중치에 도달한 기울기를 양쪽에서 읽는다.
두 경우가 씨앗을 공유하므로 층은 똑같이 시작한다. 다른 것은 배선뿐이다.
작은 ResNet 학습
줄기 하나, 블록 둘 — 하나는 모양을 지키고 하나는 반으로 줄인다 — 그다음 풀링과 평탄화와 선형 머리. 모든 ResNet 의 배치가 이것이고, 진짜 ResNet 은 구조가 아니라 가운데를 몇 번 반복하느냐로 달라진다.
AdaptiveAvgPool2d 가 이제 여기 있다. torchvision 의 ResNet 은
그 이름으로 끝나고, 거기서 복사한 줄은 일 년 동안 이 줄에서 멈췄다: 1-D 와 3-D 층은
있는데 2-D 만 없었고, 셋은 전부 같은 한 줄 adaptivePool("avg", 크기) 를
부른다. 이 레슨은 우회법 — 직접 만든 GlobalAvgPool 모듈 — 을 가르쳤고 원장은
이 이름을 구멍으로 들고 있었는데, 없는 것을 되짚어 보는 자리에서 이것이 목록 맨 위에
있어 써 넣었다. 위 블록에서 우회법은 사라졌다. 층은 출력 크기를 받고(여기선
[1, 1]), [2, 16, 5, 7] 입력에 [2, 16, 1, 1] 을
돌려준다 — 고정 AvgPool2d(8) 이라면 아무것도 안 던지고
[2, 16, 0, 0] 을 돌려줄 자리다.
완성된 ResNet18Cifar 가 모델 카탈로그에 있고, 위 블록과 똑같은
Conv2d 와 배치 정규화 층으로 만들어졌다 — 라이브러리가 따로 아는
특별한 것은 그 안에 없다. 위의 신경망은 [4, 1, 23, 17] 입력에도
[4, 3] 을 답한다. 그것이 adaptive 풀링이 사 주는 것이고, 고정 풀링이
못 하는 것이다.