Calculus_행렬의 미분

JKH·약 7시간 전
0

미적분

목록 보기
4/4

데이터 사이언스 스쿨에서 공부한 내용입니다.

4.4 행렬의 미분

f([x1x2])=f(x)=f(x1,x2)(4.4.1)f\left( \begin{bmatrix} x_1 \\ x_2 \end{bmatrix} \right) = f(x) = f(x_1, x_2) \tag{4.4.1}
f([x11x12x21x22])=f(X)=f(x11,,x22)(4.4.3)f\left( \begin{bmatrix} x_{11} & x_{12} \\ x_{21} & x_{22} \end{bmatrix} \right) = f(X) = f(x_{11}, \cdots, x_{22}) \tag{4.4.3}
f(x)=[f1(x)f2(x)](4.4.5)f(x) = \begin{bmatrix} f_1(x) \\ f_2(x) \end{bmatrix} \tag{4.4.5}
f(x)=[f11(x)f12(x)f21(x)f22(x)](4.4.7)f(x) = \begin{bmatrix} f_{11}(x) & f_{12}(x) \\ f_{21}(x) & f_{22}(x) \end{bmatrix} \tag{4.4.7}
f(x)=[f1(x1,x2)f2(x1,x2)](4.4.9)f(x) = \begin{bmatrix} f_1(x_1, x_2) \\ f_2(x_1, x_2) \end{bmatrix} \tag{4.4.9}
f(x)=[f11(x1,x2)f12(x1,x2)f21(x1,x2)f22(x1,x2)](4.4.11)f(x) = \begin{bmatrix} f_{11}(x_1, x_2) & f_{12}(x_1, x_2) \\ f_{21}(x_1, x_2) & f_{22}(x_1, x_2) \end{bmatrix} \tag{4.4.11}

이러한 행렬을 입력이나 출력으로 가지는 함수를 미분하는 것을 행렬미분(matrix differentiation) 이라고 한다. 사실 행렬미분은 정확하게는 미분이 아닌 편미분(partial derivative)이지만 여기에서는 편의상 미분이라고 쓰겠다. 또한 행렬미분에는 분자중심 표현법(Numerator-layout notation)과 분모중심 표현법(Denominator-layout notation) 두 가지가 있는데 여기에서는 분모중심 표현법으로 서술한다.

스칼라를 벡터로 미분하는 경우

데이터 분석에서는 함수의 출력변수가 스칼라이고 입력변수 xx가 벡터인 다변수 함수를 사용하는 경우가 많다. 따라서 편미분도 fx1,fx2,\frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, \cdots 등으로 여러 개가 존재한다.

이렇게 스칼라를 벡터로 미분하는 경우에는 결과를 열벡터로 표시한다. 이렇게 만들어진 벡터를 그레디언트 벡터(gradient vector) 라고 하고 f\nabla f로 표기한다.

f=fx=[fx1fx2fxN](4.4.13)\nabla f = \frac{\partial f}{\partial {x}} = \begin{bmatrix} \dfrac{\partial f}{\partial x_1}\\ \dfrac{\partial f}{\partial x_2}\\ \vdots\\ \dfrac{\partial f}{\partial x_N}\\ \end{bmatrix} \tag{4.4.13}

예제

다음과 같은 다변수 함수에 대한 그레디언트 벡터를 구하면

f(x,y)=2x2+6xy+7y226x54y+107(4.4.14)f(x, y) = 2x^2 + 6xy + 7y^2 - 26x - 54y + 107 \tag{4.4.14}
f=[fxfy]=[4x+6y266x+14y54](4.4.15)\nabla f = \begin{bmatrix} \dfrac{\partial f}{\partial x}\\ \dfrac{\partial f}{\partial y}\\ \end{bmatrix} = \begin{bmatrix} 4x + 6y - 26\\ 6x + 14y - 54\\ \end{bmatrix} \tag{4.4.15}

연습 문제 4.4.1

다음 함수의 그레디언트 벡터를 구하라

(1)

f(x,y,z)=x+y+z(4.4.16)f(x, y, z) = x + y + z \tag{4.4.16}

✏️
(1,1,1)(1,1,1)

(2)

f(x,y,z)=xyz(4.4.17)f(x, y, z) = xyz \tag{4.4.17}

✏️
(yz,xz,xy)(yz, xz, xy)

연습 문제 4.4.2

f=[4x+6y266x+14y54](4.4.18)\nabla f = \begin{bmatrix} 4x + 6y - 26\\ 6x + 14y - 54\\ \end{bmatrix} \tag{4.4.18}

