juuuding
[Convolutional Neural Networks] Foundations of Convolutional Neural Networks 본문
[Convolutional Neural Networks] Foundations of Convolutional Neural Networks
jiuuu 2024. 8. 29. 00:28
이번 주제에서는 컴퓨터 비전의 "이미지 분류, 객체 감지, 신경 스타일 전이" 등의 문제를 해결해나갈 것이다. 컴퓨터 비전의 가장 큰 걸림돌은 입력의 크기가 아주 크다는 것이다. 예를 들어 64크기의 컬러 이미지가 입력으로 들어온다고 하면 64*64*3의 크기가 입력으로 들어온다. 이러한 걸림돌을 가진 문제들을 해결하기 위해서는 컨볼루션 연산을 잘 구현해야한다.
Edge detection example
예시로 이미지에서 수직 엣지를 감지하는 것에 대한 컨볼루션 연산을 해보겠다. 여기서는 6x6 grayscale 이미지에 3x3 필터로 연산을 하여 4x4 행렬을 생성된다.
입력 이미지를 보면 왼쪽에 수직 경계선이 있는데, 이 수직 경계선을 찾아내기 위해 수직 경계를 가진 필터를 적용하였다. 그 결과 이미지 가운데에 강한 경계선이 보이는 결과를 얻어내었는데, 이는 이미지의 차원이 더 크다면 더욱 정교하게 경계선을 얻을 수 있다. 이러한 원리로 합성곱 연산을 적용하여 엣지를 감지하는 것이다. 참고로 수평 경계선을 얻고 싶다면 위의 필터를 90도 회전하면 된다.
이러한 원리를 가지고 물체의 윤곽선을 검출하고자 할 때는 위의 방식처럼 필터 안의 값을 정하지 않고 변수로 두어 자동으로 학습하게끔 한다. 이 방식은 필터 안의 값을 직접 설정한 것보다 더 강력한 방식으로 학습된다.
Padding
합성곱 신경망 변형 방식 중 하나인 패딩에 대해 알아보겠다. 컨볼루션 연산을 계속해서 진행하면 할 때마다 크기가 축소되고 가장자리 부분은 결과 이미지에 딱 한 번만 사용이 되어 정보의 손실이 발생할 수 있다. 따라서 패딩을 적용하여 이미지 주변에 픽셀을 추가하여 크기를 보존한다. 일반적으로 패딩은 0으로 설정한다.
패딩의 크기를 지정하는 방법에는 "valid convolution"과 "same convolution"이 있다. valid convolution은 패딩을 적용하지 않는 것이고, same convolution은 출력 크기를 입력 크기와 동일하게 유지하기 위해 패딩을 적용하는 것을 의미한다. 일반적으로 컴퓨터 비전에서는 필터를 홀수의 크기로 설정하고, 패딩의 크기는 (필터 크기 - 1) / 2로 설정하여 입력 크기와 출력 크기를 동일하게 유지한다.
Strided convolutions
컨볼루션 연산에서 stride는 필터가 얼만큼의 간격으로 이동하며 연산을 수행하는지에 대한 정보다. 다음은 stride=2, input=4, filter=2에 대한 예시다.
위의 과정처럼 stride가 2라면 필터가 2칸씩 이동하면서 컨볼루션 연산을 수행한다. 만약 필터와 입력 크기가 맞지 않아 필터가 삐져나오는 부분이 있다면 그 부분은 연산을 하지 않는다. 따라서 stride, input size, filter size, padding으로 output의 크기가 결정이 되는데 이를 수식으로 나타내면 다음과 같다.
Convolutions over volumes
실전에서 컨볼루션 연산을 할 때는 입력이 깊이(채널)를 가진다. 따라서 필터도 깊이를 가져야 하는데 입력과 필터의 높이, 너비의 값은 달라도 되지만 채널 수는 동일해야한다. 예를 들어 만약 입력의 크기가 6x6x3이라면 필터의 크기는 3x3x3이 되어야 한다. 이렇게 깊이를 가지는 필터로 합성곱을 수행할 때는 위에서 보았던 연산 방식을 적용하되, 깊이 부분은 depth-wise로 연산을 한다. 이 방식으로 연산을 진행한 후 출력의 깊이는 연산을 진행한 필터의 개수로 설정된다
위의 예시를 보면 6x6x3이라는 입력에 3x3x3의 크기를 가지는 필터가 2개 있다. 이 필터들이 입력과 각각 컨볼루션 연산을 수행하고 오른쪽에 보이는 것처럼 depth-wise로 결과를 쌓는다. 따라서 출력의 깊이는 연산된 필터의 개수가 되는 것이다.
Summary of notation
f[l] : filter size
p[l] : padding
s[l] : stride
n_c[l] : number of filters
Each filters is : f[l] x f[l] x n_c[l]
Activations : a[l] = n_h[l] x n_w[l] x n_c[l]
Weights : f[l] x f[l] x n_c[l-1] x n_c[l]
bias : n_c[l]
Input : n_h[l-1] x n_w[l-1] x n_c[l-1]
Output : n_h[l] x n_w[l] x n_c[l]
n_h[l] = ((n_h[l-1] + 2p[l] - f[l]) / s[l]) + 1
n_w[l] = ((n_w[l-1] + 2p[l] - f[l]) / s[l]) + 1
Pooling layers
합성곱 네트워크 안의 레이어 종류는 convolution, pooling, fully connected 3가지가 있다. 앞선 내용들에서 convolution에 대해 알아보았고 이제 pooling에 대해 알아볼 것이다. pooling은 표현의 크기를 줄이고 계산 속도를 높이며 특징을 조금 더 견고하게 만든다. pooling의 종류에는 max pooling, average pooling 등이 있지만 일반적으로 max pooling을 사용한다.
[max pooling]
max pooling은 입력을 나누어 각 영역에서의 최대 값을 선택하여 표현의 크기를 줄인다. 위의 예시에서는 4x4 입력이 2x2로 축소되었다.
[average pooling]
average pooling은 각 영역에서 평균을 취하여 표현의 크기를 줄이는 방식이다. 실제로 많이 사용하진 않지만 아주 깊은 신경망에서는 종종 사용하기도 한다.
이러한 pooling에도 필터 크기, 스트라이드와 같은 하이퍼파라미터가 있으며 출력의 크기를 결정한다. 그리고 pooling은 3D 입력의 각 채널에 독립적으로 적용된다. 여기에는 학습할 매개변수는 없다. 참고로 pooling에서 filter size=2, stride=2로 설정하면 입력의 높이와 너비를 절반으로 줄여주는 효과가 난다.
Convolutional neural network example
LeNet-5의 과정을 그림으로 그려보았다. conv-pool-conv-pool-fc-fc-fc-softmax 구조다.
신경망이 깊어질수록 높이, 너비는 줄어들고 깊이는 커지는 것을 확인할 수 있다. 그리고 신경망에서 층의 개수를 셀 때는 가중치 / 매개변수를 가지는 층만을 세기 때문에 pooling은 layer 개수에 영향을 미치지 않는다.
Why convolutions?
합성곱을 사용하는 이유는 "parameter sharing", "sparsity of connections" 크게 2가지가 있다.
1. Parameter sharing
매개변수 공유는 동일한 필터가 입력 데이터의 여러 위치에서 반복적으로 사용된다는 것을 의미한다. 즉, 하나의 필터가 이미지의 모든 영역을 스캔하며 동일한 가중치를 적용하여 특징을 추출한다. 이로 인해 신경망이 학습해야할 가중치의 수가 감소하고, 더 적은 데이터로 학습하여 과적합을 방지할 수 있게 된다. 그리고 동일한 필터가 입력 데이터의 여러 위치에서 동일한 특성을 감지할 수 있으므로, 이미지의 어느 부분이든 동일한 유형의 패턴을 인식할 수 있게 한다.
2. Sparsity of Connections
연결의 희소성은 합성곱 신경망에서 각 뉴런이 입력 데이터의 전체가 아닌 일부와만 연결된다는 것을 의미한다. 다시 말해 합성곱 연산은 입력의 특정 부분만을 보고 그 부분에 대한 출력을 계산한다. 따라서 필터가 이미지의 일부분에만 적용되기 때문에 계산량이 감소하고, 이는 고해상도 이미지나 긴 시퀀스 데이터에 유리한 역할을 한다. 그리고 이미지에서 국소적인 패턴을 학습하는데 아주 유용해지는 효과도 있다.
※ 출처
패딩 사진 - https://ruhelalakshya.medium.com/convulational-padding-and-stride-59cb1b20c919