ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [cs231n] 9강 CNN 아키텍처 (architecture) (1/4, 알레스넷 (AlexNet))
    AI 2021. 3. 31. 17:54

    9강에 오신 것을 환영합니다. 오늘 우리는 CNN 아키텍처에 대해 얘기할 겁니다.

    지난 시간 리뷰를 빠르게 해보죠. 지난시간에 우리는 여러 종류의 딥러닝 프레임워크에 대해서 얘기했죠. 파이토치, 텐서플로우, 카페2에 대해서 얘기했습니다.

    그리고 우리는 이런 종류의 프레임워크를 사용해서 커다란 계산 그래프 (computational graph)를 만들 수 있다는 것을 봤죠. 예를 들면, 매우 큰 신경망과 콘브넷 (convnet)이죠. 그 결과 이 그래프들에서 매우 쉽게 경사를 계산할 수 있었습니다. 또 모든 중간 변수, 가중치, 입력에 대해 경사를 계산할 수 있었고 그걸 사용해서 모델을 훈련시키고 이 모두를 GPU에서 효율적으로 실행할 수 있었습니다.

    그리고 이 많은 프레임워크 (framework)들에 대해서, 이것들이 동작하는 방식은 이런 모듈화된 계층으로 작업하는 것이었고, 여러분들이 숙제할 때 이걸로 작성하는 거죠. 여기에는 순방향 전달, 역방향 전달이 있죠.

    그리고 우리의 최종 모델 아키텍쳐에서, 이 모든 전체 계층의 시퀀스 (sequence)를 정의하는 것만 하면 됩니다. 그걸 이용해서 매우 쉽게 매우 복잡한 망 아키텍처를 쌓아 올릴 수 있었죠.

    오늘 우리는 오늘날 최첨단 응용프로그램과 연구에서 샤용되는 몇 가지 특정 CNN 아키텍처에 대해 얘기할 겁니다. 그리고 이를 위해 가장 흔하게 사용되는 몇 가지 아키텍처들, 즉 이미지넷 분류 벤치마크 (ImageNet classification benchmark)의 우승자들을 깊이 볼 겁니다. 시간순서로 보면, 알렉스넷, VGGNet, 구글넷, 그리고 레즈넷이죠. 이것들은 아주 깊이 들어갑니다. 그리고 나서 다른 아키텍쳐들도 간단히 볼 텐데, 오늘 날에는 두드러지게 사용되진 않지만, 역사적 관점에서 흥미롭거나 최근 연구 분야인 것들을 볼 겁니다.

    잠깐 복습해 보죠. 우리는 한참 전에 LeNet에 대해서 얘기했었는데, 콘브넷의 첫번째 예시였고 실제에서 성공적으로 사용되었죠. 이게 그 콘브넷이었는데, 입력 이미지를 받아서 5 x 5 콘브 필터를 사용했고, 스트라이드 1을 적용하고 몇 개의 컨브 계층, 몇 개의 풀링 (pooling) 계층 그다음 마지막에 몇 개의 완전 연결 계층을 가지고 있었죠. 그리고 이 꽤 간단한 콘브넷은 매우 성공적으로 숫자 인식에 적용되었죠.

    2012년에 나온 알렉스넷에 대해서는 앞선 수업에서 이미 들었을텐데, 이건 첫번째 대규모의 합성곱 신경망이었고 이미지넷 분류 작업에서 잘 동작할 수 있었습니다. 그래서 2012년에 알렉스넷은 그 경쟁에 들어갔고, 이전의 모든 딥러닝 기반이 아닌 모델들을 큰 차이로 이겼죠. 이것이 이후에 너도 나도 콘브넷을 연구하고 사용하게 만들었죠. 그래서 기본적인 콘브넷인 알렉스넷 아키텍처는 콘브 계층이 있고 이후 풀링 계층, 정규화, 콘브, 풀링, 정규화 그리고 몇 개의 콘브 계층이 더 있고, 풀링 계층 그리고 이후 몇 개의 완전 연결 계층이 있죠. 이건 사실 방금본 르넷 망과 매우 유사해 보입니다. 전체적으로는 더 많은 계층이 있죠. 5개의 콘브 계층과 2개의 완전 연결 계층이 있고 이후 출력 클래스로 이어지는 마지막 완전 연결 계층이 있죠.

    먼저 알렉스넷에 관련된 크기에 대한 감을 잡아보죠. 알렉스넷에 대한 입력을 보면, 이미지넷에 대해서 훈련되었는데, 입력은 227 x 227 x 3 크기 이미지죠. 첫번째 계층을 보면 알렉스넷에 대한 콘브 계층인데, 11 x 11 필터고, 96개의 필터가 스트라이드 4로 적용되어 있습니다. 잠깐 이것에 대해서 생각해 보죠. 첫번째 계층의 출력 볼륨 크기가 얼마죠? 여기 힌트가 있죠. 기억해 보면, 입력 크기가 있고, 합성곱 필터가 있죠. 그리고 여기 이 공식이 있는데, 힌트죠. 콘브를 적용한 다음의 출력 차원 크기를 알려주고 있습니다. 기억해 보면 그건 전체 이미지 빼기 필터 크기 나누기 스트라이드 더하기 1이었죠. 여기 적혀 있는 것을 보면, 55죠. 콘브 계층을 적용한 후에 뭐가 최종 출력 크기인지 추측할 수 있나요? 55 x 55 x 96. 네 맞아요. 출력에서의 공간 차원이 각각 55가 될거고 우리는 전체 96개의 필터가 있으니까 콘브 계층 뒤의 깊이는 96이 될거죠. 그래서 그게 출력 볼륨입니다.

    그리고 이 계층의 전체 파라미터는 몇 개죠? 96개의 11 x 11 필터가 있다는 걸 기억해야죠. 96 x 11 x 11이라구요? 거의 맞죠.

    네 x3이 더 있죠. 맞습니다. 그래서 필터의 각각은 11 x 11 x 3인 지역 영역을 볼 겁니다. 왜냐면, 입력 깊이가 3이니까요. 그래서 그게 각각의 필터 크기고 이것들 전체 96을 곱하는 거죠. 그래서 3만5천개의 파라미터가 첫번째 계층에 있습니다.

    두번째 계층을 보면, 풀링 계층이고, 이 경우 3 x 3 필터가 스트라이드 2로 적용되어 있죠. 풀링 이후 이 계층의 출력 볼륨은 어떻게 되죠? 여기 또 힌트가 있죠. 아까 질문과 매우 유사합니다. 27 x 27 x 96. 맞습니다. 풀링 계층은 사실 여기 있는 이 공식을 사용하는 겁니다. 스트라이드 2로 적용된 풀링이기 때문에, 공간 차원을 결정하는데 같은 공식을 사용할 겁니다. 그래서 공간 차원은 27 x 27이고 풀링은 깊이는 보존하죠. 그래서 우리는 입력으로 깊이 96을 갖고, 출력에서도 깊이 96인거죠.

    다음 질문입니다. 이 계층에서 파라미터는 몇개죠?

    네, 풀링 계층은 파라미터가 없죠. 속이는 듯한 질문이었죠.

    이걸 계속하면 되고, 그 절차를 계속 반복하면 됩니다. 이걸 거쳐가 보고 각 계층에서 크기, 파라미터를 알아내는 것은 좋은 연습이죠.

    이걸 계속하면, 이걸 볼 수 있는데, 이것이 작업할 최종 아키텍처입니다. 초기에 11 x 11 필터가 있고, 그다음 5 x 5 그다음 몇 개의 3 x 3 필터가 있죠. 그리고 일반적으로 앞에서 본것과 꽤 비슷해 보이는 크기가 있는데, 끝에서는 4096 크기의 완전 연결 계층 몇 개가 있고 마지막 계층은 FC으로 소프트맥스 (softmax)와 이어지고 100개의 이미지넷 클래스로 가는 거죠.

    이것에 대한 몇 가지 세부사항을 얘기하면, 이것이 우리가 얘기한 렐루 (ReLu) 비선형성을 처음으로 사용한 것이죠. 렐루는 가장 많이 사용되는 비선형성이죠. 그들은 사실 지역 응답 정규화 (local response normalization) 계층을 사용해서 인접한 채널에 걸친 응답을 정규화하려고 (normalize) 했는데요. 이건 더이상 사용되지 않는 것입니다. 다른 사람들이 그게 별로 효과가 없다는 것을 보여줬죠. 많은 헤비한 (heavy) 데이타 증강이 있었습니다. 논문을 더 자세히 들여다 보면, 뒤집기, 색깔 바꾸기, 잘라내기, 컬러 정규화 (flipping, jittering, cropping,color normalization)가 있는데, 이 모든 것들은 프로젝트할 때 아마 유용하다는 것을 알게 될 겁니다. 여기엔 많은 데이타 증강이 있다는 거고, 또한 배치사이즈 128의 드랍아웃 (dropout)을 사용했습니다. 그리고 앞선 강의에서 얘기했던 SGD 모멘텀으로 학습을 했죠. 그리고 학습률은 1e-2로 시작했습니다. 평평해질 때마다, 10으로 나누면서 계속갑니다. 훈련이 끝날 때까지요. 그리고 약간의 가중치 감소가 있죠. 그리고 결국은 최선의 숫자를 얻기 위해서 모델 앙상블 (ensemble)을 해서 여러 개를 훈련시켜서 평균을 내었고 성능 개선을 하였습니다.

    그리고 한편으로 지적하고 싶은 것은 이 알렉스넷 다이어그램을 보면, 한가지 차이점을 제외하고는 일반적인 콘브넷 다이어그램처럼 보입니다. 차이점은 보다시피 이 두 다른 행과 열을 사이를 가로 질러 나누는 것입니다. 이렇게 하는 이유는 대개 역사적인 노트인데, 알렉스넷이 GTX580 GPU에서 훈련되었고, 그건 3GB 메모리밖에 없는 오래된 GPU죠. 그래서 그건 전체 망에 맞지 않았고, 결국 망을 2개의 GPU에 걸치게 한 것이죠. 각각의 GPU에서 뉴런의 절반을 가지고, 피쳐 지도 (feature map)의 절반을 가질 겁니다. 그래서 예를 들어, 첫번째 콘브 계층을 보면, 55 x 55 x 96 출력이 있지만, 이 다이어그램을 자세히 보면, 나중에 논문을 확대해서 본다면, 각 GPU에 단지 48깊이로만 되어 있는 것을 볼 겁니다. 피쳐 지도를 반씩 분산한거죠.

    대부분의 이 계층에서, 예를 들면, 콘브1, 2, 4, 5에서 같은 GPU에 있는 피쳐 지도와 연결되어 있습니다. 이전 처럼 같은 GPU에 있는 피쳐 지도의 반을 입력으로 받아들이는 거죠. 96개의 전체 피쳐 지도를 보는게 아닙니다. 첫번째 계층에서 그냥 48개를 입력으로 받아들이는 겁니다.

    그리고 몇 개의 계층이 있는데, FC6, 7, 8 뿐아니라 콘브3에서는 GPU가 서로에게 얘기를 하고 있습니다. 그래서 앞선 계층의 모든 피쳐 지도와 연결되어 있죠. GPU간의 커뮤니케이션이 있고, 이 각 뉴런들은 이전 입력 계층의 전체 깊이에 대해 연결되어 있죠.

    잠깐 얘기하자면, 논문을 보고 수학과 아키텍처 등을 적어 보고 해 본다면, 작은 이슈가 첫번째 계층에 있는데요. 숫자를 보면, 그들은 224 x 224라고 얘기하지만, 약간 우스운 패턴이 진행되면서 그 숫자는 227로 동작하죠.

    알렉스넷은 2012년에 이미지넷 분류 벤치마크의 우승자였죠. 보다시피 그건 오류율을 꽤 큰 차이로 줄였습니다. 첫번째 CNN 기반 우승자였죠. 그리고 그건 우리의 아키텍처의 기반으로 폭넓게 사용되고 있죠. 그때부터 몇 년전까지 안쓰이는 곳이 없었습니다. 여전히 많이 사용되죠. 여러 작업을 위한 전이 학습 (transfer learning)에서도 사용되어서 사실 오랜 시간동안 사용되고 있는 거고 매우 유명했죠. 하지만 이제 일반적으로 더 나은 성능을 갖는 더 최근의 아키텍쳐들이 있고, 이것들에 대해 얘기할 거고, 이것들이 더 많이 사용되는 아키텍처라서 실제에서 사용하고 싶을 겁니다.

    먼저 빠르게 얘기하면, 2013년에 이미지넷 대회는 ZFNet이라고 불리는 것이 우승을 했죠.

    2013년에 ZFNet (Zeller Fergus Net)이 그 대회를 우승했는데, 이건 만든 사람의 이름을 딴거죠. 이것 대부분 알렉스넷에 대해서 하이퍼파라미터를 개선한 겁니다.

    그건 같은 숫자의 계층을 가지고 있었고 같은 전체적인 구조를 가지고 있었고, 약간 변경한 것은 스트라이드 크기, 필터의 숫자였죠. 이 하이퍼파라미터들을 좀 더 가지고 논 다음 , 그들은 오류율을 개선할 수 있었죠. 그러나 여전히 같은 아이디어입니다.

    댓글

Designed by Tistory.