본문 바로가기
기계학습/자연어 처리 머신러닝

합성곱 신경망 - 딥러닝을 이용한 자연어처리 입문

by tryotto 2020. 2. 21.

  CNN : 합성곱 신경망 - Convolutional Neural Network









# CNN 기본 개념



- 구조 : 합성곱층(Conv. layer) + 풀링층(Pooling)


    1) 합성곱층 : 합성곱(Conv) 단계 + 렐루(Relu) 단계

    2) 풀링층 : 풀링 연산 진행




- 필요성 : 이전의 다층 퍼셉트론 종류의 한계 때문

    ** 다층 퍼셉트론 : 은닉층이 여러 개 있는 머신러닝 기본 모델

    - CNN 도 다층 퍼셉트론의 한 종류. 여러 개의 Dense 레이어들로 구성된 것도 다층 퍼셉트론의 종류.


    - 이전 다층 퍼셉트론 (Dense 층 등) 의 한계 : 3D -> 2D 전처리를 반드시 해야 함

** (batch, width, height) 의 3차원 텐서를 입력값으로 받을 경우, 반드시 (batch, w * h) 의 2차원 텐서로 전처리 해줘야 했다

      ** 근데, 이것도 Embedding 층을 거치게 되면 결국 (batch, w * h, onehot) 의 3차원 텐서로 다시 변형되어 전달됨 ㅋㅋ;;

** Why? 모름. 그냥 관행상 그래왔음. 다른 방법이 아직 개발되지 못했던 시기였는듯


          - 한계 : "공간적 특성" 을 잃어버린다!

  -> 상하좌우에 어떤 값을 지니고 있었는지가 무의미해짐 (  (w,h) 였던 값을 (w*h) 값으로 바꿔버렸으니.. )

  -> 이미지의 경우, 공간적 특성을 반영하는게 중요한데

      CNN 은 공간적 특성마저 반영해서 학습을 시키도록 해준다!!


- 이미지의 기본 구조 : (height, width, channel)

     1) height, width : 말 그대로, 이미지의 높이와 너비

     2) channel : R, G, B 각각에 대해서 하나의 layer 가 생긴다고 보면 된다

> 각각의 R, G, B 층은 일반적으로 8비트인 256 pixel 값으로 채워진다.

   (즉, 내부 값이 0~255 의 값들 중 하나라는 것. 원핫 이 아니다!)








< CNN 적용 단계 >


# CNN 의 각 단계 (1) : 합성곱 연산 (Conv. 연산)


- 입/출력 값 :

     1) 인풋 값 : (batch, height, width) 의 3차원 텐서

     2) 출력 값 : 커널(=필터) 와의 연산이 완료 된 "특성 맵"(=feature map)


- 목적 : 이미지의 특성을 추출하기 위함


- 기본 용어 설명

     1) 커널(=필터) : 

  - 3*3 또는 5*5 크기의 배열 (2D 배열)

- 원핫 으로 구성


     2) 특성 맵 :

- 커널과의 합성 곱 연산을 마무리 한 후의 결괏값 (2D 배열)


     3) stride (=스트라이드) :

- 합성 곱을 하는 과정 하나하나마다, 커널을 얼만큼씩 이동하면서 연산할 것인가?


     4) padding (=패딩) :

- 자연어 처리에서도 언급했던, "덧붙이는" 과정

- 의의 : 특성맵의 크기는 원본보다 크기가 작을수밖에 없다    

      -> 굳이, 특성맵의 크기를 원본과 똑같이 유지하고싶다면 padding 연산을 해주면 된다

-> 가장자리 부분을 0 으로 채워주는 것이며, 따로 패딩 부분은 제외하고 계산하는 방법도 

    있기 때문에 padding 연산은 디폴트로 해주는게 낫지 않을까 싶다.



- 커널(=필터) 사용 의의 :

     - 밀집 층의 경우, 가중치(weight) 가 여러개 필요했음

