글
Automatic Differentiation
* 아래 내용은 아직 본인도 명확히 이해를 하지 못하고 있으며, 생각을 하면서 끄적인 글이라 타인에게 오히려 혼란을 줄 수도 있으나, 생각의 과정이 의외로 타인에게 도움이 되는 경우가 있으므로 공개한다.
(결론은, 결코 추천할 만한 글이 아님.. T.T)
최적화 문제를 풀기 위해서 partial derivative 문제를 풀 일이 발생하였다.
나는 linear algebra의 편리한 사용을 위해 Eigen을 사용하고 있다.
(다른 좋은 tool도 많겠지만.)
일단 Eigen에서는 partial derivative를 따로 제공하고 있지는 않다.
다만 Automatic Differentiation 기능을 제공한다.
그렇다면 Automatic Differentiation 기능이란 무엇일까?
http://en.wikipedia.org/wiki/Automatic_differentiation 를 참조하면 아주 잘 설명되어 있다.
와 같은 chain rule을 사용하여 numerical하게 differentiation 계산을 한다고 보면 된다.
이 때 주의해야 할 점은, 기존의 numerical differentiation 방법과는 차이가 있다는 것이다.
기존의 방식 중에 forward 방식을 예로 들어 생각해 보자.
와 같이 표현된다.
따라서 이 h를 얼마나 미소하게 쪼갤 수 있느냐에 따라 그 성능이 결정된다고 볼 수 있다.
물론 이 때 발생하는 오류에 대한 분석이 없는 것은 아니다.
( 이 때, c는 물론 양 쪽 input 값의 중간 값을 의미한다.)
하지만, 우리는 일반적으로 간단한 하나의 함수에 대해서 문제를 풀기 보다는 복잡한 차원의 문제를 풀다보니 matrix 형태로 표현된 문제를 풀 때가 많다. (예를 들자면 Jacobian matrix를 생각해 볼 수 있겠다.)
따라서 직접 c/c++ 코드 등으로 구현을 하려면 matrix 차원에 따라 어마어마한 코딩량이 발생할 수도 있다.
이에 우리는 이러한 문제를 쉽게 풀 수 있는 Tool은 없는지 찾게 되는 것이 본능이다!
Wiki에 보면 다양한 AD Tool이 비교되어 있다. 그러나 우리에게 필요한 것은 Eigen과 함께 사용할 수 있는 Tool이 있느냐는 것!!
https://justindomke.wordpress.com/2009/02/17/automatic-differentiation-the-most-criminally-underused-tool-in-the-potential-machine-learning-toolbox/
와 같은 페이지에서 Eigen과 함께 사용할 수 있는 지에 대한 고민을 토론하고 있으나 아직 해답은 없는 것으로 보인다.