GoogLeNet 즉, 구글에서 발표한 Inception 계통의 Network에서는 1x1 Convolution을 통해 유의미하게 연산량을 줄였습니다. 그리고 이후 Xception, Squeeze, Mobile 등 다양한 모델에서도 연산량 감소를 위해 이 방법을 적극적으로 채택하고 있습니다. 뿐만 아니라 Semantic Segmentation 연구에서도 채널(Channel) 또는 공간적(Spatial) 특성 파악을 위해 1x1 Convolution 방법 사용이 유의미하다는 것을 증명한 바 있습니다.

깊이 들어가지 않더라도 Image Classification Task에서 모델 구조를 개발한 몇 가지 논문만 살펴보아도 이러한 장점을 단번에 알아볼 수 있습니다.

이번 글에서는 1x1 Convolution을 쉽게 설명해보았습니다. 1x1 Convolution은 직관적으로 1x1 크기를 가지는 Convolution Filter를 사용한 Convolution Layer입니다.

1x1 Convolution에는 크게 세 가지 장점이 있다고 말할 수 있습니다.

  1. Channel 수 조절
  2. 연산량 감소(Efficient)
  3. 비선형성(Non-linearity)

1. Channel 수 조절

Convolution Layer를 사용해서 Custom Model을 구성할 경우, Channel 수는 하이퍼파라미터이기 때문에 우리가 직접 결정해주어야 합니다. 대부분은 논문을 참조하지만, 그렇지 않은 경우는 특성에 맞게 우리가 직접 결정해주어야 합니다.

이 부분에서 1x1 Conv의 장점을 알 수 있습니다. Channel 수는 우리가 원하는만큼 결정할 수 있습니다. 하지만 컨볼루션 연산에서 특히 충분히 큰 크기의 Channel 수를 사용하고자 할때 문제가 되곤 합니다. 왜냐하면 그만큼 파라미터 수가 급격히 증가하기 때문이죠. 하지만 1x1 Convolution을 사용하면 효율적으로 모델을 구성함과 동시에 만족할만한 성능을 얻을 수 있습니다.

파라미터 수가 급격하게 증가하는 것을 예방하기 때문에 Channel 수를 특정 경우가 아닌 이상 마음껏 조절할 수 있고, 다양한 크기를 가진 Convolution Layer를 통해 우리가 원하는 구조의 모델을 구성해볼 수 있습니다.

밑의 그림에서는 이와 같이 1x1x128 Convolution을 활용하여 우리가 원하는 수의 Channel 수를 가지는 층을 구성하고 있습니다.

2. 계산량 감소

* 여기서 파라미터 수는 주로 결과값 크기를 의미합니다. 밑 그림에서 (28*28)을 제거해야 진정한 의미의 파라미터 수라고 말할 수 있습니다. 하지만 편의를 위해 파라미터 수라고 언급하겠습니다. 유의하시길 바랍니다.

* 아래 입력의 크기는 Conv(padding = 'same') 전제하에 계산해주세요.

1x1 Convolution 예시

위 그림처럼 Channel 수 조절은 계산량 감소에 직접적으로 영향을 주게 되어 네트워크를 구성할 때 좀 더 깊게 구성할 수 있도록 도움을 줍니다. 여기서 Channel 수를 줄였다가 다시 늘이는 부분을 Bottleneck 구조라고 표현하기도 합니다. 파라미터 수가 많으면 아무리 보유하고 있는 GPU나 RAM이 좋아도 감당하기 힘드니 우리 입장에선 적극 고려해볼만한 방법입니다.

위 그림을 보면, 위와 아래 예시의 차이는 1x1 컨볼루션 사용 유무입니다.

  1. 빨간색 글씨는 해당 과정에서 사용되는 전체 파라미터 개수를 의미합니다. 윗 부분은 160백만개의 파라미터 수가 필요하고, 아랫 부분은 약 44백만개의 수가 필요하네요. 대략 4배의 차이입니다. 이처럼 1x1 컨볼루션을 사용하면, 사용 유무에 따라 모델 파라미터 수가 급격하게 차이가 납니다.
  2. 초록색 글씨는 컨볼루션 필터가 가지는 파라미터 수입니다.
  3. 파란색 글씨는 필터 크기(또는 갯수)를 나타내며, 초록색 글씨와 곱해 최종 파라미터 수를 구하게 됩니다.
    (28*28은 파라미터가 아니므로 무시해도 무관하나, 여기서는 계산 편의와 직관을 위해 포함합니다.)

따라서, 위 예시의 (28 * 28 * 64 * 5 * 5 * 128)을 해석하면, (5 * 5 * 128) 크기의 컨볼루션 필터가 64개 사용되어 최종적으로 (28, 28, 64) 크기를 가지는 결과물이 나온다는 것입니다.

예시를 통해 각 숫자가 나타내는 의미가 무엇인지 생각해보시기 바랍니다. 만약 정확히 떠오르지 않는다면, 아직 컨볼루션 연산 개념이 정확히 확립되지 않은 것일 수 있습니다.

Convolution Layer는 굉장히 자주 사용하기 때문에 개념을 정확히 알고 넘어가는 것이 큰 도움이 될 수 있습니다.

3. 비선형성

GoogLeNet을 포함하여 구글팀의 수많은 고민이 포함되어 적용된 Inception 계통의 다양한 model version을 공부하면, 많은 수의 1x1 Conv를 사용했다는 것을 알 수 있습니다. 이때 ReLU Activation을 지속적으로 사용하여 모델 비선형성을 증가시켜 줍니다. ReLU 사용 목적 중 하나는 모델의 비선형성을 더해주기 위함도 있습니다. 비선형성이 증가한다는 것은 그만큼 복잡한 패턴을 좀 더 잘 인식할 수 있게 된다는 의미와 비슷하겠죠?

1x1 Convolution을 사용하면서 사용되는 파라미터 수가 감소하게 되고, 이러한 이점을 통해 모델을 더욱 깊게 구성할 수 있습니다. 모델을 깊게 구성하는 과정에서 기존보다 많은 수의 비선형성 활성화 함수를 사용하게 되고, 모델은 점점 더 구체적인 패턴을 파악할 수 있어 성능 향상을 이룰 수 있겠죠?