borch

배우기 · 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 풀링이 사 주는 것이고, 고정 풀링이 못 하는 것이다.