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

 

 

numpy를 이용하여 간단한 경사하강법 구현

테스트를 위한 x_data와 y_data를 만들었습니다. 

아마 예제는 sung kim 교수님의 유튜브 강좌에서 가져왔습니다.

logistic 의 비용함수와 결과값을 위한 sigmoid함수를 정의하였습니다.

sigmoid는 0 ~ 1의 값을 반환해주죠?

기억하시길 바랍니다.

num_examples로 평균값을 내려고 했으나 cost_function에서 mean()으로 대체하였습니다.

W, b는 데이터의 모양에 맞춰주었고, 사실 이런 부분은 x.shape[0], [1]과 같은 것으로 일반화 시켜주는 것이 좋지만 직관적인 이해를 위해서 나이브한 표현을 사용하였습니다.

  1. 정해준 max_iter만큼 반복을 할겁니다.

  2. w*x + b

  3. sigmoid

    1. 여기까지가 신경망을 구성하는 두 가지 부분인걸 아시죠? 

    2. 첫 번째로 가중치와 bias를 곱(더)해주고, 두번째로는 activation function에 통과시킵니다. 

  4. 다음으로 cost_function을 이용해 비용을 계산해 주고

  5. a - y_data는 역전파를 통해 계산해보시면 나오는 값입니다. 가중치와 바이어스 업데이트를 위해 필요한 값이죠

  6. 마지막으로 w와 b를 업데이트 시켜줍니다. lr 다음에 곱해주는 식 또한, 역전파를 통해 나오는 식입니다. 

 

 

'# Machine Learning > 글 공부' 카테고리의 다른 글

deconvolution(conv2Dtranspose) vs upsampling  (0) 2018.12.10
1x1 convolution이란,  (16) 2018.12.10
Logistic Regression 의 비용함수  (0) 2018.12.09
Multi Class vs Multi Label  (0) 2018.12.06
fine tuning 시 상위층과 하위층  (0) 2018.11.25


먼저 단일 변수에 대한 기본 비용함수는 m을 없앤 식을 생각하면 됩니다. 


이 비용함수는 binary classification에서 탁월한 성능을 보여줍니다. 


2가지로 구분하여 비용함수를 책정하게 되는데


1. if y = 0 :

이 때는 -log(1-y_hat)이 남게 됩니다. 결국 우리의 목표는 cost를 낮추는 것이기 때문에 y_hat이 작아지는 쪽으로 update를 하게 될 것입니다.


2. if y = 1 :

이 경우는 -log(y_hat)이 남게 됩니다. 위와 같이 cost를 낮추려면 y_hat을 1과 비슷하게 만들어야 겠죠? log1은 곧 0이니까요. 


이와 여러개의 변수에 관해서 구하고 싶다면 m으로 나눠주어 평균으로 비용함수를 책정하게 됩니다. 


직관적인 이해는 아래 그림을 참고하세요! ( 구글 검색 그림 )





'# Machine Learning > 글 공부' 카테고리의 다른 글

deconvolution(conv2Dtranspose) vs upsampling  (0) 2018.12.10
1x1 convolution이란,  (16) 2018.12.10
basic gradient(+backprop) with numpy  (0) 2018.12.09
Multi Class vs Multi Label  (0) 2018.12.06
fine tuning 시 상위층과 하위층  (0) 2018.11.25

과일이 주제가 되는 이미지에 사과, 배, 오렌지가 있다고 합시다.

Multi-Class는 이 과일 주제의 이미지에서 딱하나의 과일만 찾고 싶습니다.

하나를 찾기 위해선 당연히 다른 과일도 판단할 수 있어야겠지요. 반면에, Multi-Label은 사과도 찾고 싶고, 배도 찾고 싶은겁니다.

 

 

keras에서 각 상황에 맞는 loss function은 다음과 같습니다.

1. Multi-Class : categorical_crossentropy

2.Multi-Label : binary_crossentropy

 

기본 CNN 기반에서, 

하위층은 어느정도 일반적이고 재사용성이 있는 특성을 학습하며,

상위층은 좀 더 구체적인 특성을 학습합니다. ( 고양이 귀, 눈, 코 등 )

따라서 미세 조정(fine tuning) 시에는 상위층을 나의 데이터에 맞게 조절하는 것이 좋습니다.

 -> 하위 층으로 갈수록 fine tuning의 효과가 감소함.

 

(+) VGG16기반 합성곱층 만들기

from TensorFlow.python.keras.applications import VGG16
model = VGG16(weights = 'imagenet', include_top = False, input_shape = (n,n,n))

'# Machine Learning > 글 공부' 카테고리의 다른 글

deconvolution(conv2Dtranspose) vs upsampling  (0) 2018.12.10
1x1 convolution이란,  (16) 2018.12.10
basic gradient(+backprop) with numpy  (0) 2018.12.09
Logistic Regression 의 비용함수  (0) 2018.12.09
Multi Class vs Multi Label  (0) 2018.12.06