JD의 블로그

[딥러닝을 위한 고급 도구] - 함수형 API 본문

머신러닝-딥러닝

[딥러닝을 위한 고급 도구] - 함수형 API

GDong 2019. 9. 22. 16:30

1. 케라스의 함수형 API

케라스의 Sequential 모델은 네트워크 입력과 출력이 하나라고 가정한다. 따라서 이 모델은 층을 차례대로 쌓아 구성하는데 많은 경우 이런 과정이 적절하다. 하지만 이런 가정이 맞지 않는 경우도 많다. 일부 네트워크는 개별 입력이 여러 개 필요하거나 출력이 여러 개 필요하다. 예를 들어, 다양한 입력 소스에서 전달된 데이터를 다른 종류의 신경망 층을 사용하여 처리하고 합친다. 중고 의류의 시장 가격을 예측할 때 의류 브랜드, 연도 , 제품 사진 등을 입력으로 사영하여 원-핫 인코딩으로 바꾸고 완전 연결 네트워크를 사용하여 가격을 예측할 수 있다. 이럴 경우 텍스트는 RNN이나 1D 컨브넷을 사진은 2D 컨브넷을 이용할 수 있다. 가장 간단히 세 모델을 동시에 사용하는 방법은 3개의 모델을 따로 훈련시키고 각 예측을 가중 평균하는 것이다. 하지만 이 방법은 각 모델에서 추출한 정보가 중복이 되면 최적의 값을 도출할 수 없을 것이다. 즉 가능한 모든 종류의 입력 데이터를 동시에 사용해서 정확한 하나의 모델을 학습하는 것이 더 나은 방법이다. 

 

최근에 개발된 많은 신경망 구조는 선형적이지 않은 네트워크 토폴로지가 필요하다. 비순환 유향 그래프 같은 네트워크 구조이다. 또한 최근에는 모델에 잔차 연결을 추가하는 경향도 있다. 잔차 연결은 하위 층의 출력 텐서를 상위 층의 출력 텐서에 더해서 아래층의 표현이 네트워크 위쪽으로 흘러갈 수 있도록 한다. 즉, 하위 층에서 학습된 정보가 데이터 처리 과정에서 손실되는 것을 방지한다. 

 

2. 층으로 구성된 비순환 유향 그래프

[1] 인셉션 모듈

Inception 이전

일반적으로 Convolution Neural Network(CNN)에서 네트워크가 깊어질수록 , 더 많은 레이어를 가질수록 성능이 좋아지는 것이 분명하지만 네트워크가 깊어질수록 학습해야하는 파라미터 수가 늘어난다는 문제점이 있었다. 그리고 overfitting에 빠질 가능성이 높아진다. 

 

Network in Network

같은 layer에 서로 다른 크기를 갖는 convolutional filter를 적용하여 다른 scale의 feature를 얻을 수 있도록 했다. 1x1 convolution을 적절히 사용하여 차원을 줄이고, 망이 깊어졌을 때 연산량이 늘어나는 문제를 해결하였다. 

 

일반적인 CNN 구조는 feature extracton 부분(conv + pooling layer)과 classifier 부분(fully connected neural network)으로 구성된다. Convolutional layer과 pooling layer를 번갈아 사용하는 layer를 여러 개 사용하여 feature를 추출하고, 최종 feature vector를 classifier하는 fully-connected nerual network를 이용하여 처리하였다.

 

Network in Network 설계자는 CNN의 convolutional layer가 local receptive field에서 feature를 추출해내는 능력은 우수하지만, filter의 특징이 linear하기 떄문에 non-linear한 성질을 갖는 feature를 추출하기엔 어려움이 있으므로, 이 부분을 극복하기 위해 feature-map의 개수를 늘려야 하는 문제에 주목했다. 하지만 필터의 개수를 늘리면 연산량이 늘어나는 문제가 있어 local receptive field 안에서 좀 더 feature를 잘 추출해낼 수 있는 방법을 연구하였으며 이를 위해 micro neural network를 설계하였다. 이들은 covolutional을 수행하기 위한 filter 대신에 MLP(Multi-Layer Perceptron)을 사용하여 feature를 추출하였으며 그 구조는 아래 그림과 같다. 

