본문 바로가기

머신러닝/[논문으로 짚어보는 딥러닝의 맥]

Residual Network가 왜 잘되는지 해석해보기

학습목표

Residual Network(ResNet)가 왜 잘 작동되는 구조인지, 과연 Depp한 Network가 좋은지를 다루고 있는 두 가지 논문을 알아보겠습니다. 두 논문을 통해 Residual Network를 더 자세히 분석해보고 Network에서 Depth가 가지는 의미를 알아보겠습니다.

핵심 키워드

  • Residual Network (ResNet)
  • Deeper Network
  • Degradation
  • Esemble Model

학습하기 

 이번에는, Res net이 왜 좋은지, 그리고 Deeper network가 정말 좋은지 이 2가지에 대해 알아보도록 하겠습니다. Res net을 정말 대단하죠. 152개의 Layer를 활용해 5개의 이미지 대회를 휩쓸었습니다. Res net이 나오기까지 한 질문이 있었죠. Deeper network가 정말 좋은가? Degration문제를 다시 떠올려보겠습니다. 이건 오버피팅과는 다른 개념이었죠. 트레인 에러와 테스트 에러가 동시에 하락하긴하지만, Deeper network에서 성능이 더 안나오는 그런 문제. 그래서 Res net은 Residual을 이용했었습니다. 이건 디그레이션문제의 본질적인 해결이아니라, 수십개 레이어에서 발생하던 Degradation문제를 수백개 레이어 정도로 쌓아도 발생하지 않도록 늘릴 수 있게 해주었습니다. 그렇게 학습을 개선시킨 Res net인데, 사실 이게 왜 잘되는지를 수학적으로 풀어낸 논문이 없습니다. 대개 그냥 모델을 해석하는 수준 정도에서 끝나버립니다. 지금부터 소개드릴 내용도 마찬가지입니다. 여기서는 Res net을 Ensemble로써 풀어내고 있습니다.

 정확히는 Bagging 방법인데요, 인풋 데이터는 고정이니까 Bootstrap을 사용하지는 않습니다. 자 그럼 뭐냐. 같은 이미지에 대한 여러개의 모델을 학습시키는거죠. 그림을 보시면 기존 Hidden layer가 3개였으면, Res net은 각각에 Short cut하는 길이 총 3개 열리게 됩니다. 왼쪽에서 오른쪽으로 이미지가 통과해서 출력이 나오는데, 3개의 분기점 마다 2개의 경우의 수가 있으니 8개의 경로가 생기게 되는 거죠. 

 재밌는 실험 결과 중 하나는, 이런 152개의 Layer 중 1개를 무작위로 제거해도, 사실 모델의 정확도에는 큰 영향을 주지 않았다는 점입니다. 그런 여러 개를 없애면 어떻게 됬을까요.  1개부터 2개 3개...20개 이렇게 레이어들을 삭제하고, 정확도의 평균을 각각 내봤더니, 많은 레이어가 삭제될수록 에러도 '부드럽게' 증가했습니다. 그리고 논문의 저자는 말하네요. 이렇게 레이어 그룹의 멤버가 사라짐에따라, 에러가 부드럽게 올라간다는 것은 앙상블의 특징 중 하나이다. 조금은 이상하자. 부트스트랩 등의 기존 앙상블의 기준은 쫓지않았으니까요.

 Depth is NOT important. 그러다 새로운 흐름이 나왔습니다. 우리는 Deep한게 중요하다 생각해서 열심히 Deep하게 쌓았는데, 이러니까 Parameter 수가 많아지고, 그러니까 1x1 conv도 해보고 난리를 쳤던 건데, Depth가 사실 중요한게 아니다 라는 의견이 나온거죠. Depth vs Width. 논문을 빌려 말하자면, Res net은 Param의 수를 줄이기 위해 Thin하게 만들어진 Net이다. 이걸 더 얇게 만들기 위해 Bottleneck block까지 소개되었다. 그런데 우리는, 이 Identity mapping을 하는 Residual block이 매우 Deep한 Net을 통해 한 번에 조금씩 여러번 학습한다는 개념이라 생각한다. 때문에 사실, 수만은 Layer중 쓸만한 Representation을 담고 있는 Block은 거의 없고 대부분은 정말 약간의 도움을 줄 뿐인 빈 깡통이다.

 그래서 역시나 실험을 해봤습니다. Param이 늘어남에 따라서 Error가 줄어듭니다. 그런데, 같은 Param 수에서, Depth가 낮은 모델이 더 좋은 정확도를 보여줬습니다. 같은 Layer 수에서는, Depth가 적은게 더 성능이 좋기도 하였습니다. 뭐 이런 내용을 벗어나더라도, Depth는 높지만, Neuron는 적은 모델과, Depth는 낮지만, Neuron수는 높은 모델이 같은 정확도를 지닌다 했을 때, 우리는 무얼 선택해야할까요. 우리는 후자를 택해야합니다. 왜냐면, GPU의 발전으로 한 번에 여러 이미지를 학습시킬 수 있게된건 맞아요. Batchsize를 키울 수 있게된건맞는데, CNN 구조를 생각하면 2번째 레이어를 통과하기 위해서는 반드시 1번째 레이어에서 계산된 후의 값이 필요해요. 이미지가 잔뜩 줄서고 있는데, 1번 통과하고 2번 통과하는 순간 뒷순위 이미지는 1번으로 들어오고 이런게 안된다는 거죠. 한번 이미지 들어왔으면 1 2 3 .... K 개의 레이어를 다 통과해야만 다음 배치가 시행이 되잖아요. 그래서 시간이. 시간이 굉장히 오래걸려요. 

 결론은, 지금까지 했던, 채널은 줄이고 Depth는 늘리는 접근 방식도 있지만, 채널을 오히려 늘리는 것도 Performance를 개선할 수 있다는 거겠죠. 그래서 우리는 Depth와 Width를 둘다 늘려야합니다. Param수가 너무 되도 않게 많아지기 전까지는요. 학습을 얼마나 쉽게 시키냐는 관점에서 채널 수를 늘리는게 더 쉽습니다. 시간도 적게 걸리고. 그러니까 모델을 구성할 때 참, 고민할게 많습니다.