kil_alpaca
기록하는 습관
kil_alpaca
전체 방문자
오늘
어제
  • 분류 전체보기 (117)
    • 잡다한 오류 (2)
    • 머신러닝 & 딥러닝 (4)
      • 이론 (2)
      • 통계 기법 (2)
      • 잡다한 오류 (0)
    • Pytorch (6)
    • Tensorflow 2 (1)
      • 오류 처리 등등 (1)
    • Ubuntu (3)
      • 이것저것 (2)
      • 오류 처리 등등 (1)
    • Problem Solving (93)
      • Dynamic Programming (52)
      • Convex Hull Trick (8)
      • Dijkstra (33)
    • 자료구조 (3)
      • 기본 자료구조 (2)
      • Tree (1)
    • 알고리즘 (5)
      • 기하학 (4)
      • 최적화 기법 (1)

블로그 메뉴

  • 홈

공지사항

인기 글

태그

  • Tensor
  • 통계기법
  • 다익스트라
  • Convex Hull Trick
  • DP
  • DP optimization
  • convex hull
  • glorot 초기화
  • 기하학
  • CCW
  • 머신러닝
  • 자료구조
  • 그래프 이론
  • 그래프 탐색
  • 백준
  • CHT
  • Dijkstra
  • 데이크스트라
  • 텐서
  • 통계
  • kaiming 초기화
  • Li Chao Tree
  • dynamic programming
  • Convex Hull Optimization
  • 파이토치
  • 딥러닝
  • he 초기화
  • convolution layer
  • 알고리즘
  • pyTorch

최근 글

티스토리

hELLO · Designed By 정상우.
kil_alpaca

기록하는 습관

머신러닝 & 딥러닝/이론

Convolution Layer

2023. 4. 12. 23:41

0. 개요

Neural Net 을 이루는 기본 layer 중 Convolution layer 에 대해 적어보려 한다.

구체적인 이론보다는, 혼자 독학하고 쉽게 이해한 내용을 바탕으로 기술하려고 한다.

틀린 내용이 있다면 차차 수정해 나가도록 하겠다.

