Cách Tính Ma Trận Hess

Bây giờ chúng ta đã có hiểu biết vững chắc về đạo hàm của một hàm đơnbiến, hãy cùng trở lại câu hỏi ban đầu về hàm mất mát của (nhiều khảnăng là) hàng tỷ trọng số.

Đang xem: Cách tính ma trận hess

18.4.1. Đạo hàm trong Không gian Nhiều chiều¶

Nhớ lại Section 18.3, ta đã bàn luận về điềugì sẽ xảy ra nếu chỉ thay đổi một trong số hàng tỷ các trọng số và giữnguyên những trọng số còn lại. Điều này hoàn toàn không có gì khác vớimột hàm đơn biến, nên ta có thể viết

(18.4.1)¶

Chúng ta sẽ gọi đạo hàm của một biến trong khi không thay đổi những biếncòn lại là đạo hàm riêng (partial derivative), và ký hiệu đạo hàmnày là (frac{partial}{partial w_1}) trong phương trình(18.4.1).

Bây giờ, tiếp tục thay đổi (w_2) một khoảng nhỏ thành(w_2 + epsilon_2):

(18.4.2)¶<egin{split}egin{aligned}L(w_1+epsilon_1, w_2+epsilon_2, ldots, w_N) & approx L(w_1, w_2+epsilon_2, ldots, w_N) + epsilon_1 frac{partial}{partial w_1} L(w_1, w_2+epsilon_2, ldots, w_N) \& approx L(w_1, w_2, ldots, w_N) \& quad + epsilon_2frac{partial}{partial w_2} L(w_1, w_2, ldots, w_N) \& quad + epsilon_1 frac{partial}{partial w_1} L(w_1, w_2, ldots, w_N) \& quad + epsilon_1epsilon_2frac{partial}{partial w_2}frac{partial}{partial w_1} L(w_1, w_2, ldots, w_N) \& approx L(w_1, w_2, ldots, w_N) \& quad + epsilon_2frac{partial}{partial w_2} L(w_1, w_2, ldots, w_N) \& quad + epsilon_1 frac{partial}{partial w_1} L(w_1, w_2, ldots, w_N).end{aligned}end{split}>

Một lần nữa, ta lại sử dụng ý tưởng đã thấy ở (18.4.1)rằng (epsilon_1epsilon_2) là một số hạng bậc cao và có thể đượcloại bỏ tương tự như cách mà ta có thể loại bỏ (epsilon^{2})trong mục trước. Cứ tiếp tục theo cách này, ta có

(18.4.3)¶

Thoạt nhìn đây có vẻ là một mớ hỗn độn, tuy nhiên chú ý rằng phép tổngbên phải chính là biểu diễn của phép tích vô hướng và ta có thể khiếnchúng trở nên quen thuộc hơn. Với

(18.4.4)¶<oldsymbol{epsilon} = ^ op ; ext{và} ;
abla_{mathbf{x}} L = left^ op,>
(18.4.5)¶

Ta gọi vector (
abla_{mathbf{w}} L) là gradient của (L).

Phương trình (18.4.5) đáng để ta suy ngẫm. Nó có dạngđúng y như những gì ta đã thấy trong trường hợp một chiều, chỉ khác làtất cả đã được biến đổi về dạng vector và tích vô hướng. Điều này chochúng ta biết một cách xấp xỉ hàm (L) sẽ thay đổi như thế nào vớimột nhiễu loạn bất kỳ ở đầu vào. Như ta sẽ thấy trong mục tiếp theo, đâysẽ là một công cụ quan trọng giúp chúng ta hiểu được cách học từ thôngtin chứa trong gradient dưới góc nhìn hình học.

Nhưng trước tiên, hãy cùng kiểm tra phép xấp xỉ này với một ví dụ. Giảsử ta đang làm việc với hàm

(18.4.6)¶.>
(18.4.7)¶.>

Vì thế, nếu muốn tính xấp xỉ (f) tại((epsilon_1, log(2) + epsilon_2)), ta có một ví dụ cụ thể của(18.4.5):

(18.4.8)¶

%matplotlib inlinefrom lingocard.vn import mxnet as lingocard.vnfrom IPython import displayfrom mpl_toolkits import mplot3dfrom mxnet import autograd, np, npxnpx.set_np()def f(x, y): return np.log(np.exp(x) + np.exp(y))def grad_f(x, y): return np.array()epsilon = np.array(<0.01, -0.03>)grad_approx = f(0, np.log(2)) + epsilon.dot(grad_f(0, np.log(2)))true_value = f(0 + epsilon<0>, np.log(2) + epsilon<1>)f'approximation: {grad_approx}, true Value: {true_value}'
(18.4.9)¶

Giả sử ta muốn sử dụng thông tin gradient để cực tiểu hóa mất mát(L). Hãy cùng tìm hiểu cách hoạt động về mặt hình học của thuậttoán hạ gradient được mô tả lần đầu ở Section 2.5. Các bướccủa thuật toán được miêu tả dưới đây:

Bắt đầu với giá trị ban đầu ngẫu nhiên của tham số(mathbf{w}).Tìm một hướng (mathbf{v}) tại (mathbf{w}) sao cho(L) giảm một cách nhanh nhất.Tiến một bước nhỏ về hướng đó:(mathbf{w}
ightarrow mathbf{w} + epsilonmathbf{v}).Lặp lại.

