Phần nay ta chủ yếu ôn lại cách tính và kiểm tra đạo hàm.
1. Đạo hàm của hàm trả về một số vô hướng
Đạo hàm bậc nhất (first-order gradient) hay viết gọn là đạo hàm (gradient) của một hàm số f ( x ) : R n → R f(\mathbf{x}): \mathbb{R}^n \to \mathbb{R} f ( x ) : R n → R theo x \mathbf{x} x được định nghĩa là:
∇ x f ( x ) ≜ [ ∂ f ( x ) ∂ x 1 ∂ f ( x ) ∂ x 2 ⋮ ∂ f ( x ) ∂ x n ] ∈ R n \nabla_{\mathbf{x}} f(\mathbf{x}) \triangleq
\begin{bmatrix}
\frac{\partial f(\mathbf{x})}{\partial x_1} \\
\frac{\partial f(\mathbf{x})}{\partial x_2} \\
\vdots \\
\frac{\partial f(\mathbf{x})}{\partial x_n}
\end{bmatrix}
\in \mathbb{R}^n ∇ x f ( x ) ≜ ∂ x 1 ∂ f ( x ) ∂ x 2 ∂ f ( x ) ⋮ ∂ x n ∂ f ( x ) ∈ R n
trong đó ∂ f ( x ) ∂ x i \frac{\partial f(\mathbf{x})}{\partial x_i} ∂ x i ∂ f ( x ) là đạo hàm riêng của hàm số theo thành phần thứ i i i của vector x \mathbf{x} x . Đạo hàm này được lấy khi tất cả các biến(ngoài x i x_{i} x i ) được giả sử là hằng số.
Đạo hàm của hàm số này là một vector có cùng chiều với vector đang được lấy đạo hàm . Tức là nếu vector được viết ở dạng cột thì đạo hàm cũng phải được viết ở dạng cột.
Đạo hàm bậc hai (second-order gradient) của hàm số trên còn được gọi là Hessian được định nghĩa như sau:
∇ 2 f ( x ) ≜ [ ∂ 2 f ( x ) ∂ x 1 2 ∂ 2 f ( x ) ∂ x 1 ∂ x 2 ⋯ ∂ 2 f ( x ) ∂ x 1 ∂ x n ∂ 2 f ( x ) ∂ x 2 ∂ x 1 ∂ 2 f ( x ) ∂ x 2 2 ⋯ ∂ 2 f ( x ) ∂ x 2 ∂ x n ⋮ ⋮ ⋱ ⋮ ∂ 2 f ( x ) ∂ x n ∂ x 1 ∂ 2 f ( x ) ∂ x n ∂ x 2 ⋯ ∂ 2 f ( x ) ∂ x n 2 ] ∈ S n \nabla^2 f(\mathbf{x}) \triangleq
\begin{bmatrix}
\frac{\partial^2 f(\mathbf{x})}{\partial x_1^2} & \frac{\partial^2 f(\mathbf{x})}{\partial x_1 \partial x_2} & \cdots & \frac{\partial^2 f(\mathbf{x})}{\partial x_1 \partial x_n} \\
\frac{\partial^2 f(\mathbf{x})}{\partial x_2 \partial x_1} & \frac{\partial^2 f(\mathbf{x})}{\partial x_2^2} & \cdots & \frac{\partial^2 f(\mathbf{x})}{\partial x_2 \partial x_n} \\
\vdots & \vdots & \ddots & \vdots \\
\frac{\partial^2 f(\mathbf{x})}{\partial x_n \partial x_1} & \frac{\partial^2 f(\mathbf{x})}{\partial x_n \partial x_2} & \cdots & \frac{\partial^2 f(\mathbf{x})}{\partial x_n^2}
\end{bmatrix}
\in \mathbb{S}^n ∇ 2 f ( x ) ≜ ∂ x 1 2 ∂ 2 f ( x ) ∂ x 2 ∂ x 1 ∂ 2 f ( x ) ⋮ ∂ x n ∂ x 1 ∂ 2 f ( x ) ∂ x 1 ∂ x 2 ∂ 2 f ( x ) ∂ x 2 2 ∂ 2 f ( x ) ⋮ ∂ x n ∂ x 2 ∂ 2 f ( x ) ⋯ ⋯ ⋱ ⋯ ∂ x 1 ∂ x n ∂ 2 f ( x ) ∂ x 2 ∂ x n ∂ 2 f ( x ) ⋮ ∂ x n 2 ∂ 2 f ( x ) ∈ S n
Đạo hàm cấp một hàm số f ( X ) : R n × m → R f(X) : \mathbb{R}^{n \times m} \rightarrow \mathbb{R} f ( X ) : R n × m → R theo ma trận X \mathbf{X} X được định nghĩa là:
∇ f ( X ) = [ ∂ f ( X ) ∂ x 11 ∂ f ( X ) ∂ x 12 ⋯ ∂ f ( X ) ∂ x 1 m ∂ f ( X ) ∂ x 21 ∂ f ( X ) ∂ x 22 ⋯ ∂ f ( X ) ∂ x 2 m ⋮ ⋮ ⋱ ⋮ ∂ f ( X ) ∂ x n 1 ∂ f ( X ) ∂ x n 2 ⋯ ∂ f ( X ) ∂ x n m ] ∈ R n × m \nabla f(X) =
\begin{bmatrix}
\frac{\partial f(X)}{\partial x_{11}} & \frac{\partial f(X)}{\partial x_{12}} & \cdots & \frac{\partial f(X)}{\partial x_{1m}} \\
\frac{\partial f(X)}{\partial x_{21}} & \frac{\partial f(X)}{\partial x_{22}} & \cdots & \frac{\partial f(X)}{\partial x_{2m}} \\
\vdots & \vdots & \ddots & \vdots \\
\frac{\partial f(X)}{\partial x_{n1}} & \frac{\partial f(X)}{\partial x_{n2}} & \cdots & \frac{\partial f(X)}{\partial x_{nm}}
\end{bmatrix}
\in \mathbb{R}^{n \times m} ∇ f ( X ) = ∂ x 11 ∂ f ( X ) ∂ x 21 ∂ f ( X ) ⋮ ∂ x n 1 ∂ f ( X ) ∂ x 12 ∂ f ( X ) ∂ x 22 ∂ f ( X ) ⋮ ∂ x n 2 ∂ f ( X ) ⋯ ⋯ ⋱ ⋯ ∂ x 1 m ∂ f ( X ) ∂ x 2 m ∂ f ( X ) ⋮ ∂ x nm ∂ f ( X ) ∈ R n × m
là một ma trận trong R n × m \mathbb{R}^{n \times m} R n × m .
Cụ thể để tính đạo hàm của hàm này thì ta tính đạo hàm riêng của hàm số đó theo từng thành phần của ma trận khi toàn bộ các thành phần khác được giả sử là hằng số . Tiếp theo, ta sắp xếp các đạo hàm riêng tính được theo đúng thứ tự trong ma trận.
Ví dụ: Xét hàm số f : R 2 → R f: \mathbb{R}^2 \to \mathbb{R} f : R 2 → R , f ( x ) = x 1 2 + 2 x 1 x 2 + sin ( x 1 ) + 2 f(\mathbf{x}) = x_{1}^2 + 2x_1x_2 + \sin({x_1}) + 2 f ( x ) = x 1 2 + 2 x 1 x 2 + sin ( x 1 ) + 2
Đạo hàm bậc nhất theo x \mathbf{x} x của hàm số đó là
∇ f ( x ) = [ ∂ f ( x ) ∂ x 1 ∂ f ( x ) ∂ x 2 ] = [ 2 x 1 + 2 x 2 + cos ( x 1 ) 2 x 1 ] \nabla f(x) =
\begin{bmatrix}
\frac{\partial f(x)}{\partial x_1} \\
\frac{\partial f(x)}{\partial x_2}
\end{bmatrix} =
\begin{bmatrix}
2x_1 + 2x_2 + \cos(x_1) \\
2x_1
\end{bmatrix} ∇ f ( x ) = [ ∂ x 1 ∂ f ( x ) ∂ x 2 ∂ f ( x ) ] = [ 2 x 1 + 2 x 2 + cos ( x 1 ) 2 x 1 ]
Đạo hàm bậc hai theo x \mathbf{x} x , hay Hessian là
∇ 2 f ( x ) = [ ∂ 2 f ( x ) ∂ x 1 2 ∂ 2 f ( x ) ∂ x 1 ∂ x 2 ∂ 2 f ( x ) ∂ x 2 ∂ x 1 ∂ 2 f ( x ) ∂ x 2 2 ] = [ 2 − sin ( x 1 ) 2 2 0 ] \nabla^2 f(x) =
\begin{bmatrix}
\frac{\partial^2 f(x)}{\partial x_1^2} & \frac{\partial^2 f(x)}{\partial x_1 \partial x_2} \\
\frac{\partial^2 f(x)}{\partial x_2 \partial x_1} & \frac{\partial^2 f(x)}{\partial x_2^2}
\end{bmatrix} =
\begin{bmatrix}
2 - \sin(x_1) & 2 \\
2 & 0
\end{bmatrix} ∇ 2 f ( x ) = ∂ x 1 2 ∂ 2 f ( x ) ∂ x 2 ∂ x 1 ∂ 2 f ( x ) ∂ x 1 ∂ x 2 ∂ 2 f ( x ) ∂ x 2 2 ∂ 2 f ( x ) = [ 2 − sin ( x 1 ) 2 2 0 ]
Chú ý rằng Hessian luôn là một ma trận đối xứng.
2. Đạo hàm của hàm trả về một vector
Xét một hàm trả về vector với đầu vào là một số thực v ( x ) : R → R n v(x): \mathbb{R} \rightarrow \mathbb{R}^n v ( x ) : R → R n :
Đạo hàm của hàm số này theo x x x là một vector hàng như sau:
∇ v ( x ) ≜ [ ∂ v 1 ( x ) ∂ x ∂ v 2 ( x ) ∂ x … ∂ v n ( x ) ∂ x ] \nabla v(x) \triangleq \left[ \frac{\partial v_1(x)}{\partial x} \quad \frac{\partial v_2(x)}{\partial x} \quad \ldots \quad \frac{\partial v_n(x)}{\partial x} \right] ∇ v ( x ) ≜ [ ∂ x ∂ v 1 ( x ) ∂ x ∂ v 2 ( x ) … ∂ x ∂ v n ( x ) ]
Đạo hàm bậc hai của hàm số này có dạng:
∇ 2 v ( x ) ≜ [ ∂ 2 v 1 ( x ) ∂ x 2 ∂ 2 v 2 ( x ) ∂ x 2 … ∂ 2 v n ( x ) ∂ x 2 ] \nabla^2 v(x) \triangleq \left[ \frac{\partial^2 v_1(x)}{\partial x^2} \quad \frac{\partial^2 v_2(x)}{\partial x^2} \quad \ldots \quad \frac{\partial^2 v_n(x)}{\partial x^2} \right] ∇ 2 v ( x ) ≜ [ ∂ x 2 ∂ 2 v 1 ( x ) ∂ x 2 ∂ 2 v 2 ( x ) … ∂ x 2 ∂ 2 v n ( x ) ]
Ví dụ: Cho một vector a ∈ R n \mathbf{a} \in \mathbb{R}^n a ∈ R n và một hàm số vector-valued v ( x ) = x a v(x) = x\mathbf{a} v ( x ) = x a , đạo hàm bậc nhất và Hessian của nó lần lượt là
∇ v ( x ) = a T , ∇ 2 v ( x ) = 0 ∈ R n × n \begin{align}
\nabla v(x) = \mathbf{a}^T, \quad \nabla^2 v(x) = 0 \in \mathbb{R}^{n \times n}
\end{align} ∇ v ( x ) = a T , ∇ 2 v ( x ) = 0 ∈ R n × n
Xét một hàm trả về vector với đầu vào là một vector h ( x ) : R k → R n h(x) : \mathbb{R}^k \rightarrow \mathbb{R}^n h ( x ) : R k → R n , đạo hàm bậc nhất của nó là
∇ h ( x ) ≜ [ ∂ h 1 ( x ) ∂ x 1 ∂ h 2 ( x ) ∂ x 1 ⋯ ∂ h n ( x ) ∂ x 1 ∂ h 1 ( x ) ∂ x 2 ∂ h 2 ( x ) ∂ x 2 ⋯ ∂ h n ( x ) ∂ x 2 ⋮ ⋮ ⋱ ⋮ ∂ h 1 ( x ) ∂ x k ∂ h 2 ( x ) ∂ x k ⋯ ∂ h n ( x ) ∂ x k ] = [ ∇ h 1 ( x ) ∇ h 2 ( x ) ⋯ ∇ h n ( x ) ] ∈ R k × n \begin{align}
\nabla h(x) \triangleq
\begin{bmatrix}
\frac{\partial h_1(x)}{\partial x_1} & \frac{\partial h_2(x)}{\partial x_1} & \cdots & \frac{\partial h_n(x)}{\partial x_1} \\
\frac{\partial h_1(x)}{\partial x_2} & \frac{\partial h_2(x)}{\partial x_2} & \cdots & \frac{\partial h_n(x)}{\partial x_2} \\
\vdots & \vdots & \ddots & \vdots \\
\frac{\partial h_1(x)}{\partial x_k} & \frac{\partial h_2(x)}{\partial x_k} & \cdots & \frac{\partial h_n(x)}{\partial x_k}
\end{bmatrix}
= \left[ \nabla h_1(x) \space \nabla h_2(x) \space \cdots \space \nabla h_n(x) \right] \in \mathbb{R}^{k \times n}
\end{align} ∇ h ( x ) ≜ ∂ x 1 ∂ h 1 ( x ) ∂ x 2 ∂ h 1 ( x ) ⋮ ∂ x k ∂ h 1 ( x ) ∂ x 1 ∂ h 2 ( x ) ∂ x 2 ∂ h 2 ( x ) ⋮ ∂ x k ∂ h 2 ( x ) ⋯ ⋯ ⋱ ⋯ ∂ x 1 ∂ h n ( x ) ∂ x 2 ∂ h n ( x ) ⋮ ∂ x k ∂ h n ( x ) = [ ∇ h 1 ( x ) ∇ h 2 ( x ) ⋯ ∇ h n ( x ) ] ∈ R k × n
Nếu một hàm số g : R m → R n g : \mathbb{R}^m \rightarrow \mathbb{R}^n g : R m → R n , thì đạo hàm của nó là một ma trận thuộc R m × n \mathbb{R}^{m \times n} R m × n
Đạo hàm bậc hai của hàm số trên là một mảng ba chiều, chúng ta sẽ không nhắc đến ở đây.
Trường hợp đặc biệt đạo hàm của hàm số thường gặp, chúng ta cần biết hai tính chất quan trọng khác thường liên quan đến đạo hàm của một biến.
3. Tính chất quan trọng của đạo hàm
3.1. Quy tắc tích (Product rule)
Đề cho tổng quát, ta giả sử biến đầu vào là một ma trận. Giả sử rằng các hàm số có chiều phù hợp để các phép nhân ma trận thực hiện được. Ta có:
∇ ( f ( X ) T g ( X ) ) = ( ∇ f ( X ) ) g ( X ) + ( ∇ g ( X ) ) f ( X ) \nabla (f(X)^T g(X)) = (\nabla f(X)) g(X) + (\nabla g(X)) f(X) ∇ ( f ( X ) T g ( X )) = ( ∇ f ( X )) g ( X ) + ( ∇ g ( X )) f ( X )
Biểu thức nâng niu hơn thực chứng ta đã quen thuộc:
( f ( x ) g ( x ) ) T = f T ( x ) g ( x ) + g T ( x ) f ( x ) (f(x) g(x))^T = f^T(x) g(x) + g^T(x) f(x) ( f ( x ) g ( x ) ) T = f T ( x ) g ( x ) + g T ( x ) f ( x )
Chú ý rằng tích của vector và ma trận, ta không được sử dụng tính chất giao hoán.
3.2. Quy tắc chuỗi (Chain rule)
Khi có các hàm hợp thì
∇ X g ( f ( X ) ) = ( ∇ X f ) T ( ∇ f g ) \nabla_{X}g(f(X)) = (\nabla_X f)^T (\nabla_{f}g) ∇ X g ( f ( X )) = ( ∇ X f ) T ( ∇ f g )
Quy tắc này cũng giống với quy tắc trong hàm một biến:
( g ( f ( x ) ) ) ′ = f ′ ( x ) g ′ ( f ) (g(f(x)))' = f'(x) g'(f) ( g ( f ( x )) ) ′ = f ′ ( x ) g ′ ( f )
Một lưu ý nhỏ nhưng quan trọng khi làm việc với tích các ma trận là sự phù hợp về kích
thước của các ma trận trong tích.
4. Đạo hàm của các hàm số thường gặp
f ( x ) f(x) f ( x ) ∇ f ( x ) \nabla f(x) ∇ f ( x ) f ( X ) f(X) f ( X ) ∇ X f ( X ) \nabla_X f(X) ∇ X f ( X ) x \mathbf{x} x I \mathbf{I} I trace ( X ) \operatorname{trace}(\mathbf{X}) trace ( X ) I \mathbf{I} I a T x \mathbf{a^Tx} a T x a \mathbf{a} a trace ( A T X ) \operatorname{trace}(\mathbf{A^TX}) trace ( A T X ) A \mathbf{A} A x T A x \mathbf{x^TAx} x T Ax ( A + A T ) x \mathbf{(A+A^T)x} ( A + A T ) x trace ( X T A X ) \operatorname{trace}(\mathbf{X^TAX}) trace ( X T AX ) ( A + A T ) X \mathbf{(A+A^T)X} ( A + A T ) X x T x = ∥ ∥ x ∥ ∥ 2 2 \mathbf{x^Tx=\|\|x\|\|^2_{2}} x T x = ∥∥x∥ ∥ 2 2 2 x \mathbf{2x} 2x trace ( X T X = ∥ X ∥ F 2 ) \operatorname{trace}(\mathbf{X^TX=\|X\|^2_F}) trace ( X T X = ∥X ∥ F 2 ) 2 X \mathbf{2X} 2X ∥ A x − b ∥ 2 2 \mathbf{\|Ax - b\|^2_2} ∥Ax − b ∥ 2 2 2 A T ( A x − b ) \mathbf{2A^T (Ax - b)} 2 A T ( Ax − b ) trace ( ∥ A X − B ∥ F 2 ) \operatorname{trace}(\mathbf{\|AX - B\|^2_F}) trace ( ∥AX − B ∥ F 2 ) 2 A T ( A X − B ) \mathbf{2A^T (AX - B)} 2 A T ( AX − B ) a T x x T b \mathbf{a^T x x^T b} a T x x T b ( a b T + b a T ) x \mathbf{(ab^T + ba^T) x} ( a b T + b a T ) x trace ( A T X B ) \operatorname{trace}(\mathbf{A^T X B}) trace ( A T XB ) A B T \mathbf{AB^T} A B T
5. Kiểm tra đạo hàm
5.1. Xấp xỉ đạo hàm của hàm một biến
Theo định nghĩa,
f ′ ( x ) = lim ϵ → 0 f ( x + ϵ ) − f ( x ) ϵ f'(x) = \lim_{\epsilon \to 0} \frac{f(x + \epsilon) - f(x)}{\epsilon} f ′ ( x ) = ϵ → 0 lim ϵ f ( x + ϵ ) − f ( x )
Một cách thường được sử dụng là lấy một giá trị ϵ \epsilon ϵ rất nhỏ, ví dụ 10 − 6 10^{-6} 1 0 − 6 , và sử dụng công thức:
f ′ ( x ) ≈ f ( x + ϵ ) − f ( x − ϵ ) 2 ϵ f'(x) \approx \frac{f(x + \epsilon) - f(x - \epsilon)}{2\epsilon} f ′ ( x ) ≈ 2 ϵ f ( x + ϵ ) − f ( x − ϵ )
Cách tính này được gọi là numerical gradient \textit{numerical gradient} numerical gradient . Có hai cách giải thích cho công thức này, hãy xem sách của a Tiệp để hiểu hơn.
5.2. Kiểm tra đạo hàm với python
from __future__ import print_function import numpy as np def check_grad ( fn , gr , X ) : X_flat = X . reshape ( - 1 ) shape_X = X . shape num_grad = np . zeros_like ( X ) grad_flat = np . zeros_like ( X_flat ) eps = 1e-6 numElems = X_flat . shape [ 0 ] for i in range ( numElems ) : Xp_flat = X_flat . copy ( ) Xn_flat = X_flat . copy ( ) Xp_flat [ i ] += eps Xn_flat [ i ] -= eps Xp = Xp_flat . reshape ( shape_X ) Xn = Xn_flat . reshape ( shape_X ) grad_flat [ i ] = ( fn ( Xp ) - fn ( Xn ) ) / ( 2 * eps ) num_grad = grad_flat . reshape ( shape_X ) diff = np . linalg . norm ( num_grad - gr ( X ) ) print ( ’Difference between two methods should be small : ’ , diff ) m , n = 10 , 20 A = np . random . rand ( m , n ) X = np . random . rand ( n , m ) def fn1 ( X ) : return np . trace ( A . dot ( X ) ) def gr1 ( X ) : return A . T check_grad ( fn1 , gr1 , X ) A = np . random . rand ( m , m ) x = np . random . rand ( m , 1 ) def fn2 ( x ) : return x . T . dot ( A ) . dot ( x ) def gr2 ( x ) : return ( A + A . T ) . dot ( x ) check_grad ( fn2 , gr2 , x )
Kết quả:
Difference between two methods should be small: 2 .02303323394e-08 Difference between two methods should be small: 2 .10853872281e-09