ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [cs231n] 9강 CNN 아키텍처 (architecture) (2/4, VGG, GoogLeNet)
    AI 2021. 3. 31. 19:33

    그래서 2014년에 몇 개의 아키텍처가 나왔는데 이제 좀 더 상당히 다른 것들이었고 성능에서 또 한번 도약했습니다. 이 망들 (networks)의 주요한 차이점은 먼저 훨씬 더 깊은 망이었다는 겁니다. 2012, 2013년에 8 계층 망에서 2014년에는 매우 비슷한 우승자 둘이 있었는데, 19계층과 22계층이었죠. 상당히 더 깊어졌죠. 우승자는 구글에서 나온 구글넷 (GoogLeNet)이었죠. 그러나 뒤에 바짝 붙어 있는 것이 VGGNet이라고 불리는 옥스포드에서 나온 것이 었는데, 사실 위치 인식 (localization) 대회에서는 VGG가 다른 트랙들 몇 개에서 1등을 했습니다. 이 둘은 매우 강력한 망이죠.

    먼저 VGG를 약간 자세히 보죠. VGG 망은 훨씬 더 깊은 망이고 훨씬 더 작은 필터를 사용하는 아이디어죠. 그들은 계층 숫자를 알렉스넷의 8계층에서 VGG의 16에서 19 계층의 모델로 늘렸죠. 그리고 그들이 한 주요한 일 하나는 매우 작은 필터를 유지한건데, 단지 3 x 3 밖에 안되는 것을 콘브 내내 유지했고, 사실상 가장 작은 합성곱 필터 크기이고 주변 픽셀을 조금만 보는 거죠. 그리고 그들은 이 매우 간단한 구조의 3 x 3 콘브와 주기적인 풀링 (pooling)을 망 끝까지 유지했습니다. 매우 단순하고 우아한 망 아키텍터이고, 이미지넷 대회에서 7.3%의 상위 5개 (top 5) 오류율을 얻을 수 있었죠.

    첫번째 질문은 왜 더 작은 필터를 사용해야 하는가 입니다.

    이 작은 필터를 사용하면, 더 적은 파리미터를 갖게 되죠. 우리는 그것들을 더 많이 쌓으려고 합니다. 큰 필터를 갖는 대신, 더 깊이 더 작은 필터들을 가지는 거죠. 필터가 더 많으면, 마치 하나의 7x7 합성곱 계층을 가진 것과 같은 실질적인 수용장 (effective receptive field)을 가지게 됩니다. 질문이 있는데요. 3개의 3 x 3 콘브 계층, 스트라이드 1의 효과적인 수용장은 무엇인가요? 만약 3개의 3 x 3 콘브 계층을 스트라이드 1로 쌓으면, 실질적인 수용장은 뭐죠? 입력의 전체 영역, 즉, 입력의 공간적 영역 3개의 계층의 제일 위 계층에서 바라보는 것 말입니다. 15픽셀이라구요? 왜 15픽셀이죠? 네, 얘기한 이유는 그들이 겹치기 때문이라는 거죠. 맞는 방향입니다. 첫번째 계층에서는 수용장이 3x3이 될 겁니다. 그다음 2번째 계층에서는, 두번째 계층의 이 각각의 뉴런은 첫번째 계층 필터의 3 x 3을 볼겁니다. 하지만 이 3 x 3의 모서리들은 각 방향에 원래 입력 계층에서 바라보고 있는 추가적인 픽셀이 있죠. 그래서 두번째 계층은 사실 5 x 5 수용장을 바라보는 거고, 이걸 다시 하면, 세번째 계층은 두번째 계층의 3 x 3을 보고 있는 거지만, 이 피라미드를 그려본다면, 입력 계층의 7 x 7을 보고 있는 거죠.

    그래서 실질적인 수용장은 여기서 7 x 7이 될 겁니다. 그건 하나의 7 x 7 콘브 계층과 같은 겁니다.

    이건 7 x 7 콘브 계층의 실질적인 수용장을 가진 것과 같지만, 그건 더 깊죠. 그건 더 많은 비선형성을 가질 수 있고, 더 적은 파라미터를 가지죠. 만약 총 파라미터 수를 본다면, 이 3 x3에 대한 각 콘브 필터는 9개의 파라미터를 가질 겁니다. 각 콘브에서 3 곱하기 3 그리고 입력 깊이를 곱하는 거죠. 그럼 3 곱하기 3 곱하기 C 곱하기 이 총 출력 피쳐 지도 (feature maps) 숫자는 C이고 우리는 전체 채널 숫자를 유지하는 것이 됩니다. 그래서 이 세 개의 계층의 각각에 대해 3 곱하기 3 곱하기 C 곱하기 C를 얻게 되고, 우리는 3개의 계층이 있어서 그건 3 곱하기 이 숫자가 되죠. 비교해 보면, 만약 하나의 7 x 7 계층이 있다면, 같은 논리로, 7제곱 곱하기 C제곱이 됩니다. 전체적으로는 더 적은 파라미터를 가질 거니까 좋은 거죠.

    이제 이 전체 망을 보면, 많은 숫자가 위에 있죠. 돌아가서 더 자세히 볼 수 있지만, 알렉스넷에 대한 예제에서 계산했던 것과 같은 방식으로 이 모든 크기들과 파라미터 숫자들을 본다면, 해 볼 만한 좋은 연습이죠. 같은 방식으로 하면, 몇 개의 이 콘브 계층이 있고, 풀링 계층이 있고, 몇 개의 콘브 계층이 더 있고, 풀링 레이어가 있고, 몇 개의 콘브 계층이 더 있고 등등이죠. 이건 계속해서 올라갑니다. 만약 전체 합성곱과 완전 연결 계층 숫자를 세어보면, VGG16인 이 경우 16을 얻을 겁니다. 그리고 VGG19은, 그건 매우 비슷한 아키텍처지만, 몇개의 더 많은 콘브 계층이 있죠.

    이 망의 전체 메모리 사용은, 이 숫자들 모두를 세어가면서 순방향 전달을 만드는 것은, 메모리에서, 여기 적힌 전체 숫자에 관해서는, 앞에서 계산했듯이요. 만약 숫자마다 4바이트를 본다면, 이건 이미지당 약 100MB가 될 겁니다. 이것이 메모리 사용의 크기 (scale)이죠. 이건 단지 순방향 전달만을 위한 거고, 역방향 전달을 한다면, 더 많이 저장해야 합니다. 메모리 측면에서 이건 꽤 무겁죠. 이미지당 100MB라는 것은, 총 5GB의 메모리가 있다면, 단지 50개만 저장할 수 있다는 겁니다. 그리고 전체 파라미터 숫자는 여기 이 망에서 1억3천8백만 파라미터죠. 알렉스넷의 6천만개와 비교됩니다.

    어디서 메모리가 사용되는지 그리고 어디에 파라미터들이 있는지 이 분포를 본다면, 보다시피, 이 초기 계층에서 많은 메모리가 있죠. 여기에서는 여전히 공간적인 차원을 가지고 있고, 더 많은 메모리를 사용할 겁니다. 그리고 많은 파라미터들은 사실 마지막 계층들에 있습니다. 완전 연결 계층들은 엄청난 수의 파라미터들을 가지고 있죠. 왜냐면, 이 모든 빽빽한 연결을 가지니까요. 그게 알아야 할 점이니까 기억해 두세요. 나중에 볼 어떤 망은 사실 이 완전 연결 계층을 없애 버려서 파라미터 숫자를 많이 줄일 수 있습니다.

    마지막으로 지적할 사항은 이 모든 계층을 부르는 여러 방법을 보게 될 텐테요. 그래서 여기에 무슨 계층들인지를 정확하게 적었습니다. conv3-64는 3x3 합성곱과 총 64개의 필터가 있다는 것을 의미합니다. 그러나 이 오른쪽 다이어그램의 VGGNet에 대해서는, 각 필터 그룹을 보는 흔한 방식이 있습니다. 여기의 각 오렌지 블럭은, conv1 부분 1로 부르죠. 그래서, conv1-1, conv1-2 등등이죠. 그냥 알아두세요.

    VGGNet은 2014년 이미지넷 분류 대회에서 2등을 결국 차지했고, 위치 탐지 (localization)에서는 1등을 했죠. 그들은 알렉스 크리제프스키가 알렉스넷에 했던 것과 매우 유사한 훈련 절차를 따랐습니다. 그들은 지역 응답 정규화 (local response normalization)를 사용하지 않았고, 앞에서 얘기했듯이, 그들은 이게 별로 도움이 되지 않는 다는 걸 알아냈고, 없애버렸죠. 보다시피 VGG16과 VGG19이 여기에서 흔한 변형이죠. 그리고 이 계층의 숫자, 19가 16보다 약간 더 깊죠. 실제에선 VGG19이 아주 약간 더 잘 동작하고 약간 메모리를 더 사용합니다. 그래서, 둘 중 하나를 사용할 수 있지만, 16이 매우 흔하게 사용되죠. 최선의 결과를 내기 위해, 알레스넷처럼, 그들은 여러 모델을 평균내기 위해서 앙상블 (ensemble)을 했고, 더 좋은 결과를 얻었죠. 그들은 또한 연구에서 마지막 완전 연결 계층의 FC7 피쳐들이, 1000개의 이미지넷 클래스들에 가기전에, 그 직전의 4096 크기의 계층이 좋은 피쳐 표현이라는 것을 보여줬고, 이것이 그대로도 사용되어서 다른 데이타로부터 이런한 피쳐들을 추출할 수 있고 이 다른 작업들 또한 일반화한다는 것을 보여줬습니다. FC7이 좋은 피쳐 표현이죠.

    VGG를 보았구요. 그건 2014년에 나온 깊은 망 중의 하나였죠. 이제 구글넷 (GoogLeNet)에 대해서 얘기해 보겠습니다. 이건 분류 대회에서 우승했죠.

    구글넷은 훨신 더 깊은 망이고 22개 계층을 가지고 있죠. 구글넷에 대한 주요한 통찰과 특별한 점들 중의 하나는 그건 정말로 계산 효율성의 문제를 보았다는 것입니다. 그리고 망 아키텍처를 계산량에 있어서 매우 효율적으로 설계하려고 했다는 겁니다. 그래서 그들은 이 인셉션 (Inception) 모듈을 이용해서 이걸 했는데, 그것에 대해서는 자세히 보겠습니다. 기본적으로는 많은 이 인셉션 모듈들을 서로서로 쌓는 것입니다. 또한 이 망에는 완전 연결 계층이 없죠. 그래서 그들은 그걸 없애서 많은 파라미터를 줄일 수 있었고, 전체적으로 5백만개의 파라미터만 있는데, 훨씬 더 깊음에도 불구하고 알렉스넷이 6천만개를 가진 것과 비교하면 12분의 1이죠. 상위 5개 (top 5) 오류율은 6.7%였습니다.

    인셉션 모듈이 뭐죠? 인셉션 모듈 뒤에 있는 아이디어는 그들이 좋은 지역 망 위상 (local network typology)를 설계하고 싶었다는 겁니다. 그리고 그건 이 지역 위상의 아이디어를 가지고 있어서, 그걸 망 내의 망으로 생각할 수 있고 이 많은 지역 위상을 서로서로 쌓아 올린거죠.

    그래서 인셉션 모듈이라고 부르는 이 지역 망에서, 그들은 사실 이 같은 계층으로 들어오는 같은 입력에 대해서 여러 개의 다른 종류의 필터 연산을 병렬로 적용합니다. 그래서 우리는 이전 계층에서 들어오는 입력이 있고, 그다음 여러 종류의 합성곱을 하는 거죠. 1 x 1 콘브, 3 x 3 콘브, 5 x 5 콘브 그리고 그들은 또한 이 경우 풀링 연산을 가집니다. 3 x 3 풀링이죠. 그래서 이 여러 계층으로부터의 모든 여러 출력을 가집니다. 그리고 나서 이 모든 필터 출력을 깊이측면으로 (depth-wise) 연결합니다. 그럼 결국 하나의 텐서 (tensor) 출력을 만들게 되고 다음 계층으로 전달 되는 거죠.

    만약 나이브 (naive) 방식의 이것을 본다면, 그냥 이 모든 여런 연산들을 가지고 출력을 얻고, 그것들을 합치는 걸 하면 되겠죠. 이것의 문제는 뭘까요?

    계산 복잡도가 문제가 된다고 알려져 있습니다. 예를 자세히 들어다 보면, 하나의 예로써, 1 x 1 콘브, 128필터, 3 x 3 콘브 192 필터, 5 x 5 콘브와 96필터를 여기 넣었는데, 모든 것이 사실 공간 차원을 유지하는 스트라이드를 갖고 이 입력이 들어온다고 가정하죠.

    그럼 1 x 1 콘브에 128 필터의 출력의 크기는 뭐가 될까요?

    28 x 28 x 128이라고 했죠. 맞습니다. 1 x 1 콘브로 우리는 공간 차원을 유지할거고, 그 위에, 각 콘브 필터는 전체 256 입력 깊이를 볼 것입니다. 그러나 출력은 이 콘브계층에서 각 128개의 필터에 대해 28 x 28 피쳐 지도 (feature map)가 될 겁니다. 그래서 28 x 28 x 128을 얻는 거죠.

    이제 같은 작업을 해서 모든 여러 필터의 출력 크기를 본다면,

    3 x 3 콘브뒤에 이 28 x 28 x 192 볼륨 (volume)을 얻겠죠. 5 x 5 콘브 뒤에는 96개의 필터가 있죠. 그래서 28 x 28 x 96죠. 그리고 풀링 계층은 여기서는 같은 공간 차원을 유지합니다. 그래서 풀링 계층은 깊이에 대해서도 유지할 겁니다. 스트라이드 (stride) 때문에, 우리의 공간 차원을 유지할 겁니다.

    필터 이어붙이기 (concatenation) 이후 출력 크기를 본다면,

    28 x 28을 얻을 겁니다. 이것들은 모두 28 x 28이고, 우리는 깊이 측면으로 연결할 겁니다. 그래서 28 x 28 곱하기 이 모든 것을 더한 것을 얻을 거고, 전체 출력 크기는 28 x 28 x 672가 되는 거죠. 인셉션 모듈에 대한 입력은 28 x 28 x 256이고, 이 모듈로부터의 출력은 28 x 28 x 672입니다. 그래서 우리는 같은 공간 차원을 유지했고, 깊이는 날려버렸죠.

    합성곱 계층에서 수행되는 연산의 숫자를 보면, 먼저 첫번째 것, 이 1 x 1 콘브를 예로 보죠. 말했듯이, 각 위치에서 우리는 1 x 1 x 256 내적 (dot product)을 합니다. 그래서 256개의 곱하기 연산이 수행되는 거고 각 필터 지도에 대해서, 우리는 28 x 28 의 공간 위치가 있죠. 그래서 그게 첫번째 28 곱하기 28로 첫 두 숫자가 곱해지는 거죠. 이것들은 각 핉터에 대한 공간적 위치죠. 그래서 우리는 이것을 해서 이 각각에 대해 256을 곱합니다. 그럼 우리는 이 계층에서 전체 128개 필터가 있으니 전체 128개 피쳐 지도를 만들어 내는 거죠. 그래서 전체 연산의 숫자는 여기서 28 x 28 x 128 x 256이 되는 거죠. 이건 여러분이 생각할 수 있겠지만, 3 x 3 콘브, 5 x 5 콘브에 대해서도 완전히 똑같은 원리로 같습니다. 전체적으로는 8억5천4백만 연산이 여기서 일어나게 됩니다.

    이건 매우 계산적으로 매우 비싸죠. 이 연산들 말입니다. 그리고 또 주목하고 싶은 점은 풀링 계층이 문제를 더한다는 겁니다. 왜냐면 그게 전체 피쳐 깊이 (feature depth)를 유지하기 때문이죠. 모든 계층에서 전체 깊이는 증가하기만 할 수 있습니다. 풀링 레이어에서 전체 피쳐 깊이를 취할 거고 뿐만 아니라 모든 추가적인 피쳐 지도를 콘브 계층에서 취할 거고 이것들을 같이 더하는거죠. 여기서 입력 깊이는 256 깊이인데, 출력은 672 깊이죠. 진행해 나가면서 계속 늘리기만 하는 겁니다.

    그럼 어떻게 이걸 처리할 수 있을까요? 어떻게 이걸 더 관리하기 쉽게 유지할 수 있을까요? 구글넷이 사용한 주요한 인사이트중 하나는 우리가 이걸 병목 (bottleneck) 계층을 사용해서 해결할 수 있고 합성곱 연산전에 즉, 비싼 계층 전에 이 피쳐들을 낮은 차원으로 사영하려고 (project) 했던 거죠.

    그게 정확히 뭘 의미할까요? 1 x 1 합성곱을 떠올려 보면, 우리는 이걸 그냥 통과하려고 했을거 같습니다.

    그러나 그건 입력을 받아서 각 공간 위치에서 내적을 하고 공간 차원을 유지하는 거죠. 그러나 그건 깊이를 줄입니다. 입력의 깊이를 낮은 차원으로 사영해서 그걸 줄입니다. 그건 입력 피쳐 지도의 선형 조합 (combination) 같은 겁니다.

    이 주요한 아이디어는 그건 깊이를 낮게 사영해서 인셉션 모듈이 1 x 1 콘브를 취하고 이 모듈에서 많은 지점에서 이것들을 더합니다. 이 비싼 계산을 줄이기 위해서요. 3 x 3 과 5 x 5 콘브 계층 전에, 그건 이 1x1 합성곱들 중 하나를 집어넣는 거죠. 그리고 풀링 계층 다음에 추가적인 1 x 1 합성곱을 넣습니다.

    이것들이 추가된 1 x 1 병목 계층입니다.

    이것이 어떻게 앞에서 봤던 수학을 바꾸나요? 우리는 여전히 28 x 28 x 256의 같은 입력을 갖고 있습니다. 그러나 1 x 1 콘브들이 깊이 차원을 줄일 겁니다. 보다시피 3 x 3 콘브 전에, 1 x 1 콘브 64개의 필터를 넣으면, 그것으로부터의 출력은 28 x 28 x 64가 될 것입니다. 이제 3 x 3 콘브로 가는 대신, 나중에 28 x 28 x 256이 오는 것이 아니라, 우리는 단지 28 x 28 x 64 블록 (block)이 오는 것입니다. 그래서 이건 더 작은 입력을 줄여서 이 콘브 계층으로 가게 하는 것입니다. 5 x 5 콘브에 대해서도 같은 것이고, 풀링 계층에 대해서는, 풀링이 나온 다음, 이 후에 깊이를 줄일 것입니다. 만약 여기 모든 합성곱 연산에 대해 같은식으로 수학을 하면, 이 모든 1 x 1 콘브를 3 x 3과 5 x 5위에서 더하면, 총 연산 숫자는 3억5천8백만 연신이죠. 그건 나이브 버전에서 봤던 8억5천4백만보다는 훨씬 적습니다. 이 1 x 1 콘브와 그에 대한 필터 사이즈를 사용해서 어떻게 계산을 제어할 수 있는 지를 볼 수 있습니다.

    그다음 구글넷은 이 인셉션 모듈들을 받아들여서 이것들을 모두 쌓을 겁니다. 이것이 전체 인셉션 아키텍쳐죠.

    만약 이걸 좀 더 자세히 들여다 보면, 여기서는 그걸 옆으로 눕혔는데요. 왜냐면 그게 너무 커서 수직적으로는 슬라이드에 더이상 들어가지 않아서요. 시작할 때 우리는 먼저 이 스템 망 (setm network)을 갖는 겁니다. 그래서 이건 앞에서 본 좀 더 바닐라하고 (vanilla) 평범한 콘브 망이죠. 6개의 시퀀스의 계층입니다. 콘브 풀링, 몇개의 콘브와 또다른 풀링으로 시작하죠.

    모든 다양한 여러 인셉선 모듈을, 모두 서로서로 쌓은 후에

    그리고 그 위에 우리는 분류기 출력을 얻습니다.

    여기서 주목할 건 비싼 완전 연결 계층을 제거했다는 겁니다. 그것 없이도 모델이 잘 동작한다고 밝혀졌죠. 그래서 파라미터들을 많이 줄였습니다.

    보다시피 이 몇 개의 추가적인 스템이 나오고 있죠. 이것들은 보조적인 분류 출력입니다. 그래서 이것들은 평균 풀링이 있는 작은 망이고, 1 x 1 콘브, 몇 개의 완전 연결 계층이 소프트맥스 (Softmax)로 연결 됩니다. 그리고 또한 이미지넷 클래스의 1000개의 방향 소프트맥스가 있죠. 사실상 이미지넷 훈련 분류 손실을 이 3개의 각각의 공간에서 사용하고 있는 겁니다. 망의 표준 끝과, 뿐만 아니라 망의 앞선 두 개의 위치에서 사용하죠. 그렇게 하는 이유는 이것이 깊은 망이고 이 추가적인 보조 분류 출력을 가지므로, 더 많은 경사 학습을 앞선 계층에 넣을 수 있는 거고, 더 많은 도움이 되는 신호가 흘러 들어오는 거죠. 왜냐면 이 중간 계층들도 도움이 될 테니까요. 이것들의 일부에 기반해서 분류를 할 수 있어야 합니다. 이게 전체 아키텍처입니다.

    가중치가 있는 22개의 계층이 있습니다. 각각의 이 모듈에서, 1 x 1, 3 x 3, 5 x 5 중 하나가 가중치 계층이고, 이 모든 병렬 계층을 포함해서,일반적으로 그건 비교적 더 세심하게 설계된 아키텍처이고 이것 중 일부는 우리가 얘기했던 이 직관에 근거하고 있습니다. 구글, 저자들은 거대한 클러스터 (cluster)가 있고 그들은 모든 종류의 설계 선택에 대해서 교차 검증을 하니까, 이것이 잘 동작하게 된 것이죠. 그래서 계산 그래프에서 마치 끝에 다 더해지는 것과 같죠.

    구글넷은 22 계층이죠. 그건 효율적인 인셉션 모듈을 가지고 있고, 완전 연결 계층은 없습니다. 알렉스넷보다 12배 적은 파라미터를 가지고 있죠. 그리고 ILSVRC 2014의 분류 우승자죠.

    댓글

Designed by Tistory.