오늘은 Lec.07의 나머지 부분과 Lec.09의 일부분을 공부했다. (Lec.08은 건너뛰었다.)
Lec.07
1. learning rate에 대해 봤다.
- learning rate decay : Adam보다는 SGD + Momentum에서 많이 쓴다.
- First-Order Optimization : 기울기를 사용하여 선형으로 근사시켰다. 근사치를 minimize 하는 단계이다.
- Second-order Optimization : 기울기와 Hessian 행렬을 사용하여 2차적으로 근사시켰다. 근사치를 minima하는 단계
- Second-order에서 BGFS와 L-BFGS가 있는데 딥러닝에서는 잘 사용되지 않는다.
- 만약 full batch가 가능하면 잘 작동할 수 있으나, mini batch에서는 나쁜 결과가 나온다. 아직 연구 분야이다.
- 결론은 Adam은 대부분의 경우에서 좋은 기본 default이다.
2. Model Ensembles
- 독립적인 모델을 훈련하는 대신에 훈련 중 단일 모델의 multiple snapshots를 사용한다.
- 또한 순환적으로 learning rate를 높히고 줄이기를 반복하면서 여러개의 minima를 찾을 수 있다.
3. Regularization
- 흔히 L2, L1, Elastic net (L1 + L2)를 사용하고, Dropout이란 것도 있다.
- Dropout이란 랜덤하게 학습시킬 노드를 비활성화 하는 것이다. (activation에 0을 주면서)
- Dropout은 특정 Feature에 비중이 쏠리지 않게 해주고, overfitting을 방지할 수 있다.
- 또 다른 해석으로는 모델을 거대한 앙상블로 만들 수 있다. 훈련마다 비활성되는 노드가 바뀌므로 여러 submodel이 만들어지는 격이다.
- 흔한 패턴으로는 훈련 때는 랜덤성 종류를 추가하고, 테스트 때는 무작위성을 average out한다.
- 다른 Regularization에는 Data Augmentation이 있다.
- 이미지를 예로 들면, 하나의 사진을 반전시키거나, 음영이나 색상을 조절하거나 혹은 여러 작은 이미지로 잘라서 사용한다.
- 다른것으로는 DropConnect(모든 노드는 활성화, 노드간 연결상태를 랜덤하게 Drop하는 방식)도 있고, Fractional Max Pooling 방식, Stochastic Depth(랜덤하게 레이어를 비활성화하여 학습) 방식도 있다.
4. Transfer Learning
- 이것은 CNN을 사용할 때 많은 데이터가 필요하다는 생각을 부숴줄 수 있다.
- 잘 학습된 모델이 있다면 그것을 가져와서 내 데이터에 알맞게 일부만 수정해주는 방식이다.
- 예를 들어, 동물 1000가지를 분류하는 모델이 있다면, 마지막 FC만 수정하여 10가지 동물만 분류하는 모델로 리모델링 할 수 있다는 것이다. (그 이하의 깊은 레이어들은 놔둔채)
- 데이터셋이 좀 더 많다면 마지막 레이어뿐 아니라 몇몇개의 레이어를 좀 더 수정해도 될 수 있다.
- 모델이 학습한 데이터의 종류(data1)와 내가 가지고 있는 데이터 종류(data2)에 따라 4가지 경우의 수가 생긴다.
1) data1과 data2가 유사한 형태이고, data2의 수가 적은 경우 : 최상층에 선형 분류를 사용한다.
2) data1과 data2가 유사한 형태이고, data2의 수가 꽤 많은 경우 : 몇개의 레이어를 Finetune 한다.
3) data1과 data2가 다른 형태이고, data2의 수가 적은 경우 : You're in trouble....
4) data1과 data2가 다른 형태이고, data2의 수가 꽤 많은 경우 : 많은 수의 레이어를 Finetune 한다.
- 사전에 훈련된 모델은 많이 있다. 이 모델을 가져와서 잘 사용하면 직접 훈련시킬 필요가 없을 수 있다.
Lec.09
1. CNN의 아키텍쳐들을 공부할 예정이다. 먼저 AlexNet부터!
- AlexNet의 모델 구조를 도형화 된 모습을 봤다. 여기서 입력값이 224라고 되있는데 오타이다. 정확히는 227이라고 한다.
- 코드적으로도 봤다. 대략적으로 Conv, MaxPooling, Normalization, FC으로 만든 모델이다.
- 첫번째 conv와 pool할 때 output의 shape과 parameter를 계산해보면서 이해해나갔다.
- Alexnet에 대해 좀 더 자세히 말하면
1) RelU를 사용했고, 효과가 없다고 밝혀져서 지금은 잘 안쓰지만 Norm layers를 했다.
2) data augmentation을 했고, Dropout은 0.5으로, batch size는 128로 줬다.
3) SGD Momentum를 사용했고, learning rate는 1e-2에서 훈련이 끝날 때까지 1e-10까지 줄여서 학습시켰다.
4) 당시 gpu가 GTX580인데 이게 3GB여서 한번에 이미지를 읽을 수 없어서 절반으로 나눠서 읽었다.
5) conv1, conv2, conv4, conv5를 보면 2개로 나뉜 이미지가 서로 통신하지 않고 독립적으로 진행된다.
6) conv3, fc6, fc7, fc8를 보면 2개로 나뉜 이미지가 서로 통신하면서 진행된다.
- AlexNet은 2012년에 우승한 모델이고, 2013년에 우승한 모델인 ZFNet은 AlexNet에서 하이퍼 파라미터 몇 개만 수정했는데도 우승할 정도로 강력하다.
'공부 > AIFFEL' 카테고리의 다른 글
FUNDAMENTAL 20. 그나저나 데이터는 어디서 가져오지? (0) | 2021.02.19 |
---|---|
Exploration 10 : 인물사진을 만들어 보자 (0) | 2021.02.16 |
FUNDAMENTAL 19. TF2 API 개요 (0) | 2021.02.15 |
제 1차 해커톤 (대전) : 캐글 축제 (0) | 2021.02.10 |
풀잎스쿨 - DeepML(CS231N) Lec. 06 ~ Lec. 07 (0) | 2021.02.08 |