GIF 는 모두 다음 깃헙에서 가져왔다. (https://github.com/vdumoulin/conv_arithmetic)

 

1. 기본 개념

https://github.com/vdumoulin/conv_arithmetic

Convolution layer 는 주어진 입력에 대해 convolution 연산을 하는 layer 를 말한다.

1차원, 2차원, 3차원 입력이 주로 사용되고,

입력의 차원 수에 따라 conv1d, conv2d, conv3d 등으로 불리기도 한다.

위 그림은 2차원 입력에 대한 convolution layer 의 동작을 나타낸다.

 

convolution 연산은 input 위에서 kernel 이 움직이며,

대응하는 원소끼리 곱한 것을 모두 더하는 것을 말한다.

이 연산으로 입력의 부분적인 특징을 잡아낼 수 있다.

 

무조건 정해진 건 아니지만,

1차원 conv layer 는 자연어 처리,

2차원 conv layer 는 이미지 처리,

3차원 conv layer 는 더 고차원의 task 를 위해 주로 사용한다.

 

그도 그럴것이, 차연어는 문장의 sequence (1D) 고

이미지는 가로 X 세로 (2D) 이기 때문이다.

 

2. 용어

Convolution layer 와 관련된 용어가 헷갈리기도 하고 많은 편이다.

나도 처음에 헷갈려서 고생했는데, 최대한 이해한 바를 바탕으로 설명하고자 한다.

 

이해하기 쉬운 2D Convolution layer 를 기준으로 설명한다.

https://github.com/vdumoulin/conv_arithmetic

Input

 

위 그림에서 아래쪽 밝은 파란색의 직사각형이다.

2D Conv layer 의 경우, 이미지라고 생각하면 편하다.

 

 

Kernel

 

위 그림에서 움직이는 아래쪽 어두운 파란색 직사각형이다.

Kernel 이나 Filter 나 같은 의미다.

Kernel 이 바로 convolution layer 의 핵심이다.

convolution layer 를 학습한다는 것은 곧 kernel 을 학습한다는 것과 같은 말이다.

 

2D conv layer 에서는 kernel 도 2차원으로 생성된다. (정확히는 4차원이다. 마지막에 자세히 서술...)

kernel 은 input 의 왼쪽위부터 오른쪽 아래로 순회하면서 convolution 값을 계산한다.

따라서 kernel 크기는 output 크기에도 영향을 미친다.

그리고 kernel 은 반드시 정사각형일 필요는 없다.

 

 

Feature map

 

위 그림에서 위쪽 초록색 직사각형을 말한다.

특성맵 또는 Activation map 이라고도 부른다.

feature map 은 input 과 kernel 의 convolution 연산 결과값을 모은 것이라고 생각하면 된다.

feature map 을 이용해서 output 이 계산되며,

feature map 의 height, width 가 곧 output 의 height, width 가 된다.

 

 

Channel

https://indoml.com/2018/03/07/student-notes-convolutional-neural-networks-cnn-introduction/

간단히 복습해보면,

위 그림에서 Filter 는 Kernel 과 같고, kernel 오른쪽의 직사각형은 feature map 이다.

그리고 또 하나 중요한 channel 이 무엇인지 나타나 있다.

 

channel 은 input 과 output 의 깊이 라고 생각하면 편하다.

그래서 channel 을 depth 라고 부르는 경우도 있다.

위 그림에서 보면, input 의 channel 은 3개고 output 의 channel 은 2개다.

height 와 width 가 같은 직사각형의 개수, 즉 쌓아올려진 개수 또는 깊이 라고 생각하면 편하다.

 

그럼 여기서 의문이 들지도 모른다.

채널이 여러 개면 kernel 도 여러 개인가??

 

답은 '그렇다' 이다.

모든 input channel 에 kernel 단 1개만으로 사용하지 않는다.

input channel 마다 각각 다른 kernel 이 만들어지고, 나중에 학습된다.

위 그림의 input channel 은 3이기 때문에, kernel 은 3개가 된다.

 

그런데 이상하다.

그림에서는 위 3개, 아래 3개 합쳐서 모두 6개의 kernel 이 있다.

왜 kernel 이 6개나 될까?

 

그 이유는 output 의 channel 수가 2 이기 때문이다.

input 의 channel 만 여러 개일 필요는 없다.

output 의 channel 도 얼마든지 다양하게 나올 수 있다.

그래서 output channel 각각에 대해서도 새로운 값을 만들어주어야 한다.

output 이라고 해서 모두 같은 값으로 내보내면, channel 을 여러개 만들 이유가 없기 때문이다.

 

따라서 위 그림에 따르면,

위쪽은 output 의 0번째 channel 을 만들기 위해 input channel 3개에 대한 kernel 을 만든 것이고,

아래쪽은 output 의 1번채 channel 을 만들기 위해 input channel 3개에 대한 kernel 을 만든 것이다.

 

마지막으로 하나 더 물음이 있다.

output channel 당 kernel 이 여러 개라면, (input channel 이 여러 개라서)

그 output channel 에 해당하는 feature map 은 어떻게 계산될까?

정답은, 그 output channel 에 해당하는 kernel이 만든 feature map 을 모두 더해서 하나의 feature map 을 만든다.

그래서 위 그림에서도 3번째 열인 feature map 이 위/아래 각 1개씩만 있는 것이다.

 

 

padding

https://github.com/vdumoulin/conv_arithmetic

이번엔 padding 에 관한 내용이다.

padding 은 말 그대로, 무언가 빈 공간에 값을 채워넣는 것을 의미한다.

 

일반적으로 $1 \times 1$ 보다 큰 kernel 을 사용하면,

feature map 의 크기가 input 보다 작아지는 경향이 있다.

이는 convolution layer 가 여러 개 쌓일수록,

데이터의 크기가 너무 작아진다는 문제를 일으킨다.

 

따라서 input 의 테두리에 0이나 1과 같은 특정한 padding value 를 추가하여

output 의 크기를 조금 더 늘리기 위해 padding 을 사용한다.

위 그림은 테두리에 1만큼 padding 을 추가하여

input 과 feature map (output) 의 크기를 동일하게 맞춘 경우다.

 

반드시 input 과 output 의 크기가 같아질 필요는 없으며,

padding 을 크게 만들면 output 이 input 크기보다 더 커질수도 있다.

 

 

Stride

https://github.com/vdumoulin/conv_arithmetic

Stride 는 kernel 이 한 번에 이동하는 거리를 의미한다.

stride 가 1이면 1칸씩 이동하는데, 위 그림은 stride 가 2 라서 2 칸씩 이동하고 있다.

stride 를 늘리면, kernel 이 보는 영역을 최대한 덜 겹치게 하는 효과가 있다.

반면 stride 가 커질수록 보는 영역의 개수가 작아질 수밖에 없으므로

feature map (output) 의 크기가 작아질 수 있음에 유의해야 한다.

 

 

Dilation

https://github.com/vdumoulin/conv_arithmetic

Dilation 은 조금 생소할 수도 있다.

쉽게 말하면, kernel 원소 사이의 거리를 말한다.

dilation 이 1 이면 kernel 은 원소가 모두 붙어 있는 직사각형이 된다.

그러나 위 그림처럼 dilation 이 2 가 되면 kernel 원소들이 서로 일정 거리를 두고 떨어진다.

 

dilation 을 높이면 보다 넓은 영역의 특징을 잡아낼 수 있다는 효과가 있다.

하지만 너무 높이면 feature map (output) 의 크기가 작아질 수 있음에 유의해야 한다.

 

3. 차원 수 계산

지금까지 기본적인 convolution layer 에 관련된 용어들을 살펴보았다.

내용이 너무 많아서 헷갈리지만... 자주 보고 최대한 이해해보자.

 

이번에는 input 크기에 따른 output 의 크기를 계산해보고자 한다.

input 크기는 우리가 어쩔 수 없다. 왜냐면 이미 외부에서 주어지기 때문이다.

output 의 크기를 결정하는 요소들은 다음과 같다.

 

1) $channel_{in}$ / $channel_{out}$

