Machine Learning VS Deep Learning
- Machine Learning
- Input -> Feature Extraction( 전문가가 수행 ) -> Machine Learning (classification) -> Output
- Deep Learning (Machine Learning 기법 중 하나)
- Input -> Deep Learning (Feature Extraction -> classfication) -> Output
Convolutional Neural Network (CNN)
- IDEAL (ex K-NN (K-Nearest Neighbors))
- K-NN은 정의하고자 하는 Data 주변에 어떤 Data들이 분포하는 지를 보는 것 (ex 주변에 개가 많으니 개 이다! )
- 전체 경우에 대한 Data(개, 고양이 분류에 대해서는 전세계 모든 개 고양이 종)를 가지고 있으면 이상적이다
- 그냥 분류해 놓고 Search 알고리즘 돌리면 되니깐 K-NN으로도 충분
- 하지만 솔직히 말이 안되는 상황이다
- 일부 데이터만 가지고 분석을 해야하는데 유사도 분석이 문제가 된다
- 이에 대한 해결책으로 나온 것이 모든 픽셀을 서로 다른 가중치로 Weighted Sum진행 (Single layer Fully-connected Neural Network)
- 근데 이것도 문제점이 있음
- 이 Network는 그냥 개 고양이의 전체적인 평균 이미지를 가지고 비교를 하는 방식이다 (특정 부위를 통한 분석이 아님)
- 또한 이미지가 Crop된 경우도 다른 이미지 라고 생각해버리는 문제가 발생
- 이에 대한 해결책으로 Single layer Locally-connected Neural Network가 등장한다
- parameter도 줄어들고 부분부분에 대한 정보도 얻을 수 있고 overfitting도 줄어듬
- 이걸 베이스로 CNN이 등장
- CNN(Convolutional Neural Network)
- 대표 모델 순서
- LeNet-5 -> 굉장히 간단한 구조
- AlexNet(2012) -> 이게 ILSVRC에서 1등하면서 Neural Network가 주목 받음
- VGGNet(2014) -> ICLR
- GoogleNet(2015) ->CVPR
- ResNet (2016) -> CVPR
- 대표 모델 순서
LeNet-5

- 굉장히 단순한 구조 -> 주로 우편번호 인식(한 글자씩 인식)
- Conv - pool - Conv - pool - FC - FC
- 이때는 약간 kernel size가 3이 아니라 5를 씀 (3 두개 쓰는게 더 좋은지 몰랐음..) / stride 1
- Pooling : 2x2 max pooling / stride 2
AlexNet

- Relu(Activation Function) 이랑 Dropout 써서 떡상
- 네트워크를 두개로 구성해서 중간중간 교차 시킴
- 학습도 ImageNet 사용 (1.2 millions)
- Kernel size가 11로 엄청 컸음
- 이게 근본 없이 큰 걸 쓴게 아니라 Receptive field를 고려해서 큰 걸 사용한 거임
- Receptive Field : (P+K+1) x (P+K+!)
- 그냥 하드웨어 스펙으로 이김 (7 hidden layer 사용해서 60 million parameters 가지는 구조임)
- 이렇게 큰 모델을 쓰니깐 Out of Memory 많이 떳을 거임 (그래서 네트워크를 두개로 구성)
- 그래서 그림에서는 48차원으로 되어 있는데 밑에 Flow에서는 96으로 나타나 있는 거임


MaxPooling2D 의 결과 값을 3차원 tensor 형태인데
이게 밑에 Linear Layer로 이어지기 위해서는 tensor를 vector로 바꾸는 벡터화가 필요하다
벡터화에는 두가지 옵션을 기대할 수 있는데
- Average pooling
- 참고로 torch.nn.AdaptiveAvgPool2d(output_size) 이다
- 6,6 hyperparameter 는 Output size이고
- 이렇게 나온 (256,6,6) size를 flatten 시켜서 Linea에 넣는 거임
- 참고로 torch.nn.AdaptiveAvgPool2d(output_size) 이다
그래서 코드 중 일부를 보면 다음과 같이 구현 가능

- 구현은 아래 사이트 참고
[pytorch] 이미지 분류를 위한 AlexNet 구현
AlexNet은 컴퓨터 비전 분야의 발전에 중요한 역할을 한 합성곱 신경망(CNN) 아키텍처입니다. 이는 Alex Krizhevsky, Ilya Sutskever, Geoffrey Hinton에 의해 개발되었으며, 2012년 ImageNet 대규모 시각 인식 챌린지
resultofeffort.tistory.com
추가로 LRN 은 Local Response Normalization 인데 지금은 사용하지 않는다고 한다
(activation map 에서 명암을 normalization 하는 느낌임)
==> 지금은 Batch Normalization을 사용
VGGNet
VGGNet : https://arxiv.org/pdf/1409.1556.pdf