Thứ duy nhất mà chúng ta không biết chính xác cách làm là cách tính toánvector (mathbf{v}) tại bước thứ hai. Ta gọi (mathbf{v}) làhướng hạ dốc nhất (direction of steepest descent). Sử dụng nhữnghiểu biết về mặt hình học của phép tích vô hướng từSection 18.1, ta có thể viết lại(18.4.5) như sau

(18.4.10)¶

Để thuận tiện, ta giả định hướng của chúng ta có độ dài bằng một và sửdụng ( heta) để biểu diễn góc giữa (mathbf{v}) và(
abla_{mathbf{w}} L(mathbf{w})). Nếu muốn (L) giảm càngnhanh, ta sẽ muốn giá trị của biểu thức trên càng âm càng tốt. Cách duynhất để chọn hướng đi trong phương trình này là thông qua(cos( heta)), vì thế ta sẽ muốn giá trị này âm nhất có thể. Nhắclại kiến thức của hàm cô-sin, giá trị âm nhất của hàm này là(cos( heta) = -1), là khi góc giữa vector gradient và hướng cầnchọn là (pi) radian hay (180) độ. Cách duy nhất để đạt đượcđiều này là di chuyển theo hướng hoàn toàn ngược lại: chọn(mathbf{v}) theo hướng hoàn toàn ngược chiều với(
abla_{mathbf{w}} L(mathbf{w}))!

Điều này dẫn ta đến với một trong những thuật toán quan trọng nhất củahọc máy: hướng hạ dốc nhất cùng hướng với(-
abla_{mathbf{w}}L(mathbf{w})). Vậy nên thuật toán của ta sẽđược viết lại như sau.

Bắt đầu với một lựa chọn ngẫu nhiên cho giá trị ban đầu của các thamsố (mathbf{w}).Tính toán (
abla_{mathbf{w}} L(mathbf{w})).Tiến một bước nhỏ về hướng ngược lại của nó:(mathbf{w}
ightarrow mathbf{w} – epsilon
abla_{mathbf{w}} L(mathbf{w})).Lặp lại.

Thuật toán cơ bản này dù đã được chỉnh sửa và kết hợp theo nhiều cáchbởi các nhà nghiên cứu, nhưng khái niệm cốt lõi vẫn là như nhau. Sử dụnggradient để tìm hướng giảm mất mát nhanh nhất có thể và cập nhật cáctham số để dịch chuyển về hướng đó.

18.4.3. Một vài chú ý về Tối ưu hóa¶

Xuyên suốt cuốn sách, ta chỉ tập trung vào những kỹ thuật tối ưu hóa sốhọc vì một nguyên nhân thực tế là: mọi hàm ta gặp phải trong học sâu quáphức tạp để có thể tối ưu hóa một cách tường minh.

Tuy nhiên, sẽ rất hữu ích nếu hiểu được những kiến thức hình học ta cóđược ở trên nói gì về tối ưu hóa các hàm một cách trực tiếp.

Giả sử ta muốn tìm giá trị của (mathbf{x}_0) giúp cực tiểu hóamột hàm (L(mathbf{x})) nào đó. Và có một người nào đó đưa ta mộtgiá trị và cho rằng đây là giá trị giúp cực tiểu hóa (L). Bằngcách nào ta có thể kiểm chứng rằng đáp án của họ là hợp lý?

Xét lại (18.4.5):

(18.4.11)¶

Nếu giá trị gradient khác không, ta biết rằng ta có thể bước một bước vềhướng (-epsilon
abla_{mathbf{x}} L(mathbf{x}_0)) để tìm mộtgiá trị (L) nhỏ hơn. Do đó, nếu ta thực sự ở điểm cực tiểu, sẽkhông thể có trường hợp đó! Ta có thể kết luận rằng nếu(mathbf{x}_0) là một cực tiểu, thì(
abla_{mathbf{x}} L(mathbf{x}_0) = 0). Ta gọi những điểm màtại đó (
abla_{mathbf{x}} L(mathbf{x}_0) = 0) là các điểm tớihạn (critical points).

Điều này rất hữu ích, bởi vì trong một vài thiết lập hiếm gặp, ta cóthể tìm được các điểm có gradient bằng không một cách tường minh, và từđó tìm được điểm có giá trị nhỏ nhất.

Với một ví dụ cụ thể, xét hàm

(18.4.12)¶

Hàm này có đạo hàm

(18.4.13)¶

Các điểm cực trị duy nhất khả dĩ là tại (x = -1, 0, 2), khi hàmlấy giá trị lần lượt là (-5,0, -32), và do đó ta có thể kết luậnrằng ta cực tiểu hóa hàm khi (x = 2). Ta có thể kiểm chứng nhanhbằng đồ thị.

x = np.arange(-2, 3, 0.01)f = (3 * x**4) – (4 * x**3) – (12 * x**2)lingocard.vn.plot(x, f, 'x', 'f(x)')

*

Điều này nhấn mạnh một thực tế quan trọng cần biết kể cả khi làm việcdưới dạng lý thuyết hay số học: các điểm khả dĩ duy nhất mà tại đó hàmlà cực tiểu (hoặc cực đại) sẽ có đạo hàm tại đó bằng không, tuy nhiên,không phải tất cả các điểm có đạo hàm bằng không sẽ là cực tiểu (hay cựcđại) toàn cục.

18.4.4. Quy tắc Dây chuyền cho Hàm đa biến¶

Giả sử là ta có một hàm bốn biến ((w, x, y), and (z)) đượctạo ra bằng cách kết hợp các hàm con:

