2020년 7월 3일 금요일

Gradient-Free Optimization

딥러닝은 gradient를 통해 최적화를 하는게 핵심이다.
거의 모든 딥러닝 모델은 gradient를 통해 훈련한다.
간단하고 효율적이다.
하지만 단점도 많다.

딥러닝의 핵심은 "해석은 어렵지만 비선형 활성화 함수를 신경망을 모사하는 형태로 구성하고 이를 사용하여 무언가를 해결하라고 맡겼더니 잘되더라" 인데,

비선형 함수에 의한 층을 쌓다 보니
gradient를 형성하는 영역이 좁다던지
층이 깊어질수록 아래로 전달되는 gradient가 줄어든다던지 하는 문제에서부터,

모델의 component를 미분가능한 녀석들로만 사용해야한다던지
(VAE의 sampling operation을 위해 reparameterization trick과 같은 방법을 쓰지만 Gaussian 분포에서만 편리하고 categorical 분포만 쓰려고 해도 Gumbel trick과 같이 조금은 불친절한 방법을 써야 한다.)

LSTM 모델을 훈련할 때에는 나중 입력에 대한 gradient가 전달될때까지 기다려야 해서 학습속도가 느려지는 문제를 야기한다.

갈수록 계산능력이 좋아지고는 있지만, 내가 보기엔 데이터의 양이 증가하는 속도가 더 빨라 보인다.

작년부터 딥러닝 훈련에 꼭 gradient를 써야하나 싶은 생각이 들었다.
아니, "사람이 학습하는데 gradient를 계산하나?"하는 의문이 들었다.
그냥 이것저것 시도해보고(random sampling) 뭔가 반응 있는 쪽으로 행동하지 않나?(momentum)이라고 생각했다.

이를테면,
현재 parameter에서의 loss와 현재 parameter를 기준으로 random하게 sampling 된 model parameter와의 loss를 비교해서 loss가 줄어들면 parameter를 이동시키면 어떨까 싶은 생각이 들었다. 이를테면 relative loss 같은 개념.

이런 방법을 쓰면 forward pass에서 바로바로 relative loss를 계산하니 LSTM에 좋을 것 같고,
trick 없이 sampling을 위한 분포도 훈련하고, 형식 제약도 없고,

딥러닝 모델의 깊이 문제도 없을것 같고,

단순한 linear regression에서는 어느정도 동작하는 거 같은데,
논문으로 만들어 보자니, 분석 및 수렴 증명을 이론적으로 풀어나갈 자신이 없어 미뤄두고 있었다.

찾아보니 이런 식의 접근이 오래전부터 있었다. (뭐 세상은 넓으니까)
"Gradientless Descent: High-Dimensional Zeroth-Order Optimization"
이 논문이 가장 최근인듯 싶고,
한 5년 전에도 내가 생각한 것과 비슷한 방법이 있었다.
내가 좋아하는 John Duchi의
"Optimal Rates for Zero-Order Convex Optimization: The Power of Two Function Evaluations" 이다.
Bregman divergence를 활용한 방법인데

휴 시간이 없어 둘 다 자세히 보진 못했고 차근차근 읽어봐야겠다.
방법과 더불어 분석과 수렴 증명이 인상적이니 배울게 많아 보인다.

아, 무식한 방법으로
"RSO: A Gradient Free Sampling Based Approach For Training Deep Neural Network"도 있는데,
이건 정말 파라메터 하나하나에 대해 sampling을 하고 그거에 대한 loss가 줄어들면 취하고 늘면 버리는 식인데, 어마어마한 훈련시간이 필요한 방법일지라도 통하는 건 보여주었다.
하지만, 이건 그냥 gradient 대신의 difference라서 의미가 있는건가 싶다.

쨋든, 이건 그냥 시작이니
필요한 것들은 추가로 정리해야겠다.