Motivation
- 앞에서 어떻게 값을 계산하는지를 알아냈는데, 그러면 그 값을 어찌 활용해야하는 지에 대해서도 생각해볼 필요가 있음
- 딥러닝은 결국 Data들에서 Feature들 간의 특징을 찾아 값을 내는 과정, 즉 이미 주어진 것들에 대해 정답을 비교하여 계산할 필요가 있음 ⇒ 정답과 나의 답을 검증하는 과정이 필요함
- 이 정답과 나의 답의 차이를 Loss(Cost)라고 하고, 이것들을 이용하여 Weight들을 업데이트 하는 과정을 Backpropagation, 그리고 그 업데이트를 어떤 주기로 진행할 것인지가 Batch, Batch size에 따라 업데이트의 종류(Minibatch, SGD, Batch)로 나뉜다.
Cost
- Network와 Input, 그에 상응하는 Output이 주어지면 우리는 Estimate output을 구할 수 있고, 진짜 답과 그 답의 차이인 Cost도 구할 수 있음
- 일반적으로 continuous한 label일 경우(Regression) 거리를 계산하는 MSE를 활용하고, Discrete할 경우 Cross Entropy를 사용하는 경우가 대부분이다.
- 이산적인(실수값이 아닌 분류를 할 때 이용하는 경우) 답을 낼 경우 답에 대해서만 을 뱉어내는 one-hot encoding을 한다.
- 항상은 아니고, Word Embedding 같은 경우엔 답이 아님에도 연관성을 생각하여 답이 아님에도 값을 일부 할당해준다.
- 번째 input data를 , 번째 predict output을 , 번째 target output을 로 명명한다.
- 이때, 번째 data들에서 cost를 이고, 이들을 모든 cost들에 대해 합치면 Total cost이다.
- Total Cost의 정확한 모양을 알 수는 없기 때문에 모든 것에서 최적을 이루는 weight들에 대해서 알 수가 없음
- 이 외에도 Convex한 모양이면 괜찮으나, 그렇지 않으면 Local minimum problem 등에 빠질 수도 있음
Gradient Descent
- 일 경우, 미분 계수 을 통해 이 지점 에서 어디로 가는지, 어느 정도로 감소하는지를 알 수 있다.
- 과연, 이 아니라 에도 이러한 요소가 있을까? ⇒ Gradient!
- Gradient는 First-order detrivation을 통해 function의 최솟값을 구하는 것!
- 은 앞의 미분계수처럼 각 지점에서의 방향과 증가율을 의미한다.
- 이때 우리의 목표는 코스트를 감소하는 것이고 그레디언트는 코스트가 증가하는 방향으로 가고 있기 때문에 그레디언트의 반대쪽으로 감소시켜야함! 즉, Gradient Descent가 의미하는 바는
Gradient Descent variants
- Gradient를 어느 주기로 업데이트를 하느냐에 따라 Batch Gradient Descent, Stochastic Gradient Descent, Minibatch Gradient Descent 총 3가지가 존재한다.
- 용어들에 대해서 먼저 알아보자.
- Batch
- 위의 Gradient Descent를 한번 시행할만한 데이터의 수
- 즉, Batch size가 30이면 30개의 트레이닝 데이터를 돌린 이후 한 번의 파라미터 업데이트를 진행한다.
- Epoch
- 앞의 Batch size가 일부였다면, Epoch는 전체를 의미한다.
- 즉, Epoch number은 전체의 데이터를 몇 번 학습했는지를 의미한다.
- Iteration
- 앞의 2개와 다르게, 이는 Batch와 Epoch가 정해지면 자동으로 정해지는 요소이다.
- 총 몇 번의 Batch를 돌렸는지, 즉 몇 번의 Parameter Update가 이루어졌는지를 의미하는 바이다.
- 앞의 두 개는 우리가 조정할 수 있는 요소로, Hyperparameter라 하고, 이걸 어떻게 정하느냐에 따라 모델의 성능이 크게 좌우된다.
- 추가적으로 어느 주기로 업데이트를 하느냐에 따라 굉장히 많이 업데이트를 할 수도, 굉장히 적게 할 수도 있으므로 그냥 그레디언트로 학습을 할 경우
대표적인 Gradient Descent 3가지를 알아보자.
- Batch Gradient Descent
- 앞에서 Batch 같은 경우 한 번의 Gradient Descent를 돌릴 때의 데이터 수를 의미했지만, 실제로 이렇게 수행하는 것은 다소 다른 Gradient Dscent임. 즉, 이름을 헷갈리면 안됨
- BGD는 한 Epoch(전체 데이터)가 지난 후에 Parameter들을 학습하는 것을 의미
- 각 Epoch마다 식을 업데이트하므로, 중간 중간에 튀어나와 욌는 outlier들에 대해 굉장히 둔감하게 반응한다는 단점이 있음
- 이 외에도 Convex한 Surface에 대해서는 반드시 최적의 답을 찾아간다는 보장이 있음(전체에 대해 학습하기 때문이고, Convex하면 이가 성립함)
- 다만, 전체 데이터셋에 대한 output 및 layer들을 들고 있어야 하므로 메모리가 굉장히 많이 필요하고, 너무 느림(Data set이 너무 큼)
- 또한, 상황에 맞게 유동적인 learning이 힘듦(Traning set이 추가된다는 등)
- Stochastic Gradient Descent
- 앞에서는 전체에 대해서 했다면, 이번엔 각 데이터마다 한다.
- 한번 전체를 시행할 때마다 하므로 계산량이 굉장히 적고, 이에 따라 빠르다는 장점이 있음
- 다만, 각 데이터마다 하기 때문에 Outlier들에 굉장히 민감하고, 최적을 찾아가는 과정이 굉장히 불안정함 (SGD Fluctuation)
- Minibatch gradient descent
- Batch의 size를 정해놓고, 그 Batch size만큼 traning을 했으면 parameter update를 수행하는 방식
- 이때 Bath 단위를 Minibatch라고 하고, 많은 epoch동안 이 과정을 반복한다.
- Batch를 어떻게 설정하느냐에 따라 다르지만 일반적으로 굉장히 빠르며, outlier들에 대해서도 민감하게 반응하지는 않는다.
- 다만, 미니배치 사이즈도 우리가 설정해야주어야 하는 Hyperparameter에 속한다.
Uploaded by N2T