(18.4.14)¶<egin{split}egin{aligned}f(u, v) & = (u+v)^{2} \u(a, b) & = (a+b)^{2}, qquad v(a, b) = (a-b)^{2}, \a(w, x, y, z) & = (w+x+y+z)^{2}, qquad b(w, x, y, z) = (w+x-y-z)^2.end{aligned}end{split}>

Các chuỗi phương trình như trên xuất hiện thường xuyên khi ta làm việcvới các mạng nơ-ron, do đó cố gắng hiểu xem làm thế nào để tính gradientcủa các hàm này là thiết yếu. Fig. 18.4.1 biểu diễn trựcquan mỗi liên hệ trực tiếp giữa biến này với biến khác.

*

Fig. 18.4.1 Các quan hệ của hàm ở trên với các nút biểu diễn giá trị và mũi têncho biết sự phụ thuộc hàm.¶

(18.4.15)¶

Tiếp theo ta có thể lấy đạo hàm bằng cách chỉ sử dụng các đạo hàm đơnbiến, nhưng nếu làm vậy ta sẽ nhanh chóng bị ngợp trong các số hạng, màđa phần là bị lặp lại! Thật vậy, ta có thể thấy ở ví dụ dưới đây:

(18.4.16)¶<egin{split}egin{aligned}frac{partial f}{partial w} & = 2 left(2 left(2 (w + x + y + z) - 2 (w + x - y - z) ight) left((w + x + y + z)^{2}- (w + x - y - z)^{2} ight) + ight.\& left. quad 2 left(2 (w + x - y - z) + 2 (w + x + y + z) ight) left((w + x - y - z)^{2}+ (w + x + y + z)^{2} ight) ight) imes \& quad left(left((w + x + y + z)^{2}- (w + x - y - z)^2 ight)^{2}+ left((w + x - y - z)^{2}+ (w + x + y + z)^{2} ight)^{2} ight).end{aligned}end{split}>

Kế đến nếu ta cũng muốn tính (frac{partial f}{partial x}), tasẽ lại kết thúc với một phương trình tương tự với nhiều thành phần bịlặp lại, và nhiều thành phần lặp lại chung giữa hai đạo hàm. Điều nàythể hiện một khối lượng lớn công việc bị lãng phí, và nếu ta tính cácđạo hàm theo cách này, toàn bộ cuộc cách mạng học sâu sẽ chấm dứt trướckhi nó bắt đầu!

Ta hãy chia nhỏ vấn đề này. Ta sẽ bắt đầu bằng cách thử hiểu (f)thay đổi thế nào khi (a) thay đổi, giả định cần thiết là tất cả(w, x, y), và (z) không tồn tại. Ta sẽ lập luận giống nhưlần đầu tiên ta làm việc với gradient. Hãy lấy (a) và cộng mộtlượng nhỏ (epsilon) vào nó.

(18.4.17)¶<egin{split}egin{aligned}& f(u(a+epsilon, b), v(a+epsilon, b)) \approx & fleft(u(a, b) + epsilonfrac{partial u}{partial a}(a, b), v(a, b) + epsilonfrac{partial v}{partial a}(a, b) ight) \approx & f(u(a, b), v(a, b)) + epsilonleft.end{aligned}end{split}>

Dòng đầu tiên theo sau từ định nghĩa đạo hàm từng phần, và dòng thứ haitheo sau từ định nghĩa gradient. Thật khó khăn để lần theo các biến khitính đạo hàm, như trong biểu thức(frac{partial f}{partial u}(u(a, b), v(a, b))), cho nên tathường rút gọn nó để dễ nhớ hơn

(18.4.18)¶

Sẽ rất hữu ích khi ta suy nghĩ về ý nghĩa của biến đổi này. Ta đang cốgắng hiểu làm thế nào một hàm có dạng (f(u(a, b), v(a, b))) thayđổi giá trị của nó khi (a) thay đổi. Có hai hướng có thể xảy ra:(a
ightarrow u
ightarrow f) và(a
ightarrow v
ightarrow f). Ta có thể lần lượt tính toán đónggóp của cả hai hướng này thông qua quy tắc dây chuyền:(frac{partial w}{partial u} cdot frac{partial u}{partial x})và(frac{partial w}{partial v} cdot frac{partial v}{partial x}),rồi cộng gộp lại.

các hàm được kết nối ở bên trái như trong Fig. 18.4.2.

Xem thêm: đồ án thiết kế băng tải cao su

*

Fig. 18.4.2 Một ví dụ khác về quy tắc dây chuyền.¶

Để tính toán (frac{partial f}{partial y}), chúng ta cần tínhtổng toàn bộ đường đi từ (y) đến (f) (trường hợp này có 3đường đi):

(18.4.19)¶

Hiểu quy tắc dây chuyền theo cách này giúp chúng ta thấy được dòng chảycủa gradient xuyên suốt mạng và vì sao một số lựa chọn kiến trúc nhưtrong LSTM (Section 9.2) hoặc các tầng phần dư(Section 7.6) có thể định hình quá trình học bằng cách kiểmsoát dòng chảy gradient.

(18.4.20)¶<egin{split}egin{aligned}f(u, v) & = (u+v)^{2} \u(a, b) & = (a+b)^{2}, qquad v(a, b) = (a-b)^{2}, \a(w, x, y, z) & = (w+x+y+z)^{2}, qquad b(w, x, y, z) = (w+x-y-z)^2.end{aligned}end{split}>