에 대해서 x,yx, y가 다음 위치일 때 그레디언트 벡터의 값을 구하고 평면상에 화살표로 나타내라.

(1) x=7,y=1x=7, y=1
✏️
(8, 12)

(2) x=2,y=1x=2, y=1
✏️
(-12, -28)

✏️

import plotly.figure_factory as ff
import numpy as np

x, y = np.meshgrid(np.arange(0, 10, 1), np.arange(0, 10, 1))
u = 4*x + 6*y - 26
v = 6*x + 14*y - 54

fig = ff.create_quiver(x, y, u, v)
fig.show()

이렇게 컨투어 플롯 위에 그레디언트 벡터를 화살표로 나타낸 것을 플롯을 퀴버(quiver)플롯이라고 한다. 퀴버플롯에서 화살표는 화살표 시작 지점의 그레디언트 벡터를 나타낸다.

예제

다음은 함수

2x2+6xy+7y226x54y+107(4.4.19)2x^2 + 6xy + 7y^2 - 26x - 54y + 107 \tag{4.4.19}

의 그레디언트 벡터를 표시한 퀴버플롯이다.

def f(x, y):
    return 2 * x**2 + 6 * x * y + 7 * y**2 - 26 * x - 54 * y + 107

xx = np.linspace(1, 16, 100)
yy = np.linspace(-3, 6, 90)
X, Y = np.meshgrid(xx, yy)
Z = f(X, Y)


def gx(x, y):
    return 4 * x + 6 * y - 26

def gy(x, y):
    return 6 * x + 14 * y - 54

xx2 = np.linspace(1, 16, 15)
yy2 = np.linspace(-3, 6, 9)
X2, Y2 = np.meshgrid(xx2, yy2)
GX = gx(X2, Y2)
GY = gy(X2, Y2)
plt.figure(figsize=(10, 5))
plt.contour(X, Y, Z, levels=np.logspace(0, 3, 10))
plt.quiver(X2, Y2, GX, GY, color='blue', scale=400, minshaft=2)

plt.xlabel('x')
plt.ylabel('y')
plt.title("퀴버 플롯(quiver plot)")
plt.show()

연습 문제 4.4.3

2x2+6xy+7y226x54y+107(4.4.20)2x^2 + 6xy + 7y^2 - 26x - 54y + 107 \tag{4.4.20}

로 표현되는 지형을 상상하라. 이 지형의 (14, 4) 지점에 공을 두었다면 어떠한 경로로 공이 움직일지 경로를 그려라.
✏️

import plotly.figure_factory as ff
import numpy as np
import sympy

# Define symbolic variables
x_sym, y_sym = sympy.symbols('x y')
f = 2*x_sym**2 + 6*x_sym*y_sym + 7*y_sym**2 - 26*x_sym - 54*y_sym + 107

# Define numerical ranges for x and y
x_num = np.arange(10, 18, 1)
y_num = np.arange(0, 8, 1)

# Create meshgrid for numerical values
x, y = np.meshgrid(x_num, y_num)

# Calculate derivatives using symbolic variables
u_sym = sympy.diff(f, x_sym) 
v_sym = sympy.diff(f, y_sym)

# Convert symbolic derivatives to numerical functions (lambdify)
u_func = sympy.lambdify((x_sym, y_sym), u_sym, 'numpy')
v_func = sympy.lambdify((x_sym, y_sym), v_sym, 'numpy')

# Evaluate numerical derivatives using the functions
u = u_func(x, y)
v = v_func(x, y)

# Create the quiver plot
fig = ff.create_quiver(x, y, u, v)
fig.show()

# print
print("x = 14, y = 4: %s" % str((u_func(14, 4), v_func(14, 4))))


x = 14, y = 4: (54, 86) 방향으로 움직일 것이다.

퀴버플롯에서 그레디언트 벡터는 다음과 같은 특징이 있다.

  1. 그레디언트 벡터의 크기는 기울기를 의미한다. 즉 벡터의 크기가 클수록 함수 곡면의 기울기가 커진다.

  2. 그레디언트 벡터의 방향은 함수 곡면의 기울기가 가장 큰 방향, 즉 단위 길이당 함수값(높이)이 가장 크게 증가하는 방향을 가리킨다.

  3. 그레디언트 벡터의 방향은 등고선(isoline)의 방향과 직교한다.

행렬미분법칙

다변수 함수를 미분하여 그레디언트 벡터를 구할 때는 다음 두가지 법칙이 유용하게 쓰인다.

