Làm thế nào để chọn đúng thuật toán tối ưu?


16

Tôi cần tìm tối thiểu của một chức năng. Đọc tài liệu tại http://docs.scipy.org/doc/scipy/reference/optizes.html Tôi thấy rằng có một số thuật toán thực hiện cùng một điều, tức là tìm mức tối thiểu. Làm thế nào để tôi biết tôi nên chọn cái nào?

một số thuật toán được liệt kê

  • Giảm thiểu một hàm bằng thuật toán đơn giản xuống dốc.
  • Giảm thiểu một hàm bằng thuật toán BFGS.
  • Tối thiểu hóa một hàm với thuật toán gradient liên hợp phi tuyến.
  • Tối thiểu hóa hàm f bằng phương pháp Newton-CG.
  • Giảm thiểu một chức năng bằng phương pháp Powell đã sửa đổi.

Hàm của tôi là tuyến tính. chiều là khoảng 232750 (đây là số lượng độ dốc khác nhau tôi phải tính mỗi lần), mất khoảng 2 phút để tính toán độ dốc và chi phí một lần, do đó không rẻ. Tôi không nghĩ rằng tôi có những ràng buộc. nó mang tính quyết định và liên tục.


Vâng, bạn phải điều tra bản chất của vấn đề của bạn: Nó có tuyến tính hay không? Chiều kích của nó là gì? Là chức năng chi phí của bạn rẻ để đánh giá? Bạn có thể đánh giá (các) công cụ phái sinh của bạn một cách phân tích và / hoặc giá rẻ không? Bạn có những ràng buộc? Nếu bạn có những ràng buộc, bạn có thể viết vấn đề của bạn một cách dễ dàng như không bị ràng buộc? Xin hãy giải thích những vấn đề này nhiều hơn.
usεr11852 nói Phục hồi Monic

@ user11852 Đó là tuyến tính. chiều là khoảng 50 tính năng, mất khoảng 2 phút để tính toán độ dốc và chi phí một lần, do đó không rẻ. Tôi không nghĩ rằng tôi có những ràng buộc.
siamii

Tôi không chắc ý của bạn là "tuyến tính" ở đây. Nếu vấn đề của bạn là tuyến tính, độ dốc là không đổi và rẻ tiền để tính toán. Nếu hàm mục tiêu của bạn là tuyến tính và không có ràng buộc, thì mức tối thiểu là -infality (hoặc có lẽ là 0).
paul

@paul: Trong tuyến tính tối ưu hóa thường đề cập đến các ràng buộc, không phải là chính chức năng. Tôi (được cấp sai) đã đề cập đến "tuyến tính" liên quan đến độ trơn tru của chức năng và tôi nghĩ đó là những gì OP cũng đề cập đến. Trong câu trả lời của tôi, tôi chủ yếu dựa trên thực tế là anh ấy đã nói "liên tục" sau đó.
usεr11852 nói Phục hồi Monic

Câu trả lời:


14

Dựa trên những gì bạn nói: Tôi giả sử bạn phải tối ưu hóa cho 50 biến; Tôi cũng cho rằng bạn đang gặp phải một tình huống rất tốn kém khi tìm các công cụ phái sinh phân tích (huống chi là lấy số) và việc tối ưu hóa của bạn không bị giới hạn.

Hãy để tôi nhấn mạnh, bạn có một chút không may gây ra từ 25-30 đến 100 biến, đó là một chút vùng chạng vạng khi phải lựa chọn giữa các thói quen tối ưu hóa quy mô lớn hay nhỏ. Có nói rằng mặc dù, không có gì là mất.

Cho rằng ngay cả đạo hàm bậc nhất cũng đắt tiền để loại bỏ ý tưởng đó về phương pháp của Newton. Bạn có thể gặp may mắn với Quasi-Newton (BFGS) mặc dù nếu Hessian của bạn hơi chéo như muốn bắt đầu. CG thường chậm hơn một chút so với BFGS nên có lẽ điều đó sẽ không cải thiện nhiều thứ; sử dụng nó nếu bộ nhớ cũng là một vấn đề (hoặc chỉ sử dụng L-BFGS trong trường hợp đó). Ngoài ra, được đánh giá là chậm như thế nào để đánh giá chức năng của bạn, một thuật toán tìm kiếm gốc / dòng dốc đơn giản nhất sẽ rất chậm; điều tương tự cũng xảy ra với Mô phỏng luyện kim và các biến thể tìm kiếm ngẫu nhiên khác (Tôi giả sử bạn không có quyền truy cập vào HMC và tất cả nhạc jazz đó).

