Tôi đã triển khai khá nhiều loại bộ giải phi tuyến tính trên GPU, bao gồm LBFGS, Barzilai Borwein và độ dốc liên hợp phi tuyến tính.
Đối với điều này, gradient liên hợp phi tuyến tính của Dai & Yuan là hiệu quả nhất. Nói chung, phiên bản khác của gradient liên hợp phi tuyến có thể hiệu quả hơn (như CG-DESCENT), nhưng cũng có thể khó thực hiện hơn.
LBFGS nói chung là một lựa chọn rất chắc chắn, và trừ khi bạn thực sự bị trói buộc vào bộ nhớ, đó có lẽ là nơi tốt nhất để bắt đầu.
Cả gradient liên hợp và BFGS đều yêu cầu tìm kiếm dòng, đó là nơi fp32 trở thành một vấn đề. Thay vì sử dụng các điều kiện Wolfe tiêu chuẩn cho tìm kiếm dòng, tôi sẽ đề nghị sử dụng điều kiện Wolfe gần đúng được đề xuất ở đây . Bài viết có một chút liên quan, nhưng điều quan trọng là phương trình 4.1. Về cơ bản họ giới thiệu rõ ràng độ chính xác mà bạn có thể tính toán hàm của mình.
Cân nhắc cho GPU:
Bạn có rất nhiều vấn đề nhỏ, hơi khác với trường hợp sử dụng của tôi về một vấn đề lớn. Xem xét việc chạy 1 vấn đề cho mỗi khối GPU (hoặc cong vênh), nếu bạn có thể song song hóa các đánh giá chức năng và độ dốc để sử dụng tất cả các luồng trong một khối. Theo cách đó, nó không phải là vấn đề nếu các vấn đề khác nhau đòi hỏi số lần lặp khác nhau.
Nếu đây không phải là một tùy chọn, tôi sẽ đi với bộ giải LBFGS. Nếu chức năng của bạn hoạt động tốt, bạn có thể thoát khỏi việc chỉ cần sử dụng kích thước bước 1 (tránh tìm kiếm dòng) và chỉ chạy tất cả các vấn đề cho một số lần lặp cố định.