> 임베딩된 인풋 벡터 차원 수 = N,  밀집층의 벡터 차원 수 = M 일때,

   가중치 갯수 = N*M 


     - 커널 사용시, "커널의 크기만큼만" 가중치(weight)를 필요로 한다

> 커널 크기가 3*3 인 경우, 가중치 갯수 = 9

     >> 더 적은 갯수의 가중치를 학습해도 되며 (=매개변수=파라미터)

          이미지의 공간적 특성도 반영할 수 있다





# CNN 의 각 단계 (2) : 활성화 함수 통과


- 의의 : 비선형성을 추가하기 위함

     > WHY?

- 선형성만 갖고 있는 모델의 경우, 

  데이터 값이 선형모델로는 절대 처리할 수 없는 경우에 대해서 대응이 불가능함.

- 억지로 비선형성을 추가해주는 것.


- 주로 사용하는 활성화 함수 : ReLU 함수


- 다른 퍼셉트론에서도, 활성화함수를 추가해서 비선형성을 추가해준다! 

   (CNN에만 국한되는게 아님)






# CNN 의 각 단계 (3) : 풀링 (Pooling)



- 방식 : 특성맵을 구했다면, 다시 한 번 더 "특성들" 을 추출해내는 과정을 거친다

     > 특정 크기만큼의 샘플들로부터 대표값을 "하나씩" 뽑아온다



- 종류 : 

     1) Max Pooling (샘플중에서 가장 큰 값을 추출)

     2) Average Pooling (샘플들의 값들을 평균 내서 추출)



- 합성곱 연산과의 차이점?

     1) 합성곱 연산 : N 개의 채널들이 인풋으로 들어온다면, 1개의 채널 값으로 축소되어서 출력된다

WHY?  맨 마지막에, 각각의 채널들에 해당되는 특성 맵을 "더하는" 과정이 있기 떄문

> 즉, "차원" 자체가 줄어들게 된다 (3차원->2차원)


     2) 풀링 : 각각의 채널들에 대해 대표 값들만 찾아서 "크기"를 줄일 뿐, "차원"을 줄이지는 않는다

> (3차원->3차원) 또는 (2차원->2차원)









# CNN 적용 : 여러 개의 채널에 대해서?


     - 추가 연산 : 


  1) 1단계인 합성곱 연산(Convolution Operation) 과정에서, 

      "각 채널에 대해서" 커널을 이용해 특성맵을 추출한다


  2) 추출해낸 여러 개의 특성맵들을 한 곳으로 모아서, "한꺼번에 더해"준다

   > 이 결괏값을 새로운 특성맵으로 사용한다 (이것만 사용. 이전의 특성맵들은 더 이상 사용 안 함)



      - 커널 텐서 차원 수 :

  - 인풋 값이 3차원 텐서라고 하자 : (height, width, channel)

  - 이때, 커널도 마찬가지로 3차원 텐서여야 한다 : (3, 3, channel) 또는 (5, 5, channel)

> 그래야, "각각의 채널" 에 대해 "맞춤형" 커널 곱을 해줄 수 있다

      - 입출력 텐서 차원 수 :

   - 인풋 텐서 : 3차원

   - 커널 텐서 : 3차원

   - 출력값 텐서 : 2차원 !!!!!!

         WHY? 특성맵을 구해준 다음에, 결국엔 "합"을 구해준다고 했다!!


      - "여러 개"의 커널 텐서들을 사용한다면? :

   - 3차원 텐서의 커널들을 N 개 사용한다고 하자

   - 그렇게 된다면, 각각의 커널들을 한개씩 뽑아서, 이에 대응되는 특성맵 2차원 텐서를 출력해낸다

   - 결국, N 개의 특성맵 2차원 텐서들이 쌓이게 된다

         >> 2차원 텐서 * N = 3차원 텐서 !!!




# CNN 에서 학습해야 하는 매개변수들은 뭘까?


- 커널들!
1) 커널의 두께 = a
2) 커널의 갯수 = b
3) 커널의 높이 = c
4) 커널의 너비 = d

> 학습해야 하는 매개변수의 수 =   a x b x c  x d