한 변수에서 미분 가능하다는 것은 “충분히 확대하면 그래프가 직선처럼 보인다”는 뜻이었습니다. 여러 변수에서는 “충분히 확대하면 함수가 선형변환(행렬)처럼 보인다”는 뜻이 됩니다. 이 장의 주인공은 그 행렬, 곧 야코비 행렬이고, 이 관점에서 연쇄법칙은 “행렬을 곱한다”는 한 줄이 됩니다. 신경망을 학습시키는 역전파 알고리즘이 바로 이 연쇄법칙입니다.
3.1 선형근사와 미분 가능성
미적분학 6장의 선형근사 f ( a + h ) ≈ f ( a ) + f ′ ( a ) h f(a + h) \approx f(a) + f'(a)h f ( a + h ) ≈ f ( a ) + f ′ ( a ) h 를 여러 변수로 넓히면
f ( a + h ) ≈ f ( a ) + ∇ f ( a ) ⋅ h f(\mathbf{a} + \mathbf{h}) \approx f(\mathbf{a}) + \nabla f(\mathbf{a})\cdot\mathbf{h} f ( a + h ) ≈ f ( a ) + ∇ f ( a ) ⋅ h
입니다. 기울기 f ′ ( a ) f'(a) f ′ ( a ) 자리에 그래디언트가 오고, 곱셈 자리에 내적이 옵니다. 2변수 함수에서 우변은 접평면입니다.
정의 3.1 (미분 가능). lim h → 0 f ( a + h ) − f ( a ) − ∇ f ( a ) ⋅ h ∥ h ∥ = 0 \displaystyle\lim_{\mathbf{h}\to\mathbf{0}}\frac{f(\mathbf{a} + \mathbf{h}) - f(\mathbf{a}) - \nabla f(\mathbf{a})\cdot\mathbf{h}}{\|\mathbf{h}\|} = 0 h → 0 lim ∥ h ∥ f ( a + h ) − f ( a ) − ∇ f ( a ) ⋅ h = 0 이면 f f f 는 a \mathbf{a} a 에서 미분 가능 (differentiable)합니다.
오차가 ∥ h ∥ \|\mathbf{h}\| ∥ h ∥ 보다 빨리 0으로 간다는 뜻입니다. 편미분이 모두 있어도 미분 가능하지 않을 수 있습니다(1장 예제 1.6의 함수는 원점에서 편미분이 둘 다 0이지만 연속도 아닙니다). 다행히 다음 정리가 있습니다.
정리 3.2. 편미분들이 a \mathbf{a} a 근처에서 연속이면 f f f 는 a \mathbf{a} a 에서 미분 가능합니다.
식으로 만든 함수는 대부분 이 조건을 만족하므로, 실제로는 편미분을 구해 쓰면 됩니다.
예제 3.3. f ( x , y ) = x 2 + y 2 f(x, y) = \sqrt{x^2 + y^2} f ( x , y ) = x 2 + y 2 로 3.02 2 + 3.97 2 \sqrt{3.02^2 + 3.97^2} 3.0 2 2 + 3.9 7 2 을 어림합니다. a = ( 3 , 4 ) \mathbf{a} = (3, 4) a = ( 3 , 4 ) 이면 f = 5 f = 5 f = 5 , ∇ f = ( x , y ) / f = ( 0.6 , 0.8 ) \nabla f = (x, y)/f = (0.6, 0.8) ∇ f = ( x , y ) / f = ( 0.6 , 0.8 ) . h = ( 0.02 , − 0.03 ) \mathbf{h} = (0.02, -0.03) h = ( 0.02 , − 0.03 ) 이므로 f ≈ 5 + 0.012 − 0.024 = 4.988 f \approx 5 + 0.012 - 0.024 = 4.988 f ≈ 5 + 0.012 − 0.024 = 4.988 입니다. (실제 4.98806 … 4.98806\ldots 4.98806 … )
3.2 야코비 행렬
값이 벡터인 함수 f : R n → R m \mathbf{f} : \mathbb{R}^n \to \mathbb{R}^m f : R n → R m 은 성분마다 선형근사를 합니다. 그 그래디언트들을 행으로 쌓은 것이 야코비 행렬입니다.
정의 3.4 (야코비 행렬). f = ( f 1 , … , f m ) \mathbf{f} = (f_1, \dots, f_m) f = ( f 1 , … , f m ) 의 야코비 행렬 (Jacobian matrix)은 m × n m \times n m × n 행렬
J = ∂ f ∂ x = [ ∂ f 1 ∂ x 1 ⋯ ∂ f 1 ∂ x n ⋮ ⋮ ∂ f m ∂ x 1 ⋯ ∂ f m ∂ x n ] J = \frac{\partial\mathbf{f}}{\partial\mathbf{x}} = \begin{bmatrix} \frac{\partial f_1}{\partial x_1} & \cdots & \frac{\partial f_1}{\partial x_n} \\ \vdots & & \vdots \\ \frac{\partial f_m}{\partial x_1} & \cdots & \frac{\partial f_m}{\partial x_n} \end{bmatrix} J = ∂ x ∂ f = ∂ x 1 ∂ f 1 ⋮ ∂ x 1 ∂ f m ⋯ ⋯ ∂ x n ∂ f 1 ⋮ ∂ x n ∂ f m
이고, f ( a + h ) ≈ f ( a ) + J h \mathbf{f}(\mathbf{a} + \mathbf{h}) \approx \mathbf{f}(\mathbf{a}) + J\mathbf{h} f ( a + h ) ≈ f ( a ) + J h 입니다.
i i i 행은 f i f_i f i 의 그래디언트, j j j 열은 “x j x_j x j 를 조금 바꾸면 출력 전체가 어떻게 바뀌는가”입니다. 선형변환 f ( x ) = A x \mathbf{f}(\mathbf{x}) = A\mathbf{x} f ( x ) = A x 의 야코비 행렬은 A A A 자신입니다.
예제 3.5 (극좌표). f ( r , θ ) = ( r cos θ , r sin θ ) \mathbf{f}(r, \theta) = (r\cos\theta, r\sin\theta) f ( r , θ ) = ( r cos θ , r sin θ ) 이면
J = [ cos θ − r sin θ sin θ r cos θ ] , det J = r . J = \begin{bmatrix} \cos\theta & -r\sin\theta \\ \sin\theta & r\cos\theta \end{bmatrix}, \qquad \det J = r. J = [ cos θ sin θ − r sin θ r cos θ ] , det J = r .
행렬식 r r r 은 8장에서 극좌표 적분의 d x d y = r d r d θ dx\,dy = r\,dr\,d\theta d x d y = r d r d θ 로 나옵니다(선형대수 6장의 넓이 배율).
3.3 연쇄법칙
정리 3.6 (연쇄법칙). g : R n → R m \mathbf{g} : \mathbb{R}^n \to \mathbb{R}^m g : R n → R m , f : R m → R p \mathbf{f} : \mathbb{R}^m \to \mathbb{R}^p f : R m → R p 가 미분 가능하면
J f ∘ g ( x ) = J f ( g ( x ) ) J g ( x ) . J_{\mathbf{f}\circ\mathbf{g}}(\mathbf{x}) = J_{\mathbf{f}}(\mathbf{g}(\mathbf{x}))\,J_{\mathbf{g}}(\mathbf{x}). J f ∘ g ( x ) = J f ( g ( x )) J g ( x ) .
합성의 야코비 행렬은 야코비 행렬의 곱입니다. 선형대수 5장에서 “선형변환의 합성 = 행렬곱”이었던 것이, 미분하면(가까이서 보면) 모든 함수에 대해 성립하는 것입니다.
자주 쓰는 특별한 경우 두 가지:
(1) 곡선을 따라. z = f ( x , y ) z = f(x, y) z = f ( x , y ) , x = x ( t ) x = x(t) x = x ( t ) , y = y ( t ) y = y(t) y = y ( t ) 이면
d z d t = ∂ f ∂ x d x d t + ∂ f ∂ y d y d t = ∇ f ⋅ r ′ ( t ) . \frac{dz}{dt} = \frac{\partial f}{\partial x}\frac{dx}{dt} + \frac{\partial f}{\partial y}\frac{dy}{dt} = \nabla f\cdot\mathbf{r}'(t). d t d z = ∂ x ∂ f d t d x + ∂ y ∂ f d t d y = ∇ f ⋅ r ′ ( t ) .
(2) 변수 둘에서 둘로. z = f ( x , y ) z = f(x, y) z = f ( x , y ) , x = x ( s , t ) x = x(s, t) x = x ( s , t ) , y = y ( s , t ) y = y(s, t) y = y ( s , t ) 이면 ∂ z ∂ s = ∂ f ∂ x ∂ x ∂ s + ∂ f ∂ y ∂ y ∂ s \dfrac{\partial z}{\partial s} = \dfrac{\partial f}{\partial x}\dfrac{\partial x}{\partial s} + \dfrac{\partial f}{\partial y}\dfrac{\partial y}{\partial s} ∂ s ∂ z = ∂ x ∂ f ∂ s ∂ x + ∂ y ∂ f ∂ s ∂ y .
“모든 길을 따라 미분을 곱하고, 길들을 더한다”고 기억합니다.
예제 3.7. z = x 2 y z = x^2y z = x 2 y , x = cos t x = \cos t x = cos t , y = sin t y = \sin t y = sin t 이면 d z d t = 2 x y ( − sin t ) + x 2 cos t \frac{dz}{dt} = 2xy(-\sin t) + x^2\cos t d t d z = 2 x y ( − sin t ) + x 2 cos t . t = 0 t = 0 t = 0 에서 x = 1 x = 1 x = 1 , y = 0 y = 0 y = 0 이므로 d z d t = 0 + 1 = 1 \frac{dz}{dt} = 0 + 1 = 1 d t d z = 0 + 1 = 1 입니다.
3.4 계산 그래프와 역전파
복잡한 함수는 간단한 연산을 이어 붙인 계산 그래프 로 볼 수 있습니다. 연쇄법칙을 출력 쪽에서 입력 쪽으로 거꾸로 적용하면 모든 입력에 대한 편미분을 한 번의 역방향 계산으로 얻습니다. 이것이 역전파 (backpropagation)입니다.
예제 3.8. L = ( w x + b − y ) 2 L = (wx + b - y)^2 L = ( w x + b − y ) 2 에서 w = 2 w = 2 w = 2 , x = 3 x = 3 x = 3 , b = 1 b = 1 b = 1 , y = 5 y = 5 y = 5 일 때 ∂ L / ∂ w \partial L/\partial w ∂ L / ∂ w , ∂ L / ∂ b \partial L/\partial b ∂ L / ∂ b 를 구합니다. 중간값을 u = w x u = wx u = w x , v = u + b v = u + b v = u + b , e = v − y e = v - y e = v − y , L = e 2 L = e^2 L = e 2 으로 둡니다.
단계
앞으로(값)
뒤로(미분)
u = w x u = wx u = w x
6 6 6
∂ L ∂ w = ∂ L ∂ u ⋅ x = 4 ⋅ 3 = 12 \frac{\partial L}{\partial w} = \frac{\partial L}{\partial u}\cdot x = 4\cdot3 = 12 ∂ w ∂ L = ∂ u ∂ L ⋅ x = 4 ⋅ 3 = 12
v = u + b v = u + b v = u + b
7 7 7
∂ L ∂ u = ∂ L ∂ v ⋅ 1 = 4 \frac{\partial L}{\partial u} = \frac{\partial L}{\partial v}\cdot1 = 4 ∂ u ∂ L = ∂ v ∂ L ⋅ 1 = 4 , ∂ L ∂ b = 4 \frac{\partial L}{\partial b} = 4 ∂ b ∂ L = 4
e = v − y e = v - y e = v − y
2 2 2
∂ L ∂ v = ∂ L ∂ e ⋅ 1 = 4 \frac{\partial L}{\partial v} = \frac{\partial L}{\partial e}\cdot1 = 4 ∂ v ∂ L = ∂ e ∂ L ⋅ 1 = 4
L = e 2 L = e^2 L = e 2
4 4 4
∂ L ∂ e = 2 e = 4 \frac{\partial L}{\partial e} = 2e = 4 ∂ e ∂ L = 2 e = 4
앞으로 값을 계산하고(표의 위에서 아래), 뒤로 미분을 계산합니다(아래에서 위). 각 단계는 자기 연산의 국소적인 미분만 알면 됩니다. 파라미터가 수십억 개인 신경망도 출력 하나(손실)의 그래디언트를 앞 계산과 비슷한 비용으로 구할 수 있는 이유입니다.
3.5 이 장의 요약
미분 가능 = 선형근사 f ( a ) + ∇ f ⋅ h f(\mathbf{a}) + \nabla f\cdot\mathbf{h} f ( a ) + ∇ f ⋅ h 의 오차가 ∥ h ∥ \|\mathbf{h}\| ∥ h ∥ 보다 작음.
야코비 행렬 = 가까이서 본 선형변환. 행은 성분의 그래디언트.
연쇄법칙 = 야코비 행렬의 곱. 거꾸로 적용하면 역전파.
쓰이는 곳. 신경망 학습의 역전파와 PyTorch·JAX의 자동 미분이 이 장의 연쇄법칙입니다. 야코비 행렬은 정규화 흐름(normalizing flow)의 log ∣ det J ∣ \log|\det J| log ∣ det J ∣ , 로봇 팔의 속도 관계, 비선형 연립방정식을 푸는 뉴턴 방법에 쓰입니다. 물리에서는 좌표 변환(직교좌표 ↔ 극·구면좌표)에 야코비안이 나옵니다.
문제
3.1 [계산] · 확인 문제
f ( x , y ) = ( x 2 y , x + y 3 ) \mathbf{f}(x, y) = (x^2y,\ x + y^3) f ( x , y ) = ( x 2 y , x + y 3 ) 의 점 ( 1 , 2 ) (1, 2) ( 1 , 2 ) 에서의 야코비 행렬 [ a b c d ] \begin{bmatrix} a & b \\ c & d \end{bmatrix} [ a c b d ] 의 성분을 씁니다.
성분
값
a = ∂ f 1 / ∂ x a = \partial f_1/\partial x a = ∂ f 1 / ∂ x
[?]
b = ∂ f 1 / ∂ y b = \partial f_1/\partial y b = ∂ f 1 / ∂ y
[?]
c = ∂ f 2 / ∂ x c = \partial f_2/\partial x c = ∂ f 2 / ∂ x
[?]
d = ∂ f 2 / ∂ y d = \partial f_2/\partial y d = ∂ f 2 / ∂ y
[?]
정답 풀이 ∂ f 1 / ∂ x = 2 x y = 4 \partial f_1/\partial x = 2xy = 4 ∂ f 1 / ∂ x = 2 x y = 4 , ∂ f 1 / ∂ y = x 2 = 1 \partial f_1/\partial y = x^2 = 1 ∂ f 1 / ∂ y = x 2 = 1 , ∂ f 2 / ∂ x = 1 \partial f_2/\partial x = 1 ∂ f 2 / ∂ x = 1 , ∂ f 2 / ∂ y = 3 y 2 = 12 \partial f_2/\partial y = 3y^2 = 12 ∂ f 2 / ∂ y = 3 y 2 = 12 .
3.2 [계산] · 확인 문제
z = e x sin y z = e^{x}\sin y z = e x sin y , x = t 2 x = t^2 x = t 2 , y = π t y = \pi t y = π t 일 때 t = 1 t = 1 t = 1 에서 d z / d t dz/dt d z / d t 는? (소수 넷째 자리까지)
정답 풀이 d z d t = e x sin y ⋅ 2 t + e x cos y ⋅ π \frac{dz}{dt} = e^x\sin y\cdot2t + e^x\cos y\cdot\pi d t d z = e x sin y ⋅ 2 t + e x cos y ⋅ π . t = 1 t = 1 t = 1 이면 x = 1 x = 1 x = 1 , y = π y = \pi y = π 이므로 e ⋅ 0 ⋅ 2 + e ⋅ ( − 1 ) ⋅ π = − e π ≈ − 8.5397 e\cdot0\cdot2 + e\cdot(-1)\cdot\pi = -e\pi \approx -8.5397 e ⋅ 0 ⋅ 2 + e ⋅ ( − 1 ) ⋅ π = − e π ≈ − 8.5397 입니다.
3.3 [계산] · 확인 문제
예제 3.8과 같은 L = ( w x + b − y ) 2 L = (wx + b - y)^2 L = ( w x + b − y ) 2 에서 w = 1 w = 1 w = 1 , x = 2 x = 2 x = 2 , b = 0 b = 0 b = 0 , y = 5 y = 5 y = 5 일 때 값을 씁니다.
값
답
L L L
[?]
∂ L / ∂ w \partial L/\partial w ∂ L / ∂ w
[?]
∂ L / ∂ b \partial L/\partial b ∂ L / ∂ b
[?]
정답 풀이 e = 2 + 0 − 5 = − 3 e = 2 + 0 - 5 = -3 e = 2 + 0 − 5 = − 3 이므로 L = 9 L = 9 L = 9 . ∂ L ∂ e = 2 e = − 6 \frac{\partial L}{\partial e} = 2e = -6 ∂ e ∂ L = 2 e = − 6 이고, ∂ L ∂ b = − 6 \frac{\partial L}{\partial b} = -6 ∂ b ∂ L = − 6 , ∂ L ∂ w = − 6 ⋅ x = − 12 \frac{\partial L}{\partial w} = -6\cdot x = -12 ∂ w ∂ L = − 6 ⋅ x = − 12 입니다.
3.4 [계산]
선형근사로 ( 2.01 ) 2 ( 0.98 ) 3 (2.01)^2(0.98)^3 ( 2.01 ) 2 ( 0.98 ) 3 을 어림한 값은? (f ( x , y ) = x 2 y 3 f(x, y) = x^2y^3 f ( x , y ) = x 2 y 3 , a = ( 2 , 1 ) \mathbf{a} = (2, 1) a = ( 2 , 1 ) )
정답 풀이 f = 4 f = 4 f = 4 , f x = 2 x y 3 = 4 f_x = 2xy^3 = 4 f x = 2 x y 3 = 4 , f y = 3 x 2 y 2 = 12 f_y = 3x^2y^2 = 12 f y = 3 x 2 y 2 = 12 . h = ( 0.01 , − 0.02 ) \mathbf{h} = (0.01, -0.02) h = ( 0.01 , − 0.02 ) 이므로 4 + 0.04 − 0.24 = 3.80 4 + 0.04 - 0.24 = 3.80 4 + 0.04 − 0.24 = 3.80 입니다.
3.5 [증명]
f ( x , y ) f(x, y) f ( x , y ) 가 미분 가능하고 x = r cos θ x = r\cos\theta x = r cos θ , y = r sin θ y = r\sin\theta y = r sin θ 일 때 ( ∂ f ∂ r ) 2 + 1 r 2 ( ∂ f ∂ θ ) 2 = f x 2 + f y 2 \left(\frac{\partial f}{\partial r}\right)^2 + \frac{1}{r^2}\left(\frac{\partial f}{\partial\theta}\right)^2 = f_x^2 + f_y^2 ( ∂ r ∂ f ) 2 + r 2 1 ( ∂ θ ∂ f ) 2 = f x 2 + f y 2 임을 보입니다.
풀이 연쇄법칙으로 f r = f x cos θ + f y sin θ f_r = f_x\cos\theta + f_y\sin\theta f r = f x cos θ + f y sin θ , f θ = − f x r sin θ + f y r cos θ f_\theta = -f_xr\sin\theta + f_yr\cos\theta f θ = − f x r sin θ + f y r cos θ 입니다. 그러면 f r 2 + 1 r 2 f θ 2 = ( f x cos θ + f y sin θ ) 2 + ( − f x sin θ + f y cos θ ) 2 = f x 2 ( cos 2 θ + sin 2 θ ) + f y 2 ( sin 2 θ + cos 2 θ ) + 0 = f x 2 + f y 2 f_r^2 + \frac{1}{r^2}f_\theta^2 = (f_x\cos\theta + f_y\sin\theta)^2 + (-f_x\sin\theta + f_y\cos\theta)^2 = f_x^2(\cos^2\theta + \sin^2\theta) + f_y^2(\sin^2\theta + \cos^2\theta) + 0 = f_x^2 + f_y^2 f r 2 + r 2 1 f θ 2 = ( f x cos θ + f y sin θ ) 2 + ( − f x sin θ + f y cos θ ) 2 = f x 2 ( cos 2 θ + sin 2 θ ) + f y 2 ( sin 2 θ + cos 2 θ ) + 0 = f x 2 + f y 2 입니다(교차항은 2 f x f y cos θ sin θ − 2 f x f y sin θ cos θ = 0 2f_xf_y\cos\theta\sin\theta - 2f_xf_y\sin\theta\cos\theta = 0 2 f x f y cos θ sin θ − 2 f x f y sin θ cos θ = 0 ).