무냐의 개발일지
[3/13] 컴퓨터비전3 _ 심화 CNN, Transfer Learning 본문
CNN 모델을 심화시키는 건 모델의 깊이를 늘리는 것이다.
깊이가 깊어질수록, vanishing gradient 문제가 생겼고, 기울기가 소실되지 않도록 하는 방법을 고안해야 됐다
1. GoogLeNet ( 인셉션 모듈(Inception Module)을 사용한 인공 신경망 구조)
1) Naive version
| GoogLeNet
- Inception module을 연속적으로 이어서 구성한다
- 여러개의 서로 다른 사이즈의 feature map을 추출하고, 결합함으로써 풍부한 feature extractor layer 구성이 가능하다 !!
| 배경
좋은 성능을 얻기 위해서는 딥러닝 구조를 깊게 만들어야 한다. 다만 모델이 깊어질수록, Vanishing Gradient가 생긴다 !
* vanishing gradient : Input에 가까이 갈수록 loss 전달이 안되는 현상
파라미터 업데이트 = 딥러닝 학습 => loss 의 error를 back propagation하는 것이고, 그럴 때 gradient 를 전파하는 거고, 그 gradient에 따라 파라미터가 달라진다. output에 가까운 쪽에선 error 전달이 잘 되지만, input에 가까워질수록 error값 전달이 잘 안된다. 즉, 모델이 깊어질수록 (Hidden layer가 많아질수록) Vanishing Gradient가 생긴다 !
역전파 과정에서 신경망의 깊은 층으로 역전파되는 그래디언트(기울기)가 너무 작아져서, 이 그래디언트가 점차 사라져서 업데이트되는 파라미터가 거의 없거나 전혀 없게 되는 상황
Vanishing Gradient의 문제를 극복하면서 구조를 깊게 만드는 방법은 ?
-> GoogLeNet은 vanishing gradient의 문제를 해결하기 위해 Inception Module을 사용한다.
previous layer (Input이 들어옴) -> Convolution, Maxpooling -> Filter Concetenation
| 인셉션 모듈의 기본 컨셉
- 여러개의 필터를 사용해서, 여러개의 feature map 을 만들어보는 방법.
- 각기 다른 feature map 사이즈가 나올텐데, 그걸 다 그냥 concat 해버리는 것. 여러개를 다 써보고 합치는 것. (가장 단순한 naive한 형태의 인셉션 모듈)
- Inception module은 여러 가지 크기의 필터를 병렬로 사용하여 네트워크가 다양한 크기의 특징을 학습할 수 있게 하고, 이를 통해 네트워크의 성능을 향상시킬 수 있습니다.
- Inception module을 사용하지 않는 경우, 네트워크는 일반적으로 직렬로 쌓여서 깊이를 더욱 증가시킵니다. 이는 일반적으로 일렬로 연결된 합성곱 층이나 풀링 층을 중첩하여 사용함으로써 이루어집니다.
- 효율적으로 네트워크를 설계하여 파라미터의 수를 줄이고 연산량을 감소
- 다양한 크기의 커널을 동시에 사용하여 네트워크가 여러 크기의 패턴을 동시에 학습할 수 있도록 합니다. 이는 네트워크의 효율성을 높이고, 더 적은 매개 변수를 사용하여 더 깊은 네트워크를 구축할 수 있도록 돕습니다.
* 시작점 :
• 왜 한 입력 image에 한 종류의 filter size만 적용해야 하는가?
• 뭐가 잘 될지 모르니 1 x 1, 3 x 3, 5 x 5, 3 x 3 max pooling을 다 해보자!
• 큰 사이즈의 Receptive Field가 제공하는 장점(큰 특징 추출, 연산이 빠름)은 수용하면서 파라미터의 수를 줄일 수 있는 구조를 만들자.
적절한 커널의 필터 사이즈와 Pooling(down sampling)을 고민해서 찾아내기보다는 여러 사이즈의 필터들을 한꺼번에 결합하는 방식을 제공하였고, 논문(Going deeper with convolutions)에서는 이를 Inception module로 지칭하였습니다.
receptive field = kernel size 이다
| Receptive field가 커질때의 장점 :
- 큼직한 패턴을 볼 수 있다.
: 작은 커널은 디테일한 정보를 얻을 수 있겠지만, 지나치게 지엽적인 정보일 수 있다.
- 연산이 좀 더 빠르다.
일반적으로는 3x3 사이즈의 커널을 쓰지만, 구글넷에서는 여러 사이즈의 커널을 다 쓰고, 거기다가 max pooling까지 해서 down sampling도 한다.
- GoogLeNet은 Inception module들을 Pooling을 통해 연속적으로 이어서 구성되었습니다
- 여러 사이즈의 필터들이 서로 다른 공간 기반으로 Feature들을 추출하고, 이를 결합하면서 보다 풍부한 Feature Extractor layer의 구성이 가능합니다.
2) 1x1 Convolution ( 앞에서처럼 가로x세로로 있는게 아니라, 깊이가 쭈욱 깊은 애인거다)
1D: vector, 2D : matrix, 3D : tensor
* Input channel 수 = filter channel(커널) 수
* filter 갯수 = output channel의 수
feature map depth(channel수) = 10개라고 한다면,
1x1 필터의 채널수 = 10개 -> 겹치는 영역에 곱하기를 다 하고, 그걸 다 sum 해서, 빨간색 1개 숫자가 나오겠지
input 채널수가 10개였는데, feature map의 채널은 1개가 됐다 !!!
7x7x 10 -> 1x1x10 -> 7x7x1
1x1 convolution의 효과 : feature map의 depth(채널 수)가 1로 감소한다. 그래서, 연산량을 감소시킨다. 그리고 비선형성을 강화시킨다 ! (depth가 똑같은 필터)
설명) 5x5 convolution 수행
padding이 적용된 상태에서 5x5 convolution 해서, Input, output 사이즈가 그대로이다.
설명2) 1x1 conv + 5x5 conv 수행
- 1x1 conv 하니까, 채널수가 줄어들고, 연산량이 확 감소됐다 !
- Conv + Relu 세트로 하니까, Conv2 두번하면 Relu가 총 2번 적용되어서 비선형성이 강화된다.
| 그래서 결과적으로는 요렇게 된다!! 1x1 conv를 다 적용해주면 좋아진다.
* Global Average Pooling : 전체값에서 average 를 뽑아서 pooling을 하는 것! (매우 심플)
- 특성 맵(feature map)을 요약하는 기술.
- 네트워크의 파라미터 수를 줄이고 과적합을 방지하는 데에도 기여할 수 있습니다.
- 이는 일반적으로 분류 문제의 마지막 단계에서 사용되며, Fully Connected Layer 대신에 사용될 수 있습니다.
| Auxiliary Classifier
: training 과정에서만 사용되는, error를 만드는 목적으로 만든 도구이다.
: Auxiliary classifier를 모델에 2개를 붙여 결과적으로 loss를 맨 끝뿐만 아니라 중간에서도 구하기 때문에 기울기를 역전파 시킬 수 있다
: 대신 결과에 지나치게 영향을 주는 것을 막기 위해 auxiliary classifier의 loss에는 0.3을 곱하였습니다.
: 실제로 테스트하는 과정에서는 auxiliary classifier를 제거하고, 맨 끝의 softmax만을 사용하였습니다.
근데, 이렇게 구글넷을 만들면, 또 엄청 깊은 네트워크가 생겨서 vanishing gradient 문제 발생
이걸 해결하기 위해 Auxiliary Classifier를 만들어냄 (가짜 분류기)
Output에 있는 softmax가 True classifier이고, 모델 사이사이에 가짜 분류기를 집어넣은거임.
순전파 단계에서 Auxiliary Classifier는 주요 분류기와 병렬로 작동하여 입력 데이터에 대한 예측을 생성합니다. 이 예측은 손실 함수(loss function)를 계산하기 위해 실제 레이블과 비교됩니다. 따라서 Auxiliary Classifier는 학습 데이터에 대한 예측을 생성하는 데 사용됩니다.
역전파 단계에서는 Auxiliary Classifier의 손실을 계산하고, 이를 통해 중간층의 파라미터가 업데이트됩니다. 이 과정은 주요 분류기와 병렬로 이루어지며, 네트워크의 전체 손실을 줄이고 성능을 향상시키는 데 기여합니다. 따라서 Auxiliary Classifier는 네트워크의 학습을 강화하고 더 좋은 결과를 얻기 위해 사용됩니다.
이렇게 해서 loss를 중간중간 가짜 분류기에서도 구하기 때문에, 역전파할 때 vanishing이 덜 생긴다. 그 가짜분류기에서 강제로 error를 만들어서, 그 loss를 기준으로 parameter 값을 변경시킨다. 그래서 error가 너무 크면 안되니까 0.3을 곱해준다. 이건 training 과정에서만 사용되는, error를 만드는 목적으로 만든 도구이다.
2. ResNet (Residual learning을 통한 극복)
이 모델에서는 vanishing gradient 의 문제를 어떻게 해결할 것인가?
-> residual learning : skip connection을 통해 highway를 만들어서 극복한다!
-> skip connection을 통해 학습하는 것을 residual learning이라고 합니다.
* Skip Connection (가장 큰 차이점)
| Residual Learning
- Residual Learning은 일정 시점마다 input x 자체를 skip connection을 통해 연결합니다.
- 이로 인해 backpropagation을 할 때 Identitiy mapping을 통해 loss 값이 변함 없이 전달되기 때문에 Gradient flow가 원활하게 이루어집니다.
- 따라서 모델을 깊게 쌓는 것에 대한 부담이 줄어듭니다.
- 그래서 Vanishing gradient의 문제를 해결할 수 있어 Skip Connection을 gradient “highway”라고 부르기도 합니다.
왼쪽 : 그냥 일반 연결, Residual net : Skip connection
forward propagation은 2개의 다른 방향으로 이뤄진다. skip하는 애를, identity mapping이라고 한다.
이렇게 스킵해서, feature map과 자기 자신을 더해서 최종 output을 만들어낸다. 이게 바로, skip connection을 통한 forward propagation이다.
back propagation 할 때도 똑같이 2개의 다른 루트로 진행한다.
1번 케이스) 그럼 loss 값이 두 개의 weight layer에 다 들어가서 파라미터를 적용하겠찌.
2번 케이스) relu쪽에서 전달된 loss가 그대~로 위에 전달되겠지, skip하니까 !
identity mapping (skip connection)을 통해 error가 깎이지 않고 그대로 전달된다 !!!
| 장점
- Gradient Flow가 원활하게 이뤄져서, 모델을 깊게 쌓는 것의 부담이 줄어든다
- Vanishing gradient 극복 ! (Gradient 'Highway' 라고도 할 수 있다!! )
3. Transfer Learing (이미 학습된 모델을 따와서 쓰는 것)
: Transfer learning은 데이터의 양과 연산 비용의 한계를 극복하면서 딥러닝 구조의 장점을 이용하기 위해서 고안되었습니다.
ImageNet Competition 1000개의 이미지 클래스를 분류하는 대회이며, 위의 구글넷, ResNet 다 여기서 수상했음.
| 레이어가 많아질수록 생기는 문제
1. 데이터를 많이 모아야한다
양과 질을 모두 충족시켜야 되겠지 (양질의 데이터를 많이 모으는 것이 매우 핵심적이다)
2. 비용이 많이 든다
모델을 학습시키는 데 들어가는 비용
(GPT-3 모델의 parameter 수 : 1750억개, 학습시키는 데는 자동차로 달까지 왕복하는 수준의 온실가스 발생(전기세), 1000만 달러)
그래서 나온게 바로 Transfer Learning !!
처음부터 학습시키냐 vs 있는 모델을 업데이트 시키냐
모델은 결국 parameter 덩어리이다! 저장된 parameter 값을 그대로 가져다가 쓰면 되겠지.
Pre-trained model을 사용한다 = Knowledge Transfer (Transfer Learning은 여기서 파생됨)
이 문제를 풀어봤던 사람에게 물어볼 수 있다. 그 노하우를 받아서 내 문제에 적용하는거지.
* 장점 :
- 기존에 만들어진(학습된) 모델을 사용해 새로운 모델을 만들 때, 학습이 매우 빠르고, 예측능력을 더 높일 수 있다
- 복잡한 모델일수록 학습시키기 어렵다는 난점을 해결 가능
- 학습에 들어가는 연산 비용 절감
- 일반적 feature -> Domain-specific Feature 가지 쭈우우욱 학습한다
- Domain: 내가 분류하려는 이미지의 영역 (사람, 사물, 동물 등등)
| VGG16 모델 (16 : 연산이 필요한 layer 의 수)
1) 내 데이터셋 사이즈가 너무 작을 때
왼쪽에 가까울수록, general feature (선, 도형, 색깔, 질감 등)
오른쪽에 가까울수록, Domain-specific feature (특정한 것들)
이게 이미 있는거라면, 내가 갖고 있는 데이터에 아주 직접적으로 영향을 줄만한 맨 오른쪽 초록색 영역만 학습한다.
그리고 나머지는 VGG16의 pre-trained model을 가져온다 = Freeze 시킨다.
2) 데이터셋 사이즈가 중간정도 일 때
-> training 시키는 layer 영역을 좀 더 늘려준다
- output에 가까운 layer들부터 왼쪽으로 슬슬 이동하면서 학습 - 이건 정해져있진 않고, 시행착오를 통해 연산을 해야 한다.
(젤 왼쪽은 너무 general 한거니까 굳이 학습 안시켜도 된다)
(학습 가이드라인)
1. 데이터의 유사성
- pre-trained : 동물에 대해 학습, 내가가진 데이터: 인간 일 경우는 X
- 유사성을 봐야 한다
2. 데이터의 사이즈
- 데이터 많고, 유사도도 많을 경우 (1사분면) : 위는 freeze, 뒤에만 train ( 최적의 시나리오 )
- 데이터 많은데, 유사도 적을 경우 (2사분면) : 다 train 시킨다
- 데이터 적고, 유사도도 적다 (3사분면) : 일반적인 feature 관련된 위쪽은 제외하고, 밑에만 학습
- 데이터도 적고, 유사도는 높다 (4사분면) : Domain은 같으니까 위는 freeze, task specific 한 부분만 train 한다
가지고 있는 데이터셋의 크기가 작을수록, pre-training을 진행한 데이터셋과의 유사성(domain의 유사성)이 높을수록, 많은 레이어를 freeze 하는 것이 효과적 !!
'Data Scientist Bootcamp' 카테고리의 다른 글
[3/18] 프로젝트_ VGG16 써서 transfer learning으로 Flower 데이터셋 예측 (0) | 2024.03.18 |
---|---|
[3/14] 컴퓨터비전4 _Object detection, Segmentation (2) | 2024.03.14 |
[3/12] 컴퓨터비전2_ CNN(Convolutional Neural Network) (0) | 2024.03.12 |
[3/11] 컴퓨터비전1 (0) | 2024.03.11 |
[3/8] 딥러닝 심화3 (가중치 초기화, 배치정규화) (2) | 2024.03.08 |