[CNN 알고리즘들] ResNet의 구조
LeNet-5 => https://bskyvision.com/418
AlexNet => https://bskyvision.com/421
VGG-F, VGG-M, VGG-S => https://bskyvision.com/420
VGG-16, VGG-19 => https://bskyvision.com/504
GoogLeNet(inception v1) => https://bskyvision.com/539
ResNet => https://bskyvision.com/644
SENet => https://bskyvision.com/640
오늘은 2015년 ILSVRC에서 우승을 차지한 ResNet에 대해서 소개하려고 한다. 오랜만에 이미지 분류용 CNN 모델에 대해 글을 쓰는 것 같다.
ResNet은 마이크로소프트에서 개발한 알고리즘이다. 그것도 북경연구소의 중국인 연구진이 개발한 알고리즘이다. ResNet의 original 논문명은 "Deep Residual Learning for Image Recognition"이고, 저자는 Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jiao Sun으로 전부 다 중국인이다. 이런 것에 우리는 자존심이 상해야 한다. 몇몇 우리나라 사람들은 중국인과 일본인을 폄훼하는데만 혈안인 것 같아 안타깝다. 지나친 민족주의가 횡행하는게 아닌가 걱정스럽다. 우리 민족에 대해 자랑스러워할 것은 자랑스러워하고, 부끄러워할 것은 부끄러워하고, 존속시킬 것은 존속시키고, 고칠 것은 고치는 균형잡힌 태도가 필요하지 않을까?
잠깐 이야기가 샜다. 다시 ResNet으로 돌아오자. 층수에 있어서 ResNet은 급속도로 깊어진다. 2014년의 GoogLeNet이 22개 층으로 구성된 것에 비해, ResNet은 152개 층을 갖는다. 약 7배나 깊어졌다!
위 그림을 보면 네트워크가 깊어지면서 top-5 error가 낮아진 것을 확인할 수 있다. 한마디로 성능이 좋아진 것이다. 그렇다면 질문! "망을 깊게하면 무조건 성능이 좋아질까?" 이것을 확인하기 위해 ResNet의 저자들은 컨볼루션 층들과 fully-connected 층들로 20 층의 네트워크와 56층의 네트워크를 각각 만든 다음에 성능을 테스트해보았다.
위 그래프들을 보면 오히려 더 깊은 구조를 갖는 56층의 네트워크가 20층의 네트워크보다 더 나쁜 성능을 보임을 알 수 있다. 기존의 방식으로는 망을 무조건 깊게 한다고 능사가 아니라는 것을 확인한 것이다. 뭔가 새로운 방법이 있어야 망을 깊게 만드는 효과를 볼 수 있다는 것을 ResNet의 저자들은 깨달았다.
Residual Block
그것이 바로 ResNet의 핵심인 Residual Block의 출현을 가능케 했다. 아래 그림에서 오른쪽이 Residual Block을 나타낸다. 기존의 망과 차이가 있다면 입력값을 출력값에 더해줄 수 있도록 지름길(shortcut)을 하나 만들어준 것 뿐이다.
기존의 신경망은 입력값 x를 타겟값 y로 매핑하는 함수 H(x)를 얻는 것이 목적이었다. 그러나 ResNet은 F(x) + x를 최소화하는 것을 목적으로 한다. x는 현시점에서 변할 수 없는 값이므로 F(x)를 0에 가깝게 만드는 것이 목적이 된다. F(x)가 0이 되면 출력과 입력이 모두 x로 같아지게 된다. F(x) = H(x) - x이므로 F(x)를 최소로 해준다는 것은 H(x) - x를 최소로 해주는 것과 동일한 의미를 지닌다. 여기서 H(x) - x를 잔차(residual)라고 한다. 즉, 잔차를 최소로 해주는 것이므로 ResNet이란 이름이 붙게 된다.
ResNet의 구조
ResNet은 기본적으로 VGG-19의 구조를 뼈대로 한다. 거기에 컨볼루션 층들을 추가해서 깊게 만든 후에, shortcut들을 추가하는 것이 사실상 전부다. 34층의 ResNet과 거기에서 shortcut들을 제외한 버전인 plain 네트워크의 구조는 다음과 같다.
위 그림을 보면 알 수 있듯이 34층의 ResNet은 처음을 제외하고는 균일하게 3 x 3 사이즈의 컨볼루션 필터를 사용했다. 그리고 특성맵의 사이즈가 반으로 줄어들 때, 특성맵의 뎁스를 2배로 높였다.
저자들은 과연 shortcut, 즉 Residual block들이 효과가 있는지를 알기 위해 이미지넷에서 18층 및 34층의 plain 네트워크와 ResNet의 성능을 비교했다.
왼쪽 그래프를 보면 plain 네트워크는 망이 깊어지면서 오히려 에러가 커졌음을 알 수 있다. 34층의 plain 네트워크가 18층의 plain 네트워크보다 성능이 나쁘다. 반면, 오른쪽 그래프의 ResNet은 망이 깊어지면서 에러도 역시 작아졌다! shortcut을 연결해서 잔차(residual)를 최소가 되게 학습한 효과가 있다는 것이다.
아래 표는 18층, 34층, 50층, 101층, 152층의 ResNet이 어떻게 구성되어 있는가를 잘 나타내준다. 깊은 구조일수록 성능도 좋다. 즉, 152층의 ResNet이 가장 성능이 뛰어나다.
끝까지 인내를 갖고 읽어주셔서 감사합니다. 부족한 글이다만, 도움이 되셨길 바랍니다. 혹시나 제 이해에 잘못된 점이 있다면 알려주시길 부탁드립니다.^^ ResNet에 대한 이해가 깊어지면 글을 한층 더 업그레이드 시키도록 하겠습니다.
참고자료
[1] https://medium.com/@Lidinwise/the-revolution-of-depth-facf174924f5, Armando Vieira, "The Revolution of Depth"
[2] https://cv-tricks.com/keras/understand-implement-resnets/, UTKARSH GUPTA, "Detailed Guide to Understand and Implement ResNets"
[3] https://datascienceschool.net/view-notebook/958022040c544257aa7ba88643d6c032/, 데이터 사이언스 스쿨, "ResNet"
[4] https://laonple.blog.me/220761052425, 라온피플, "[Part V. Best CNN Architecture] 8. ResNet [1] - 라온피플 아카데미 -"
본문 내 쿠팡파트너스 링크를 통해 물건을 구매하시면, 제게 소정의 수익이 발생하여 더 좋은 글을 쓸 동력이 됩니다.