Cách Tính Ma Trận Hess

Cách Tính Ma Trận Hess

Bây giờ tất cả chúng ta đã có hiểu biết vững chãi về đạo hàm của một hàm đơnbiến, hãy cùng trở lại câu hỏi bắt đầ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

Bạn đang đọc: Cách Tính Ma Trận Hess

( 18.4.1 ) ¶ Chúng ta sẽ gọi đạo hàm của một biến trong khi không đổi khác 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ờ, liên tục biến hóa ( w_2 ) một khoảng chừ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 ) và 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 ) \ và approx L ( w_1, w_2, ldots, w_N ) \ và quad + epsilon_2frac { partial } { partial w_2 } L ( w_1, w_2, ldots, w_N ) \ và quad + epsilon_1 frac { partial } { partial w_1 } L ( w_1, w_2, ldots, w_N ) \ và quad + epsilon_1epsilon_2frac { partial } { partial w_2 } frac { partial } { partial w_1 } L ( w_1, w_2, ldots, w_N ) \ và approx L ( w_1, w_2, ldots, w_N ) \ và quad + epsilon_2frac { partial } { partial w_2 } L ( w_1, w_2, ldots, w_N ) \ và 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 sáng tạo đã thấy ở ( 18.4.1 ) rằng ( epsilon_1epsilon_2 ) là một số hạng bậc cao và hoàn toàn có thể đượcloại bỏ tựa như như cách mà ta hoàn toàn có thể vô hiệu ( epsilon ^ { 2 } ) trong mục trước. Cứ liên tục theo cách này, ta có ( 18.4.3 ) ¶ Thoạt nhìn đây có vẻ như là một mớ hỗn độn, tuy nhiên quan tâm rằng phép tổngbên phải chính là màn biểu diễn của phép tích vô hướng và ta hoàn toàn 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)¶oldsymbol{epsilon}) approx L(mathbf{w}) + oldsymbol{epsilon}cdot abla_{mathbf{w}} L(mathbf{w}).>

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 giống 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 hóa về dạng vector và tích vô hướng. Điều này chochúng ta biết một cách xê dịch hàm ( L ) sẽ biến hóa 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 tất cả 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 thứ nhất, hãy cùng kiểm tra phép xê dịch này với một ví dụ. Giảsử ta đang thao tác với hàm

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