Nếu muốn tính (frac{partial f}{partial w}) chẳng hạn, ta có thểáp dụng quy tắc dây chuyền đa biến để thấy:

(18.4.21)¶<egin{split}egin{aligned}frac{partial f}{partial w} & = frac{partial f}{partial u}frac{partial u}{partial w} + frac{partial f}{partial v}frac{partial v}{partial w}, \frac{partial u}{partial w} & = frac{partial u}{partial a}frac{partial a}{partial w}+frac{partial u}{partial b}frac{partial b}{partial w}, \frac{partial v}{partial w} & = frac{partial v}{partial a}frac{partial a}{partial w}+frac{partial v}{partial b}frac{partial b}{partial w}.end{aligned}end{split}>

Chúng ta hãy thử sử dụng cách phân tách này để tính(frac{partial f}{partial w}). Tất cả những gì chúng ta cần ởđây là các đạo hàm riêng:

(18.4.22)¶<egin{split}egin{aligned}frac{partial f}{partial u} = 2(u+v), & quadfrac{partial f}{partial v} = 2(u+v), \frac{partial u}{partial a} = 2(a+b), & quadfrac{partial u}{partial b} = 2(a+b), \frac{partial v}{partial a} = 2(a-b), & quadfrac{partial v}{partial b} = -2(a-b), \frac{partial a}{partial w} = 2(w+x+y+z), & quadfrac{partial b}{partial w} = 2(w+x-y-z).end{aligned}end{split}>

# Compute the value of the function from inputs to outputsw, x, y, z = -1, 0, -2, 1a, b = (w + x + y + z)**2, (w + x – y – z)**2u, v = (a + b)**2, (a – b)**2f = (u + v)**2print(f' f at {w}, {x}, {y}, {z} is {f}')# Compute the single step partialsdf_du, df_dv = 2*(u + v), 2*(u + v)du_da, du_db, dv_da, dv_db = 2*(a + b), 2*(a + b), 2*(a – b), -2*(a – b)da_dw, db_dw = 2*(w + x + y + z), 2*(w + x – y – z)# Compute the final result from inputs to outputsdu_dw, dv_dw = du_da*da_dw + du_db*db_dw, dv_da*da_dw + dv_db*db_dwdf_dw = df_du*du_dw + df_dv*dv_dwprint(f'df/dw at {w}, {x}, {y}, {z} is {df_dw}')
Tuy nhiên, cần lưu ý rằng điều này không làm cho các phép tính chẳng hạnnhư (frac{partial f}{partial x}) trở nên đơn giản. Lý do nằm ởcách chúng ta chọn để áp dụng quy tắc dây chuyền. Nếu nhìn vào nhữnggì chúng ta đã làm ở trên, chúng ta luôn giữ (partial w) ở mẫukhi có thể. Với cách này, chúng ta áp dụng quy tắc dây chuyền để xem(w) thay đổi các biến khác như thế nào. Nếu đó là những gì chúngta muốn thì cách này quả là một ý tưởng hay. Tuy nhiên, nghĩ lại về mụctiêu của học sâu: chúng ta muốn thấy từng tham số thay đổi giá trị mấtmát như thế nào. Về cốt lõi, chúng ta luôn muốn áp dụng quy tắc dâychuyền và giữ (partial f) ở tử số bất cứ khi nào có thể!

Cụ thể hơn, chúng ta có thể viết như sau:

(18.4.23)¶<egin{split}egin{aligned}frac{partial f}{partial w} & = frac{partial f}{partial a}frac{partial a}{partial w} + frac{partial f}{partial b}frac{partial b}{partial w}, \frac{partial f}{partial a} & = frac{partial f}{partial u}frac{partial u}{partial a}+frac{partial f}{partial v}frac{partial v}{partial a}, \frac{partial f}{partial b} & = frac{partial f}{partial u}frac{partial u}{partial b}+frac{partial f}{partial v}frac{partial v}{partial b}.end{aligned}end{split}>

Lưu ý rằng cách áp dụng quy tắc dây chuyền này buộc chúng ta phải tínhrõ(frac{partial f}{partial u}, frac{partial f}{partial v}, frac{partial f}{partial a}, frac{partial f}{partial b}, ; ext{và} ; frac{partial f}{partial w}).Chúng ta cũng có thể thêm vào các phương trình:

(18.4.24)¶<egin{split}egin{aligned}frac{partial f}{partial x} & = frac{partial f}{partial a}frac{partial a}{partial x} + frac{partial f}{partial b}frac{partial b}{partial x}, \frac{partial f}{partial y} & = frac{partial f}{partial a}frac{partial a}{partial y}+frac{partial f}{partial b}frac{partial b}{partial y}, \frac{partial f}{partial z} & = frac{partial f}{partial a}frac{partial a}{partial z}+frac{partial f}{partial b}frac{partial b}{partial z}.end{aligned}end{split}>

và tiếp đó theo dõi (f) biến đổi như thế nào khi chúng ta thay đổibất kỳ nút nào trong toàn bộ mạng. Hãy cùng lập trình nó.

