핵심 키워드
- Optimization (최적화)
- Gradient Descent Algorithm
- Adam
- Bactch Normalization
학습하기
기본적으로 우리는 Gradient descent를 가정합니다. Hessian 이란, 미분(기울기)의 미분값을 의미하고, Newton's method가 일종의 Hessian 을 이용한 방법론입니다. 다만 Parameter의 수가 100개라면, 1차 미분에는 100의 연산이 필요하지만, 2차 미분에는 100^2의 연산이 필요합니다. 때문에 우리는 1차 미분에 대한 정보만을 갖고있다고 가정합니다.
Batch gradient descent, 예를 들어, 55000개의 데이터가 있을 때, Gradient를 계산하기 위해 전체 데이터셋을 한 번에 사용하는 것을 의미합니다. 그 말인즉슨 55000개의 Gradient를 각각 계산하고, 평균을 내어 모델을 한 번 업데이트하는 것입니다. 한 번의 업데이트를 위해 55000의 계산이 필요하기 때문에, 느립니다.
Stochastic gradient descent는 반대입니다. 한 번에 한 개씩만 보는거죠. 때문에 Loss가 널뜁니다. 생각해보죠. 55000개에 적합한 값을 찾아야하는데 1개를 학습할 때마다 업데이트를 하니, 어떤 때는 일반적으로 적합한 업데이트가 될 것이고, 어떤 때는 전체적인 맥락에는 맞지 않는 업데이트가 발생하겠죠. 그래도 언젠가는 Converge할 것입니다. Stochastic이라는 말이 붙은 이유는, 1개를 뽑는 게 랜덤이라 그렇습니다. 그래도 최종적으로 얻어지는 Gradient descent의 Expectation은 Batch gradient descent와 같습니다.
Mini-batch gradient descent는 그 중간입니다. 50개 256개 이런식의 묶음을 사용해 모델을 업데이트하는 거죠. 보통 SGD를 썼다고하면 Mini-batch gradient descent를 썼다는 걸 의미합니다. 일반적으로 Mini batch는 64 128 256 등 2의 거듭제곱로 사용합니다. 이는 GPU의 메모리가 2의 거듭제곱이기 때문입니다. 그래서 특정상황에서 66개의 배치를 사용하나, 254개의 배치를 사용하나 필요한 시간이 비슷한 경우가 발생하고, 최고의 효율을 내기 위해 2의 거듭제곱으로 설정합니다. 많이 알려져있는, 특히 개발자에게 일반적으로 통용되는 사실은, Batch size가 작을수록, 시간은 오래걸리지만 효과는 좋다는 점입니다.
문제점은 좋은 Learning rate를 찾는 것이 어렵습니다. 이 문제는 Learning rate scheduling을 통해 해결합니다. 두번째 문제는 Local minima에 빠질 수 있다는 점입니다.
때문에 Momentum, Nesterov accelerate 이 전에 업데이트 된 정보를 활용해 Gradient를 Update할 수 있습니다. Momentum은 말그대로 학습에 관성을 추가해 조금더 빠르게 나아갈지 속도를 조금 줄여야할지를 판단하며, Nestrov는 Momentum을 통해 예견된 위치에서 Gradient를 업데이트하는 방식입니다. 또는 Adagrad라는 Adaptive한 방법론이 가능합니다. 이는 예를 들어 10000개의 Parameter가 있다면 Parameter별 Learning rate를 설정하는 것입니다. 그리고 자주 변화는 Parameter에 대한 Learning rate는 조금씩 변화시키고, 그렇지않은 Parameter에 대한 Learning rate는 크게 변화시키는 거죠. 그러기 위해서는 어떻게 많이 변화한 것을 표현할 것인가가 필요하고, 이는 수학적 수식으로 표현됩니다. 좋은 방법이지만 하나의 치명적 단점은, Learning rate가 계속해서 작아진다는 점인데, 때문에 값을 업데이트할 때 사용한 세타를 저장하고 활용하는, EMA를 활용한 Adadelta가 나왔습니다. 이건 Learning rate가 필요없습니다. 그다음이 RMSprop입니다. 이건 Adadelta에 Learning rate를 추가한 것인데, 효과가 좋았습니다. 마지막으로 Adam입니다.이는 Adaptive Moment Estimation의 약칭으로 위의 2가지 아이디어를 모두 사용한 것입니다. 실제 Adam을 쓸 때 중요한 Parameter는 epsilon(분모가 0이 아니게끔 하는 보정값)과 beta(Momentum에 관여하는)입니다. epsilon의 기본값이 지금은 10^-8이지만 저는 별로 적합한 수치는 아니라고 생각합니다. 때문에 학습이 잘 안될때는 epsilon을 바꿔보는 것을 추천합니다. 조금더 크게. 10^-4, 10^-2 정도로. 이렇게 많이 봤지만, 사실 Adam을 쓰시면 됩니다. 보통은.
추가적인 방법론을 말씀드리면, Shuffling. 섞는거죠. 학습 데이터는 매 Epoch마다 섞어주시면 좋습니다. 또 Curriculum learning. 쉬운데이터로 학습을 하다가, 어려운걸 학습시키는. 사람을 교육하듯 하는 개념입니다. 그리고 Batch normalization, Early stopping, Gradient noise를 사용할 수 있습니다.
좋은 Learning rate는 원만한 곡선의 형태입니다. 물론 실제 개발을 하면 이걸 판단하는게 쉽지 않습니다. 결국 많은 시도와 경험이 필요합니다. 이상입니다.
'머신러닝 > [논문으로 짚어보는 딥러닝의 맥]' 카테고리의 다른 글
이미지의 각 픽셀을 분류하는 Semantic Segmentation (0) | 2020.03.24 |
---|---|
Restricted Boltzmann Machine (0) | 2020.03.23 |
Nature 논문으로 살펴보는 AlphaGo 알고리즘 (0) | 2020.03.21 |
Overfitting을 막는 regularization (0) | 2020.03.20 |
[실습] 이미지 처리 실습하기 (0) | 2020.03.19 |