0. 개요
Neural Net 을 이루는 기본 layer 중 Convolution layer 에 대해 적어보려 한다.
구체적인 이론보다는, 혼자 독학하고 쉽게 이해한 내용을 바탕으로 기술하려고 한다.
틀린 내용이 있다면 차차 수정해 나가도록 하겠다.
GIF 는 모두 다음 깃헙에서 가져왔다. (https://github.com/vdumoulin/conv_arithmetic)
1. 기본 개념
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 를 기준으로 설명한다.
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
간단히 복습해보면,
위 그림에서 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
이번엔 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
Stride 는 kernel 이 한 번에 이동하는 거리를 의미한다.
stride 가 1이면 1칸씩 이동하는데, 위 그림은 stride 가 2 라서 2 칸씩 이동하고 있다.
stride 를 늘리면, kernel 이 보는 영역을 최대한 덜 겹치게 하는 효과가 있다.
반면 stride 가 커질수록 보는 영역의 개수가 작아질 수밖에 없으므로
feature map (output) 의 크기가 작아질 수 있음에 유의해야 한다.
Dilation
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 |
---|