- 3x3 kerrnel의 포문을 열음(야 ㅋㅋ 3x3써도 좋은데 ??? )
- 작은 kernel을 쓰지만 엄청 깊게 쌓으면 ㅈ결국에는 큰 Receptive size를 얻을 수 있다는 마인드
- 더 깊지만 simple 하게 (높은 성능 / 좋은 일반화)
- layer 수만 16 or 19 개임
- 더 깊지만 simple 하게 (높은 성능 / 좋은 일반화)
- 얘도 ReLU 씀 (이후론 거의 다 쓰는 듯)
- 2x2 max pooling operation
비교

GoogleNet
아니 그럼 무지성으로 깊어질 수록 좋은 거 아니냐??
문제점
- Gradient Vanishing / Exploding 문제 발생
- Parameter가 너무 많아져서 Computationally Complex가 증가
- Overfitting problem이 발생
- 이때 당시에는 overfitting 문제가 발생한다고 생각하였지만
- 엄밀하게는 Degradation Problem이다
- Depth가 너무 깊어지면 Gradient Vanishing이나 Exploding같은 문제가 생겨서 학습이 저해되는 현상
GoogleNet은 이에 대해서 다음과 같은 방법으로 해결하고자 하였다
- 1x1 Convolution layer
- Inception Module
- Auxiliary Classifiers
전체 구조는 다음과 같음

먼저 일반적인 구조와 달리 옆으로 넓어보이는 이유는 Inception Module 때문인데
(Depth가 아닌 Width를 확장)
Inception Module

다음과 같이 3개의 Convolution 연산과 1개의 Max pooling을 단순 Concate연산을 시켜서 다음 layer로 넘긴다
- 이러면 좀 더 다양한 특징들을 뽑을 수 있지 않을까 생각한 거 같음
- 대충 생각해도 이러면 계산 복잡도가 엄청 오를거 같음
- 이걸 해결해준 것이 1x1 Convolution이다
- 1x1은 쉽게 설명하면 Channel수를 우리 마음대로 조절할 수 있는 로직이다
- 이걸 통해서 Inception Module을 구성하였다
- Max pooling 에 1x1 conv를 사용한 이유는 dimension을 조절하기 위해서이다
1x1 Convolution

이렇게 Channel축과 동일한 크기로 1x1 Convolution을 적용하면
Depth 정보를 하나의 Pixel로 압축해서 나타낼 수 있다
만약 위와 같은 주황색 1x1 Conv가 N개가 있다면 민트색 같은 결과가 N개가 나오게 되어
D 개의 Dimension을 N개의 Dimension으로 바꿀 수 있을 것이다
"공간의 크기는 변하지 않고 Channel 수만 바꿔"
그래서 모델을 부분 별로 끊어서 보게 되면

여기까지는 우리가 아는 일반적인 Model 구조(Stem Network)이고

Inception module을 쌓아 올린다
근데 여기서 우리가 예상할 수 있는 문제점이
다음 그림과 같이

이렇게 쌓아 올리면 누가봐도 Gradient Vanishing 이던 Exploding이던 발생할 것이다
이걸 해결하기 위해 Auxiliary Classifiers를 부분적으로 적용한다
Auxiliary Classifier

위 그림에서 Inception 모듈 옆에 달려있는 주사기 같은 것이 Auxiliary Classifier이다
- SoftMax에서 loss를 발생시켜줘서 중간중간 Gradient를 주사기 처럼 주입시킴
- 구조는 마지막 단에 있는 구조(Classifier output layer)와 동일 (중간에 끝났다고 가정하는 느낌)
- 학습할 때만 사용하고 test시에는 제거하는 layer들이다
이렇게 하고 마지막 단에

Pooling하고 FC layer 통과 시켜주고 Softmax를 적용하는 구조
ResNet
결론 : Network layer의 Depth가 성능의 큰 영향을 준다
- 엄청 깊게 쌓으면 overfitting 일어나자나
- OverFitting 때문에 Layer가 깊어질 수록 Error가 많이 나는 것이 아니라 Degradation(최적화) 문제이다
- ex) Gradient Exploding / Vanishing
- 내 생각은 어느 정도 영역까지는 overfitting이 문제인 것이 맞는데 그 이상의 영역에서의 비교인 것 같다
- 증거

만약 overfitting이 문제이면 training Error가 멈추는 부분이 20 layer보다 56 layer가 더 아래에 있어야지
- 해결 방법
- Residual block (Skip Connection = Shortcut Connection) 이라는 것을 만들어 입력을 그대로 출력으로 보내자
- 따로 빼서 결과 F(x)에 더하는 방식 (Gradient 또한 양 방향으로 흐를 수 있도록)


