본문 바로가기

딥러닝

1. DNN - FC layer(from 인공 신경망)

 오늘부터 딥러닝의 구조에 대해서 차례대로 포스팅 해보려고 합니다. 딥러닝 프레임워크, 예를 들어 tensorflow, keras, pytorch 등이 발전하면서 딥러닝 코딩이 점점 쉬워지고 있습니다. 그러나 실제로 잘 활용하기 위해서는 딥러닝에 대한 지식을 좀 알아야 합니다. 

 

 딥러닝에 관한 지식을 알면 알수록 코드의 어느 부분을 건드려야 본인이 원하는 결과물을 얻을 수 있을지 알 수 있기 때문입니다. 저도 딥러닝에 관심이 있어서 공부를 계속 하고 있지만, 파면 팔 수록 통계, 컴퓨터 과학 등이 얽힌 분야라 배워야 할 지식의 양이 참 방대합니다.

 

 그래서 저의 지식과 경험을 토대로, 이 정도는 알고 넘어가야 할 것 같은 지식들을 섞어 가면서 글을 포스팅 하도록 하겠습니다.

 


 제가 맨 처음 말하려는 구조는 DNN, FC Layer 입니다. DNN은 Deep Neural Network, FC layer는 Fully Connected Layer 입니다. 크게보면 DNN이 FC layer를 포함하는 단어이기는 한데, 종종 DNN 이라는 단어를 FC Layer의 의미로 사용하는 경우가 있습니다. 그 이유는 처음 딥러닝을 말하면 떠올리는 이미지가 다음과 같기 때문이라고 생각합니다.

 위 그림은 DNN 이기도 하면서, FC layer를 포함하기도 합니다. 천천히 살펴보도록 하겠습니다.

 


1. 인공신경망 -> 딥러닝

 

 딥러닝 보다 조금 앞선 학습 방법이 인공 신경망 입니다. 인공신경망은 이름처럼 신경망(Neural network)을 본따 만든 모형 입니다. 인공신경망의 개념부터 살펴보는 것이 DNN을 이해하기가 쉽습니다. 인공신경망의 간단한 모습이 다음과 같은 그림 입니다.

 위의 그림에서 out은 우리가 원하는 결과, x는 input 입니다. 입력이 되는 것들의 선형 결합으로써 무언가를 추정하려고 하는 것이 인공 신경망의 원리 입니다. 위의 그림을 수식으로 간단하게 표현 해보면 

 Y = f(W * X + b )

가 됩니다. 위의 f는 Activation Function은 일단은 생략하고 보셔도 됩니다.

 

 위의 간단한 수식으로 해결할 수 있는 문제들도 꽤 있었습니다. 모든 input을 선형 결합해서 output을 예측할 수 있다! 그리고 모든 문제를 해결할 수 있다! 라는 게 학자들의 의견이었습니다. 하지만 XOR 이라는 아주 간단한 문제를 절대 해결할 수 없다는 걸 보여준 학자도 있었습니다. 

 결론적으로 말하면, 간단한 인공 신경망을 좌우, 위아래로 깊게 쌓음으로써 XOR 문제를 해결 할 수 있었습니다. DNN을 표시한 위의 그림을 다시 보시면, Input layer는 input, Output layer는 output 입니다. 입력과 출력의 갯수가 자유롭다는 것을 의미합니다. 또 중간에 hidden layer라고 있습니다. 저기에 있는 동그라미 하나하나가 Y = f(W*X +b)를 의미한다고 보실 수 있습니다.

 즉 인공 신경망을 보통 위아래로 깊게 쌓는다는 말은 hidden layer의 갯수를 늘린다는 말이고, 인공 신경망을 좌우로 깊게 쌓는 다는 말은 hidden layer 한층 한층 마다 존재하는 Y=f(W*X+b)의 갯수를 늘린다는 말 입니다.

 

 그 외에 인공 신경망 - 딥러닝으로 가는 역사에서 깊은 신경망의 '학습' 측면에서 많은 이슈와 발전이 있었습니다. 이후에도 많이 나오는 단어라 수식은 빼고 역사를 간단하게 정리해보겠습니다.

 

1) XOR 문제를 해결 하기 위해 인공 신경망을 좌우, 상하로 깊게 쌓았음. (Multi layer가 되었음)

  위에서 언급한 Activation Function로 비선형성을 가지고 있는 Sigmoid 등의 함수를 사용.

  그러자 계산량이 굉장히 많아서 학습이 안됨.

   -> BackPropagation으로 학습 했더니 학습에 필요한 연산량이 급격히 줄어들면서 학습이 가능해짐.

 

2) Multi-layer가 3층 이상으로 쌓이면 Vanishing Gradient 문제가 생기면서 학습이 잘 안됨.

   -> Activation Function으로 ReLU를 사용했더니 위의 문제가 사라지면서 학습이 가능해짐

 

3) GPU를 학습에 사용하는 등, 하드웨어의 발달도 따라옴.

   -> 1,2 번의 학습방법 개선 + 하드웨어 발달로 딥러닝이 굉장히 활발해짐

 