- input / output 의 channel 수

 

2) $H_{kernel}$ / $W_{kernel}$

- kernel 의 높이 / 너비

 

3) $H_{stride}$ / $W_{stride}$

- 세로 방향 stride / 가로 방향 stride

 

4) $H_{padding}$ / $W_{padding}$

- 세로 방향 padding 개수 / 가로 방향 padding 개수

 

5) $H_{dilation}$ / $W_{dilation}$

- 세로 방향 dilation / 가로 방향 dilation

 

input 의 높이 / 너비 를 가지고 output 의 높이 / 너비를 구하는 구하는 공식은 아래와 같다.

$$ H_{out} = \lfloor \frac{H_{in} + 2 \times H_{padding} - H_{dilation} \times (H_{kernel} - 1) - 1}{H_{stride}} + 1 \rfloor $$

$$ W_{out} = \lfloor \frac{W_{in} + 2 \times W_{padding} - W_{dilation} \times (W_{kernel} - 1) - 1}{W_{stride}} + 1 \rfloor $$

 

좀... 복잡하다....

그런데 이건 다 dilation 때문이고,

dilation 은 자주 쓰지도 않으므로 아래 수식만 눈여겨봐도 충분하다.

$$ H_{out} = \lfloor \frac{H_{in} + 2 \times H_{padding} - H_{kernel}}{H_{stride}} + 1 \rfloor $$

$$ W_{out} = \lfloor \frac{W_{in} + 2 \times W_{padding} - W_{kernel}}{W_{stride}} + 1 \rfloor $$

 

4. weight / bias

마지막으로 convolution layer 의 weight 와 bias 에 대해 이야기해보자.

이번에도 2D conv 기준으로 하겠다.

 

convolution layer 의 weight 는 kernel 이라고 생각해도 된다.

kernel 크기는 우리가 직접 지정할 수 있고, 높이와 너비가 있다. ($H \times W$)

input channel 별로 kernel 이 따로 존재해야 한다. ($channel_{in} \times H \times W$)

또 이것이 output channel 별로 따로 존재해야 한다. ($channel_{in} \times channel_{out} \times H \times W$)

 

convolution 에도 bias 는 존재한다.

feature map 으로부터 output 의 각 channel 이 결정되고 난 후,

각 channel 의 모든 원소에 각각 동일한 bias 를 모두 더해준다.

즉, output channel 개수만큼 bias 가 존재한다. ($channel_{out}$)

저작자표시 비영리 변경금지 (새창열림)

'머신러닝 & 딥러닝 > 이론' 카테고리의 다른 글

Gradient vanishing / exploding  (0) 2023.04.17
    '머신러닝 & 딥러닝/이론' 카테고리의 다른 글
    • Gradient vanishing / exploding
    kil_alpaca
    kil_alpaca

    티스토리툴바