강의 영상 주소 : https://www.youtube.com/watch?v=YnQJTfbwBM8&list=PL5-TkQAfAZFbzxjBHtzdVCWE0Zbhomg7r&index=6
해당 슬라이드:
https://web.eecs.umich.edu/~justincj/slides/eecs498/498_FA2019_lecture04.pdf
- 모든 데이터에 대해서 gradient와 loss를 구하기보다는 mini-batch라는 subsample을 만들어서 대략적으로 계산합니다. 보통 이런 subsample의 크기는 대개 2의 제곱수로 32, 64, 128등으로 사용합니다.
- mini-batch를 사용하기 때문에 batch gradient descent보다 계산 속도가 훨신 빠르고 같은 시간에 더 많은 step을 나아갈 수 있습니다.
SGD도 Hyperparameter가 필요한데 SGD에서 Hyperparameter는 기존의 Gradient Descent에서 사용하는 것에 추가로 minibatch 크기인 batch size와 데이터를 어떻게 선정을 할 것인지에 관한 Data sampling이 있습니다.
그리고 batch size의 경우 컴퓨터의 GPU의 메모리 크기가 허용하는 한, 최대한 크게 잡는 것이 좋습니다.
코드는 gradient descent코드에서 추가로 매 스텝마다 full training data set를 batch size만큼 sampling해주어 mini-batch의 gradient를 구하고 w를 update해줍니다.
SGD에서는 loss function으로 확률론적으로 접근하기 때문에 stochastic이라는 이름이 덛붙여졌고,
SGD에서는 표본 데이터를 가지고 gradient와 loss를 구하기때문에 표본 데이터의 분포가 전체 데이터의 분포와 최대한 유사하게 표본을 선정해야 합니다.
SGD algorithm에는 몇가지 문제가 발생 할 수 있습니다.
첫 번째로는 gradient descent가 지그재그를 그리면서 진행되어 더 많은 step이 소요된다는 점 입니다.
이 때문에 SGD는 Full batch보다 Overshooting문제에도 더 취약합니다.
- 위와 같은 SGD문제점때문에 SGD를 약간 변형시켜서 사용하는데 대표적인 방법들 중 하나가 SGD + Momentum입니다.
- 이 SGD + Momentum은 경사하강법에 관성을 더해준건데 이렇게 하면 마치 언덕에서 공이 내려올 때 중간에 작은 웅덩이에 빠지더라도 관성의 힘으로 넘어설 수 있는 효과를 줄 수 있습니다.
[용어정리]
* Iteration
이전의 momentum update
1. 현재 위치에서 gradient를 구한다.
2. 이전 velocity를 가져온다.
3. 이 두가지 방향을 더한 방향으로 한 step간다.
Nesterov Momentum
1. 이전 velocity를 가져온다.
2. 이전 velocity 방향대로만 갔을 때의 지점에서 gradient를 구한다.
3. 이 두가지를 더한 방향으로 한 step간다.
momentum값이 적용된 지점에서 gradient값이 계산되는 방식
Momentum은 현재 update과정에서의 기울기 값을 기반으로 미래값을 도출하도록 되어있습니다. 따라서, 최적의 parameter를 관성에 의해 지나칠 수 있게 된다.
Nesterov Momentum에서는 Momentum으로 이동된 지점에서의 기울기를 활용하여 update를 수행하기 때문에 이러한 문제를 해소할 수 있게 됩니다.