# Compute the value of the function from inputs to outputsw, x, y, z = -1, 0, -2, 1a, b = (w + x + y + z)**2, (w + x – y – z)**2u, v = (a + b)**2, (a – b)**2f = (u + v)**2print(f'f at {w}, {x}, {y}, {z} is {f}')# Compute the derivative using the decomposition above# First compute the single step partialsdf_du, df_dv = 2*(u + v), 2*(u + v)du_da, du_db, dv_da, dv_db = 2*(a + b), 2*(a + b), 2*(a – b), -2*(a – b)da_dw, db_dw = 2*(w + x + y + z), 2*(w + x – y – z)da_dx, db_dx = 2*(w + x + y + z), 2*(w + x – y – z)da_dy, db_dy = 2*(w + x + y + z), -2*(w + x – y – z)da_dz, db_dz = 2*(w + x + y + z), -2*(w + x – y – z)# Now compute how f changes when we change any value from output to inputdf_da, df_db = df_du*du_da + df_dv*dv_da, df_du*du_db + df_dv*dv_dbdf_dw, df_dx = df_da*da_dw + df_db*db_dw, df_da*da_dx + df_db*db_dxdf_dy, df_dz = df_da*da_dy + df_db*db_dy, df_da*da_dz + df_db*db_dzprint(f'df/dw at {w}, {x}, {y}, {z} is {df_dw}')print(f'df/dx at {w}, {x}, {y}, {z} is {df_dx}')print(f'df/dy at {w}, {x}, {y}, {z} is {df_dy}')print(f'df/dz at {w}, {x}, {y}, {z} is {df_dz}')
f at -1, 0, -2, 1 is 1024df/dw at -1, 0, -2, 1 is -4096df/dx at -1, 0, -2, 1 is -4096df/dy at -1, 0, -2, 1 is -4096df/dz at -1, 0, -2, 1 is -4096
Việc tính đạo hàm từ (f) trở ngược về đầu vào thay vì từ đầu vàođến đầu ra (như chúng ta đã thực hiện ở đoạn mã đầu tiên ở trên) là lýdo cho cái tên lan truyền ngược (backpropagation) của thuật toán. Cóhai bước:

Tính giá trị của hàm và đạo hàm riêng theo từng bước đơn lẻ từ đầuđến cuối. Mặc dù không được thực hiện ở trên, hai việc này có thểđược kết hợp vào một lượt truyền xuôi duy nhất.Tính toán đạo hàm của (f) từ cuối về đầu. Chúng ta gọi đó làlượt truyền ngược.

Đây chính xác là những gì mỗi thuật toán học sâu thực thi để tínhgradient của giá trị mất mát theo từng trọng số của mạng trong mỗi lượtlan truyền. Thật thú vị vì chúng ta có một sự phân tách như trên.

Để tóm gọn phần này, hãy xem nhanh ví dụ sau.

# Initialize as ndarrays, then attach gradientsw, x, y, z = np.array(-1), np.array(0), np.array(-2), np.array(1)w.attach_grad()x.attach_grad()y.attach_grad()z.attach_grad()# Do the computation like usual, tracking gradientswith autograd.record(): a, b = (w + x + y + z)**2, (w + x – y – z)**2 u, v = (a + b)**2, (a – b)**2 f = (u + v)**2# Execute backward passf.backward()print(f'df/dw at {w}, {x}, {y}, {z} is {w.grad}')print(f'df/dx at {w}, {x}, {y}, {z} is {x.grad}')print(f'df/dy at {w}, {x}, {y}, {z} is {y.grad}')print(f'df/dz at {w}, {x}, {y}, {z} is {z.grad}')
df/dw at -1.0, 0.0, -2.0, 1.0 is -4096.0df/dx at -1.0, 0.0, -2.0, 1.0 is -4096.0df/dy at -1.0, 0.0, -2.0, 1.0 is -4096.0df/dz at -1.0, 0.0, -2.0, 1.0 is -4096.0

18.4.6. Hessian¶

Như với giải tích đơn biến, việc xem xét đạo hàm bậc cao hơn cũng hữuích để xấp xỉ tốt hơn một hàm so với việc chỉ sử dụng gradient.

Một vấn đề trước mắt khi làm việc với đạo hàm bậc cao hơn của hàm đabiến đó là cần phải tính toán một số lượng lớn đạo hàm. Nếu chúng ta cómột hàm (f(x_1, ldots, x_n)) với (n) biến, chúng ta có thểcần (n^{2}) đạo hàm bậc 2, chẳng hạn để lựa chọn (i) và(j):

(18.4.26)¶<egin{split}mathbf{H}_f = egin{bmatrix} frac{d^2f}{dx_1dx_1} & cdots & frac{d^2f}{dx_1dx_n} \ vdots & ddots & vdots \ frac{d^2f}{dx_ndx_1} & cdots & frac{d^2f}{dx_ndx_n} \ end{bmatrix}.end{split}>

Không phải mọi hạng tử của ma trận này đều độc lập. Thật vậy, chúng tacó thể chứng minh rằng miễn là cả hai đạo hàm riêng hỗn hợp – mixedpartials (đạo hàm riêng theo nhiều hơn một biến số) có tồn tại và liêntục, thì hàm số luôn tồn tại và liên tục với mọi (i) và (j),

Điều này suy ra được bằng việc xem xét khi ta thay đổi hàm lần lượt theo(x_i) rồi (x_j), và ngược lại thay đổi (x_j) rồi(x_i), và so sánh hai kết quả này, biết rằng cả hai thứ tự này ảnhhưởng đến đầu ra của (f) như nhau.

