Làm thế nào để Tensorflow `tf.train.Optimizer` tính toán độ dốc?


10

Tôi đang theo hướng dẫn của mnist Tensorflow ( https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_softmax.py ).

Hướng dẫn sử dụng tf.train.Optimizer.minimize(cụ thể tf.train.GradientDescentOptimizer). Tôi không thấy bất kỳ đối số nào được thông qua ở bất cứ đâu để xác định độ dốc.

Là dòng chảy sử dụng phân biệt số theo mặc định?

Có cách nào để vượt qua độ dốc như bạn có thể với scipy.optimize.minimize?

Câu trả lời:


16

Đó không phải là sự khác biệt về số, đó là sự khác biệt tự động . Đây là một trong những lý do chính cho sự tồn tại của tenorflow: bằng cách chỉ định các hoạt động trong biểu đồ tenorflow (với các hoạt động trên Tensors và vv), nó có thể tự động tuân theo quy tắc chuỗi thông qua biểu đồ và vì nó biết các dẫn xuất của từng hoạt động riêng lẻ mà bạn biết chỉ định, nó có thể kết hợp chúng tự động.

Nếu vì một lý do nào đó mà bạn muốn ghi đè lên từng phần, thì có thể với gradient_override_map.


Không phải là phân biệt tự động bằng cách sử dụng phân biệt số?
Aerin

@BYOR Không; kiểm tra liên kết Wikipedia ở trên. Tuy nhiên, những gì tenorflow thực sự nằm ở đâu đó giữa chế độ tự động đảo ngược "thực" và phân biệt biểu tượng.
Dougal

@Dougal im sử dụng chế độ háo hức không có đồ thị, không có trang trí tf.feft, làm thế nào để phân biệt tự động biết mối quan hệ giữa các tenxơ?
datdinhquoc

1
@datdinhquoc Đó là thuật toán cơ bản tương tự, chỉ phức tạp hơn một chút khi thực hiện.
Dougal

9

Nó sử dụng sự khác biệt tự động. Trong đó nó sử dụng quy tắc chuỗi và đi ngược lại trong biểu đồ gán độ dốc.

Giả sử chúng ta có một tenx C này tenx C này đã được thực hiện sau một loạt các thao tác Hãy nói bằng cách thêm, nhân, trải qua một số phi tuyến, v.v.

Vì vậy, nếu C này phụ thuộc vào một số bộ tenxơ gọi là Xk, chúng ta cần lấy độ dốc

Tensorflow luôn theo dõi đường dẫn của hoạt động. Ý tôi là hành vi tuần tự của các nút và cách dữ liệu chảy giữa chúng. Điều đó được thực hiện bởi biểu đồ nhập mô tả hình ảnh ở đây

Nếu chúng ta cần lấy các đạo hàm của chi phí đầu vào X, thì điều đầu tiên sẽ làm là tải đường dẫn từ đầu vào x đến chi phí bằng cách mở rộng biểu đồ.

Sau đó, nó bắt đầu theo thứ tự sông. Sau đó phân phối gradient với quy tắc chuỗi. (Giống như backpropagation)

Bất kỳ cách nào nếu bạn đọc mã nguồn thuộc về tf.gradrons (), bạn có thể thấy rằng tenorflow đã thực hiện phần phân phối gradient này một cách tốt đẹp.

Trong khi quay lại tf tương tác với đồ thị, trong backword pass TF sẽ gặp các nút khác nhau Bên trong các nút này có các hoạt động mà chúng ta gọi là (ops) matmal, softmax, relu, batch_n normalization, v.v. Vì vậy, những gì chúng ta làm là tự động tải các op này vào đồ thị

Nút mới này tạo ra đạo hàm riêng của các hoạt động. get_gradient ()

Hãy nói một chút về các nút mới được thêm vào này

Bên trong các nút này, chúng tôi thêm 2 điều 1. Đạo hàm chúng tôi đã tính ealier) 2. Ngoài ra, các đầu vào cho opp mã hóa trong chuyển tiếp chuyển tiếp

Vì vậy, theo quy tắc chuỗi chúng ta có thể tính toán

Vì vậy, nó giống như một API backword

Vì vậy, tenorflow luôn nghĩ về thứ tự của biểu đồ để thực hiện phân biệt tự động

Vì vậy, như chúng ta biết, chúng ta cần các biến chuyển tiếp để tính toán độ dốc, sau đó chúng ta cần lưu trữ các giá trị xen kẽ trong các thang đo, điều này có thể làm giảm bộ nhớ Đối với nhiều thao tác, tf biết cách tính độ dốc và phân phối chúng.


1
Tôi đang sử dụng chế độ háo hức không có đồ thị, không có trang trí tf.feft, làm thế nào để phân biệt tự động biết mối quan hệ giữa các tenxơ?
datdinhquoc
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.