RNN [SW-ex]
[ 1. 간단 정리]
논문 1 : VERY DEEPCONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION
Convnet의 깊이에 대한 연구 → 정확도
3X3 컨볼루션 필터를 사용하는 아키텍쳐 → 16-19레이어 까지 확장
imagenet 과 같은 대규모 공개 이미지 저장소 + 고성능 컴퓨팅 시스템의 개발
아키텍쳐의 다른 매개변수를 고정 + 모든 레이어에서 3X3 컨볼루션 필터 사용
입력 224X224 RGB이미지
전처리 평균 RGB와의 편차 계산
컨볼루션 레이어 스택 (스트라이드 1, 스트라이드2, 5개 최대 풀링레이어)
완전연결 레이어 (4096채널 + 4096채널 + 1000채널[ILSVRC 분류])
최종 레이어 (softmax)
히든 레이어 ReLU 비선형성 적용
레이어 스택은 7X7 수용역역
3개의 ReLU 비선형정류레이어를 통합하여 결정함수 판별성 증가 및 매개변수 요구량 감소
오류는 Convnet 깊이가 증가할 수록 감소
멀티 스케일 평가
두출력 결과를 softmax출력 결과 평균 방식
상보성 덕분에 성능 향상 테스트 오류 6.8%
결과 적으로 가장 좋은 것 2net, multicrop, dense val ⇒ googleNet 보다 우수
논문 2 : Deep Residual Learning for Image Recognition
최근 네트워크 레이어 깊이는 중요한 아이템 → 특히 imageSEt에서는 모두 매우 깊은 모델을 활용중
깊은 신경망의 트레이닝 어려움
residual learing framework를 제안
⇒ 레이어 input과 referenced한 function으로 학습하도록
ImageNet 데이터 set을 이용해서 기존 VGG보디ㅏ 8배더 깊지만, 복잡성은 낮은 레이어 구성
깊은 네트워크가 수렴을 시작하면 성능저하 문제 발생 ⇒ 깊이가 깊어짐에 따라 정확도가 포화
resNet :
ReLU + weight Layer를 통한 새로운 학습 함수 F(x)와
지름길 경로(skip connection & indentify mapping)로 그대로 주는 x를 합쳐 y=F(x)+x로 학습
편차 H(x)-x를 F(x)로 학습
기울기 소실(vanishing gradient)
⇒ 학습하다보면 출력층의 오차를 구할때 곱해지는 값들이 결국 sigmoid와 같은 0~1사이의 값이기 때문에 계속해서 곱하다보면 0에 수렴하게 되는 문제
기울기 폭발(exploding gradient)
⇒ 학습하는 함수가 1보다 큰값을 가지는 함수라면, 계속해서 반복하다 보면 무한으로 발산하는 문제
x를 전달해 줌으로써, 항상 gradient가 0이나 무한 되지 않으므로, 안정적 ⇒ 깊은 학습이 가능
이 identify mapping by shortcut 방법은 추가 매개변수나 복잡도를 추가하지 않음
네트워크 아키텍쳐
3X3필터로 레이어를 쌓는 VGG-19 레이어를 만들때 보다 18%에 불과한 FLOPs로 동일한 수의 레이어 구성 가능
18:34레이어 비교
⇒ 기존은 검증 오류 쪽이 34가 높음 ⇒ 깊이가 깊어지면 검증 오류가 커짐
ResNet은 18일때 보다 34일때 검증오류가 적음 (2.8%개선) ⇒ 성능 저하 없앰
bottle neck 디자인
1X1 축소 → 3X3 연산 → 1X1 확장 ⇒ 50/101/152 학습 시도추가
vgg-16보다 resNet-152가 오류율이 더 낮았다 → 레이어를 늘려도 오류율이 낮다
[ 2. 간단 정리]
- wx+b형태일때,
- weight는 3(w)X3(h)X100(c)의 값 만큼의 크기를 갖는 가중치 행렬
- 채널 별로, kernel data를 가진다
- conv를 반복하면 channel이 커지므로 pooling으로 down-sampling
- max-pooling (non-linear)
- avg-pooling (linear)
⇒ Max-Pooling이 선호 : non-linear 연산 + 계산이 간편
padding : 외곽에 0채우기
- valid(zero) padding (패딩 X) ⇒ size : output < input
- same padding ⇒ size : output = input
stride : kernel을 옮기는 간격
conv : shift invarient
fully connected 단점
- 데이터의 크기나, 위치가 달라지면 패턴 인식을 못함
Overfitting
- traing set을 극한으로 학습했을 때, train err는 줄지만 test err가 점점 올라가는 현상
but training err 도 줄지 않는 현상 발생
residual ⇒ 최소 이전단계의 성능은 가져가되, 더좋은 방법을 찾으면 추가해라
FC - > batch norm → ReLU
실습 결과 및 분석
20 epoch를 학습한 VGG16은 약 93%의 정확도를 보였으며, 15 epoch를 학습한 ResNet50은 약 87%의 정확도를 기록하였다.
ResNet50은 shortcut 경로를 통해 이전 결과를 보존할 수 있고, Bottleneck 구조를 채택하여 더 깊은 레이어로 구성된 아키텍처이므로, 더 높은 정확도를 보일 것이라 예상하였다.
epoch 수를 늘릴수록 ResNet50의 loss 값은 VGG16에 비해 뚜렷하게 감소하였다. 예를 들어 20회에서는 약 0.2~0.02 수준이었으나, 90회 부근에서는 0.001~0.0001 미만까지 줄어들었다. 이는 Residual Shortcut의 장점이 일정 부분 발휘되었음을 보여준다. 그러나 ResNet50은 VGG16이 겪는 레이어 깊이 증가에 따른 degradation 문제를 해결한 모델임에도 불구하고, 최종 정확도에서는 오히려 더 낮은 결과를 나타냈다.
추가 실험 및 가설 검증
첫 번째 가설은 epoch 수의 부족이었다.
ResNet50은 VGG16보다 더 깊고 복잡한 구조를 가지고 있기 때문에, 15~20 epoch만으로는 충분한 학습이 이루어지지 않았을 가능성이 있다고 판단하였다. 이에 epoch를 100으로 늘려 정확도를 다시 측정한 결과, VGG16은 약 40회 이후부터 100회까지 93~94% 수준으로 정확도가 소폭 상승하는 데 그쳤다. 반면 ResNet50은 학습이 진행될수록 40회에서 100회 구간에서 정확도가 86%에서 90%대로 개선되는 양상을 보였다. 그러나 최종적으로는 여전히 VGG16보다 낮은 정확도를 기록하였다.
두 번째는 ResNet50의 복잡도에 비해 학습 데이터셋의 규모가 너무 작았을 것이라는 가설이었다. VGG16은 비교적 단순한 구조를 가지고 있어, 작은 데이터셋에 더 적합한 모델일 수 있다고 판단하였다. 이를 검증하기 위해 데이터셋을 줄이지 않고 동일한 조건에서 다시 학습을 진행하였으며, 두 모델 모두 epoch는 20으로 설정하였다. 그 결과 VGG16은 약 87%, ResNet50은 약 78%의 정확도를 기록하여 두 모델 모두 성능이 하락했으며, ResNet50은 여전히 VGG16보다 낮은 정확도를 보였다. 이러한 결과를 통해 문제의 원인은 데이터셋의 크기가 아니라 데이터 자체의 단순성, 즉 32×32 크기의 이미지 해상도가 ResNet50의 성능 발휘를 제한했을 가능성이 있다고 판단하였다.
마지막으로, ResNet50의 복잡한 구조가 단순한 데이터셋에 과적합을 일으킨 것은 아닐까 가정하고, learning rate를 기존의 1/10로 낮춰 학습을 진행하였다. 그러나 테스트 결과 얻은 정확도는 82%로, 여전히 VGG16보다 낮게 나타났다.
세 가지 추가 실험을 종합한 결과, ResNet50이 VGG16보다 낮은 성능을 보이는 이유는 다음과 같이 결론지을 수 있었다. ResNet50은 VGG16보다 훨씬 깊은 구조를 가지며, 해상도를 점진적으로 줄여가는 Bottleneck 블록을 포함한다. 그러나 이는 원래 논문에서 사용된 224×224 해상도의 이미지에는 적합했지만, CIFAR-10과 같은 32×32 크기의 작은 이미지에서는 해상도를 지나치게 빠르게 축소하여 정보 손실이 크게 발생했을 가능성이 있다.
이번 실습을 통해 더 복잡하고 깊은 모델이 항상 더 높은 성능을 보장하는 것은 아니다라는 점을 확인할 수 있었다. 또한, 높은 성능을 얻기 위해서는 단순히 모델의 깊이를 늘리기보다, 학습 데이터셋의 특성과 규모에 맞는 적절한 모델 구조를 선택하는 것이 중요함을 배울 수 있었다.
실습 결과 20 epoch를 통과한 VGG16은 93% 정도의 Accuracy를, 15 epoch를 통과한 ResNet50은 85% 정도의 Accuracy를 얻었다.
ResNet50의 경우 shortcut 경로를 통해, 이전 결과를 보존할 수 있다는 점과 BottelNeck 구조를 형성했기 때문에 비교적 레이어의 깊이가 긴 아키텍쳐 구조였기 때문에 더 좋은 정확도가 도출될 것이라 예상했다. 오류율에서는 최대 0.02 부터 크고 작은 오류율 분포를 나타냈던 VGG와 비교하였을 때, ResNet50은 1/1000미만의 오류율은 균등하게 도출했다. 이는 Residual Shortcut 경로에서 오는 장점이 잘 적용되었다는 것을 확인할 수 있었다. 하지만 실습 결과 ResNet50이 VGG의 레이어 깊이 증가에 따른 degradiation을 개선한 모델임에도 불구하고 정확도면에서 아쉬운 결과를 도출하였다.
이에 그 이유를 다음과 같이 분석하고, 추가 실험을 진행하였다.
첫번째 예상은 epoch의 수가 부족했기 때문이라고 예상했다. ResNet50은 VGG16보다 더 깊고, 복잡한 구조를 가지고 있기 때문에 15~20의 epoch 수로는 많은 레이어 층에 충분한 학습이 이루어지지 않았을 수 있다는 가정을 세웠다. 이에 epoch를 100으로 변경하고, 정확도를 다시 측정하였지만, VGG16의 결과 기존에 비해 약 40회부터 100회까지 93~94%로 정확도가 미미하게 올라가는 결과를 확인할 수 있었다. ResNet50의 경우 학습이 진행됨에 따라, 40회~100회까지 86%에서 90%대로 올라가는 학습률에서는 더 좋은 결과를 확인할 수 있었지만, 최종적으로 VGG16보다 더 낮은 학습률을 도출하였다.
두번째 예상은 Res50의 복잡도에 비해 학습할 데이터 셋이 너무 작았을 수 있다. VGG16이 비교적 간단한 구조를 가지고 있어 더 간단한 데이터에 적합한 모델일 수 있다고 판단했다. 이를 확인하기 위해, 데이터 셋을 줄이지 않고 다시 학습시켰다. 이때 epoch는 두 경우 모두 20으로 하였다. 실험 결과, 각각 87%, 78%로 VGG16과 Res50 모두 정확도가 떨어졌고, Res50은 여전히 VGG16보다 낮은 정확도를 보였다. 이 결과에서 데이터 셋의 크기가 문제가 아니라, 데이터 자체의 복잡도. 즉 32 크기 이미지가 너무 작았던 것이 원인이 될 수 있겠다라고 판단했다.
마지막으로 Res50의 복잡한 구조가 간단한 데이터 셋에 과적합을 일으킨 건 아닐까 생각하여 learning rate 를 1/10배 하여 학습 시켰고, 테스트 결과 얻은 정확도는 82%로 여전히 VGG16보다 낮았다.
세 번의 추가 실험을 통해 Res50가 VGG16보다 낮은 성능을 보이는 이유를 다음과 같이 결론 내렸다. Res50은 VGG16보다 깊고, 해상도를 계속해서 낮추는 Bottleneck 구조가 논문에서 사용된 224 이미지보다, 훨씬 작은 32 크기 이미지의 해상도를 너무 빨리 낮추었기 때문이라고 추측하였다.
실습결과에서 생긴 의문을 해결하는 과정을 통하여, 더 복잡하고 깊은 모델이 항상 탁월한 성능을 보이지는 않는 다는 것을 확인하였다. 높은 성능의 모델을 얻기 위해서는 학습시키고자 하는 데이터 셋에 적절한 깊이와 구조를 선택하여야 한다는 것을 배울 수 있었다.
BatchNorm
train()모드: 현재 배치의 평균·분산 사용
eval()모드: 학습 중에 누적해둔 러닝 평균·분산 사용 → 일관된 결과