Tính toán Cập nhật Gradient diễn viên trong thuật toán Gradient chính sách xác định sâu (DDPG)


8

Câu hỏi này liên quan đến bài viết Deepmind trên DDPG: https://arxiv.org/pdf/1509.02971v5.pdf .

Hầu hết (tất cả?) Việc triển khai thuật toán DDPG mà tôi đã thấy tính toán cập nhật độ dốc cho mạng diễn viên theo , trong đó đại diện cho các tham số của mạng diễn viên, đại diện cho mạng diễn viên, đại diện cho mạng phê bình và đại diện cho trạng thái đầu vào. Tôi sẽ gọi phương trình này 1.(J)=μ(s|θ)(Q(s,μ(s|θ))θ(μ(s|θ))θμQs

Phương trình 1, như được hiển thị trong bài báo, được bắt nguồn bằng cách áp dụng quy tắc chuỗi cho . Điều này mang lại cho .(J)=θ(Q(s,μ(s|θ))μ(s|θ)(Q(s,μ(s|θ))θ(μ(s|θ))

Câu hỏi của tôi là, bằng cách sử dụng gói phần mềm tự động phân cấp (Theano / Tensorflow / Torch / vv), có lý do nào khiến tôi không thể tính trực tiếp độ dốc của đầu ra của wrt không? Vì một số lý do, tất cả các lần triển khai dường như trước tiên sẽ tính toán độ dốc của đầu ra của wrt và sau đó nhân nó với độ dốc của wrt thành , theo quy tắc chuỗi. Tôi không hiểu tại sao họ làm điều này - tại sao không chỉ tính trực tiếp độ dốc của wrt ? Có một lý do bạn không thể làm điều này? Tức là, tại sao hầu hết các bản cập nhật dường như làm điều này:QθQμ(s)μ(s)θQθ

Q_grad = gradients( Q(s, mu(s|theta)), mu(s|theta) )
mu_grad = gradients( mu(s|theta), theta )
J_grad = Q_grad * mu_grad

Thay vì điều này:

J_grad = gradients( Q(s, mu(s|theta)), theta )

Trong đó đầu vào đầu tiên cho "độ dốc" là chức năng bạn muốn phân biệt và đầu vào thứ hai là những gì bạn đang phân biệt đối với.

Để rõ ràng, tôi không thấy lý do tại sao là một bản cập nhật khác với phương trình 1, xem phương trình 1 có nguồn gốc theo nghĩa đen bằng cách áp dụng quy tắc chuỗi cho , nhưng tôi muốn chắc chắn rằng tôi không thiếu một loại tinh tế nào.(J)=θ(Q)θ(Q)


Bạn có thể cụ thể hơn về độ dốc bạn đề xuất? Tôi không chắc ý của bạn là gì khi "sử dụng phương trình trước khi áp dụng quy tắc chuỗi làm cập nhật"
DaVinci

@DaVinci xin lỗi vì sự mơ hồ! Tôi đã cập nhật bài viết gốc để (hy vọng) được rõ ràng hơn.
Bill

Câu trả lời:


6

Không có sự khác biệt trong tính toán. Tôi đã tự hỏi điều tương tự và đã xác minh trong việc triển khai DDPG của riêng mình bằng cách thử cả hai và khẳng định rằng các giá trị số là giống hệt nhau. Như mong đợi, họ là.

Tôi nhận thấy rằng hầu hết các triển khai giống như hướng dẫn (ví dụ: Patrick Emami ) hiển thị rõ ràng phép nhân. Tuy nhiên, thực hiện đường cơ sở OpenAI của trực tiếp tính toán . (Họ làm điều này bằng cách xác định tổn thất trên mạng diễn viên bằng , tính trung bình trên toàn bộ lô).doesθμQθμQ

Có một lý do mà bạn muốn tách khỏi và nhân chúng. Đây là nếu bạn muốn trực tiếp thao tác một trong các điều khoản. Ví dụ: Hausknecht và Stone thực hiện "đảo ngược độ dốc" trên để ép buộc các hành động ở trong phạm vi của môi trường.aQθμμaQ


2

Bằng cách này bạn có thể xác định hai mạng độc lập. Mặt khác, bạn có thể phải xác định một mạng lớn và phân biệt phần nào thuộc về chính sách và phần nào thuộc hàm giá trị hành động.


0

Tôi không chắc chắn để hiểu phép nhân này giữa hai thuật ngữ gradient ..

Khi bạn tính toán điều này bằng cách sử dụng tenorflow:

J_grad = gradients( Q(s, mu(s|theta)), theta )

Nó áp dụng quy tắc chuỗi và do đó tính toán các tiện ích của Qwrt đầu ra của mạng chính sách mu(s|theta)và sau đó sao lưu các "lỗi" đó qua mạng chính sách để lấy độ dốc được lấy mẫu theta(thông số của mọi lớp trong mạng chính sách của bạn).

Tuy nhiên, khi bạn làm:

Q_grad = gradients( Q(s, mu(s|theta)), mu(s|theta) )
mu_grad = gradients( mu(s|theta), theta )
J_grad = Q_grad * mu_grad

Theo cách hiểu của tôi, nó (1) tính toán độ dốc của Qwrt thông số của mạng chính sách mu(s|theta)và (2) độ dốc của đầu ra của mạng mu(s|theta)chính sách ghi các tham số chính sách theta, nhưng lần này là SEPARATELY. Điều tôi không hiểu là bây giờ, bạn có một mặt gradient đầu tiên của bạn là một vectơ kích thước (1, action_dim)và mặt khác, bạn có gradient thứ hai là một vectơ kích thước (1, theta_dim). Để áp dụng bản cập nhật của bạn, bạn cần một gradient wrt cho theta, đó sẽ là một vectơ kích thước (1, theta_dim). Vì vậy, những gì chính xác là này nhân làm trong dòng thứ ba, và làm thế nào là nó tương đương với backpropagating gradient đầu tiên thông qua mạng lưới chính sách:

J_grad = Q_grad * mu_grad

Câu hỏi:

Có phải nó chỉ thực hiện một sản phẩm bên ngoài tạo ra một ma trận hình dạng (action_dim, theta_dim)và sau đó giảm bằng cách tính tổng kích thước để có được vectơ cập nhật của chúng ta về hình dạng (1, theta)? Nếu vậy, tại sao điều này hợp lệ (tương đương với việc sao lưu lại gradient đầu tiên thông qua mạng chính sách)?

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.