Như với các hàm đơn biến, chúng ta có thể sử dụng những đạo hàm này đểhiểu rõ hơn về hành vi của hàm số lân cận một điểm. Cụ thể, chúng ta cóthể sử dụng nó để tìm hàm bậc hai phù hợp nhất lân cận(mathbf{x}_0) tương tự như trong giải tích đơn biến.

Hãy tham khảo một ví dụ. Giả sử rằng(f(x_1, x_2) = a + b_1x_1 + b_2x_2 + c_{11}x_1^{2} + c_{12}x_1x_2 + c_{22}x_2^{2}).Đây là một dạng tổng quát của hàm bậc hai 2 biến. Nếu chúng ta nhìn vàogiá trị của hàm, gradient và Hessian của nó (18.4.26), tấtcả tại điểm 0:

(18.4.28)¶<egin{split}egin{aligned}f(0,0) & = a, \ abla f (0,0) & = egin{bmatrix}b_1 \ b_2end{bmatrix}, \mathbf{H} f (0,0) & = egin{bmatrix}2 c_{11} & c_{12} \ c_{12} & 2c_{22}end{bmatrix},end{aligned}end{split}>
(18.4.29)¶
(18.4.30)¶

Cách này hoạt động cho bất cứ đầu vào thứ nguyên nào và cung cấp gầnđúng nhất hàm bậc hai cho một hàm bất kỳ tại một điểm. Lấy biểu đồ củahàm sau làm ví dụ.

(18.4.32)¶<egin{split} abla f(x, y) = e^{-x^2-y^2}egin{pmatrix}1-2x^2 \ -2xyend{pmatrix} ; ext{and} ; mathbf{H}f(x, y) = e^{-x^2-y^2}egin{pmatrix} 4x^3 - 6x & 4x^2y - 2y \ 4x^2y-2y &4xy^2-2xend{pmatrix}.end{split}>

# Construct grid and compute functionx, y = np.meshgrid(np.linspace(-2, 2, 101), np.linspace(-2, 2, 101), indexing='ij')z = x*np.exp(- x**2 – y**2)# Compute approximating quadratic with gradient and Hessian at (1, 0)w = np.exp(-1)*(-1 – (x + 1) + (x + 1)**2 + y**2)# Plot functionax = lingocard.vn.plt.figure().add_subplot(111, projection='3d')ax.plot_wireframe(x, y, z, **{'rstride': 10, 'cstride': 10})ax.plot_wireframe(x, y, w, **{'rstride': 10, 'cstride': 10}, color='purple')lingocard.vn.plt.xlabel('x')lingocard.vn.plt.ylabel('y')lingocard.vn.set_figsize()ax.set_xlim(-2, 2)ax.set_ylim(-2, 2)ax.set_zlim(-1, 1)ax.dist = 12

*

Điều này tạo cơ sở cho Thuật toán Newton được thảo luận ởSection 11.7, trong đó chúng ta lặp đi lặp lại việc tối ưu hoá đểtìm ra hàm bậc hai phù hợp nhất và sau đó cực tiểu hoá hàm bậc hai đó.

18.4.7. Giải tích Ma trận¶

Đạo hàm của các hàm có liên quan đến ma trận hoá ra rất đẹp. Phần này sẽnặng về mặt ký hiệu, vì vậy độc giả có thể bỏ qua trong lần đọc đầutiên. Tuy nhiên sẽ rất hữu ích khi biết rằng đạo hàm của các hàm liênquan đến các phép toán ma trận thường gọn gàng hơn nhiều so với suy nghĩban đầu của chúng ta, đặc biệt là bởi sự quan trọng của các phép tính matrận trong các ứng dụng học sâu.

Hãy xem một ví dụ. Giả sử chúng ta có một vài vector cột cố định(oldsymbol{eta}), và chúng ta muốn lấy hàm tích(f(mathbf{x}) = oldsymbol{eta}^ opmathbf{x}), và hiểu cáchtích vô hướng thay đổi khi chúng ta thay đổi (mathbf{x}).

Ký hiệu có tên ma trận đạo hàm sắp xếp theo mẫu số – denominator layoutmatrix derivative sẽ hữu ích khi làm việc với ma trận đạo hàm trong họcmáy, trong đó chúng ta tập hợp các đạo hàm riêng theo mẫu số của viphân, biểu diễn thành các dạng vector, ma trận hoặc tensor. Trong trườnghợp này, chúng ta viết:

(18.4.34)¶<egin{split}frac{df}{dmathbf{x}} = egin{bmatrix}frac{df}{dx_1} \vdots \frac{df}{dx_n}end{bmatrix},end{split}>

mà ở đây nó khớp với hình dạng của vector cột (mathbf{x}).

Triển khai hàm của chúng ta thành các thành tố

Nếu bây giờ ta tính đạo hàm riêng theo (eta_1) chẳng hạn, để ýrằng tất cả các phần tử bằng không ngoại trừ số hạng đầu tiên là(x_1) nhân với (eta_1). Vì thế, ta có

(18.4.38)¶<egin{split}frac{df}{dmathbf{x}} = egin{bmatrix}frac{df}{dx_1} \vdots \frac{df}{dx_n}end{bmatrix} = egin{bmatrix}eta_1 \vdots \eta_nend{bmatrix} = oldsymbol{eta}.end{split}>

Biểu thức trên minh họa một vài yếu tố về giải tích ma trận mà ta sẽ gặptrong suốt phần này:

Đầu tiên, các tính toán sẽ trở nên khá phức tạp.Thứ hai, kết quả cuối cùng sẽ gọn gàng hơn quá trình tính toán trunggian, và sẽ luôn có bề ngoài giống với trường hợp đơn biến. Trongtrường hợp này, hãy lưu ý rằng (frac{d}{dx}(bx) = b) và(frac{d}{dmathbf{x}} (oldsymbol{eta}^ opmathbf{x}) = oldsymbol{eta})là như nhau.Thứ ba, các chuyển vị có thể xuất hiện mà thoạt nhìn không biết chínhxác từ đâu ra. Lý do chủ yếu là do ta quy ước đạo hàm sẽ có cùng kíchthước với mẫu số, do đó khi nhân ma trận, ta cần lấy chuyển vị tươngứng để khớp với kích thước ban đầu.

Ta hãy thử một phép tính khó hơn làm ví dụ minh họa trực quan. Giả sử tacó một vector cột (mathbf{x}) và một ma trận vuông (A), vàta ta muốn tính biểu thức sau:

Với số hạng như (frac{dx_i}{dx_k}), không khó để thấy rằng đạohàm trên có giá trị bằng 1 khi (i=k), ngược lại nó sẽ bằng 0. Điềunày có nghĩa là mọi số hạng với (i) và (k) khác nhau sẽ biếnmất khỏi tổng trên, vì thế các số hạng duy nhất còn lại trong tổng đầutiên đó là những số hạng với (i=k). Lập luận tương tự cũng áp dụngcho số hạng thứ hai khi ta cần (j=k). Từ đó, ta có

Hiện tại, tên của các chỉ số trong ký hiệu Einstein là tùy ý – việc(i) và (j) khác nhau không quan trọng cho tính toán tại thờiđiểm này, vì thế ta có thể gán lại chỉ số sao cho cả hai đều chứa(i)

Bây giờ, ta cần luyện tập một chút để có thể đi sâu hơn. Ta hãy thử xácđịnh kết quả trên theo các phép toán ma trận. (a_{ki} + a_{ik}) làphần tử thứ (k, i) của (mathbf{A} + mathbf{A}^ op). Từđó, ta có

Tương tự, hạng tử này là tích của ma trận(mathbf{A} + mathbf{A}^ op) với vector (mathbf{x}), nênta có

(18.4.46)¶_k = frac{d}{dx_k}x_ia_{ij}x_j = <(mathbf{A} + mathbf{A}^ op)mathbf{x}>_k.>

Ta thấy phần tử thứ (k) của đạo hàm mong muốn từ(18.4.39) đơn giản là phần tử thứ (k) của vectorbên vế phải, và do đó hai phần tử này là như nhau. Điều này dẫn đến

(18.4.47)¶

Biểu thức trên cần nhiều biến đổi để suy ra được hơn ở phần trước, nhưngkết quả cuối cùng vẫn sẽ gọn gàng. Hơn thế nữa, hãy xem xét tính toándưới đây cho đạo hàm đơn biến thông thường:

Tương tự, (frac{d}{dx}(ax^2) = 2ax = (a+a)x). Một lần nữa, ta lạithu được kết quả nhìn giống với trường hợp đơn biến nhưng với một phépchuyển vị.

Tại thời điểm này, cách tính trên có vẻ khá đáng ngờ, vì vậy ta hãy thửtìm hiểu lý do tại sao. Khi ta lấy đạo hàm ma trận như trên, đầu tiên tagiả sử biểu thức ta nhận được sẽ là một biểu thức ma trận khác: một biểuthức mà ta có thể viết nó dưới dạng tích và tổng của các ma trận vàchuyển vị của chúng. Nếu một biểu thức như vậy tồn tại, nó sẽ phải đúngcho tất cả các ma trận. Do đó, nó sẽ đúng với ma trận(1 imes 1), trong đó tích ma trận chỉ là tích của các số, tổngma trận chỉ là tổng, và phép chuyển vị không có tác dụng gì! Nói cáchkhác, bất kỳ biểu thức nào chúng ta nhận được phải phù hợp với biểuthức đơn biến. Điều này có nghĩa là khi ta biết đạo hàm đơn biến tươngứng, với một chút luyện tập ta có thể đoán được các đạo hàm ma trận!

Cùng kiểm nghiệm điều này. Giả sử (mathbf{X}) là ma trận(n imes m), (mathbf{U}) là ma trận (n imes r) và(mathbf{V}) là ma trận (r imes m). Ta sẽ tính

Phép tính này khá quan trọng trong phân rã ma trận. Tuy nhiên, ở đây nóchỉ đơn giản là một đạo hàm mà ta cần tính. Hãy thử tưởng tượng xem nósẽ như thế nào đối với ma trận (1 imes1). Trong trường hợp này,ta có biểu thức sau

Có thể thấy, đây là một đạo hàm khá phổ thông. Nếu ta thử chuyển đổi nóthành một biểu thức ma trận, ta có

(18.4.51)¶

Tuy nhiên, nếu ta nhìn kỹ, điều này không hoàn toàn đúng. Hãy nhớ lại(mathbf{X}) có kích thước (n imes m), giống(mathbf{U}mathbf{V}), nên ma trận(2(mathbf{X} – mathbf{U}mathbf{V})) có kích thước(n imes m). Mặt khác (mathbf{U}) có kích thước(n imes r), và ta không thể nhân một ma trận (n imes m)với một ma trận (n imes r) vì số chiều của chúng không khớpnhau!

