뉴럴 네트워크는 weight paramter들을 최적화(optimize)하기 위해서 Gradient Descent방법을 사용했다..
loss function의 현 weight의 기울기(gradient)를 구하고 loss를 줄이는 방향으로 업데이트(조정)해 나가는 방법을 통해서 뉴럴 네트워크를 학습하였습니다.
loss(cost) function
--> 현재의 가중치에서 틀린정도를 알려주는 함수.
현재 네트워크의 weight에서 내가 가진 데이터를 다 넣어주면 전체 에러가 계산된다. 거기서 미분을 하면 에러를 줄이는 방향을 알 수 있다. 이걸 계속 반복해서 학습을 하는 것.
내가 가진 데이터를 다 넣어주면 전체 에러가 계산된다.
최적값을 찾아 나가기 위해서 한칸 전진할 때마다 모든 데이터 셋을 넣어주어야 한다는 문제.
그래서 학습이 굉장히 오래 걸린다. 언제 다 학습 시킬 것이가?
Gradient Descent 말고 더 빠른 Optimizer는 없는지 연구자들이 고민을 하게 되죠. 그래서 나온 것이
Stochastic Gradient Descent.
Stochastic Gradient Descent
뒤죽박죽 형태로 찾아가지만 속도는 GD보다 훨씬 빠르다.
- GD
- 모든 데이터를 계산한다 => 소요시간 1시간
- 최적의 한스텝을 나아간다.
- 6 스텝 * 1시간 = 6시간
- 확실한데 너무 느리다.
- SGD
- 일부 데이터만 계산한다 => 소요시간 5분
- 빠르게 전진한다.
- 10 스텝 * 5분 => 50분
- 조금 헤메지만 그래도 빠르게 간다
SGD에도 문제점이 존재. 미니 배치를 통해 학습을 시키는 경우 최적의 값을 찾아가니 위한 방향 설정이 뒤죽 박죽-->무슨말이지?
한걸음 나아가기 위한 보폭이 낮으면 학습하는데 오래 걸리고, 너무 크면 최적의 값을 찾지 못하는 문제.
문제점을 인지하고 각가의 문제점을 개선하는 더 좋은 Optimizer들이 많이 있다.
- Gradient Descent
- 최적을 값을 찾아가는 것은 정확하지만 너무 느리다.
- Stochastic Gradient Descent를 통해서 빠르게 찾을 수 있도록 발전
- 그러나 최적의 값을 찾아가는 방향이 뒤죽 박죽이고, 한 스텝 나아가기 위한 사이즈를 정하기 어렵다.위한 사이즈를 정하기 어렵다.
- 방향과 스텝 사이즈를 고려하는 새로운 Optimizer들이 많이 나왔다.
- 방향성
- Momentum
- NAG
- 스텝 사이즈
- Adagrad
- RMSPop
- AdaDelta
- 방향성 + 스텝사이즈
- Adam
- 방향성
그래서 무엇을 쓰는게 좋다는 거여?
Adam이 짱이여?
출처: https://seamless.tistory.com/38 [Mino's blog]