본문 바로가기

IT/Deeplearning

[번역:: Gradient Clipping] Why you should use gradient clipping

최근 자율주행차량 논문을 읽다가 계속해서 Gradient Clipping이라는 단어가 나와서 공부를 하던 도중에 해당 블로그 글을 찾게되서

Gradient Clipping이 무엇인지에 대해서 해당 블로그 글을 번역해보려고합니다.



"Deep learning" 책을 읽다가 Gradient Clipping이라는 새로운 팁을 알게되었습니다. 

딮러닝 연구자/엔지니어 사이에서는 이미 상식같은 내용이었지만, 어쨌든, 나는 Gradient Clipping이 무엇인지 몰랐었습니다.


문제


recurrent network나 deep neural network같은 강한 비선형 목적함수를 가지고 있을 경우에에 미분값은 매우 크거나 작아지는 경향이 있는 

문제가 있습니다. 이러한 가파른 지녁은 절벽과 비슷하며, 이러한 결과는 여러개의 큰 가중치값을 곱할때 생기게 됩니다. 

이런 가파른 지역에 다다르게되면, Backpropagation에서의 gradient update step에서 파라미터들이 굉장히 크게 움직일 수 있습니다. 

일반적으로 이러한 절벽지형을 통해서 파라미터들이 크게 움직이게 되면, 여태까지 진행해왔던 수많은 학습 epoch들이 무효화될 수 있습니다. 


gradient는 현재 파라미터가 국부적인 지역안에서 steepest descent::Gradient descent 알고리즘이 가야할 방향을 알려줍니다. 

만약 이러한 국부지역을 벗어나게 된다면. 비용함수(Cost function)이 증가할 수 있습니다. 

따라서 parameter 업데이트시에 이러한 국부지역을 벗어나지 않도록 충분히 작은 업데이트 step을 갖게 만들어야합니다.



솔루션


이러한 문제에 대처하는 한가지 방법은 learning rate를 매우 작게 설정하는 것입니다. 이 솔루션은 학습 속도를 매우 느리게 만들고, 

잘못하면 local minima에 빠지게 만듭니다. 위의 솔루션보다 더 좋은 솔루션은 gradient clipping :: norm-clipping을 사용하는 것입니다.

gradient clipping의 개념은 gradient의 최대 갯수를 제한하고, gradient가 최대치를 넘게되면 gradient의 크기를 재조정해서 gradient의 

크기를 조정하는 것입니다. 이러한 gradient clipping은 최적화 알고리즘이 가야하는 방향은 그대로 유지하면서 업데이트되야하는 step의 

크기(learning rate)를 자동으로 조정합니다.



생각


만약에 여러분들의 업무가 강한 비선형적인 목적함수를 갖는 네트워크 모델을 자동으로 훈련해야하는 업무라면 하이퍼 파라미터를 

최적화해야하는, 즉 여러가지를 많이 시도해봐야하는 일이 생기게 되고, 이를 자동화해야할 필요가 생기게 됩니다. 

우리는 엔지니어고, 엔지니어는 자동화를 통해서 업무 효율을 극대화해야합니다. 여기서 나의 문제는 학습의 예측 불가능이었습니다. 

이런 경우에 학습 시에 gradient 초기화 문제에 직면하게 됩니다. 이럴 때, 곧바로 대처하게 되는 방법은 learning rate를 

줄이는 방법을 쓰게 되는데, 이는 시간과 돈을 요구하게되므로 그 외에도 항상 자동으로 작동해야하는 무엇인가가 필요했습니다.

gradient clipping은 이러한 제 문제에 대해서 굉장히 훌륭하게 작동했고, 학습 속도를 높여서 학습이 매우 빠르게 만들어줬습니다.


결론


gradient clipping을 사용할 수 있다면 모든 네트워크에 사용하세요! 일반적으로 gradient clipping의 최대 gradient 갯수는 1로 제한됩니다. 

Caffe에서는 Solver에 쓰기 쉽게 제공되고있고, 프레임워크가 지원하지 않으면, 직접 구현할 수도 있습니다. Gradient clipping을 통해서 

여러분의 시간과 노력을 줄일 수 있습니다.


[Reference]

[1] Deeplearning : Why you should use gradient clipping