벡터 미분과 행렬 미분

수학 이야기 2014. 8. 21. 20:01

논문을 읽거나 어떤 이론을 이해할 때, 그리고 자신이 수식을 전재할 때 종종 벡터, 행렬에 대한 미분이 필요한 경우가 종종 있습니다.


저의 경우는 주로 함수 최적화 기법(Least Squares, Weighted Lest Squares, 가우스-뉴턴법, Gradient Descent 방법, Levenberg-Marquardt 방법 등) 관련해서 벡터 미분을 종종 접하는데 그때마다 수식을 푸는데(이해하는데) 시간을 많이 소비합니다. 그래서 한번 정리를 해 두면 좋겠다 싶어서 글을 씁니다.


벡터, 행렬 미분에 대한 내용은 사실 위키피디아(http://en.wikipedia.org/wiki/Matrix_calculus)에 잘 정리가 되어 있으니 보다 자세한 내용은 위키피디아를 참조하시면 좋겠습니다.



1. 표현 및 기호


이 글에서 스칼라(scalar)는 x, y 등과 같이 이텔릭 소문자로, 벡터(vector)는 x, y와 같이 볼드체 소문자로, 행렬(matrix)은 A, B 등과 같이 대문자로 표기합니다.


☞ 스칼라(영어: scalar 스케일러)란 크기와 방향을 가지는 벡터에 대비하는 개념으로, 크기만 있고 방향을 가지지 않는 양을 말합니다. 그런데, 상수 뿐만 아니라 변수, 함수도 모두 스칼라가 될 수 있음에 주의해야 합니다. 예를 들어 스칼라 함수는 y = f(x1,...,xn)과 같이 그 결과값이 1차원의 값인 함수이며, f(x1,...,xn) = (f1(x1,...,xn), ..., fm(x1,...,xn))과 같이 그 결과값이 다차원인 함수는 벡터함수라 부릅니다. 즉, 상수, 변수, 함수 관계없이 1차원의 값을 나타내는 것은 모두 스칼라라고 이해하면 됩니다.


벡터는 열벡터로 표현할 수도 있고 행벡터로 쓸 수도 있지만 이 글에서는 열벡터 표현을 사용합니다. 즉, x는 열벡터를 의미하고 xT는 행벡터를 의미합니다. 벡터가 행렬 등과 같이 수식적으로 사용될 때에는 열벡터 표현을 사용하는 것이 일반적입니다.


스칼라를 스칼라로 미분하는 경우, 벡터를 벡터로 미분하는 경우 등 다양한 경우의 미분을 위 기호에 따라 표로 나타내면 아래와 같습니다 (표 출처: 위키피디아).


 

 스칼라

 벡터

 행렬

 스칼라

 


 


 


 벡터

 


 


 

 행렬

 


 

 


행렬을 벡터로 미분하는 경우나 행렬을 행렬로 미분하는 경우는 다루지 않습니다. 하지만, 스칼라를 행렬이나 벡터로 미분하는 경우를 벡터나 행렬의 원소에 각각 적용하는 방식으로 확장해 보면 벡터-행렬, 행렬-벡터, 행렬-행렬 미분도 어렵지 않게 구할 수 있습니다.



2. 벡터, 행렬 미분 정의


다양한 경우의 벡터, 행렬 미분은 다음과 같이 정의됩니다.


스칼라 함수를 벡터로 미분(Gradient)


 --- (1)



벡터를 스칼라로 미분


 --- (2)



스칼라 함수를 행렬로 미분


 --- (3)



행렬을 스칼라로 미분


--- (4)



벡터를 벡터로 미분


 --- (5)



※ 분자중심 표현(numerator layout)과 분모중심 표현(denominator layout)

식 (1)에서 미분 결과는 행벡터인 반면에 식 (2)의 결과는 왜 열벡터인지 혼동스러울 지도 모르겠습니다. 그런데, 사실은 식 (1)의 결과를 열벡터로 쓰고 식 (2)의 결과를 행벡터로 써도 모두 맞는 표현입니다. 그 차이는 벡터를 미분할 경우나 벡터로 미분할 경우에 피미분 변수(numerator)를 중심으로 행과 열을 결정할지 아니면 미분 변수(denominator)를 중심으로 행과 열을 결정할지의 차이입니다. 위키피디아에 보면 사람에 따라서 그리고 서적에 따라서 두 가지 표현법이 혼재되어 사용된다고 나옵니다. 중요한 점은 어느 한쪽 표현법을 선택하든지 일관되게만 사용하면 될 것 같습니다. 이 글에서는 벡터 미분은 개인적으로 좀더 친숙한 분자중심 표현(numerator layout)을 따르고 있으며 분자중심 표현과 분모중심 표현은 서로 전치(transpose) 관계에 있습니다. 보다 자세한 내용은 위키피디아를 참조하시기 바랍니다.



3. 벡터, 행렬 미분의 계산


상수벡터 a와 열벡터 x에 대해 aTxx로 미분하면 그 결과값은 aT가 됩니다. 정말로 그렇게 되는지 앞서 설명한 벡터, 행렬 미분 정의에 따라 실제로 계산을 해 보겠습니다.


 --- (6)


와 같이 aTx는 하나의 스칼라 값입니다. 따라서 스칼라 aTx를 식 (1)을 이용하여 벡터 x로 미분하면


 --- (7)


와 같이 aT가 됩니다.


이와 같이 벡터, 행렬식에 대한 미분은 원래의 정의를 이용하면 모두 계산이 가능합니다. 하지만 정의에 따라 직접 미분을 계산하는 것은 시간이 많이 걸리고 또 어렵기 때문에 개인적으로 필요한 부분만 아래에 표로 정리합니다(보다 다양한 경우의 미분은 위키피디아 참조).


a, b: 상수 벡터

A: 상수 행렬

y, z: x와 함수관계를 갖는 벡터


 식

 x 로 미분 결과

 



 


 


 

 



 


 


 

 



 

 



 


 

 



 


 


 


 


 


 



벡터, 행렬 미분에서도 잘 보면 곱의 미분, 합성함수 미분 등 보통의 실함수 미분에서 적용되는 성질이 그대로 적용됩니다. 그리고 norm의 제곱은 내적과 같다는 점(∥x∥2 = x·x = xTx)과, xTAy, xTy를 계산하면 결과적으로 스칼라가 된다는 점, 그리고 스칼라의 전치(transpose)는 그 자신이기 때문에 xTAy = yTATx, xTy = yTx와 같이 얼마든지 바꿔 써도 된다는 점 등을 잘 활용하면 벡터, 행렬 수식에서 미분을 보다 용이하게 전개할 수 있습니다.



by 다크 프로그래머