Đạo hàm là một trong những khái niệm cơ bản nhất trong giải tích. Chúng mô tả những thay đổi trong biến đầu vào ảnh hưởng như thế nào đến đầu ra của chức năng. Mục tiêu của bài viết này là cung cấp phần giới thiệu cấp cao về tính toán đạo hàm trong PyTorch cho những người mới sử dụng khuôn khổ này. PyTorch cung cấp một cách thuận tiện để tính đạo hàm cho các hàm do người dùng định nghĩa
Trong khi chúng ta luôn phải xử lý backpropagation [một thuật toán được biết đến là xương sống của mạng nơ-ron] trong mạng nơ-ron, giúp tối ưu hóa các tham số để giảm thiểu lỗi nhằm đạt được độ chính xác phân loại cao hơn;
Sau khi xem qua hướng dẫn này, bạn sẽ học được
- Cách tính đạo hàm trong PyTorch
- Cách sử dụng autograd trong PyTorch để thực hiện phân biệt tự động trên tensor
- Giới thiệu về biểu đồ tính toán bao gồm các nút và lá khác nhau, cho phép bạn tính toán độ dốc theo cách đơn giản nhất có thể [sử dụng quy tắc chuỗi]
- Cách tính đạo hàm riêng trong PyTorch
- Cách thực hiện đạo hàm của hàm đối với nhiều giá trị
Bắt đầu nào
Tính toán đạo hàm trong PyTorch
Ảnh của Jossuha Théophile. Một số quyền được bảo lưu.
Sự khác biệt trong Autograd
Autograd – mô-đun phân biệt tự động trong PyTorch – được sử dụng để tính toán đạo hàm và tối ưu hóa các tham số trong mạng thần kinh. Nó chủ yếu dành cho tính toán gradient
Trước khi bắt đầu, hãy tải lên một số thư viện cần thiết mà chúng ta sẽ sử dụng trong hướng dẫn này
1
2
nhập matplotlib. pyplot as plt
nhập đuốc
Bây giờ, hãy sử dụng một tensor đơn giản và đặt tham số requires_grad
thành true. Điều này cho phép chúng tôi thực hiện phân biệt tự động và cho phép PyTorch đánh giá các công cụ phái sinh bằng cách sử dụng giá trị đã cho, trong trường hợp này là 3. 0
1
2
x = ngọn đuốc. tensor[3. 0, requires_grad = True]
print["tạo một tensor x. ", x]
1
tạo ra một tensor x. tenxơ[3. , yêu cầu_grad=True]
Chúng ta sẽ sử dụng một phương trình đơn giản $y=3x^2$ làm ví dụ và lấy đạo hàm đối với biến x
. Vì vậy, hãy tạo một tenxơ khác theo phương trình đã cho. Ngoài ra, chúng tôi sẽ áp dụng một phương pháp gọn gàng .backward
trên biến y
tạo thành biểu đồ tuần hoàn lưu trữ lịch sử tính toán và đánh giá kết quả bằng .grad
cho giá trị đã cho
1
2
3
4
y = 3 * x ** 2
in["Kết quả của phương trình là. ", y]
y. lùi lại[]
in["Đạo hàm của phương trình tại x = 3 là. ", x. grad]
1
2
Result of the equation is: tensor[27., grad_fn=]
Đạo hàm của phương trình tại x = 3 là. tenxơ[18. ]
Như bạn có thể thấy, chúng tôi đã nhận được giá trị là 18, giá trị này đúng
đồ thị tính toán
PyTorch tạo ra các dẫn xuất bằng cách xây dựng một biểu đồ ngược đằng sau hậu trường, trong khi các hàm tensor và ngược là các nút của biểu đồ. Trong biểu đồ, PyTorch tính toán đạo hàm của một tenxơ tùy thuộc vào việc nó có phải là lá hay không
PyTorch sẽ không đánh giá đạo hàm của tensor nếu thuộc tính leaf của nó được đặt thành True. Chúng tôi sẽ không đi sâu vào chi tiết về cách tạo và sử dụng biểu đồ ngược, bởi vì mục tiêu ở đây là cung cấp cho bạn kiến thức cấp cao về cách PyTorch sử dụng biểu đồ để tính đạo hàm
Vì vậy, hãy kiểm tra xem các tenxơ x
và y
trông như thế nào bên trong sau khi chúng được tạo ra. Cho 1
1
2
3
4
5
in['thuộc tính dữ liệu của tensor. ',x. dữ liệu]
in['grad thuộc tính của tenxơ. ',x. grad]
print[thuộc tính 'grad_fn của tensor. ',x. grad_fn]
in["thuộc tính is_leaf của tensor. ",x. is_leaf]
print["requires_grad thuộc tính của tensor. ",x. requires_grad]
1
2
3
4
5
thuộc tính dữ liệu của tensor. tenxơ[3. ]
thuộc tính grad của tensor. tenxơ[18. ]
thuộc tính grad_fn của tensor. Không có
thuộc tính is_leaf của tensor. Thật
thuộc tính require_grad của tensor. Thật
và cho y
1
2
3
4
5
in['thuộc tính dữ liệu của tensor. ',y. dữ liệu]
in['grad thuộc tính của tenxơ. ',y. grad]
print[thuộc tính 'grad_fn của tensor. ',y. grad_fn]
in["thuộc tính is_leaf của tensor. ",y. is_leaf]
print["requires_grad thuộc tính của tensor. ",y. requires_grad]
1
2
3
4
5
print['thuộc tính dữ liệu của tensor. ',y. dữ liệu]
print['thuộc tính grad của tensor. ',y. tốt nghiệp]
print['grad_fn thuộc tính của tensor. ',y. grad_fn]
print["thuộc tính is_leaf của tensor. ",y. is_leaf]
print["thuộc tính request_grad của tensor. ",y. yêu cầu_grad]
Như bạn có thể thấy, mỗi tensor đã được gán với một bộ thuộc tính cụ thể
Thuộc tính data
lưu trữ dữ liệu của tenxơ trong khi thuộc tính x
0 cho biết về nút trong biểu đồ. Tương tự như vậy, thuộc tính .grad
giữ kết quả của đạo hàm. Bây giờ bạn đã học được một số kiến thức cơ bản về autograd và đồ thị tính toán trong PyTorch, hãy lấy một phương trình phức tạp hơn một chút $y=6x^2+2x+4$ và tính đạo hàm. Đạo hàm của phương trình được cho bởi
$$\frac{dy}{dx} = 12x+2$$
Đánh giá đạo hàm tại $x = 3$,
$$\left. \frac{dy}{dx}\right\vert_{x=3} = 12\times 3+2 = 38$$
Bây giờ, hãy xem PyTorch làm điều đó như thế nào,
1
2
3
4
5
x = ngọn đuốc. tensor[3. 0, requires_grad = True]
y = 6 * x ** 2 + 2 * x + 4
in["Kết quả của phương trình là. ", y]
y. lùi lại[]
in["Đạo hàm của phương trình tại x = 3 là. ", x. grad]
1
2
Result of the equation is: tensor[64., grad_fn=]
Đạo hàm của phương trình tại x = 3 là. tenxơ[38. ]
Đạo hàm của phương trình là 38, đúng
Triển khai đạo hàm riêng của hàm
PyTorch cũng cho phép chúng ta tính đạo hàm riêng của các hàm. Ví dụ: nếu chúng ta phải áp dụng đạo hàm riêng cho hàm sau,
$$f[u,v] = u^3+v^2+4uv$$
Đạo hàm của nó đối với $u$ là,
$$\frac{\partial f}{\partial u} = 3u^2 + 4v$$
Tương tự, đạo hàm đối với $v$ sẽ là,
$$\frac{\partial f}{\partial v} = 2v + 4u$$
Bây giờ, hãy thực hiện theo cách của PyTorch, trong đó $u = 3$ và $v = 4$
Chúng ta sẽ tạo các tenxơ x
2, x
3 và x
4 và áp dụng thuộc tính .backward
trên x
4 để tính đạo hàm. Cuối cùng, chúng tôi sẽ đánh giá đạo hàm bằng cách sử dụng .grad
đối với các giá trị của x
2 và x
3
1
2
3
4
5
6
7
8
9
10
11
12
u = ngọn đuốc. tensor[3. , requires_grad=True]
v = ngọn đuốc. tensor[4. , requires_grad=True]
f = u**3 + v**2 + 4*u*v
in[u]
in[v]
in[f]
f. lùi lại[]
in["Đạo hàm riêng theo u. ", u. grad]
in["Đạo hàm riêng theo v. ", v. grad]
1
2
3
4
5
tenxơ[3. , yêu cầu_grad=True]
tenxơ[4. , yêu cầu_grad=True]
tensor[91., grad_fn=]
đạo hàm riêng theo u. tenxơ[43. ]
đạo hàm riêng theo v. tenxơ[20. ]
Đạo hàm của các hàm có nhiều giá trị
Điều gì sẽ xảy ra nếu chúng ta có một hàm có nhiều giá trị và chúng ta cần tính đạo hàm đối với nhiều giá trị của nó? . Đây là cách chúng ta có thể thấy 'hàm so với. đồ thị phái sinh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# tính đạo hàm của hàm nhiều giá trị
x = ngọn đuốc. linspace[-20, 20, 20, requires_grad = True]
Y = x ** 2
y = ngọn đuốc. tổng[Y]
y. lùi lại[]
# vẽ đồ thị hàm số và đạo hàm
function_line, = plt. âm mưu[x. tách[]. numpy[], Y . .tách[]. numpy[], nhãn = 'Function']
function_line. set_color["đỏ"]
derivative_line, = plt. âm mưu[x. tách[]. numpy[], x . .grad. tách[]. numpy[], nhãn = 'Derivative']
derivative_line. set_color["green"]
plt. xlabel['x']
plt. chú thích[]
plt. hiển thị[]
Trong hai hàm .backward
0 ở trên, chúng tôi trích xuất các giá trị từ các tenxơ PyTorch để chúng tôi có thể hình dung chúng. Phương pháp .backward
1 không cho phép biểu đồ theo dõi thêm các hoạt động. Điều này giúp chúng ta dễ dàng chuyển đổi một tensor thành một mảng có nhiều mảng