H(x) = F(x) + x (Concate이 아니라 덧셈이다)
-> 이렇게 하면 원본은 보존하면서 특징들만 학습을 할 수 있는 효과
BackPropogation에서도
만약 왼쪽 루트에서 Gradient Vanishing문제가 일어나도
X가 계속 살아있기 때문에 계속 학습할 수 있는 기회를 얻음 (기울기 = 1, F`(x) + 1 이자나)

나는 사실 이 부분이 좀 이해가 되질 않아서 나만의 방식으로 이해를 하고자 하였다
F(x) + x = H(x)라고 생각을 하지 말고 애초에 ResNet의 Residual의 뜻이 나머지의... 라는 뜻이니깐
이 모델은 나머지를 구해 최소화 하는 것이 목표인 모델이다 생각 F(x) = H(x) - x
참고 링크는 아래의 세개이다
https://ljm565.github.io/contents/CNN3.html#google_vignette
https://ganghee-lee.tistory.com/41
https://www.youtube.com/watch?v=Fypk0ec32BU
- 원래의 CNN
- X를 모델(F) 에 넣어서 나온 결과가 F(X)이고 이상적인 값이 H(X)라 할 때
- 목표 : F(X) = H(X)
- 학습 방향(loss) = H(X) - F(X)를 최소화 (0으로 만들기)
- 뭐 이걸 위해서 MSE니 RSE이니 loss function 다양하게 적용해서 학습하자나 MAE로 예시를 들면
- F(X)에 f`(x) * lr 을 Backpropogation 적용 (H(X) - F(X) > 0 가정)
- ResNet
- X를 모델(F) 에 넣어서 나온 결과가 F(X)이고 이상적인 값이 H(X)라 할 때
- 얘는 목표 자체가 H(X) = F(X) + X
- 학습 방향(loss) F(X)= H(X) - X를 최소화 (0으로 만들기 / 나머지가 음수일 수는 없자나)
- Ideal : f(X) = H(X) - X = 0
- X는 바꿀 수가 없네? (사진이자나/픽셀)
- H(X) = X가 되는 것을 목표로 한다고 볼 수 있다
- 아니 그러면 그냥 다이렉트로 모델이 input X , Output X가 나오게 학습 시키면 안되나 (ex) AutoEncoder
- 이거는 X를 만들어야 하는 것이고 ResNet은 X를 그대로 둔 채로 미세한 정보들만 학습을 하는 것
- 오해하면 안되는게 Conv를 통과하는 거여서 f(x) = x 이렇게 만드는 게 쉽지 않음
- 이거는 X를 만들어야 하는 것이고 ResNet은 X를 그대로 둔 채로 미세한 정보들만 학습을 하는 것
- Ideal : f(X) = H(X) - X = 0
- H(x)=f(x)+x�(�)=�(�)+�이므로 이를 미분한 값인 H′(x)=f′(x)+1�′(�)=�′(�)+1이 되며, 최소 gradient가 1이 보장되기 때문에 모델이 깊어졌을 때 문제점의 원이이 되었던 gradient vanishing 현상이 해소됨.
- Gradient가 최소 1이 보장되므로 0으로 수렴할 일이 없어 항상 모든 정보가 통과하며, 지속적인 residual learning이 가능하여 깊게 레이어를 쌓을 수 있음.
핵심 요약
- AlexNet(2012)
- ㅁㅁㅁㅁ
- ㅁㅁㅁㅁ
- VGGNet(2014)
- ㅁㅁㅁㅁㅁ
- ㅁㅁㅁㅁㅁ
- GoogleNet(2015)
- ㅁㅁㅁㅁㅁㅁ
- ResNet(2016)
- IDEA : layer가 깊어질 수록 성능이 떨어지는 것은 Overfitting이 아닌 Degradation(최적화) 문제이다
- Gradient Vanishing / Exploding 등
- Skip Connection
- 기울기가 최소 1은 보장 되기 때문에 Gradient Vanishing 현상을 막아준다
- 전차(Residual) 부분만 각 layer가 학습이 되기 때문에 더 세밀한 부분을 학습이 가능하다
- IDEA : layer가 깊어질 수록 성능이 떨어지는 것은 Overfitting이 아닌 Degradation(최적화) 문제이다
'AI Study' 카테고리의 다른 글
| [환경설정] VSC에서 SSH로 Remote View 사용하기 (0) | 2024.05.21 |
|---|---|
| [환경설정] 가상환경 총 정리/사용법 (pipenv virtualenv conda venv) (0) | 2024.04.11 |