Convolutional Neural Network
Convolution을 사용하는 Neural Network는 주로 CV에서 사용되지만 Multimodal을 공부하기 위해선 필수라고 생각해서 자세히 이해해보려고 합니다.
Convolution이란?
컨볼루션을 직접 계산할 때는 한 신호를 고정시키고, 다른 신호는 y축 대칭 후 시간축에서 t만큼 평행이동한 것으로 나타낸 후, 시간변수 t가 음의 무한대부터 양의 무한대까지 이동하며 중첩된 영역의 두 함수값을 곱한 값의 적분(이산시간의 경우 시그마)을 계산하여 시간에 대한 함수로 나타낼 수 있습니다.
위 그림을 보면 f가 고정돼있고 g가 움직이고 있습니다. g가 필터 역할을 하면서 f의 신호를 해석하는 것입니다.(f = 이미지, g = 커널)
*여기서 중요한 점은 이산시간이 아니라 연속 시간이기 때문에 시계열 데이터에서는 다른 방법으로 사용해야 됩니다.
이러한 convolution을 실제로는 어떻게 계산하는지 자세히 살펴봅시다. 여기 2D convolution이 있습니다.
f 행렬을 g 커널을 통해서 특징을 추출하는 과정입니다. 여기서는 2D라서 커널(g)을 x축 대칭 후 y축 대칭을 시켜줍니다.
이후 이렇게 각 칸을 계산해준 뒤 모든 값을 더하면 됩니다.
이렇게 커널을 활용해서 이미지의 특징값을 뽑아낼 수 있는 것이 convolution의 장점입니다.
위 그림은 경우에는 각 축으로 필터를 만들어서 Edge detection을 하는 과정입니다.
이처럼 커널(g)에 따라 이미지에서 원하는 특징을 추출할 수 있습니다. 하지만 처음에는 커널을 사람이 직접 만들었다면 커널을 인공지능이 스스로 만들고 특징을 뽑아서 어떤 이미지인지 예측하는 네트워크가 CNN이라고 할 수 있습니다.
Convolutional Neural Network
CNN은 주로 이미지 분석에 사용되고, 가중치(w)를 공유하기 때문에 연산량이 많지 않다는 장점이 있습니다. CNN은 convolution을 통해 먼저 이미지의 특징값들을 추출하고, FC Layer에 전달해서 값을 예측하는 구조로 이루어져 있습니다.
만약 convolution을 사용하지 않고 바로 FC Layer에 이미지를 넣게 되면 이미지가 회전하거나 밀렸을 때 정확하게 예측할 수 없습니다.
또한 원래 neural network에서는 왼쪽 구조와 같이 7 x 5= 35개의 파라미터가 존재하지만 convolution에서는 파라미터를 공유하기 때문에 연산량이 매우 적다는 장점이 있습니다.
convolutional layer에서는 channel 수를 맞춰주는 것이 중요합니다.
convolution의 output channel은 커널의 갯수와 같기 때문에 input channel과 같지 않습니다.
convolution의 output size는 input size보다 작습니다. 따라서 사이즈를 맞춰주기 위해 0으로 padding을 합니다.(zero padding) 이렇게 하면 끝쪽에 있는 이미지도 잘 판단할 수 있다는 장점이 있습니다.
Why is the spatial resolution decreasing?
왜 공간 해상도가 감소하고 있나요?
- 공간 해상도를 줄임으로써, 각 뉴런이 볼 수 있는 입력의 영역, 즉 수용 영역(Receptive Field)이 커집니다. 이는 더 큰 범위의 정보를 통합하여 더 높은 수준의 특징을 추출하는 데 유리합니다.
- 공간 해상도를 줄이면 계산해야 할 픽셀 수가 줄어들기 때문에, 동일한 계산 비용으로 더 많은 필터를 적용할 수 있습니다. 이는 모델이 다양한 특징을 더 잘 학습하도록 도와줍니다.
Receptive Field는 커널 크기와 비슷한 개념입니다. CNN은 우선 대략적인 특징을 추출한 뒤 더 세부적인 특징을 추출하는 방식으로 동작합니다. 따라서 stride와 pooling을 통해 공간 크기를 점점 줄이는 방식으로 진행됩니다.
컨볼루션 연산에서 스트라이드를 사용하여 필터가 이동하는 간격을 조정합니다. 스트라이드를 1보다 크게 설정하면 출력 크기가 줄어듭니다.
주로 최대 풀링(max pooling)이나 평균 풀링(average pooling)을 사용하여 공간 해상도를 줄입니다. 이는 입력의 크기를 줄이면서 중요한 정보만 남기고 불필요한 정보를 제거하는 효과가 있습니다.
Fully connected layer
Fully Connected Layer는 네트워크의 마지막 부분에 위치한 계층으로, 모든 입력 뉴런이 모든 출력 뉴런과 연결된 구조입니다. 특징 추출 레이어와 Fully Connected Layer를 연결하는 과정에서, 입력 데이터를 1차원 벡터로 변환하는 작업을 합니다. 이 과정을 Flatten 또는 Linear라고 합니다.
예를 들어, 2차원 행렬 형태의 특징 맵을 1차원 벡터로 변환하여 Fully Connected Layer에 전달합니다.
FC Layer의 output size는 최종적인 class 갯수로 구성됩니다.
각 커널의 output size는 다음과 같이 계산할 수 있습니다.
우선 input 이미지를 보면 32 x 32의 3 channel 이미지인 것을 알 수 있습니다. 따라서 맨 첫번째만 계산해보면 input size가 32, 커널 사이즈가 5, stride가 1이기 때문에 output size는 (32–5) / 1 + 1 = 28이고 필터의 갯수인 6 channel이 됩니다. weight의 갯수는 5 x 5에 3 channel 이미지라서 3을 곱해주고 bais 1을 더하고 필터의 갯수인 6을 곱하면 됩니다.
1x1 convolution
1x1 컨볼루션은 필터의 공간적 크기가 1x1인 컨볼루션 연산을 의미합니다. 이 필터는 각 공간 위치에서 채널 간의 가중치 합을 계산하여 채널을 혼합(mixing)합니다.
1x1 컨볼루션을 통해 입력 볼륨의 채널 수를 원하는 만큼 줄이거나 늘릴 수 있습니다.
예를 들어, 32×32×256크기의 입력 볼륨을 1x1 컨볼루션을 사용하여 32×32×64 크기로 변환할 수 있습니다. 이는 네트워크의 파라미터 수를 줄여 계산 비용을 감소시킬 수 있습니다.
다음과 같은 예시가 있습니다.
1x1 없이 바로 계산하게 되면 약 200k 파라미터가 필요합니다.
하지만 1x1로 channel 수를 줄이고 계산하면 55k의 파라미터만 있으면 됩니다. 이는 이후 채널수를 조절하여 모델의 계산 비용을 줄이면서 성능을 향상시키는 데 중요한 역할을 합니다.
LeNet
LeNet-5는 CNN을 처음 사용하여 사람 손글씨 데이터(MNIST Dataset)를 인식하는 모델입니다. LeNet-5의 전체적인 구조는 [CONV-POOL-CONV-POOL-FC-FC]로 구성되어 있습니다. 이때 input 이미지는 32 x 32 x 1인 grayscale 이미지 입니다.
각 계층을 자세히 보면 다음과 같습니다.
C1 Layer(Convolution)
5 x 5 conv, 6 kernels, stride: 1, padding: 0
32 x 32 사이즈의 이미지를 6개(6채널)의 5 x 5 필터와 컨볼루션 연산을 해줍니다. 그 결과 6장의 28 x 28 특성 맵(Feature map)을 얻게 됩니다.
(5 * 5 * 1 + 1) * 6 = 156
S2 Layer(Subsampling)
average pooling 2 x 2
6장의 28 x 28 특성 맵에 대해 서브샘플링(subsampling, pooling)을 진행합니다. 결과적으로 28 x 28 사이즈의 특성 맵이 6장의 14 x 14 사이즈의 특성맵으로 축소됩니다. 2 x 2 필터를 stride 2로 설정해서 서브샘플링(average pooling)해주기 때문입니다.
(1 + 1) * 6 = 12
풀링은 원래 파라미터가 필요 없지만 논문에 의하면 뭔가 추가 작업을 해주기 때문에 파라미터가 필요합니다.
C3 Layer(Convolution)
5 x 5 conv, 16 kernels, stride: 1, padding: 0
6장의 14 x 14 특성맵에 5 x 5 커널의 컨볼루션 연산을 수행해서 16장의 10x10 feature map을 만들어냅니다.
C3 Layer는 특징점이 겹치지 않도록 위 그림과 같이 특별한 작업을 해줍니다.
(5 * 5 * 3 + 1) * 6 = 456
(5 * 5 * 4 + 1) * 6 = 606
(5 * 5 * 4 + 1) * 3 = 303
(5 * 5 * 6 + 1) * 1= 151
= 1516
S4 Layer(Subsampling)
2x2 average pooling
16장의 10 x 10 특성 맵에 대해서 서브샘플링을 진행해 16장의 5 x 5 특성 맵으로 축소시킵니다.
(1 + 1) * 16 = 32
C5 Layer(Convolution)
5x5 conv, 120 kernels, stride: 1, padding: 0
16장의 5 x 5 특성맵을 120개의 5 x 5 x 16 사이즈의 필터와 컨볼루션 해줍니다. 결과적으로 120개의 1 x 1 특성맵이 산출됩니다. FC Layer에 값들을 넣어주기 위해 많은 커널을 사용하는데 이 때 파라미터 수가 많이 늘어납니다.
(16 * 5 * 5 + 1) * 120 = 48120
이후 FC Layer를 들어가서 다음과 같이 계산됩니다. 여기서 F6 Layer의 output이 84인 이유는 아스키 코드를 염두해두고 만들었다고 합니다.
(120 + 1) * 84 = 10164
최종적으로 output layer에서는 (84 + 1) * 10 = 850 개가 됩니다.
따라서 총 파라미터의 수는 60850 개입니다.
AlexNet
AlexNet은 ImageNet 대회에서 처음으로 CNN 기반 모델이 우승을 차지한 모델입니다.
과거에는 라벨링된 데이터셋이 너무 작아 딥러닝 모델을 훈련시키기에 충분하지 않았습니다. 그러나 AlexNet은 수백만 개의 이미지(fullcolor)와 수천 개의 클래스가 포함된 대규모 데이터셋인 ImageNet을 사용했습니다.
초기 딥러닝 연구에서는 컴퓨터의 처리 속도가 매우 느렸습니다. 그러나 2010년대에 들어 GPU(그래픽 처리 장치)의 성능이 비약적으로 향상되면서, 대규모 신경망을 훈련시키는 것이 가능해졌습니다. AlexNet 역시 GPU를 사용하여 훈련 속도를 크게 높였습니다.
이전에는 신경망의 가중치를 비효율적으로 초기화했기 때문에 학습 과정에서 문제가 발생했습니다. AlexNet에서는 가중치를 효과적으로 초기화하여 학습을 안정화하고 성능을 향상시켰습니다. Activation function의 중요성을 보여준 모델이기도 합니다.
ZFNet
기존 AlexNet을 조금 수정해서 만든 모델입니다. DeconvNet을 처음으로 제안했고, 이는 심층 신경망, 특히 컨볼루션 신경망(CNN)의 내부 동작을 이해하는 데 도움을 줍니다. DeconvNet은 Deconvolutional Network의 약자로, 이미지의 특징 맵을 원래 이미지 공간으로 역투사하는 방법입니다. 이는 CNN이 어떤 특징을 학습하고 있는지를 시각적으로 보여줍니다.
DeconvNet 시각화는 CNN이 어떻게 작동하는지 이해하고, 모델의 학습 과정을 개선하는 데 중요한 도구입니다. 이를 통해 모델의 해석 가능성을 높이고, 더 나은 성능을 위한 인사이트를 얻을 수 있습니다.
VGGNet
이후 네트워크가 깊어지기 시작합니다. 당시 GoogLeNet에게 밀려 아쉽게 2등을 했습니다.
VGG는 convolution 사이즈를 3 x 3으로 고정하여 깊이가 깊어짐에 따라 어떤 영향을 미치는지 연구했습니다. 연구 당시 7 x 7 커널 하나랑 3 x 3 커널 3개를 사용하는거랑 비슷한 성능을 가져온다는 것을 찾아냈습니다.
CNN의 특징 중 하나가 이미지 하나를 이해할때 커널이 가지는 파라미터는 convolution 연산을 할때 공유하는 것입니다. 따라서 bais를 제외하면 3 x 3 커널 3개를 쓸때 27개의 파라미터만 있으면 됩니다. 반면 7 x 7은 49개의 파라미터가 필요하기 때문에 더 적은 연산량으로 좋은 성능을 만들 수 있는 것입니다. 또한 activation function을 3번 지나기 때문에 non-lnearities도 더 잘 보존할 수 있는 장점도 있습니다.
VGG의 contribution은 위 표와 같이 layer 갯수를 계속 늘리면서 얼마나 깊어질 수 있는지 확인했다는 점이 있습니다.
GoogLeNet
주요 특징은 인셉션 모듈(Inception module)을 사용하여 다양한 크기의 필터를 병렬로 적용하는 것입니다. 인셉션 모듈은 아래 그림과 같이 여러 사이즈의 커널로 나누어서 feature map을 추출하는 것입니다. 따라서 다양한 특징을 한번에 추출할 수 있다는 장점이 있습니다.
또한 1x1 컨볼루션(bottleneck layer)을 사용했는데 채널 수를 줄여 계산 비용을 줄이고, 모델의 깊이를 늘립니다. 이는 네트워크의 효율성을 높이고, 더 많은 비선형성을 추가합니다.
또한 그림의 빨간색 부분에서 미리 error를 계산해두기 때문에 gradient vanishing 문제를 방지할 수 있습니다. FC layer 이전에 flatten을 해주는게 아니라 average pooling을 사용해서 연산량을 많이 줄일 수 있었습니다.
인셉션 모듈을 사용하여 계산 비용을 절감하면서도 성능을 유지합니다. 이는 모델이 더 많은 데이터를 처리할 수 있도록 합니다. GooLeNet은 기존 AlexNet 보다 12배 빠르게 연산할 수 있습니다. 하지만 특이한 구조 때문에 확장성이 조금 떨어진다는 단점이 있습니다.
ResNet
ResNet, 또는 Residual Network는 딥러닝 모델의 학습 효율성을 크게 향상시키기 위해 개발된 신경망 구조입니다. 2015년 Kaiming He와 그의 팀이 개발한 ResNet은 매우 깊은 신경망에서도 효과적으로 학습할 수 있는 방법을 제시했습니다.
사람이 이미지를 분류할때 5%정도 오류가 있다고 하는데 ResNet은 3.57%밖에 틀리지 않아서 사실상 사람보다도 더 정확한 인공지능이라고 할 수 있습니다.
ResNet의 주요 혁신은 Skip Connection(Residual Connection)과 Batch normalization을 도입한 것입니다.
스킵 연결은 입력 데이터를 다음 레이어의 출력에 직접 더하는 방식입니다. 이를 통해 신호가 네트워크를 통해 더 쉽게 전파되고, 기울기 소실 문제(vanishing gradient problem)를 완화할 수 있습니다.
ResNet-152는 152개의 레이어를 가진 깊은 신경망 구조입니다. 이 구조는 깊이가 깊어질수록 성능이 향상되지만, 스킵 연결 덕분에 학습이 안정적이고 효율적으로 이루어질 수 있습니다.
따라서 CNN 모델들이 학습능력을 높이는 방법을 다음과 같이 정리할 수 있습니다.
- LeNet-5: CNN 적용하면서, 깊은 네트워크(4Layer) 학습하여 성능 상승
- AlexNet: GPU, ReLU 함수 사용하면서, 깊은 네트워크(8Layer) 학습하여 성능 상승
- ZFNet: 하이퍼파라미터 최적화하면서, 깊은 네트워크(8Layer) 학습하여 성능 상승
- VGGNet: 작은 필터 수(3x3) 규칙적으로 적용하면서, 깊은 네트워크(19Layer) 학습하여 성능 상승
- GoogleNet: Inception 모듈 적용하여 효율성 높이면서, 더 깊고 넓은 네트워크(22Layer) 학습하여 성능 상승
- ResNet: Skip connection 적용하여 기울기 소실 문제 해결하면서, 매우 깊은 네트워크(152Layer) 학습하여 성능 상승
그렇다면 이제 CNN 모델을 더 효율적으로 학습시킬 수 있는 방법에 대해 소개하겠습니다.
Data Augmentation
Data Augmentation은 데이터셋의 부족으로 인한 과적합 문제를 해결하는 데 중요한 역할을 합니다. 이는 실제로 새로운 데이터를 수집하지 않고도, 학습 모델에 사용할 수 있는 데이터의 다양성을 크게 증가시키는 전략입니다.
Data Augmentation을 적용하는 방법은 다양하며, 주로 다음과 같은 기술들이 사용됩니다:
- 회전 (Rotation): 이미지를 다양한 각도로 회전시켜 새로운 데이터를 생성합니다.
- 이동 (Translation): 이미지를 상하좌우로 이동시켜 다양한 위치에서의 데이터를 생성합니다.
- 확대 및 축소 (Scaling): 이미지를 확대하거나 축소하여 크기 변형을 통해 다양한 데이터를 생성합니다.
- 뒤집기 (Flipping): 이미지를 수평 또는 수직으로 뒤집어 새로운 데이터를 생성합니다.
- 왜곡 (Distortion): 이미지를 약간 왜곡하여 다양한 형태의 데이터를 생성합니다.
- 밝기 및 색상 조절 (Brightness and Color Adjustment): 이미지의 밝기, 대비, 색상을 조절하여 다양한 조명 조건의 데이터를 생성합니다.
Additive White Gaussian Noise (AWGN)를 사용해서 이미지에 노이즈를 주는 방법도 있습니다. 이렇게 하면 모델이 더 많은 환경에서 데이터를 학습하기 때문에 과적합을 방지하고 성능이 더 좋아지지만 모든 것을 해결해주지는 않습니다.
Weight (parameter) initialization
가중치 초기화는 딥러닝에서 매우 중요한 역할을 합니다. 초기 가중치 설정은 네트워크의 학습 속도와 성능에 큰 영향을 미칩니다. 초기 가중치가 잘못 설정되면 네트워크가 지역 최소값에 갇히거나, 너무 느리게 수렴하거나, 일반화 성능이 좋지 않을 수 있습니다.
효과적인 초기 가중치 설정을 위해 여러 가지 방법이 제안되었습니다. 한마디로 정답이 있을 것 같은 범위 안에서 가중치를 초기화 하는 것입니다. 화주요 방법으로는 LeCun Initialization, Xavier Initialization, He Initialization가 있습니다.
LeCun Initialization
주로 신경망의 입력층에서 사용되며, 가중치를 설정할 때 입력 노드의 수에 따라 정규 분포 또는 균등 분포를 사용합니다. LeCun 초기화는 신경망의 가중치를 적절한 범위 내에서 초기화하여 학습의 안정성을 높이는 데 목적이 있습니다.
Xavier Initialization
Sigmoid 및 Tanh 활성화 함수를 사용하는 신경망에서 적절한 가중치를 설정하기 위해 사용됩니다. 이 방법은 입력 노드와 출력 노드의 수를 모두 고려하여 초기 가중치를 설정합니다.
신경망의 각 레이어의 가중치를 적절히 초기화하여 기울기 소실(vanishing gradient) 문제를 완화하고, 효율적으로 학습할 수 있도록 합니다.
He Initialization
LeCun을 변형하여 만들었고, ReLU와 같은 활성화 함수와 함께 사용되는 신경망의 가중치를 초기화하는 방법입니다. Xavier는 Sigmoid나 Tanh와 같은 활성화 함수에 적합한 반면, ReLU와 같은 비선형 활성화 함수에 대해서는 비효율적인 결과를 보일 수 있습니다.
최근의 딥러닝 모델에서는 주로 He 초기화가 선택됩니다. 이는 ReLU 활성화 함수가 많이 사용되기 때문입니다.
위와같은 초기화 방법들은 pytorch에서 쉽게 구현할 수 있습니다.
Transfer learning
Learning from Scratch는 특정 주제에 대한 사전 지식 없이 처음부터 시작하는 것을 의미합니다. 딥러닝에서는 학습을 초기화된 상태에서 시작하는 것을 의미합니다. 이 과정에서는 모델이 처음부터 모든 것을 학습해야 합니다.
Learning from Scratch는 시간이 많이 걸리고 계산 비용이 많이 드는 반면 Transfer learning을 통해 학습 시간을 단축하고 성능을 향상시킬 수 있습니다.
사전 학습된 모델을 새로운 데이터셋에 적용할 때 대부분의 특징 추출 레이어는 고정하고, 마지막 분류기 레이어만 재학습합니다.
아래 그림은 데이터셋 사이즈와 유사도에 따라 어떻게 재학습하는지 보여줍니다.
전이 학습을 사용하면 빠르게 학습하는 것을 볼 수 있습니다.
전이 학습을 사용하는 방법
데이터셋이 관심 대상이지만 이미지가 100만 장 미만인 경우
- 유사한 데이터를 가진 매우 큰 데이터셋 찾기 및 큰 ConvNet 훈련
- 자신의 데이터셋에 전이 학습 적용
위 방법을 통해서 쉽게 학습할 수 있습니다.