공부/AIFFEL

FUNDAMENTAL 30. 딥네트워크, 서로 뭐가 다른 거죠?

dong_dong_2 2021. 3. 15. 20:52

1. 딥네트워크, 서로 뭐가 다른 거죠?
    - 요즘 핫한 딥러닝, 이름에서 알 수 있듯 깊게 구성된 신경망이다.
    - 이런 신경망을 깊게 쌓는데 많은 연구와 기법이 필요한데, 연구자들이 더 좋은 성능을 내는 딥네트워크를 만들기 위해 다양한 방법과 네트워크를 탄생시켰다.
    - 이 중 몇가지를 오늘 배웠다.
2. ImageNet Challenge
    - 이미지넷(ImageNet)은 비전(vision) 관련 딥러닝을 하다보면 보게될 이름이다.
    - 이미지넷은 2010년부터 이미지관련 데이터셋을 제공하고 이로인해 여러 모델을 만드는데 도움이 되었다.
3. 딥네트워크의 시작
    - SuperVision이라는 팀이 전년도 대비 10%의 오류율을 낮추면서 1등을 했는데, 비법은 네트워크를 깊게 쌓았기 때문이다.
    - 이 때 사용한 모델이 AlexNet이라는 이름으로, 이름은 논문의 1저자인 Alex Khrizevsky의 이름에서 따왔다고 한다.
    - AlexNet 모델의 그림을 보면 GPU의 병렬 연산을 포현하기 위한 것으로 보면 된다. 레이어가 많이 생긴 정도이지 MNIST에 CNN과 클래스가 많이 있는 네트워크로 볼 수 있다.
    - 여기에 더해진 것들은 ReLU 활성화 함수와 드롭아웃(Dropout) 그리고 오버래핑 풀링(Overlapping pooling) 등이 적용되었다.
4. CNN을 잘쓰자.
    - 다음으로 볼 네트워크 모델은 VGG이다. VGG는 AlexNet 같이 이미지넷 챌린지에서 공개된 모델이다. 이 모델은 2014년 이미지넷 챌린지 준우승을 거뒀다.
    - 우승모델이 아닌데 소개하는 이유는 간결한 구조로 많은 활용이 이루어졌기 때문이다.
    - 이전 우승한 모델이 10개가 안 되는 CNN층을 가진 반면, VGG16과 VGG19라는 이름 뒤의 숫자로 볼 수 있듯, VGG는 16개, 19개 층으로 이뤄졌다.
    - 그럼 VGG는 어떤 방식으로 이런 레이어를 쌓을까?
       1) CNN을 만들 때 커널 크기(kernel size)를 조절한다. VGG에서는 3x3 커널을 사용해서 더 많은 레이어를 쌓고 이미지의 비선형적 특성을 더 잘 잡아낼 수 있게 만들었다.
       2) 7x7 커널을 1개 사용하는 것보다 3x3 커널 3개를 사용하는 것이 같은 효과를 가져오면서 더 적은 파라미터를 가져서 훨씬 가볍다.
5. 멀리 있으면 잘 안 들려요
    - 생각보다 네트워크를 깊게 쌓기가 어렵다.
    - 그 이유는 모델이 깊어질수록 모델의 학습을 위한 Gradient가 사라지는 현상이 발생한다.
    - 더 자세하게는 네트워크는 Gradient descent를 통해서 기울기를 학습하는데 깊은 레이어에는 데이터에 따른 차이가 충분하게 반영되지 못한다.
    - 이렇게 Gradient가 매우 작아져서 레이어를 학습시키기 위해 충분한 값을 표현하지 못할 경우를 Vanishing 했다고 해서 기울기 소실(경사소실, Gradient vanishing)이라 한다.
    - Gradient vanishing 또는 exploding의 문제가 발생하는 원인은, 레이어가 깊어지면서 Gradient가 매우 커지거나 작아지기 때문이다.
    - 레이어의 가중치가 반복되서 곱해지면 1보다 작을 때에는 0에 너무 가까워져 버리고, 1보다 클 때는 그 값이 기하급수적으로 커지게 된다.
    - 이 문제를 해결하기 위해 활성화 함수를 변경하거나 가중치 초기화 방법을 통해 완화할 수 있다.
6. 지름길을 만들어주자
    - 레이어를 깊게 쌓으면서 생기는 gradient exploding, vanishing 문제를 해결하기 위해 ResNet은 생각보다 간단한 방법을 사용했다.
    - ResNet은 이전의 모델들 보다 레이어가 훨씬 많다. ResNet은 Skip Connection이라는 구조를 사용해서 Gradient Vanishing 문제를 해결했다.
    - Skip Connection은 레이어의 입력을 다른 곳에 이어서 Gradient가 깊은 곳까지 이어지도록 했다. 
    - Skip Connection이 있는 블록을 Residual Block이라 한다.
7. 딥네트워크 속속들이
    - 지금까지 잘 알려진 딥네트워크들이 어떤 이유에서 어떤 구조를 갖게 되었는지 확인했다.
    - 이제 다음은 코드로 직접 구현하면서 배운다.
8. Model API
    - tensorflow의 사전학습 모델(pre-trained model)들은 slim이라는 고수준 API로 구현되어있다.
    - Keras는 Keras의 Layer를 사용해서 모델이 구현되어 있다.
9. VGG-16
    - 4번째에서 봤던 VGG16을 코드로 구현해봤다. 구현만 해보는 것이기에 epochs는 1만 줬다.
10. ResNet-50
    - 위에서 배운 Skip connection이 추가되어 있는 ResNet을 구현해봤다. 마찬가지로 epochs는 1만 줬다.
11. 정리
    - 노드에서는 네트워크를 도식으로 보고, 모델이 어떻게 구현되었는지, 새로운 기법이 어떻게 적용되었는지 확인했다.
    - 그리고 이 노드는 이렇게 복잡하지 않더라도 엄청난 효과를 가져올 수 있는 모델을 우리도 직접 만들 수 있따는 자신감을 주기 위해 구성했다 한다.
    - 추가로 블로그에서는 모델들의 그림을 삽입하지 않았는데, 모델들의 구조 그림을 보면서 이해하면 훨씬 이해하기 편할 것이다.