Partial Differentiation and Gradients
5.1장에서 다루었던 미분은 스칼라 변수 $x\in\mathbb{R}$ 에 대한 함수 $f$ 에 적용되었습니다. 이번에는 하나 이상의 변수 $\boldsymbol{x}\in\mathbb{R}^n$ 에 대한 함수 $f(\boldsymbol{x}) = f(x_1, x_2)$ 와 같이 일반적인 case를 고려해보도록 하겠습니다. 여러 변수의 함수에 대한 도함수의 일반화는 gradient 입니다.
함수 $f$ 의 gradient는 한 번에 하나의 변수만을 변수로 취급하고 나머지는 상수로 고정시켜서 찾습니다. 따라서, gradient는 이러한 partial derivatives(편미분)의 collection 입니다.
Definition 5.5 (Partial Derivative).
\[\begin{align*} \frac{\partial f}{\partial x_1} &= \lim_{h\rightarrow 0} \frac{f(x_1 + h, x_2, \dotsc, x_n) - f(\boldsymbol{x})}{h} \\ \vdots \\ \frac{\partial f}{\partial x_n} &= \lim_{h\rightarrow 0} \frac{f(x_1, \dotsc, x_{n-1}, x_n + h) - f(\boldsymbol{x})}{h} \end{align*} \tag{5.39}\]
$f : \mathbb{R}^n \rightarrow \mathbb{R}, \boldsymbol{x}\mapsto f(\boldsymbol{x})$ 와 같은 함수가 있을 때, n개의 변수들 $x_1, \dotsc, x_n$ 의 집합 $\boldsymbol{x}\in\mathbb{R}^n$ 에 대한 partial derivatives 는 다음과 같이 정의됩니다.이렇게 계산한 편미분을 row vector로 모으면 다음과 같이 표현할 수 있습니다.
\[\nabla_x f = \text{grad}f = \frac{\mathrm{d}f}{\mathrm{d}\boldsymbol{x}} = \left\lbrack \frac{\partial f(\boldsymbol{x})}{\partial x_1} \quad \frac{\partial f(\boldsymbol{x})}{\partial x_2} \quad \cdots \quad \frac{\partial f(\boldsymbol{x})}{\partial x_n} \right\rbrack \in \mathbb{R}^{1\times n} \tag{5.40}\]위 식에서 $n$ 은 변수의 갯수이고 $1$ 은 $f$ 의 image/range/codomain의 dimension 입니다. 여기서 $\boldsymbol{x}$ 는 column vector $\lbrack x_1, \dotsc, x_n \rbrack^\top$ 으로 정의합니다. 식 (5.40)의 row vector를 $f$ 의 gradient 또는 Jacobian 이라고 부릅니다.
Example 5.6 (Partial Derivatives Using the Chain Rule)
\[\begin{align*} \frac{\partial f(x, y)}{\partial x} &= 2(x+2y^3)\frac{\partial}{\partial x}(x + 2y^3) = 2(x + 2y^3) \tag{5.41} \\ \frac{\partial f(x, y)}{\partial y} &= 2(x+2y^3)\frac{\partial}{\partial y}(x + 2y^3) = 12(x+2y^3)y^2 \tag{5.42} \end{align*}\]
함수 $f(x, y) = (x + 2y^3)^2$ 의 partial derivatives 는 다음과 같이 얻을 수 있습니다.여기서 편미분을 계산하기 위해 (5.32)에서 살펴본 chain rule을 사용했습니다.
Example 5.7 (Gradient)
\[\begin{align*} \frac{\partial f(x_1,x_2)}{\partial x_1} &= 2x_1x_2 + x_2^3 \tag{5.43} \\ \frac{\partial f(x_1, x_2)}{\partial x_2} &= x_1^2 + 3x_1x_2^2 \tag{5.44} \end{align*}\]
$f(x_1, x_2) = x_1^2x_2 + x_1x_2^3 \in \mathbb{R}$ 의 편미분 결과는 다음과 같습니다.따라서, gradient는 다음과 같습니다.
\[\frac{\mathrm{d}f}{\mathrm{d}\boldsymbol{x}} = \left\lbrack \frac{\partial f(x_1, x_2)}{\partial x_1} \quad \frac{\partial f(x_1, x_2)}{\partial x_2} \right\rbrack = \left\lbrack 2x_1x_2 + x_2^3 \quad x_1^2 + 3x_1x_2^2 \right\rbrack \in \mathbb{R}^{1\times 2} \tag{5.45}\]
Basic Rules of Partial Differentiation
$\boldsymbol{x} \in \mathbb{R}^n$ 의 multivariate case에서 우리가 알고 있는 기본적인 differentiation rule은 여전히 적용됩니다. 그러나, vector $\boldsymbol{x}\in\mathbb{R}^n$ 에 대한 미분을 계산할 때, 조금 더 주의를 기울여야 합니다. 이는 gradient가 이제는 벡터와 행렬을 포함하고 있으며, 행렬곱은 교환법칙이 성립되지 않기 때문입니다. 즉, 순서에 주의를 기울여야 합니다.
다음은 general product rule, sum rule, chain rule 입니다.
\[\begin{align*} &\text{Product rule : }\quad\frac{\partial}{\partial\boldsymbol{x}}(f(\boldsymbol{x})g(\boldsymbol{x})) = \frac{\partial f}{\partial \boldsymbol{x}}g(\boldsymbol{x}) + f(\boldsymbol{x})\frac{\partial g}{\partial \boldsymbol{x}} \tag{5.46} \\ &\text{Sum rule : }\quad\frac{\partial}{\partial\boldsymbol{x}}(f(\boldsymbol{x})+ g(\boldsymbol{x})) = \frac{\partial f}{\partial\boldsymbol{x}} + \frac{\partial g}{\partial\boldsymbol{x}} \tag{5.47} \\ &\text{Chain rule : }\quad\frac{\partial}{\partial\boldsymbol{x}}(g\circ f)(\boldsymbol{x}) = \frac{\partial}{\partial\boldsymbol{x}}(g(f(\boldsymbol{x}))) = \frac{\partial g}{\partial f}\frac{\partial f}{\partial \boldsymbol{x}} \tag{5.48} \end{align*}\]Chain rule을 조금 더 자세히 살펴보겠습니다. (5.48)의 식으로 나타나는 chain rule은 행렬 곱셈의 정의에서 인접한 차원이 동일해야 한다는 rule과 유사합니다. (5.48) 식의 마지막 항을 왼쪽->오른쪽 순서로 살펴보면, 첫 번째 factor의 분모에 $\partial f$ 가 나타나고, 두 번째 factor의 분자에 $\partial f$ 가 나타납니다. 이 factor들을 함께 곱하면 곱셈이 정의되는데, 즉, $\partial f$ 의 차원이 일치하고 $\partial f$ 가 “cancels” 되어 $\partial g / \partial\boldsymbol{x}$ 만 남게 됩니다.
Chain Rule
두 변수 $x_1, x_2$ 에 대한 함수 $f : \mathbb{R}^2 \rightarrow \mathbb{R}$ 을 살펴보겠습니다. 추가로 $x_1, x_2$ 는 $t$ 에 대한 함수 $x_1(t), x_2(t)$ 로 정의합니다. $t$ 에 대해 $f$ 의 gradient를 계산하려면 다음과 같이 multivariate 함수에 대한 chain rule (5.48)을 적용해야 합니다.
\[\frac{\mathrm{d}f}{\mathrm{d}t} = \begin{bmatrix}\frac{\partial f}{\partial x_1}&\frac{\partial f}{\partial x_2}\end{bmatrix}\begin{bmatrix}\frac{\partial x_1(t)}{\partial t}\\\frac{\partial x_2(t)}{\partial t}\end{bmatrix} = \frac{\partial f}{\partial x_1}\frac{\partial x_1}{\partial t} + \frac{\partial f}{\partial x_2}\frac{\partial x_2}{\partial t} \tag{5.49}\]여기서 $\mathrm{d}$ 는 gradient를, $\partial$ 은 partial derivatives를 나타냅니다.
Example 5.8
\[\begin{align*} \frac{\mathrm{d}f}{\mathrm{d}t} &= \frac{\partial f}{\partial x_1}\frac{\partial x_1}{\partial t} + \frac{\partial t}{\partial x_2}\frac{\partial x_2}{\partial t} \tag{5.50a} \\ &= 2\sin t\frac{\partial \sin t}{\partial t} + 2\frac{\partial \cos t}{\partial t} \tag{5.50b} \\ &= 2\sin t\cos t - 2\sin t = 2\sin t(\cos t - 1) \tag{5.50c} \end{align*}\]
$x_1 = \sin t$ , $x_2 = \cos t$ 일 때, $f(x_1, x_2) = x_1^2 + 2x_2$ 의 $t$ 에 대한 미분은 다음과 같이 계산됩니다.
$x_1, x_2$ 가 두 개의 변수 $s, t$ 에 대한 함수 $x_1(s, t), x_2(s, t)$ 이고 $f(x_1, x_2)$ 가 있을 때, chain rule을 사용하여 다음과 같이 편미분 계산 결과를 얻을 수 있습니다.
\[\begin{align*} \frac{\partial f}{\partial \color{orange}s} &= \frac{\partial f}{\partial\color{blue}{x_1}}\frac{\partial\color{blue}{x_1}}{\partial\color{orange}s} + \frac{\partial f}{\partial\color{blue}{x_2}}\frac{\partial\color{blue}{x_2}}{\partial\color{orange}s} \tag{5.51} \\ \frac{\partial f}{\partial \color{orange}t} &= \frac{\partial f}{\partial\color{blue}{x_1}}\frac{\partial\color{blue}{x_1}}{\partial\color{orange}t} + \frac{\partial f}{\partial\color{blue}{x_2}}\frac{\partial\color{blue}{x_2}}{\partial\color{orange}t} \tag{5.52} \end{align*}\]그리고 행렬 곱에 의해서 gradient는 다음과 같이 얻을 수 있습니다.
\[\frac{\mathrm{d}f}{\mathrm{d}(s, t)} = \frac{\partial f}{\partial\boldsymbol{x}}\frac{\partial\boldsymbol{x}}{\partial(s, t)} = \underbrace{\begin{bmatrix}\frac{\partial f}{\color{blue}{\partial x_1}}&\frac{\partial f}{\color{orange}{\partial x_2}}\end{bmatrix}}_{= \frac{\partial f}{\partial\boldsymbol{x}}}\underbrace{\begin{bmatrix}\color{blue}{\frac{\partial x_1}{\partial s}}&\color{blue}{\frac{\partial x_1}{\partial t}}\\\color{orange}{\frac{\partial x_2}{\partial s}}&\color{orange}{\frac{\partial x_2}{\partial t}}\end{bmatrix}}_{=\frac{\partial\boldsymbol{x}}{\partial(s, t)}} \tag{5.53}\]위와 같이 chain rule을 행렬 곱셈으로 간결하게 작성하는 것은 gradient가 row vector로 정의되었을 때만 가능합니다. row vector가 아니라면 행렬의 차원이 일치하도록 gradient를 transpose해야 합니다. Grandient가 vector 또는 matrix인 경우에 transpose가 간단히 수행될 수 있지만, gradient가 텐서(tensor)라면 transpose가 간단하지가 않게 됩니다 (이에 대해서는 이후에 다룹니다).
Coursera의 Deep Learning 특화과정을 통해 Gradient Checking과 관련하여 정리한 강의 노트가 있으니 필요하시다면 참조바랍니다. 실제 파이썬 코드를 통해 수행해보는 실습도 있습니다.