Vì vậy, khi bạn cần một cú đánh tốt nhất cho đồng tiền của mình khi nói đến một đánh giá chức năng duy nhất: Đi với phương pháp của Powell và cũng kiểm tra COBYLA; mặc dù là một thuật toán tối ưu hóa bị ràng buộc bởi vì nó sẽ tuyến tính gần đúng độ dốc của hàm của bạn để tăng tốc mọi thứ, nó sẽ có thể tận dụng lợi thế của tuyến tính của hàm. Cũng chắc chắn thử NLopt cho Python . Họ có rất nhiều tối ưu hóa không có độ dốc; thử UOBYQA; đó cũng là đứa con tinh thần của Powell (Tối ưu hóa không bị ràng buộc bởi các xấp xỉ bậc hai).

Rất ngắn gọn: Các thuật toán N-CG phụ thuộc vào tính toán Hessian và Hessian của bạn có vẻ rất tốn kém để tính toán. NLCG và BFGS không yêu cầu mặc dù có thể thử tính toán nó một lần trong bước đầu tiên.

Tôi đã bỏ qua thuật toán đơn giản vì nó là một con quái vật hoàn toàn khác; không có gì để làm với độ dốc như vậy. Hãy thử nó nhưng tôi không thể thực sự nhận xét về nó; nó thực sự phụ thuộc vào bản chất vấn đề của bạn.

Để có tài liệu tham khảo tốt đầu tiên về tối ưu hóa số, cuốn sách Phương pháp lặp để tối ưu hóa của CTKelly sẽ giúp bạn đi khá xa, khá độc đáo.


Để tham khảo trong tương lai: bạn có thể muốn kiểm tra bản beta Khoa học tính toán trên Stackexchange cho các câu hỏi tương tự.
usεr11852 nói Phục hồi Monic

cảm ơn vì câu trả lời Trên thực tế, chiều của tôi là 232.750. Đây là số độ dốc tôi tính toán mỗi lần. Tôi thực hiện đánh giá chức năng và tính toán độ dốc trên GPU. Điều đó sẽ tương thích với NLopt?
siamii

Tôi chưa sử dụng NLopt trên GPU nhưng tôi không thấy lý do rõ ràng tại sao nó lại là một vấn đề liên quan đến khả năng tương thích. Tôi có thể nghi ngờ vấn đề nghĩ rằng mặc dù hoạt động I / O thường xuyên từ và đến GPU.
usεr11852 nói Phục hồi Monic

@ usεr11852, Cũng có thể thảo luận về việc so sánh các phương pháp phân tách độ dốc và QR để giảm thiểu hàm chi phí hồi quy tuyến tính? Tôi có cần hỏi một câu hỏi riêng không?
Bác sĩ Nisha Arora

@DrNishaArora: Vâng. Điều đó sẽ thích hợp cho một câu hỏi riêng biệt. Vui lòng xem chủ đề Tại sao sử dụng độ dốc giảm dần cho hồi quy tuyến tính, khi có sẵn một giải pháp toán học dạng đóng? để đảm bảo bạn tránh trùng lặp!
usεr11852 nói Phục hồi Monic

1

Có lẽ bạn nên có cho mình một cuốn sách giới thiệu về tối ưu hóa số. Bạn sẽ cần tính đến chức năng của mình để quyết định thuật toán.

Trong số các thuật toán bạn đề cập, sự khác biệt quan trọng là liệu Jacobian hay Hessian là cần thiết hay chỉ có chức năng.

Xem xét rằng đây là trang web Hỏi & Đáp về thống kê và do đó xử lý các biến ngẫu nhiên: đảm bảo chức năng của bạn có tính xác định có thể được đánh giá theo cách mang lại kết quả liên tục trong không gian tìm kiếm.


nó mang tính quyết định và liên tục.
siamii
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.