행렬미분법칙 1: 선형 모형

선형 모형을 미분하면 그레디언트 벡터는 가중치 벡터이다.

f(x)=wTx(4.4.25)f(x) = w^T x \tag{4.4.25}
f=wTxx=xTwx=w(4.4.26)\nabla f = \frac{\partial {w}^{T}{x}}{\partial {x}} = \frac{\partial {x}^{T}{w}}{\partial {x}} = {w} \tag{4.4.26}

행렬미분법칙 2: 이차 형식

이차 형식을 미분하면 행렬과 벡터의 곱으로 나타난다.

f(x)=xTAx(4.4.28)f(x) = x^T A x \tag{4.4.28}
f(x)=xTAxx=(A+AT)x(4.4.29)\nabla f(x) = \frac{\partial {x}^{T}{A}{x}}{\partial {x}} = ({A} + {A}^{T}){x} \tag{4.4.29}

✏️ 결론: 직관적으로 이해하고 외우기 !

스칼라 미분벡터/행렬미분
ax        aax \;\; \rightarrow \;\; awTx        ww^Tx \;\; \rightarrow \;\; w
ax2        2axax^2 \;\; \rightarrow \;\; 2axxTAx        (A+AT)xx^TAx \;\; \rightarrow \;\; (A+A^T)x

벡터를 스칼라로 미분하는 경우

f(x)=[f1f2fM](4.4.35){f}(x) = \begin{bmatrix} f_1 \\ f_2 \\ \vdots\\ f_M \\ \end{bmatrix} \tag{4.4.35}
fx=[f1xf2xfMx](4.4.36)\frac{\partial {f}}{\partial x} = \begin{bmatrix} \dfrac{\partial f_1}{\partial x} & \dfrac{\partial f_2}{\partial x} & \cdots & \dfrac{\partial f_M}{\partial x} \end{bmatrix} \tag{4.4.36}

벡터를 벡터로 미분하는 경우

벡터를 벡터로 미분하면 미분을 당하는 벡터의 원소가 여러개(i=1,,Ni=1, \dots, N)이고 미분을 하는 벡터의 원소도 여러개(j=1,,Mj=1, \dots, M)이므로 미분의 결과로 나온 도함수는 2차원 배열 즉, 행렬이 된다.

fx=[f1xf2xfNx]=[fx1fx2fxM]=[f1x1f2x1fNx1f1x2f2x2fNx2f1xMf2xMfNxM](4.4.37)\dfrac{\partial {f}}{\partial {x}} = \begin{bmatrix} \dfrac{\partial f_1}{\partial {x}} & \dfrac{\partial f_2}{\partial {x}} & \cdots & \dfrac{\partial f_N}{\partial {x}} \end{bmatrix} = \begin{bmatrix} \dfrac{\partial {f}}{\partial x_1} \\ \dfrac{\partial {f}}{\partial x_2} \\ \vdots \\ \dfrac{\partial {f}}{\partial x_M} \end{bmatrix} = \begin{bmatrix} \dfrac{\partial f_1}{\partial x_1} & \dfrac{\partial f_2}{\partial x_1} & \cdots & \dfrac{\partial f_N}{\partial x_1} \\ \dfrac{\partial f_1}{\partial x_2} & \dfrac{\partial f_2}{\partial x_2} & \cdots & \dfrac{\partial f_N}{\partial x_2} \\ \vdots & \vdots & \ddots & \vdots \\ \dfrac{\partial f_1}{\partial x_M} & \dfrac{\partial f_2}{\partial x_M} & \cdots & \dfrac{\partial f_N}{\partial x_M} \\ \end{bmatrix} \tag{4.4.37}

행렬미분법칙 3: 행렬과 벡터의 곱의 미분

행렬 AA와 벡터 xx의 곱 AxAx를 벡터 xx로 미분하면 행렬 ATA^T가 된다.

f(x)=Ax(4.4.38)f(x) = Ax \tag{4.4.38}
f(x)=(Ax)x=AT(4.4.39)\nabla f(x) = \dfrac{\partial ({Ax})}{\partial {x}} = A^T \tag{4.4.39}

(증명)

