1. 도정찬
컴퓨터 비전을 위한 합성곱 신경망 설계
Convolution Networks Arcitectures 4
- ResNet
Michigan Online, Justin Johnson, Computer Vision, 2021. 02. 15
2. 잔류 신경망
▪ 우린 이전에 배치 정규화가 발견되면서 12층 이상의 심층 신경망을 학습할수 있게 되었다고 했었는데, 계층들을 계속 쌓아 만든 아
주 아주 깊은 신경망을 학습했을때 어떤 일이 벌어졌을까요?
3. ▪ 오른쪽의 그림을 보시면 학습 곡선이 있는데, x축은 학습 횟수이고, y축은 테스트 에러로 지금 56층 모델과 20층 모델을 비교하고 있
어요. 여기서 이상한 점은 56층 모델이 20층 모델보다 더 나쁜 성능을 보이고 있는데, 이전에 신경망이 더 커질수록 더 좋은 성능을 보
였던과는 다르죠.
잔류 신경망
4. ▪ 갑자기 이렇게 더 크고 깊어진 신경망이 나쁜 성능이 나오는게 갑작스러울수는 있는데, 이 신경망에서 아마 오버피팅이 일어난다고
볼수 있을거에요. 한번 56층의 신경망이 있고, 배치 정규화도 있다고 해봅시다. 그럼 이건 아주 큰 신경망이고 훈련 데이터셋에 오버
피팅/과적합 되었다고 볼수 있겠죠. 그러면 한번 이 가설을 검증하기 위해서 이 신경망의 훈련 성능을 봅시다.
잔류 신경망
5. ▪ 20층 신경망과 56층 신경망의 훈련데이터셋에대한 성능을 보면, 둘다 테스트 오류율 보다 떨어진걸 볼수 있어요. 사실 56층 신경망
은 훈련 데이터 셋에 언더피팅/과소적합을 하고 있습니다. 이건 최적화 과정에서 문제가 있었는데, 깊은 모델에서 배치 정규화를 사용
하고 어느정도 깊이에 도달하면 더 이상 효율적으로 최적화를 할수 없거든요. 이게 문제입니다.
▪ (56층 신경망이 깊으니까 과대적합했다고 생각했으나, 훈련 에러율이 과대적합의 경우 20층 보다 낮아야 하지만 실제로는 20층보다
높다. 실제로는 56층 신경망은 과소적합을 한 것임.)
잔류 신경망
6. ▪ 이게 또 놀라운 건 우리는 깊은 모델일 수록 얕은 모델을 모방할 능력을 가졌다고 생각했기(얕은 모델과 동일하게 동작한다) 때문인
데, 제가 말하고 싶은건 56층 신경망으로 20층 신경망을 모방하는 경우를 상상해볼수도 있어요. 왜냐면 20층 모델의 모든 계층들을 복
사하고, 나머지 계층들을 항등 함수/동일하게 학습 시키는 경우를 생각해볼수 있거든요.
▪ => 20층을 복사해서 40층을 만들고, 나머지 층들은 항등 함수로 채운다. 이렇게 깊은 모델을 얕은 모델을 카피해서 만든 경우 적어도
얕은 모델과 비슷한 성능을 보여야한다.
잔류 신경망
7. ▪ 만약 최적화기가 올바르게 동작을 한다면 신경망이 깊어질수록 얕은 신경망과 동일한 함수 처럼 표현될 능력/동일한 역활을 할 능
력을 가져야 합니다(깊은 신경망이 얕은 신경망을 잘 모방함). 언더 피팅이 일어난다면 우리는 최적화 문제를 가지고 있는 것이고, 더
깊은 신경망은 효율적으로 얕은 신경망을 모방하기 위한 항등 함수들을 학습하지 못하게 되요.
▪ => 깊은 모델일수록 최적화 하기가 힘들어 얕은 모델과 동일한 성능을 내기 힘들다. 특히 항등 함수를 효율적으로 학습 못해 언더피
팅발생.
잔류 신경망
8. ▪ 이 최적화 문제의 해결 방법은 항등 함수를 더 쉽게 학습할수 있도록 신경망 구조를 바꾸면, 심층 신경망에서 얕은 신경망을 더 잘 모
방하도록 쉽게 학습할수가 있어요. 특히 실제 필요한것보다 더 많은 계층을 가지는 경우에두요.
▪ => 항등 함수를 잘 학습할 수 있도록 신경망 구조를 바꾸자
잔류 신경망
9. ▪ 이게 제안된 잔류 신경망 residual network라고 부르는 구조인데, 왼쪽에는 이전에 본 합성곱 블록으로 이건 VGG에서 두 합성곱 계층
을 쌓았고 중간에 reLU를 넣을수도 있고 배치 정규화를 넣을수도 있는 평범한 구조에요.
▪ 이번에 잔류 신경망은 우측 그림에 잔류 블록 구조를 볼수 있는데, 이것도 합성곱 계층 두개를 쌓은 것이긴 하지만 끝 부분에 입력 X
와 두번째 합성곱 계층의 출력을 더하고 있어요. 이 블록의 계산 결과가 f(x) + x로, 기본 블록에다가 잔류 첨가 지름길이 생겼죠.
▪ => 잔류 블록 Residual Block은 기존 합성곱 블록 출력에다가 기존의 입력 x를 추가함. (잔류가 x인지 f(x)를 말하는건지는 햇갈림)
잔류 신경망
10. ▪ 이렇게 하면 쉽게 항등 함수를 학습 시킬수가 있는데, 두 합성곱 계층의 가중치들을 0으로 설정시킨다면, 이 블록의 계산 결과는 항
상 입력과 같아지겠죠. 이걸로 심층 신경망이 얕은 신경망을 모방할수 있도록 쉽게 만들수 있고, 아주 깊은 심층 신경망의 그라디언트
흐름을 개선시키는데 도움이 되요. 왜냐면 덧셈 게이터에서 어떻게 역전파가 되는지를 떠올려보면 add 게이트는 역방향으로 입력 그
라디언트를 복사해서 보내줫었거든요.
▪ => 잔류 블록 합성곱 가중치를 0으로 할시 항등 함수가 된다. add 게이트는 역전파시 들어온 그라디언트들을 복사해서 내보낸다.
잔류 신경망
11. ▪ 그래서 이 잔류 블록이 역전파 해나갈때, 그라디언트를 복사한뒤 지름길을 통해 가면서 엄청 엄청 깊은 신경망 전체에 그라디언트
정보가 전파되는데 도와줘요.
잔류 신경망
12. ▪ 그리고 잔류 신경망은 이런 잔류 블록들을 쌓아서 만든 건데, 이 잔류 신경망은 VGG와 GoogLeNet의 가장 중요한 부분에서 영감을 받
아 만든 걸로 보여요. VGG에서의 간단한 설계 원칙과 GoogLeNet에서 본 혁신적인 기법들을 조합해서 잘 만들어졌거든요.
▪ 신경망은 VGG처럼 여러 단계로 나누어져 있는데, 각 단계 사이에서 공간 해상도는 그대로지만 채널의 수는 두배씩 늘려 값니다. 그
리고 모든 단계의 합성곱 연산은 3 x 3 크기이지만 이들은 잔류 지름길을 가진 블록이구요.
잔류 신경망
13. 잔류 신경망
▪ 그리고 이 잔류 신경망은 GoogLeNet의 혁신적인 점들을 확용하고 있는데, GoogLeNet처럼 맨 앞 계층에서 집중적 줄기 aggressive
stem? 입력을 집중적으로 다운 샘플링을 하고 있어요.
14. 잔류 신경망
▪ 또 GoogLeNet처럼 전역적 평균 풀링 Global Average Pooling을 사용하여 완전 연결 계층을 줄이고, 전체 학습할 파라미터 수를 크게 줄
였죠.
15. ▪ 이런 간단한 패턴이랑 여러분이 골라야 할건 신경의 초기 폭과 단계당 블록 개수를 정하면 되요. ResNet 18의 예시를 보면 한 단계당
두 잔류 블록이 있고, 단계 당 4 합성곱 계층이 있으니 총 합성곱 계층은 16개에요. 여기에 줄기 합성곱 계층과 맨 끝에 완전 연결 계층
이 있다보니 이들을 더 합치면 18 계층이 되겠죠.
잔류 신경망
16. ▪ 이 상황에서 다운 샘플링을 하는건 어떤 의미일까요? 우리는 그동안 이미지의 공간적인 크기를 줄이는 연산이라 했었는데, 스트라
이드를 준 합성곱 연산으로 할수 있고, 맥스 풀링으로도 할수 있고, 평균 풀링으로도 가능해요. 아무튼 제가 말하고싶은건 입력의 공
간적 크기를 줄이는 많은 연산들이 있다는거에요.
잔류 신경망
17. ▪ ResNet에 관해서 재미있는 점은 엄청 효율적인 구조에요. 이걸로 우리는 이미지넷에서 오류율이 매우 적어졌고, 소수점 연산 수도
엄청 적어졌어요. ResNet 34층짜리 버전이 있는데, 이건 그저 몇몇 단계에다가 블록만 더 추가하고 나머지는 똑같아요.
잔류 신경망
18. ▪ 이 모델과 VGG를 비교를 하면 VGG 전체 신경망에서 소수점연산 회수는 13GFLOP이고, 오류율은 9.6정도 나오고 있습니다. 하지만
ResNet-34는 소수점 연산량이 3.6GFLOP뿐이며, 오류율도 더 줄어들었습니다. 이러한 효율성과 이득은 신경망 앞에서 집중적인 다운
샘플링과 맨 끝에서 전역적 다운 샘플링 덕분이에요.
잔류 신경망
19. ▪ 잔류 신경망을 더 깊이 하기 위해서 블록 디자인을 고쳤는데, 맨 왼쪽에 잔류 신경망에서 사용 되는 기본 블록이 있어요. 이 기본 블
록은 3 x 3 합성곱 계층이 2개 그리고 그 사이에 ReLU와 매치 정규화 계층 그리고 합성곱 계층 옆에 잔류 지름길이 있습니다.
잔류 신경망 : 기본 블록
20. ▪ 우린 이 블록의 전체 소수점 연산 수를 계산할 수 있는데 각 합성곱 계층은 9HWC^2다보니 총 계산비용은 18HWC^2가 됩니다.
잔류 신경망 : 기본 블록
21. ▪ 이번에는 더 깊은 잔류 신경망을 만들기 위한 다른 블록 디자인으로 병목 블록이 있습니다. 이병목 블록은 3개의 합성곱 계층으로 구
성되며 첫번째 계층은 기본 블록보다 4배나 큰 입력 텐서의 채널을 받을수가 있고 1 x 1 합성곱 연산을 수행하여 채널 수를 4C에서 C로
줄일 수가 있어요. 그 뒤에 이 줄여진 채널 수로 3 x 3 합성곱 연산을 하고, 다음에 1 x 1 합성곱 연산으로 채널 개수를 C에서 4C로 증가
시킵니다.
잔류 신경망 : 병목 블록
22. ▪ 조금전의 방식대로 병목 블록의 연산 비용을 계산하면 1 x 1 합성곱 계층의 경우 4 HWC^2이고, 중간에 있는 계층은 9HC^2이다보니
총 병목 블록의 계산 비용은 17HWC^2로 더 적은 계산 비용으로 더 많은 비선형성과 순차 연산을 할수 있게 되었습니다.
▪ 여기서 알수 있는 사실은 기본 블록을 병목 블록으로 바꿈으로서 더 많은 비선형성을 가진 더 깊은 계층으로 만들어 더 복잡한 계산
을 할수 있었어요. 계산 비용을 늘리질 않고서두요.
잔류 신경망 : 병목 블록
23. ▪ 지금까지 우린 기본 블록을 사용한 18층, 34층짜리 잔류 신경망을 봤는데,
잔류 신경망들
24. ▪ 병목 블록을 사용하여 50층으로 늘릴수가 있어요. 하지만 이렇게 늘려도 계산 비용은 크게 늘어나지는 않았습니다. 블록만 바꾸면
서 계산 비용은 늘리지도 않고 층의 수를 늘려 깊어진 덕분에 8.58에서 7.13으로 이미지넷의 오류율이 더 줄어든 볼수 있었어요. 이정
도면 상당히 크게 줄었다고 볼수 있겠죠.
잔류 신경망들
25. ▪ 그리고 또 이전보다 더 깊이 해서 101층 짜리와, 152계층 짜리 잔류 신경망을 만들수가 있는데, 기본 구조는 같고 각 단계의 병목 블
록 수만 늘려서 만들었습니다. 이 잔류 신경망이 더 깊어질 수록 더 좋은 성능이 나오는걸 볼수 있고, 이게 2015년에 있었던 아주 중요
한 일이에요.
잔류 신경망들
26. ▪ 이전까지는 여러 컴퓨터 비전 대회가 있었고 각 대회마다 서로 다른 팀이 우승했었습니다. 하지만 2015년에는 ResNet이 이미지 넷
대회의 모든 트랙에서 우승을 휩슬었어요. 이미지 분류 분야와 지금까지 얘기 안한 위치 추적 Localization분야, 검출 detection 분야에
다가 마이크로 소프트의 COCO라고 부르는 다른 데이터셋을 가지고 하는 대회에서도 잔류 신경망이 검출과 시멘틱 분할 대회에서 우
승을 휩슬었습니다. 모든 사람들이 이 모델에 주의를 기울였고, 오늘날 컴퓨터 비전의 다양한 분야에서 널리 사용되는 베이스라인이
되었습니다.
잔류 신경망들
27. ▪ 잔류 신경망에 대한 다음 논문에서 합성곱-배치정규화-ReLU 순서를 바꾸는 연구를 했는데, 이들의 순서를 바꾸면서 약간 성능이 더
개선되는걸 발견하였습니다. 그래서 제 생각에는 여러분이 약간 성능을 더 개선시키려고 시도한다면
블록 설계로 잔류 신경망 개선
28. ▪ 이들의 순서를 바꾸면서 약간 성능이 더 개선되는걸 발견하였습니다. 그래서 제 생각에는 여러분이 약간 성능을 더 개선시키려한다
면 이게 도움될거같아요.
블록 설계로 잔류 신경망 개선