이러면서 여러가지 의미로 머신러닝, 인공지능의 대세가 딥러닝이 되었습니다.

 


2. DNN, FC Layer

 

 다시 돌아와서, 그렇다면 DNN과 FC layer를 다시 말씀드려보겠습니다. 인공 신경망이 좌우, 상하로 커지면서 Deep Neural Network가 됩니다. 그리고 이 시기에 딥러닝에 사용된 주 layer의 구조는 Y=f(W*X +b) 입니다. 맨 위의 그림을 다시 보시면 전 layer와 후 layer가 모두 연결이 된 것을 볼 수 있습니다. 말그대로 Fully Connected Layer 입니다.

 DNN이라고 하면 대표적으로 떠올리는 이미지가 저런 식이라 DNN과 FC layer를 혼용하는 경우가 종종 있다고 생각이 됩니다. 그러니 앞으로 제가 언급하는 DNN, FC layer는 위의 글들을 바탕으로 해석해주시면 되겠습니다.

 

 DNN의 가장 기본적인 구조라고 FC layer를 무시하면 안됩니다. 아직도 SOTA 모델들에 FC layer는 대부분 포함이 되어 있고, FC layer 만을 이용해서 실험을 진행하시는 분들도 있습니다.

 복잡한 모델에서 FC layer가 쓰이는 예시로는 이미지 분류 문제가 있습니다. 

 위의 표는 2015년 12월에 나온 resnet의 논문에서 가져온 모델 구조 입니다. 노란색으로 칠한 부분이 FC layer 입니다. CNN을 통해서 추출된 feature를 최종적으로 어떤 이미지인 분류 하기 위해서 연결되어 있는 layer 입니다. 이런식으로 feature를 추출하고, 마지막 부분에 fc layer를 넣는 경우가 많습니다. 

 그리고 여러 분야에서 머신러닝을 활용한 논문을 보면 MLP 라는 모델을 볼 수 있습니다. Multi layer perceptron 의 줄임말인데, 사실상 FC layer를 여러개 쌓은 모델입니다. Tabular 데이터(엑셀에서 자주 볼 수 있는 그 데이터 형태)를 활용할 때 CNN이나 RNN을 사용하기 애매하니 FC layer를 사용하는 경우도 있죠. 

 

3. FC layer를 학습시킬 때의 요령

 

 딥러닝 초기에 FC layer를 활용하면서, 어떻게 하면 잘 학습 시킬까에 대한 연구도 많이 진행했습니다. 머신러닝(그리고 딥러닝)에서 잘 학습 시킨다는 의미는 보통 3가지의 의미를 가집니다. 첫째는, 성능이 높게(loss를 낮게) 둘째는, 일반화가 잘 되게 셋째는, 빠르게 입니다. 

 대부분의 머신러닝, 딥러닝을 잘 학습 시키기 위해서 공통적으로 사용하는, 또는 조정하는 부분이 있습니다. Learning rate, l1, l2 regularizer 입니다. FC layer도 똑같이 학습율을 조정하거나, l1, l2 regularizer를 설정합니다. 또 딥러닝 layer들에게 공통적으로 적용하는 방법은 initializer를 조정하는 방법입니다. 각 layer들의 가중치를 맨처음 일반적으로는 random 하게 설정합니다. 이 부분을 random이 아니라 일정한 분포를 따르게 설정하거나 하는 방식입니다.

 또한 Activation Function을 무엇으로 하느냐도 딥러닝의 학습에 지대한 영향을 미치긴 합니다.

 

 FC layer에서 특별히 살펴볼 내용은 dropout 입니다. Dropout을 그림으로 보여드리면 이렇습니다.

 그림과 같이 node(그림의 동그라미)를 일정부분 out 시키는 것 입니다. node가 out 처리 되면 일부 input을 사용하지 않은 경우도 있고, layer와 layer 사이의 일부 결합을 제외 시킵니다. 이럼으로써 얻는 효과가 '일반화' 입니다. 그리고 일반화 효과를 얻기 때문에 Regularization의 일종으로 보기도 합니다.

 각 레이어 별로 일정 비율의 Node를 아웃 시킴으로써, 훈련할때마다 input도 달라지고, 결합도 달라집니다. 따라서 결과적으로 여러개의 모델을 만드는 앙상블 모델로 볼 수 있습니다. 

 Dropout의 효과를 좀 더 깊게 이해하자면, dropout은 layer의 weight들이 동조화(co-adaptation) 하는 것을 피할 수 있게 해줍니다. 동조화라는 것은 쉽게 말해서 두개 이상의 노드가 하나의 노드처럼 활동하는 거라고 말할 수 있습니다. 이럴 경우 layer를 좌우로 넓히는 효과가 없어진다고 볼 수 있어서 모델의 성능이 떨어지고, 계산량만 증가하면서 학습 속도도 느려지게 될 것 입니다.

 

 


 FC layer를 활용한 코딩은 다음 포스팅에 이어서 하도록 하겠습니다. 코딩 자체가 복잡하지는 않으나, 딥러닝 관련 코딩을 처음 작성하게 되면 설명할 부분이 꽤 있어서, 글의 길이가 너무 길어지기 때문입니다.