Ax=c1x1+c2x2++cMxM(4.4.40){Ax} = {c_1}x_1 + {c_2}x_2 + \cdots + {c_M}x_M \tag{4.4.40}
(Ax)x=[(Ax)x1(Ax)x2(Ax)xM]=[(c1x1+c2x2++cMxM)Tx1(c1x1+c2x2++cMxM)Tx2(c1x1+c2x2++cMxM)TxM]=[c1Tc2TcMT]=AT(4.4.41)\dfrac{\partial ({Ax})}{\partial {x}} = \begin{bmatrix} \dfrac{\partial ({Ax})}{\partial x_1} \\ \dfrac{\partial ({Ax})}{\partial x_2} \\ \cdots \\ \dfrac{\partial ({Ax})}{\partial x_M} \end{bmatrix} = \begin{bmatrix} \dfrac{\partial ({c_1}x_1 + {c_2}x_2 + \cdots + {c_M}x_M)^T}{\partial x_1} \\ \dfrac{\partial ({c_1}x_1 + {c_2}x_2 + \cdots + {c_M}x_M)^T}{\partial x_2} \\ \cdots \\ \dfrac{\partial ({c_1}x_1 + {c_2}x_2 + \cdots + {c_M}x_M)^T}{\partial x_M} \end{bmatrix} = \begin{bmatrix} {c_1}^T \\ {c_2}^T \\ \cdots \\ {c_M}^T \end{bmatrix} = A^T \tag{4.4.41}

함수의 출력변수와 입력변수가 모두 벡터(다차원) 데이터인 경우에는 입력변수 각각과 출력변수 각각의 조합에 대해 모두 미분이 존재한다. 따라서 도함수는 행렬 형태가 된다. 이렇게 만들어진 도함수의 행렬을 자코비안 행렬(Jacobian matrix) 이라고 한다. 자코비안 행렬은 벡터함수를 벡터변수로 미분해서 생기는 행렬의 전치행렬이다. 따라서 행/열의 방향이 다르다는 점에 유의한다.

Jf(x)=J=(fx)T=[(f1x)T(fMx)T]=[f1TfMT]=[f1x1f1xNfMx1fMxN](4.4.42)Jf(x) = J = \left(\frac{\partial f}{\partial x}\right)^T = \begin{bmatrix} \left(\dfrac{\partial f_1}{\partial x}\right)^T \\ \vdots \\ \left(\dfrac{\partial f_M}{\partial x}\right)^T \end{bmatrix} = \begin{bmatrix} \nabla f_1^T \\ \vdots \\ \nabla f_M^T \\ \end{bmatrix} = \begin{bmatrix} \dfrac{\partial f_1}{\partial x_1} & \cdots & \dfrac{\partial f_1}{\partial x_N}\\ \vdots & \ddots & \vdots\\ \dfrac{\partial f_M}{\partial x_1} & \cdots & \dfrac{\partial f_M}{\partial x_N} \end{bmatrix} \tag{4.4.42}

✏️ 지코바 행렬 아님 ㅎ

연습 문제 4.4.4

다음 함수의 자코비안 행렬을 구하라

f(x)=[i=13xii=13xi](4.4.43)f(x) = \begin{bmatrix} \displaystyle\sum_{i=1}^3 x_i \\ \displaystyle\prod_{i=1}^3 x_i \end{bmatrix} \tag{4.4.43}

✏️
J=[111x2x3x1x3x1x2]J = \begin{bmatrix}1 & 1 & 1 \\x_2x_3 & x_1x_3 & x_1x_2 \end{bmatrix}

다변수 함수의 2차 도함수는 그레디언트 벡터를 입력변수 벡터로 미분한 것으로 헤시안 행렬(Hessian matrix) 이라고 한다.

헤시안 행렬은 그레디언트 벡터의 자코비안 행렬의 전치 행렬로 정의한다.

Hf(x)=H=J(f(x))T(4.4.44)Hf(x) = H = J(\nabla f(x))^T \tag{4.4.44}

풀어쓰면 다음과 같다.

Hij=2fxixj(4.4.45)H_{ij} = \dfrac{\partial^2 f}{\partial x_i\,\partial x_j} \tag{4.4.45}
H=[2fx122fx1x22fx1xN2fx2x12fx222fx2xN2fxNx12fxNx22fxN2](4.4.46)H = \begin{bmatrix} \dfrac{\partial^2 f}{\partial x_1^2} & \dfrac{\partial^2 f}{\partial x_1\,\partial x_2} & \cdots & \dfrac{\partial^2 f}{\partial x_1\,\partial x_N} \\ \dfrac{\partial^2 f}{\partial x_2\,\partial x_1} & \dfrac{\partial^2 f}{\partial x_2^2} & \cdots & \dfrac{\partial^2 f}{\partial x_2\,\partial x_N} \\ \vdots & \vdots & \ddots & \vdots \\ \dfrac{\partial^2 f}{\partial x_N\,\partial x_1} & \dfrac{\partial^2 f}{\partial x_N\,\partial x_2} & \cdots & \dfrac{\partial^2 f}{\partial x_N^2} \end{bmatrix} \tag{4.4.46}