Vì thế, nếu muốn tính xê dịch ( f ) tại ( ( epsilon_1, log ( 2 ) + epsilon_2 ) ), ta có một ví dụ đơn cử 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)¶oldsymbol{epsilon}) approx L(mathbf{w}) + oldsymbol{epsilon}cdot abla_{mathbf{w}} L(mathbf{w}).>

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 và khám phá cách hoạt động giải trí về mặt hình học của thuậttoán hạ gradient được miêu 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à tất cả chúng ta không biết đúng chuẩn 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 hoàn toàn 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à phối 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 hoàn toàn có thể và update cáctham số để di dời 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 chuyên sâu vào những kỹ thuật tối ưu hóa sốhọc vì một nguyên do thực tiễn là : mọi hàm ta gặp phải trong học sâu quáphức tạp để hoàn toàn có thể tối ưu hóa một cách tường minh . Tuy nhiên, sẽ rất hữu dụng nếu hiểu được những kỹ năng và 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 hoàn toàn có thể kiểm chứng rằng đáp án của họ là hài hòa và hợp lý ? Xét lại ( 18.4.5 ) : ( 18.4.11 ) ¶ oldsymbol { epsilon } ) approx L ( mathbf { x } _0 ) + oldsymbol { epsilon } cdot abla_ { mathbf { x } } L ( mathbf { x } _0 ). >

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 dụng, do tại 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ụ đơn cử, 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 hoàn toàn 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 vấn đề một thực tiễn quan trọng cần biết kể cả khi làm việcdưới dạng triết lý 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 lớn ) sẽ có đạo hàm tại đó bằng không, tuy nhiên, không phải tổng thể 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 .
Mọi Người Cũng Xem   Thuế sử dụng đất là gì? Cách tính tiền thuế sử dụng nhà đất hàng năm?

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 phối hợp các hàm con : ( 18.4.14 ) ¶ egin { split } egin { aligned } f ( u, v ) và = ( u + v ) ^ { 2 } \ u ( a, b ) và = ( a + b ) ^ { 2 }, qquad v ( a, b ) = ( a-b ) ^ { 2 }, \ a ( w, x, y, z ) và = ( 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 Open liên tục khi ta làm việcvới các mạng nơ-ron, do đó cố gắng nỗ lực 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 màn 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 trình diễn giá trị và mũi têncho biết sự phụ thuộc vào hàm. ¶ ( 18.4.15 ) ¶ Tiếp theo ta hoàn toàn 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 gọn bị ngợp trong các số hạng, màđa phần là bị lặp lại ! Thật vậy, ta hoàn toàn có thể thấy ở ví dụ dưới đây : ( 18.4.16 ) ¶ egin { split } egin { aligned } frac { partial f } { partial w } và = 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. \ và 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 \ và 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ự như 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 việc làm bị tiêu tốn lãng phí, và nếu ta tính cácđạo hàm theo cách này, hàng loạt cuộc cách mạng học sâu sẽ chấm hết trướckhi nó mở màn ! Ta hãy chia nhỏ yếu tố này. Ta sẽ khởi đầu bằng cách thử hiểu ( f ) biến hóa thế nào khi ( a ) biến hóa, giả định thiết yếu là tổng thể ( w, x, y ), và ( z ) không sống sót. Ta sẽ lập luận giống nhưlần tiên phong ta thao tá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 } và f ( u ( a + epsilon, b ), v ( a + epsilon, b ) ) \ approx và fleft ( u ( a, b ) + epsilonfrac { partial u } { partial a } ( a, b ), v ( a, b ) + epsilonfrac { partial v } { partial a } ( a, b ) ight ) \ approx và f ( u ( a, b ), v ( a, b ) ) + epsilonleft.end { aligned } end { split } > Dòng tiên phong 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 vất vả để 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 ) ) ), do đó 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 liên kết ở bên trái như trong Fig. 18.4.2 . Xem thêm : đồ án phong cách thiết kế băng tải cao su đặc * Fig. 18.4.2 Một ví dụ khác về quy tắc dây chuyền sản xuất. ¶ Để giám sát ( frac { partial f } { partial y } ), tất cả chúng ta cần tínhtổng hàng loạt đườ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 sản xuất theo cách này giúp tất cả chúng ta thấy được dòng chảycủa gradient xuyên suốt mạng và vì sao một số ít 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 ) hoàn toàn có thể định hình quy 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 ) và = ( u + v ) ^ { 2 } \ u ( a, b ) và = ( a + b ) ^ { 2 }, qquad v ( a, b ) = ( a-b ) ^ { 2 }, \ a ( w, x, y, z ) và = ( 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 } ) ví dụ điển hình, ta có thểáp dụng quy tắc dây chuyền sản xuất đa biến để thấy : ( 18.4.21 ) ¶ egin { split } egin { aligned } frac { partial f } { partial w } và = 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 } và = 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 } và = 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ì tất cả 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 ), và quadfrac { partial f } { partial v } = 2 ( u + v ), \ frac { partial u } { partial a } = 2 ( a + b ), và quadfrac { partial u } { partial b } = 2 ( a + b ), \ frac { partial v } { partial a } = 2 ( a-b ), và quadfrac { partial v } { partial b } = – 2 ( a-b ), \ frac { partial a } { partial w } = 2 ( w + x + y + z ), và 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, tất cả chúng ta hoàn toàn có thể viết như sau : ( 18.4.23 ) ¶ egin { split } egin { aligned } frac { partial f } { partial w } và = 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 } và = 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 } và = 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 vận dụng quy tắc dây chuyền sản xuất này buộc tất 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 hoàn toàn có thể thêm vào các phương trình : ( 18.4.24 ) ¶ egin { split } egin { aligned } frac { partial f } { partial x } và = 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 } và = 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 } và = 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:

Mọi Người Cũng Xem   Điều trị viêm xoang mãn tính
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 triển khai ở trên, hai việc này có thểđược tích 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 đúng chuẩn 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 mê hoặc vì tất cả 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 để giao động tốt hơn một hàm so với việc chỉ sử dụng gradient . Một yếu tố trước mắt khi thao tác với đạo hàm bậc cao hơn của hàm đabiến đó là cần phải đo lường và thống kê một số lượng lớn đạo hàm. Nếu tất cả chúng ta cómột hàm ( f ( x_1, ldots, x_n ) ) với ( n ) biến, tất cả chúng ta có thểcần ( n ^ { 2 } ) đạo hàm bậc 2, ví dụ điển hình để lựa chọn ( i ) và ( j ) : ( 18.4.26 ) ¶ egin { split } mathbf { H } _f = egin { bmatrix } frac { d ^ 2 f } { dx_1dx_1 } và cdots và frac { d ^ 2 f } { dx_1dx_n } \ vdots và ddots và vdots \ frac { d ^ 2 f } { dx_ndx_1 } và cdots và frac { d ^ 2 f } { 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 tỏ 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ó sống sót và liêntục, thì hàm số luôn sống sót 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 biến hóa hàm lần lượt theo ( x_i ) rồi ( x_j ), và ngược lại biến hóa ( x_j ) rồi ( x_i ), và so sánh hai tác dụng 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, tất cả chúng ta hoàn toàn 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ể, tất cả chúng ta cóthể sử dụng nó để tìm hàm bậc hai tương thích nhất lân cận ( mathbf { x } _0 ) tương tự như như trong giải tích đơn biến . Hãy tìm hiểu thêm 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 tất cả 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 giải trí cho bất kể nguồn vào thứ nguyên nào và phân phối 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-2 x ^ 2 \ – 2 xyend { pmatrix } ; ext { and } ; mathbf { H } f ( x, y ) = e ^ { – x ^ 2 – y ^ 2 } egin { pmatrix } 4 x ^ 3 – 6 x và 4 x ^ 2 y – 2 y \ 4 x ^ 2 y – 2 y và 4 xy ^ 2-2 xend { 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 = ‘ 3 d ‘ ) 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 đàm đạo ởSection 11.7, trong đó tất cả chúng ta lặp đi lặp lại việc tối ưu hoá đểtìm ra hàm bậc hai tương thích 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ó tương quan đến ma trận hoá ra rất đẹp. Phần này sẽnặng về mặt ký hiệu, vì thế fan hâm mộ hoàn toàn có thể bỏ lỡ trong lần đọc đầutiên. Tuy nhiên sẽ rất có í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 ngăn nắp hơn nhiều so với suy nghĩban đầu của tất cả chúng ta, đặc biệt quan trọng 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ử tất cả chúng ta có một vài vector cột cố định và thắt chặt ( oldsymbol { eta } ), và tất cả 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 đổi khác khi tất cả chúng ta biến hóa ( 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 dụng khi thao tác với ma trận đạo hàm trong họcmáy, trong đó tất cả chúng ta tập hợp các đạo hàm riêng theo mẫu số của viphân, trình diễn thành các dạng vector, ma trận hoặc tensor. Trong trườnghợp này, tất cả 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 tất cả chúng ta thành các thành tố Nếu giờ đây ta tính đạo hàm riêng theo ( eta_1 ) ví dụ điển hình, để ýrằng tổng thể các thành phần bằng không ngoại trừ số hạng tiên phong 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 giám sát sẽ trở nên khá phức tạp. Thứ hai, hiệu quả ở đầu cuối sẽ ngăn nắp hơn quy trình thống kê giám sát 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 quan tâm 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ị hoàn toàn có thể Open mà thoạt nhìn không biết chínhxác từ đâu ra. Lý do đa phần 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 size bắt đầ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, cho nê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ự như cũng áp dụngcho số hạng thứ hai khi ta cần ( j = k ). Từ đó, ta có
Mọi Người Cũng Xem   Cách cover bài hát trên YouTube
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 giám sát tại thờiđiểm này, vì vậy ta hoàn toàn có thể gán lại chỉ số sao cho cả hai đều chứa ( i ) Bây giờ, ta cần rèn luyện một chút ít để hoàn toàn có thể đi sâu hơn. Ta hãy thử xácđịnh tác dụng 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 = _k. > Ta thấy thành phần thứ ( k ) của đạo hàm mong ước từ ( 18.4.39 ) đơn thuần là thành phần thứ ( k ) của vectorbên vế phải, và do đó hai thành phần 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 hóa để suy ra được hơn ở phần trước, nhưngkết quả ở đầu cuối vẫn sẽ ngăn nắp. 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ì : Tương tự, ( frac { d } { dx } ( ax ^ 2 ) = 2 ax = ( a + a ) x ). Một lần nữa, ta lạithu được tác dụng 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 gian này, cách tính trên có vẻ như khá đáng ngờ, vì thế ta hãy thửtìm hiểu nguyên do tại sao. Khi ta lấy đạo hàm ma trận như trên, tiên phong 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 hoàn toàn 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 sống sót, nó sẽ phải đúngcho toàn bộ 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ính năng gì ! Nói cáchkhác, bất kể biểu thức nào tất cả chúng ta nhận được phải tương thích 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 ít rèn luyện ta hoàn toàn 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 thuầ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 so 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á đại trà phổ thông. Nếu ta thử quy đổ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 trọn vẹn đúng. Hãy nhớ lại ( mathbf { X } ) có size ( n imes m ), giống ( mathbf { U } mathbf { V } ), nên ma trận ( 2 ( mathbf { X } – mathbf { U } mathbf { V } ) ) có kích cỡ ( n imes m ). Mặt khác ( mathbf { U } ) có kích 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 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 ) ( hoàn toàn có thể phải chuyển vị ) để có ma trận ( r imes m ). Ta hoàn toàn 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 hoàn toàn có thể đoánnghiệm cho ( 18.4.49 ) là ( 18.4.52 ) ¶ Để chứng tỏ rằng điều này là đúng, ta cần một đo lường và thống kê cụ thể. Nếubạn tin rằng quy tắc trực quan ở trên là đúng, bạn hoàn toàn có thể bỏ lỡ phầntrình bày này. Để giám sát ( 18.4.54 ) ¶ Hãy nhớ lại rằng tổng thể các thành phần của ( mathbf { X } ) và ( mathbf { U } ) là hằng số khi tính ( frac { d } { dv_ { ab } } ), chúngta hoàn toàn có thể đẩy đạo hàm bên trong tổng, và vận dụng quy tắc dây chuyền sản xuất sauđó bình phương lên để có ( 18.4.55 ) ¶ Tương tự phần diễn giải trước, ta hoàn toàn có thể chú ý 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 kèm theo đó không thỏa, số hạng trongtổng bằng không, ta hoàn toàn có thể tự do vô hiệu nó. Ta thấy rằng ( 18.4.56 ) ¶ Một điểm tinh xảo quan trọng ở đây là nhu yế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 hoàn toàn có thể muốn nó trông giống như thành phần ( a, b ) của một matrận để hoàn toàn có thể sử dụng các kỹ thuật trong các ví dụ trước đó nhằm mục đích đạ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 chú ý ( u_ { ia } = _ { ai } ), ta hoàn toàn 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ổng thể 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 thuần là làm hết một lần cho xong ? ” Vàthực sự có những quy tắc như vậy, cho ta một bản tóm tắt tuyệt vời. Tuy nhiên, vì số cách tích 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à thao tá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 khoảng trống nhiều chiều, tất cả chúng ta hoàn toàn có thể định nghĩa gradient cùngmục đích như các đạo hàm một chiều. Điều này được cho phép ta thấy cáchmột hàm đa biến biến hóa như thế nào khi có bất kể đổi khác nhỏ xảyra ở đầu vào. Thuật toán Viral ngược hoàn toàn có thể được xem như một chiêu thức trongviệc tổ chức triển khai quy tắc dây chuyền sản xuất đa biến cho phép thống kê giám sát hiệu quảcác đạo hàm riêng. Giải tích ma trận được cho phép tất cả chúng ta viết các đạo hàm của biểu thức matrận một cách ngăn nắp 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 thi 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

Điều hướng bài viết

Related Posts

About The Author

Add Comment