Motivation
일반적으로, 우리가 처음 배우는 미분이라는 개념은 고등학교 때 미적분을 배울 때 처음 등장한다.
미분의 정의부터 미분가능성, 실제 미분식까지 여러 가지를 배우는데, 이때 무엇을 해도 변하지 않는 것은 바로 일변수라는 것이다.
수학적으로 표현하면, 함수 f:R→R에 대해서 미분을 다루기 때문에, 크게 문제가 일어나지 않는다.
하지만, 딥러닝으로 들어가면 하나의 데이터가 가지고 있는 feature들이 여러 개 있기 때문에 Vector를, 이것들을 한꺼번에 처리하기 위해 Matrix를 들고오게 된다.
특히, 딥러닝쪽에서는 Parameter update(often called Backpropagation)를 진행하기 위해서 현재 parameter에서의 Loss값을 이용하기 때문에, 그때의 Gradient를 구할 수 있어야 한다.
즉, 우리가 필요한 것은 f:Rm×n→R의 함수에서 f(X) 혹은 f:Rm→R에서 f(x)의 Gradient 값이 필요하다.
이를 조금 쉽게 구할 방법에 대해서 알아볼 것이다.
Symbols
편의를 위해, 추후 자주 쓰일 것들에 대해 약속을 할 것이다.
- x, y와 같이 굵은 소문자는 vector를 의미한다.
- A, B와 같이 대문자는 Matrix, 즉 행렬을 의미한다.
일반적으로 f, g, h는 함수를 의미하며, R은 실수 전체의 집합이다.
- ⋅는 행렬곱을 의미하며 대부분 줄여쓴다. 즉, A⋅B=AB로 사용한다.
- ⊙는 Hadamard product를 의미하며, 각 원소끼리 곱을 의미한다.
즉, 크기가 같은 행렬 A, B에 대해(A⊙B)ij=Aij×Bij
- ⊤는 Matrix의 전치를 할 때 사용한다. 즉,
(A⊤)ij=Aji
- Rn에서 각각의 변수는 (x1,x2,⋯,xn)으로 표기한다.
- ⟨⋅,⋅⟩은 내적을 의미한다. 즉, a와 b의 내적은 ⟨a,b⟩로 작성한다.
- 편의를 위해 a⋅b로 작성할 때도 있다.
Total derivate
사실 다변수 함수의 미분과 가장 관련이 있는 값은 Gradient보다는 Total derivate이기 때문에, 이가 뭔지부터 알아보자.
일반적으로 다변수 같은 경우 미분을 고려할 때 여러 방향으로의 미분을 전체적으로 고려해야한다. 이를 Total derivate라고 한다.
참고로, 하나의 변수에 주목하여 이것에 대한 변화만 고려를 할 수 있는데, 이를 Partial derivate(편미분)이라고 한다.
위에서도 말했듯이 Total derivate는 전체에 대한 변화가 필요하기 때문에 각 부분에 대한 편미분의 값을 Vector로 만들어주는 식으로 진행한다.
즉, f:Rn→R에 대해 Total Derivate Dfa는
Dfa=[∂x1∂f(a)∂x2∂f(a)⋯∂xn∂f(a)]
으로 표기한다.
현재 y=f(a)에서 y에 대한 항이 아직 안 나온 것을 참고하자.
이때, 우리는 f에 대한 변화량이 궁금한 것이고 이를 알기 위해서는 모든 x에 대한 변화량에 대한 전체값의 변화가 필요하다.
따라서, 위의 값들을 모두 합쳐줄 필요가 있으므로
i=1∑n∂xi∂f(a)Δxi
이고, 우리는 미소 변화량에 대한 값이 필요하므로 Δxi를 dxi로 보내면
dfa=i=1∑n∂xi∂f(a)dxi
f의 output이 R, 즉 일변수이기 때문에 다음과 같이 표현가능하고 만약 다변수면 f를 일변수 함수의 stacking으로 표현하면 된다.
Why we learn Total derivate, not Gradient?
실제로 Gradient Descent에서 활용되는 것은 Gradient인데, 왜 Total derivate를 소개하였을까?
첫째로 Total derivate가 활용도가 더 높다.
무슨 뜻이냐면, Gradient에서는 Backpropagation에서 필수적으로 활용이 되는 Chain Rule이 성립하지 않는다.
Chain Rule이 성립하지 않으면 Layer 하나와 하나 간의 관계에서 미분을 하는 것이 아니라 전체에 대한 함수에 대해서 calculation을 수행해야하기 때문에, 난이도가 수백 수천배는 올라가게 된다.
다음으로, Total derivate와 Gradient는 서로 Tranpose의 관계에 있다. 즉,
∇f(p)⊤=Dfp
이 성립하고, 이를 이용하면 dfp=i=1∑n∂xi∂f(a)dxi=∇f(p)⋅dx로 쓸 수 있다.
또한, Total derivate에서는 Chain rule이 성립하고, 함수 f∘g에서
d(f∘g)a=dfg(a)∘dga
Trace and inner product
해당 Chapter에서는 추후 trick을 위해 필요한 것들을 간단하게 소개할 예정이다.
Matrix에서는 모든 대각선의 요소를 더하는 연산자가 있는데, 이를 trace라고 한다.
행렬 A에 대한 Trace는 tr(A)로 표기하며, 가장 대표적인 commutative하고 linearity를 가지는 연산자이다.
Inner product, 즉 내적 연산은 두 개의 Vector 또는 행렬이 결합하여 실수를 뱉는 대표적인 연산자이다. 다르게 적으면,
⟨⋅,⋅⟩:Rn×Rn→R
이외에 내적이 될려면 여러 가지 성질을 만족해야하는데, 이는 생략하도록 하겠다.
일반적이로 벡터에서는 element wise한 곱을, Matrix에서는 Frobenius norm을 쓰는 것이 대표적이다.
Vector form에서 내적은 일반적으로 ⟨u,v⟩=u⊤v로 정의하고, Matrix에서는 ⟨A,B⟩=tr(A⊤B)를 활용한다.
이때, trace의 성질 중 하나인 ∀a∈R:tr(a)=a를 활용하면 Vector에서의 내적도 동일하게 trace를 이용하여 정의할 수 있다.
Properties of Trace
- tr(A±B)=tr(A)±tr(B)
- tr(cA)=ctr(A), where c is scalar.
- tr(AB)=tr(BA) (If can)
- Corollary: tr(A1A2⋯An)=tr(AnA1⋯An−1)
- tr(A⊤B)=tr(B⊤A)=∑i∑jAijBij
- Lemma: tr(A⊤)=tr(A)
- tr(a)=a if a∈R (Important property!!!)
Matrix Differentiation rules
- d(X±Y)=dX±dY, d(XY)=(dX)Y+X(dY)
- d(X⊤)=(dX)⊤
- dtr(X)=tr(dX)
- d(X⊙Y)=(dX⊙Y)=X⊙dY
- dσ(X)=σ′(X)⊙dX, where σ(⋅) is an element wise function.
- ⟨A,B⊙C⟩=⟨A⊙B,C⟩, where A, B, C has same size.
Inner product rules
- ⟨X,Y⟩=⟨Y,X⟩
- ⟨aX,Y⟩=a⟨X,Y⟩=⟨X,aY⟩
- ⟨X+Z,Y⟩=⟨X,Y⟩+⟨Z,Y⟩
- ⟨X,Y⊙Z⟩=⟨X⊙Y,Z⟩ (Note that Hadamard product holds commutativity)
- ⟨AC,BD⟩=⟨B⊤AC,D⟩=⟨ACD⊤,B⟩ (Also holds B or D is vector)
Scalar function & Trace Trick
Scalar function은 함수 f의 range가 실수 전체인 함수를 의미한다. 즉, f(x)∈R 혹은 f(X)∈R을 의미한다.
이때, 이전의 전미분과 Gradient의 관계식을 활용하면
i=1∑n∂xi∂fdxi=(∇xf)⊤dx=tr{(∇xf)⊤dx}=⟨∇xf,dx⟩
Severel Examples
Example 1
Problem
정사각행렬 A와 column vector x에 대해 함수 f(x)=x⊤Ax라 할때, ∇xf를 구하여라.
Solution
f:Rn→R이므로 scalar function이고 Trace Trick을 활용할 수 있다.
따라서,
df∴∇xf=⟨1,d(x⊤Ax)⟩=⟨1,(dx⊤)Ax+x⊤A(dx)⟩(∵ A is constant)=⟨1,(dx)⊤Ax+xTA(dx)⟩=⟨1,(dx)⊤Ax⟩+⟨1,x⊤A(dx)⟩=⟨1,x⊤A⊤(dx)⟩+⟨1,x⊤A(dx)⟩=⟨Ax,dx⟩+⟨A⊤x,dx⟩=⟨(A+A⊤)x,dx⟩=⟨∇xf,dx⟩=(A+A⊤)x
Example 2
Problem
f(X)=a⊤exp(Xb)에 대해 ∇Xf를 구하시오.
Solution
f:Rn×m→R이므로 scalar function이고 Trace trick을 활용할 수 있다.
따라서,
df∴∇Xf=⟨1,d(a⊤exp(Xb))⟩=⟨1,a⊤d(exp(Xb))⟩=⟨a,d(exp(Xb))⟩=⟨a,exp(Xb)⊙d(Xb)⟩(∵exp(⋅) is element-wise function)=⟨a⊙exp(Xb),d(Xb)⟩=⟨a⊙exp(Xb),(dX)b⟩=⟨(a⊙exp(Xb))⋅b⊤,dX⟩=⟨∇Xf,dX⟩=(a⊙exp(Xb))⋅b⊤
Example 3 (Neural Network)
Problem
L=f(Y), Y=WX이라 하자. 이때, f는 행렬에서 scalar로 보내는 함수이다. ∇Xf, ∇Wf을 구하여라. (이때, ∇Yf는 이미 구해진 상태라 가정하자.)
Solution
dL=df(Y)=⟨∇Yf,dY⟩=⟨∇Yf,d(WX)⟩=⟨∇Yf,(dW)X+W(dX)⟩=⟨∇Yf,(dW)X⟩+⟨∇Yf,W(dX)⟩
이때 ∇Xf를 위해 W를 constant라 가정하면 dW=0이므로
dL∴∇Xf=⟨∇Yf,W(dX)⟩=⟨W⊤∇Yf,dX⟩=⟨∇Xf,dX⟩=W⊤∇Yf
같은 방법으로 ∇Wf를 위해 X를 constant라 가정하면 dX=0이므로
dL∴∇Wf=⟨∇Yf,(dW)X⟩=⟨∇Yf⋅X⊤,dW⟩=⟨∇Wf,dW⟩=∇Yf⋅X⊤
Reference Link
잘 보고 있습니다