함수가 연속이고 미분가능한 함수라면 헤시안 행렬은 대칭행렬이 된다.
( \because 슈와르츠 정리(Schwarz's theorem))

연습 문제 4.4.5

다음 함수의 헤시안 행렬을 구하라

f(x)=i=13xi2(4.4.47)f(x) = \sum_{i=1}^3 x_i^2 \tag{4.4.47}

✏️
f=(2x1,2x2,2x3)\nabla f = (2x_1, 2x_2, 2x_3) 이므로 H=2I3H = 2I_3

스칼라를 행렬로 미분

출력변수 ff가 스칼라값이고 입력변수 XX가 행렬인 경우에는 도함수 행렬의 모양이 입력변수 행렬 XX와 같다.

fX=[fx1,1fx1,2fx1,Nfx2,1fx2,2fx2,NfxM,1fxM,2fxM,N](4.4.48)\dfrac{\partial f}{\partial {X}} = \begin{bmatrix} \dfrac{\partial f}{\partial x_{1,1}} & \dfrac{\partial f}{\partial x_{1,2}} & \cdots & \dfrac{\partial f}{\partial x_{1,N}}\\ \dfrac{\partial f}{\partial x_{2,1}} & \dfrac{\partial f}{\partial x_{2,2}} & \cdots & \dfrac{\partial f}{\partial x_{2,N}}\\ \vdots & \vdots & \ddots & \vdots\\ \dfrac{\partial f}{\partial x_{M,1}} & \dfrac{\partial f}{\partial x_{M,2}} & \cdots & \dfrac{\partial f}{\partial x_{M,N}}\\ \end{bmatrix} \tag{4.4.48}

행렬미분법칙 4: 행렬 곱의 대각성분 ✏️✏️✏️

두 정방행렬을 곱해서 만들어진 행렬의 대각성분(trace)는 스칼라이다. 이 스칼라를 뒤의 행렬로 미분하면 앞의 행렬의 전치행렬이 나온다.

f(X)=tr(WX)(4.4.49)f(X) = \text{tr} ({W}{X}) \tag{4.4.49}
WRN×N,XRN×N(4.4.50){W} \in {R}^{N \times N}, {X} \in {R}^{N \times N} \tag{4.4.50}
fX=tr(WX)X=WT(4.4.51)\dfrac{\partial f}{\partial X} = \dfrac{\partial \, \text{tr} ({W}{X})}{\partial {X}} = {W}^T \tag{4.4.51}

(증명)

tr(WX)=i=1Nj=1Nwjixij(4.4.52)\text{tr}({W}{X}) = \sum_{i=1}^N \sum_{j=1}^N w_{ji} x_{ij} \tag{4.4.52}
tr(WX)xij=wji(4.4.53)\dfrac{\partial \text{tr} ({W}{X})}{\partial x_{ij}} = w_{ji} \tag{4.4.53}

행렬미분법칙 5: 행렬식의 로그 ✏️✏️✏️

행렬식(determinant)은 스칼라값이고 이 값의 로그 값도 스칼라이다. 이 값을 원래의 행렬로 미분하면 원래 행렬의 역행렬의 전치 행렬이 된다.

f(X)=logX(4.4.54)f(X) = \log | {X} | \tag{4.4.54}
fX=logXX=(X1)T(4.4.55)\dfrac{\partial f}{\partial X} = \dfrac{\partial \log | {X} | }{\partial {X}} = ({X}^{-1})^T \tag{4.4.55}

(증명)

행렬식의 정의에서

xi,jX=Ci,j(4.4.56)\dfrac{\partial}{\partial x_{i,j}} \vert X \vert = C_{i,j} \tag{4.4.56}

행렬식과 역행렬의 관계에서

XX=C=X(X1)T(4.4.57)\dfrac{\partial}{\partial X} \vert X \vert = C = | X | (X^{-1})^T \tag{4.4.57}

로그 함수 공식에 대입하면

ddxlogf(x)=f(x)f(x)=X(X1)TX=(X1)T(4.4.58)\dfrac{d}{dx} \log f(x) = \dfrac{f'(x)}{f(x)} = \dfrac{\vert X \vert (X^{-1})^T}{\vert X \vert} = (X^{-1})^T \tag{4.4.58}
profile
Connecting my favorite things

0개의 댓글