CNN은 filter의 커널을 입력 영상의 전체 영역으로 stride 간격만큼씩 옮겨가면서 연산을 수행한다. 반면에 NIN에서는 convolution 커널 대신에 MLP를 사용하며, 전체 영역을 sweeping 하면서 옮겨가는 방식은 CNN과 유사하다. 

 

MLP를 사용했을 때의 장점은 convolution kernel보다는 non-linear한 성질을 잘 활용할 수 있기 때문에 feature를 추출할 수 있는 능력이 우수하다는 점이다. NIN 이름이 붙은 이유는 망을 깊게 만들기 위해 Multip perceptron convolutional layer를 여러 개를 쌓아 사용하기 때문이며, 그래서 네트워크 안에 네트워크가 있다는 개념이 만들어지게 되었다.

 

NIN구조가 기존 CNN과 또 다른 점은 최종단에 흔히 보이는 fully-connected neural network가 없다는 것이다. 대신에 최종단에 "Global average pooling"을 사용하였다. 그 이유는 앞에서 효과적으로 feature-vector를 추출했기 때문에 이렇게 추출된 vector 들에 대한 pooling 만으로도 충분하다고 주장하기 때문이다. Average pooling만으로 classifier 역할을 할 수 있기 때문에 overfitting 문제를 회피할 수 있고, 연산량이 대폭 줄어드는 이점이 있다. 

 

CNN의 최종단에 있는 fully-connected NN은 전체 파라미터의 90%를 차지 하기 때문에 많은 파라미터의 수로 인해 overfitting에 빠질 가능성이 아주 높으며, 이를 피하기 위해 "dropout"기법을 적용해야 하지만, NN의 경우 average pooling으로 이를 해결하였다. 

 

1X1 Convolution

1x1 convolution을 사용하는 결정적인 이유는 차원을 줄이는 것이다. 여러 개의 feature-map으로부터 비슷한 성질을 갖는 것들을 묶어낼 수 있고, 결과적으로 feature-map의 숫자를 줄일 수 있으며, feature-map의 숫자가 줄어들게 되면 연산량을 줄일 수 있게 된다. 또한 연산량이 줄어들게 되면, 망이 더 깊어질 수 있는 여지가 생긴다.

(C3 < C2) , 1x1 convolution

 GoogLeNet

GoogLetNet의 핵심 설계 철학은 주어진 하드웨어 자원을 최대한 효율적으로 이용하면서도 학습 능력은 극대화 할 수 있도록 깊고 넓은 망을 갖는 구조를 설계하는 것이다. 

 

[2] 잔차 연결

대규모 딥러닝 모델에서 흔히 나타나는 두 가지 문제인 그래디언트 소실과 표현 병목(representational bottleneck)을 해결했다.  일반적으로 10개 층 이상을 가진 모델에 잔차 연결을 추가하면 도움이 된다. 

표현 병목 히든 레이어의 히든 유닛 수가 너무 적어지면 앞선 레이어의 출력을 다 받아낼 만큼의 충분한 용량을 갖기 힘들다. 이런 경우 기울기(gradient)가 잘 전달되어도 용량 자체가 작아서 다음 레이어에 전달할 수 있는 정보가 줄어들게 되어 표현 병목이라는 현상이 발생하게 된다. 즉 잔차 연결을 통해 본래 데이터에 더 가까운 값을 더해줌으로써 손실을 만회해준다. 
그래디언트 소실 문제 심층 신경망을 훈련하는 데 사용되는 핵심 알고리즘인 역전파는 출력 손실에서 얻은 피드백 신호를 하위 층에 전파한다. 피드백 신호가 깊이 쌓인 층을 통과하여 전파되면 신호가 아주 작아지거나 완전히 사라질 수도 있다. 이렇게 되면 네트워크가 훈련되지 않는데 이런 것을 그래디언트 소실 문제라고 한다. 이 문제는 심층 신경망과 순환 신경망에서 모두 나타나며 양쪽 모두 피드백 신호가 일련의 긴 연산을 통과하여 전파되기 때문이다. 

잔차 연결은 하위 층의 출력을 상위 층의 입력으로 사용한다. 하위 층의 출력이 상위 층의 활성화 출력에 연결되는 것이 아니고 더해진다. 크기가 다르면 선형 변환을 사용하여 하위 층의 활성화 출력을 목표 크기로 변환해야한다.