2. Partial Differentiation and Gradients

 

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).
$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 는 다음과 같이 정의됩니다.

\[\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}\]

이렇게 계산한 편미분을 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)
함수 $f(x, y) = (x + 2y^3)^2$ 의 partial derivatives 는 다음과 같이 얻을 수 있습니다.

\[\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*}\]

여기서 편미분을 계산하기 위해 (5.32)에서 살펴본 chain rule을 사용했습니다.

Remark (Gradient as a Row Vector). Gradient vector를 column vector가 아닌 row vector로 정의하는 것은 다음의 두 가지 이유 때문입니다. 첫째, 일관성있게 vector-valued functions $f : \mathbb{R}^n \rightarrow \mathbb{R}^m$ 의 gradient를 일반화할 수 있습니다. 그 결과로 gradient는 행렬이 됩니다. 둘째, gradient의 차원을 크게 신경쓰지 않고 multi-variate chain rule을 적용할 수 있습니다. 이와 관련된 내용들은 5.3장에서 더 자세히 살펴보도록 하겠습니다.

Example 5.7 (Gradient)
$f(x_1, x_2) = x_1^2x_2 + x_1x_2^3 \in \mathbb{R}$ 의 편미분 결과는 다음과 같습니다.

\[\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*}\]

따라서, 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
$x_1 = \sin t$ , $x_2 = \cos t$ 일 때, $f(x_1, x_2) = x_1^2 + 2x_2$ 의 $t$ 에 대한 미분은 다음과 같이 계산됩니다.

\[\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, 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가 간단하지가 않게 됩니다 (이에 대해서는 이후에 다룹니다).

Remark (Verifying the Correctness of a Gradient Implementation). 편미분의 정의((5.39) 참조)는 컴퓨터 프로그램에서 gradient의 정확도를 수치적으로 체크할 때 활용될 수 있습니다. Gradient를 계산하고 이를 활용할 때, 유한한 differences를 사용하여 수치적으로 테스트할 수 있습니다. 이는 $h$ 의 값을 매우 작게(ex, $h=10^{-4}$ ) 설정하여 식 (5.39)를 통해 finite-difference approximtion을 계산하여 이 값을 실제 gradient 계산 값과 비교합니다. 만약 두 값의 error가 작다면, 우리가 계산한 gradient가 올바르다고 판단할 수 있습니다.

Coursera의 Deep Learning 특화과정을 통해 Gradient Checking과 관련하여 정리한 강의 노트가 있으니 필요하시다면 참조바랍니다. 실제 파이썬 코드를 통해 수행해보는 실습도 있습니다.

  • Lecture note: link
  • Practice with python code: link