ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [cs231n] 5강 합성곱 신경망 (2/3, 콘브넷, ConvNet)
    AI 2021. 2. 17. 20:00

    여기까지 콘브넷이 오늘날 사용되는 작은 예들이었습니다. 하지만 이것으로 가능한 것이 엄청나게 많이 있습니다. 여러분들이 프로젝트를 할 때, 여러분의 상상력이 제멋대로 펼쳐져도, 우리는 여러분이 어떤 응용을 생각해 낼 수 있는지 보고 싶습니다. 오늘 우리는 어떻게 합성곱 신경망이 동작하는지 얘기할 겁니다. 신경망과 마찬가지로 그것들이 어떻게 동작하는지 기능적인 관점에서 뇌에 대한 비유는 빼고 먼저 얘기할 거구요. 그 다음 우린 간단히 둘 사이 연결에 대해서 얘기할 겁니다.

    지난 강의에서 우리는 완전 연결 계층 (fully connected layer)에 대한 아이디어를 얘기했죠. 완전연결 계층에서 우리가 하는 것은 이 벡터들에 대해 연산을 하는 겁니다. 예를 들어 우리가 32 x 32 x 3, 3차원 이미지를 가지고 있다면, 우리가 앞서서 본 이미지들과 같은 형태인데, 그걸 받아서 모든 픽셀을 늘여놓습니다. 그럼 우리는 3027차원 벡터를 얻죠. 그리고 우리는 여기 가중치가 있습니다. 우린 이걸 가중치 행렬로 곱할 겁니다. 그래서 예를 들어, 우리의 W는 10 x 3072가 되죠. 그 다음 우리는 활성함수 (activation function)를 얻습니다. 이 계층의 출력은, 우리는 10개의 행을 취해서, 3072차원 입력과 내적 (dot product)을 합니다.

    거기서 우리는 이 숫자를 얻는데, 이게 뉴런 (neuron)의 값입니다. 그래서 이 경우 이 10개의 뉴런 출력을 얻습니다.

    합성곱 계층과 앞에서 얘기한 완전 연결 계층과의 주요한 차이점은 여기서는 공간 구조를 유지하고 싶다는 점입니다. 앞에서 봤던 32 x 32 x 3 이미지를 받아 들이는데, 일렬로 길게 늘어뜨리는 대신, 우리는 이제 이 3차원 입력 이미지의 구조를 유지할 것입니다. 

    그다음 우리의 가중치는 이 작은 필터가 될 것입니다. 이 경우엔 5 x 5 x 3 필터죠. 우리는 이 필터를 가지고 이미지 위를 공간적으로 미끄러져가면서, 각 공간 위치마다 내적을 계산할 겁니다. 이게 어떻게 작동하는지 세부적으로 들어가 보겠습니다.

    우리의 필터는 항상 입력 볼륨의 전체 깊이로 확장합니다. 필터들은 단지 더 작은 공간 영역이라서, 이 경우는 5 x 5입니다. 전체 32 x 32 공간 입력이 아니라요. 그러나 항상 전체 깊이를 거쳐갑니다. 그래서 우리는 5 x 5 x 3을 취합니다.

    그다음 이 필터를 취해서 주어진 공간 위치에서 이 필터와 이미지 덩어리와의 내적 (dot product)을 할 겁니다. 그래서 우리는 이 필터를 이미지의 공간 위치 위에 겹쳐놓은 다음 내적을 합니다. 즉, 필터의 각 원소와 필터가 놓인 그 공간 위치에 해당하는 각 원소와의 곱셈이죠. 이렇게 해서 내적을 얻으면 5 x 5 x 3이 될 거고, 이것이 우리가 할 곱셈의 숫자입니다. 거기다 바이어스를 더하죠. 사실 우리의 필터 w를 취해서 w 트랜스포즈 곱하기 x 더하기 바이어스죠.

    앞선 질문에서 우리는 모든 공간 위치에 대해서 어떻게 이걸 슬라이드 (slide)하는지 물어봤었죠. 우리는 이 필터를 취해서, 우리는 왼쪽 위 구석부터 시작해서 우리의 입력 볼륨에서 모든 픽셀의 위에 우리의 필터를 가운데 위치시킨다음 모든 위치에서 이 내적을 합니다. 이건 우리의 출력 활성 지도 (activation map)에서 하나의 값을 만들어 낼 겁니다. 그다음 우리는 이걸 슬라이드하며 돌아다닐 건데, 가장 간단한 버전은 각 픽셀에서 이 연산을 하고 우리의 출력 활성의 해당하는 지점을 채우는 겁니다. 보시다시피 이걸해보면, 만약 32 x 32 입력이 있고, 28 x 28 출력이 있죠. 나중에 예를 보겠지만, 차원 측면에서 정확히 어떻게 이렇게 동작하는 지에 대한 수학적인 예를 볼 겁니다. 하지만, 기본적으로 여러분은 이걸 어떻게 슬라이드할지 선택할 수 있습니다. 모든 픽셀에 대해서 할지 아니면, 한번에 2개의 픽셀에 대해서 할 지를 선택할 수 있죠. 그래서 어떻게 슬라이드할 지 결정에 따라 다른 크기의 출력을 가질 수 있습니다. 그러나 기본적으로는 이 연산을 그리드 방식으로 진행할 겁니다.

    앞에서 봤던 것은 하나의 필터를 취해서 이미지 안의 모든 공간 위치에 대해 슬라이딩하고 우리는 이 활성 지도를 얻을 겁니다. 즉, 모든 공간 위치에서의 그 필터의 값입니다. 우리가 합성곱 계층을 다룰 때는 여러 필터로 작업하고 싶습니다. 왜냐면 각 필터는 입력 볼륨에서 특정 타입의 템플릿이나 컨셉을 찾고 있기 때문입니다. 우리는 여러 필터의 집합을 가질 거고 저는 두번째 필터인 녹색 필터를 취하는데, 5 x 5 x 3이죠. 저는 입력 볼륨내의 모든 공간 위치에 대해서 슬라이드할거고, 그다음 저는 같은 크기의 이 두번째 녹색 활성 지도를 얻을 겁니다.

    우리는 이것을 이 계층에서 우리가 원하는 만큼의 필터로 할 수 있습니다. 예를 들면, 우리는 6개의 5 x 5 필터가 있으면, 우리는 총 6개의 활성 지도를 얻습니다. 그래서 우리가 얻는 출력 볼륨은 28 x 28 x 6이 되죠.

    어떻게 우리가 합성곱 망에서 이 합성곱 계층을 사용할 것인지 미리 보면, 우리의 콘브넷은 사실 일련의 서로서로 쌓여있는 합성곱 계층이 될거고, 신경망에서 단순한 선형 계층에서 했던 방식과 같습니다. 그 다음 우리는 이것들을 활성함수들과 함께 배치할 겁니다. 예를 들면 ReLU 활성함수죠.

    CONV, ReLU와 보통 몇개의 풀링 계층 같은 것들을 얻게 되죠. 그다음, 여러분은 일련의 출력을 만들거고 그 출력은 다음 합성곱 계층의 입력이 될 겁니다. 이 계층 각각은 앞에서 얘기했듯이 여러개의 필터를 가지고 있습니다. 그리고 그 필터 각각은 활성 지도를 만들죠. 이 여러개의 계층이 콘브넷에 쌓여진 것을 볼 때, 결국엔 이 계층구조로 된 필터들을 학습하는 것이 됩니다.

    초기 레이어의 필터들은 여러분이 찾는 낮은 수준의 피쳐들을 표현하죠. 예를 들면, 엣지 같은 것들이죠. 그리고 중간 수준에선 더 복잡한 종류의 피쳐 (feature)들을 얻을 것입니다. 그건 아마도 모서리와 방울 (blob) 같은 것들이죠. 그다음 더 높은 수준의 피쳐에서는 방울 이상의 개념을 얻게 될 겁니다. 어떻게 이 모든 피쳐를 시각화하고 여러분의 망이 무엇인지 해석하고 여러분의 망이 어떤 종류의 피쳐를 학습하고 있는지에 대한 더 세부적인 것은 나중에 보겠습니다. 지금 이해해야 할 중요한 점은 이 피쳐들의 스택들이 단순한 것부터 더 복잡한 것 순으로 되어 있다는 겁니다.

    우리가 쌓은 이 합성곱 계층 각각에서 우리는 어떻게 더 단순한 피쳐들로 시작해서 나중에 더 복잡한 피쳐로 이것들을 합치는지 봤습니다. 이건 사실 휘벨과 위즐 (Hubel and Wiesel)이 실험에서 목격한 것과 동일합니다. 처리의 초기단계에 단순 세포들이 있고 뒤에 더 복잡한 세포들이 있죠. 비록 실제에서 우리가 명시적으로 콘브넷이 이런 종류의 피쳐를 학습하도록 강요하지 않았지만, 이런 종류의 계층적 구조를 주고 역전파를 사용하여 학습시키면, 이것들이 학습된 필터들이 됩니다.

    여기 각 필터에 의해 만들어진 활성 지도의 예가 있습니다. 위쪽에는 우리는 이 전체 5 x 5 필터 예가 있는데, 이건 사실 훈련된 콘브넷의 실제 사례입니다. 이들 각각은 5 x 5필터가 어떻게 생겼는지 그리고 우리가 이것을 이미지에 합성곱 해보면, 이 경우에는 차의 모서리인 것 같은데, 자동차 라이트요, 활성이 어떻게 생겼는지를 볼 수 있죠. 예를 들면, 첫번째 빨간 박스의 필터를 보면, 그것이 방향이 있는 엣지같은 템플릿 (template)을 찾고 있다는 것을 알 수 있습니다. 이미지에다가 슬라이드하면 그건 높은 점수, 즉 더 하얀 점수를 얻을 수 있을 겁니다. 이런 방향의 엣지가 있는 부분에서요. 이 활성 지도 각각은 이 필터들 중의 하나를 슬라이딩해서 나온 출력이죠. 이런 종류의 템플릿이 이미지에 더 많이 있죠. 우리가 이걸 합성곱이라고 부르는 이유는 이것이 두 신호의 합성곱과 연관되어 있기 때문입니다. 어떤 사람이 앞에서 지적했듯이, 이것이 합성곱 방정식인데요. 신호처리에서 합성곱을 본 사람들에겐, 사실 이건 상관계수같은 거라서 우리는 뒤집어진 버전의 필터를 합성곱하는거죠. 이게 일종의 미묘함이죠. 이 수업의 목적에 있어서는 중요하지 않습니다. 여러분이 하는 것을 적는다면, 이것처럼 보이는 표현식인데, 이게 합성곱의 표준 정의죠. 기본적으로는 필터를 취해서 이미지에 대해 공간적으로 슬라이딩하고, 각 위치에서 내적을 계산하는 겁니다.

    앞에서 얘기했듯이 우리의 전체적인 합성곱 망이 어떻게 생겼는지는 이렇습니다. 우리는 입력 이미지가 있을 거고 그걸 일련의 계층으로 통과시킵니다. 먼저 합성곱 계층이 있을 겁니다. 그 이후 보통 비선형 계층이 있죠. 나중에 더 얘기하겠지만 렐루가 매우 흔히 사용되는 거죠. 그다음 우리는 콘브, 렐루, 콘브, 렐루 계층이 있고, 가끔씩 풀링 계층이 있죠. 나중에 또 얘기할텐데, 그건 사실 우리의 활성 지도의 크기를 줄여주는 (downsample) 겁니다. 그다음 마지막으로 우리의 마지막 합성곱 계층 출력을 취해서 앞서서 본 이 합성곱 출력과 연결된 완전 연결 계층을 사용해서 최종 점수 함수를 얻습니다. 앞에서 했던 것 처럼요. 이제 어떻게 이 공간 차원이 동작하는지에 대한 예를 보겠습니다.

    이전처럼 32 x 32 x 3의 이미지를 취해보죠. 우리는 5 x 5 x 3 필터를 가지고 이미지에 슬라이드할 겁니다. 그리고 어떻게 그걸 사용해서 정확히 28 x 28 활성 지도를 생성할수 있는지 볼 겁니다.

    그래서 보다 간단히 하기 위해서 우리가 7 x 7 입력이 있다고 가정하고 3 x 3필터가 있다고 해 보죠. 이 필터를 가지고 우리의 왼쪽 위 모서리에 내려놓고 우리는 내적을 합니다. 모든 값을 다 곱해서 우리의 첫번째 값을 얻습니다. 이건 우리의 활성 지도의 왼쪽 위로 들어갑니다.

    그다음 우리가 할 것은 이 필터를 한칸 오른쪽으로 슬라이드해서 또 다른 값을 얻습니다.

    이걸 계속해서 또다른 값을 얻습니다.

    또 다른 값!

    마침내 우리는 5 x 5 출력을 얻습니다. 왜냐면 여기 맞는것은 이 필터를 수평으로 다섯 공간 위치로 움직이고 수직으로 다섯번 움직이는 거니까요.

    이전에 말했듯이, 우리가 할 수 있는 다양한 디자인 선택이 있고, 이전에 저는 모든 공간 위치에서 슬라이드했는데, 제가 슬라이드한 간격을 스트라이드 (stride)라고 부를 겁니다. 이전에는 우리는 스트라이드 1을 사용했죠. 스트라이드 2를 사용하면 어떻게 되는지 보죠.

    우리는 이전과 마찬가지로 첫번째 위치를 취할 거고, 이번에는 2픽셀을 건너 뛰어서 이 위치를 중앙으로 다음 값을 얻습니다.

    이제 우리가 스트라이드 2를 사용하면, 전체적으로 들어갈 수 있는 것은 3개죠. 그래서 우리는 3 x 3 출력을 갖습니다.

    우리가 스트라이드 3을 가지면 어떻게 되나요? 출력 사이즈는 뭔가요? 이 경우 우리는 3을 가지고 있으니, 3만큼 슬라이드해보면, 문제는 이게 들어 맞지 않는다는 것입니다. 3으로 슬라이드하면 이미지 내에 잘 맞아 들어가지 않죠.

    그래서 실제에서는 동작하지 않습니다. 합성곱을 이런식으로 하지 않습니다. 왜냐면 비대칭적 출력이 나오게 하니까요.

    우리가 출력 사이즈를 계산하는 방법을 보면, 좋은 공식으로 동작하는데요. 우리는 우리의 입력 N 차원을 취하고, 우리는 필터사이즈 F를 갖고 우리가 슬라이드하는 스트라이드를 갖고 그리고 최종 출력 사이즈가 있죠. 각각의 출력 사이즈의 공간 차원은 N 빼기 F 나누기 스트라이드 더하기 1입니다. 만약 제가 필터로 마지막으로 가능한 위치에 채울 수 있고, 즉, 안쪽으로 들어오고, 그에 앞선 픽셀들을 다 얻을 수 있다면, 이 스트라이드에 의해서 얼마나 많이 움직임으로 들어 맞을 수 있는지를 보여주죠. 그게 이 방정식이 동작하는 방식입니다. 우리가 이전에 보았듯이, 우리가 N이 7이고 F가 3이고, 스트라이드 1을 원하면, 그걸 이 공식에 넣어서, 우리는 5 x 5를 얻죠. 2에 대해서도 같은 방식으로 얻죠. 스트라이드 3으로는 동작하지 않습니다.

    실제에선 사실 경계를 0으로 패딩하는 것이 흔합니다. 우리가 원하는 크기로 동작하게 하기 위해서요. 그래서 이건 앞선 질문과 관련된 건데, 코너에서 우리가 무엇을 해야하냐는 거죠. 실제에서는 우리의 입력 이미지를 0으로 패딩하고 여러분은 필터가 실제 입력 이미지의 왼쪽 위쪽 픽셀 위치에 중심을 잡게 합니다. 여기 질문이 있는데, 만약 입력이 7 x 7이고 3 x 3 필터고, 스트라이드는 1이고, 1픽셀 경계를 패딩한다면, 출력의 사이즈는 뭐가 될까요? 6, 7이 들리는데요. 우리가 공식이 있다는 것을 기억하죠. N이 7이고 F는 3이고 스트라이드는 1이죠. 그래서 이건 7 - 3 은 4고, 나누기 1 더하기 1은 5죠. 우리는 공식을 약간 조정할 필요가 있죠. 이 공식은 우리가 0으로 패딩하지 않는 경우니까요.

    만약 패딩한다면, 여러분이 새로운 출력을 취하고, 슬라이드하면, 필터가 7개 들어 맞는다는 것을 알 수 있을 것입니다. 그래서 7 x 7출력을 얻죠. 우리의 원래 공식에 집어넣으면, N은 이제 7이 아니라 9고, 공식으로 돌아가보면 N은 9고, 필터 크기 3을 빼면 6이죠. 스트라이드 1로 나누면, 또 6이고, 1을 더하면 7이죠. 여러분이 패딩을 하면, 이 패딩을 합쳐서 공식에 넣어줘야 합니다.

    어떻게 패딩이 기본적으로 여러분을 도와주는지 봤죠. 여러분이 원하는 출력 크기를 유지시켜주는데요. 뿐만 아니라 필터를 코너와 엣지 같은 영역에 적용하는데도 도와주고요.

    일반적으로 스트라이드, 필터, 필터사이즈 0 패딩 등을 선정할 때, 흔하게 보는 것은 필터 크기 3 x 3, 5 x 5, 7 x 7을 주로 봅니다. 각각에 대해 보면 3 x 3필터에 대해서는 1의 0 패딩을 원할겁니다. 같은 공간 크기를 유지하기 위해서요. 만약 5 x 5를 한다면, 수학을 해보면, 그건 2로 0 패딩을 하길 원할 겁니다. 그리고 7에 대해선 3으로 0패딩하길 원할 겁니다.

    0 패딩에 대한 동기는 입력 크기를 유지하려고 하는 것인데, 앞에서도 암시가 되었지만, 만약 여러분이 여러개의 이 계층을 같이 쌓는다면, 만약 0 패딩을 안한다면, 혹은 다른 패딩도 안한다면, 우리가 얻는 출력의 크기가 줄어들게 됩니다. 이건 우리가 원하는게 아니죠. 여러분이 꽤 깊은 망을 갖는 것을 생각해 보면, 빠르게 여러분의 활성 지도의 크기가 매우 작아질 겁니다. 이건 안좋죠. 왜냐면 우리는 이 정보의 일부를 잃는 것이고 훨씬 작은 숫자의 값만 사용하여 원본 이미지를 표현하는 겁니다. 이걸 원하는 건 아니죠. 그리고 동시에, 앞에서 얘기했듯이, 모서리나 가장자리 정보 일부를 잃는 것이고, 우리가 잃어버릴 때마다, 그만큼 줄어드는 겁니다.

    이 크기를 계산하는 2가지 예를 해보죠. 우리가 입력 볼륨이 32 x 32 x 3이고 10개의 5 x 5 필터가 있다고 해보죠. 우리는 스트라이드 1과 패드 2를 사용할 겁니다. 출력 볼륨 사이즈는 얼마일까요? 앞서본 공식을 생각해 보죠. 32 x 32 x 10이죠.

    이걸 알 수 있는 방법은 우리는 입력 사이즈 F가 32이고 이 경우엔 우리는 그걸 패딩으로 늘릴거죠. 각 차원에서 2만큼 패딩하죠. 그래서 우리가 얻는 총 높이와 넓이는 각 방향으로 32 더하기 4가 되죠. 그리고 우리의 필터 크기인 5를 빼죠. 1로 나누고 1을 더하면 32가 됩니다. 우리의 출력은 각 필터에 대한 32 x 32죠. 총 10개의 필터가 있으니 10개의 활성 함수를 얻을 거고, 우리의 총 출력은 32 x 32 x 10이 됩니다.

    다음 질문입니다. 이 계층에서 파라미터는 몇개죠? 우리는 10개의 5 x 5 필터가 있습니다. 250이요? 정답에 근접한데, 우리의 입력 볼륨에 대해서 각 필터는 깊이로도 거쳐가야 한다는 것을 기억해야 합니다. 이게 여기 명확하게 쓰여있진 않지만, 각 필터가 공간적으로 5 x 5이기 때문에요. 그러나 암묵적으로 우리는 여기에 깊이가 있습니다. 그건 전체 볼륨을 거쳐갈 겁니다. 네 750이죠. 거의 다 왔습니다. 이건 좀 까다로운 질문인데, 우리는 항상 바이어스 항이 있다는 것을 기억해야 하니까요.

    실제에서 각각의 필터는 5 x 5 x 3의 가중치와 1개의 바이어스 항이 있죠. 그래서 76개의 파라미터가 필터마다 있죠. 그리고 필터가 10개 있으니까 총 760개의 파라미터가 있죠.

    이게 합성곱 계층의 요약인데, 여러분이 나중에 더 자세히 읽어 볼 수 있습니다. 그러나 우리는 어떤 차원의 입력 볼륨이 있고, 이것들을 선택할 수 있죠. 우리는 필터가 있고, 필터의 숫자가 있고, 필터 사이즈가 있고, 스트라이드의 크기, 0 패딩의 양이 있죠. 기본적으로 여러분들은 이 모든 것을 사용해서 앞에서 얘기한 계산을 진행할 수 있습니다. 이것으로 여러분의 출력 볼륨이 무엇이 되는지, 그리고 얼마나 많은 총 파라미터가 있는지를 알아낼 수 있습니다.

    이것에 대한 흔한 세팅은 , 앞에서 일반적인 필터 사이즈에 대해 얘기했는데, 3 x 3, 5 x 5죠. 스트라이드는 대개 1과 2가 흔합니다. 그다음 패딩 P는 들어 맞는 것이 되면 뭐든지, 여러분의 공간 정도를 유지하는 것이 흔히 사용됩니다. 그리고 필터 K의 총 숫자는 보통의 2의 제곱을 사용하는것이 좋습니다. 32, 64, 128, 512 등이요. 이런 것들이 여러분이 흔히 볼 숫자들이죠.

    여담으로, 우리는 1 x 1 합성곱도 할 수 있는데, 완벽히 말이 되죠. 1 x 1 합성곱에서 우리는 각각의 공간 정도를 슬라이드하지만 공간 영역은 5 x 5가 아니죠. 1 x 1은 사소한 케이스지만, 우리는 이 필터가 전체 깊이를 거치게 할 수 있습니다. 그래서 이건 여러분의 입력 볼륨의 전체 깊이를 거치는 내적이 될 겁니다. 그래서 출력은, 만약 56 x 56 x 64 입력 볼륨이 있고, 1 x 1 합성곱을 32개의 필터로 하면 우리의 출력은 56 x 56 x 우리의 필터 숫자인 32가 되죠.

    댓글

Designed by Tistory.