1. 학습내용
하이퍼 파라미터
CNN 튜닝 가능한 하이퍼 파라미터에 대해 확실히 알고있어야 한다.
(random initialization은 잘 쓰는 용어는 아니다)
- Convolutional layers : 필터의 갯수, 필터의 크기, stride 값, zero-padding의 유무
마지막 아웃풋에 대한 계산은 다시 해줘야한다.
- Pooling layers : Pooling 방식 선택 (MaxPool, AvgPool), Pool의 크기, Pool stride 값(overlapping)
max pooling 단점 : 이미지 크기가 고정되어야 한다. (223으로 들어오면 223으로 학습해야한다)
ave pooling : 크기 상관없다.
- Fully-connected layers : 넓이 (width)
- 활성함수 (activation function) : ReLU, SoftMax(Multiclass classification), Sigmoid(Binary Classification)
- Loss function : Cross-entropy for classification, L1 or L2 for regression
Loss function은 할때마다 찾아서 맞게 쓰면 된다. (loss 계산을 위한 함수라는 것을 알면 된다)
- 최적화 (Optimization) 알고리즘과 이것에 대한 Hyper Parameter(보통 learning rate) :
SGD(Stochastic gradient descent), SGD with momentum, AdaGrad, RMSProp
- Random initialization : Gaussian or uniform, scaling
학습률 (Learning rate)
작으면 작은대로 안 좋고, 크면 큰대로 좋지 않다.
학습속도 스케줄을 채택하는 게 기본적인 원리이다.
동적이나 정적 스케줄링을 이용해서 로스를 떨어트려본다.
정적 스케줄링을 이용하면 단계적으로 로스를 떨어트릴 수 있다.
(ex. 30 epoch, 60 epoch, 90 epoch 이런식으로..)
어느정도 로스가 떨어졌다 생각하면 과감하게 중지하고 결과를 보는 게 좋다.
로스가 0.0000001이 되면 NA로 무한대로 빠져서 발산할 가능성 높다.
학습에 크게 영향이 없어서 버리거나 종료해서 그 앞 전의 weight 저장한 값을 사용하도록 한다.
- 최소값으로 크게 진동하지 않고 최소값에 도달하거나 무한대로 분기하지 않고
손실 함수가 완만하게 내려갈 정도로 작아야 한다.
- 최적화가 적당한 시간 내에 이루어지도록 충분히 커야 한다.
하나의 매개변수에 대해 그라디언트 하강에 제공하는 것으로 학습속도가 있다.
- 충분히 작거나 충분히 큰 학습률은 모호하다.
적절한 학습 속도 선택을 다루는 현명한 방법은 소위 학습 속도 스케줄을 채택하는 것이다.
데이터셋 밸런싱의 중요성
- 비즈니스 사례에서는 목표를 신속하게 검토해야 한다.
- 대부분의 실제 데이터는 균형잡히지 않았다는 것을 알아야 한다.
- 계속 진행하려면 데이터 셋의 균형을 반드시 맞춰야 한다.
- 이 작업은 대상의 총 개수를 세고 0과 동일한 개수를 일치시키는 방식으로 수행된다.
Batch, MiniBatch
- 배치 : 한 번에 신경망에 여러 입력 데이터를 묶어 전달할 때, 여러 입력 데이터의 묶음
딥러닝에서 한번의 iteration(forward + backporpagation + 업데이트)을 위해 들어가는 인풋데이터
- 미니 배치 : 학습용 데이터셋에서 특정 개수로 이뤄진 배치를 학습시키기 위해 묶은 것
2. 중요내용
미니 배치는 풀 배치의 단점들을 보완하기 위해 나온 것이다.
적게는 수십개 많게는 수백개의 데이터가 한 그룹으로 처리함으로써 iteration을 한번 수행하는데 소요되는 시간은 최대한 줄이면서
전체 데이터를 최대한 반영할 수 있는 한 반영한다.
가능한 한도 내에서 배치 크기를 최대한으로 잡아 하드웨어 부담을 주지 않는 선에서 하드웨어를 최대한 활용하게 된다.
3. 학습소감
개발일지를 쓰면서 이리저리 찾다가 Microsoft의 COCO 이미지셋을 직접 다운로드 받아서 json 파일을 한번 확인해보고 싶단 생각이 들었다. 데이터 셋을 공부하면서 annotation 공부했던 것이 있어서 그런지 블로그에서 COCO dataset을 활용하는 것을 보고도 낯설지 않았다.