Ta muốn nhận (frac{d}{dmathbf{V}}), cùng kích thước với(mathbf{V}) là (r imes m). Vì vậy ta bằng cách nào đó cầnphải nhân một ma trận (n imes m) với một ma trận(n imes r) (có thể phải chuyển vị) để có ma trận(r imes m). Ta có thể làm điều này bằng cách nhân (U^ op)với ((mathbf{X} – mathbf{U}mathbf{V})). Vì vậy, ta có thể đoánnghiệm cho (18.4.49) là

(18.4.52)¶

Để chứng minh rằng điều này là đúng, ta cần một tính toán chi tiết. Nếubạn tin rằng quy tắc trực quan ở trên là đúng, bạn có thể bỏ qua phầntrình bày này. Để tính toán

(18.4.54)¶

Hãy nhớ lại rằng tất cả các phần tử của (mathbf{X}) và(mathbf{U}) là hằng số khi tính (frac{d}{dv_{ab}}), chúngta có thể đẩy đạo hàm bên trong tổng, và áp dụng quy tắc dây chuyền sauđó bình phương lên để có

(18.4.55)¶

Tương tự phần diễn giải trước, ta có thể để ý rằng(frac{dv_{kj}}{dv_{ab}}) chỉ khác không nếu (k=a) và(j=b). Nếu một trong hai điều kiện đó không thỏa, số hạng trongtổng bằng không, ta có thể tự do loại bỏ nó. Ta thấy rằng

(18.4.56)¶

Một điểm tinh tế quan trọng ở đây là yêu cầu về (k=a) không xảy rabên trong tổng phía trong bởi (k) chỉ là một biến tùy ý để tínhtổng các số hạng trong tổng phía trong. Một ví dụ dễ hiểu hơn:

(18.4.60)¶_{ib}u_{ia}.>

Chúng ta có thể muốn nó trông giống như phần tử (a, b) của một matrận để có thể sử dụng các kỹ thuật trong các ví dụ trước đó nhằm đạtđược một biểu thức ma trận, nghĩa là ta cần phải hoán đổi thứ tự của cácchỉ số trên (u_{ia}). Nếu để ý(u_{ia} = _{ai}), ta có thể viết

(18.4.61)¶_{ai}_{ib}.>
(18.4.62)¶_{ab}.>
(18.4.63)¶

Lời giải này trùng với biểu thức mà ta đoán ở phía trên!

Lúc này cũng dễ hiểu nếu ta tự hỏi “Tại sao không viết tất cả các quytắc giải tích đã từng học thành dạng ma trận? Điều này rõ ràng là côngviệc máy móc. Tại sao ta không đơn giản là làm hết một lần cho xong?” Vàthực sự có những quy tắc như thế, cho ta một bản tóm tắt tuyệt vời. Tuy nhiên, vì số cách kết hợp các phéptoán ma trận nhiều hơn hẳn so với các giá trị một biến, nên có nhiều quytắc đạo hàm ma trận hơn các quy tắc dành cho hàm cho một biến. Thôngthường, tốt nhất là làm việc với các chỉ số, hoặc dùng vi phân tự độngkhi thích hợp.

Xem thêm: hướng dẫn sử dụng excel cho người mới

18.4.8. Tóm tắt¶

Với không gian nhiều chiều, chúng ta có thể định nghĩa gradient cùngmục đích như các đạo hàm một chiều. Điều này cho phép ta thấy cáchmột hàm đa biến thay đổi như thế nào khi có bất kỳ thay đổi nhỏ xảyra ở đầu vào.Thuật toán lan truyền ngược có thể được xem như một phương pháp trongviệc tổ chức quy tắc dây chuyền đa biến cho phép tính toán hiệu quảcác đạo hàm riêng.Giải tích ma trận cho phép chúng ta viết các đạo hàm của biểu thức matrận một cách gọn gàng hơn.

18.4.9. Bài tập¶

Cho một vector cột (oldsymbol{eta}), tính các đạo hàm củacả hai ma trận(f(mathbf{x}) = oldsymbol{eta}^ opmathbf{x}) và ma trận(g(mathbf{x}) = mathbf{x}^ opoldsymbol{eta}). Hãy chobiết tại sao bạn lại ra cùng đáp án?Cho (mathbf{v}) là một vector (n) chiều. Vậy(frac{partial}{partialmathbf{v}}|mathbf{v}|_2)? là gì?Cho (L(x, y) = log(e^x + e^y)). Tính toán gradient. Tổng củacác thành phần của gradient là gì?Cho (f(x, y) = x^2y + xy^2). Chứng minh rằng điểm tới hạn duynhất là ((0,0)). Bằng việc xem xét (f(x, x)), hãy xácđịnh xem ((0,0)) là cực đại, cực tiểu, hay không phải cả hai.Giả sử ta đang tối thiểu hàm(f(mathbf{x}) = g(mathbf{x}) + h(mathbf{x})). Làm cách nàota có thể diễn giải bằng hình học điều kiện (
abla f = 0)thông qua (g) và (h)?

18.4.11. Những người thực hiện¶

Bản dịch trong trang này được thực hiện bởi:

Đoàn Võ Duy ThanhLê Khắc Hồng PhúcPhạm Hồng VinhNguyễn Lê Quang NhậtNguyễn Văn QuangNguyễn Thanh HòaNguyễn Văn CườngTrần Yến ThyNguyễn Mai Hoàng Long

Xem thêm bài viết thuộc chuyên mục: Cách tính