Hãy để tôi cân nhắc ở đây với một vài lời cảnh báo, mở đầu bằng một câu chuyện. Từ lâu, tôi đã làm việc với một đồng nghiệp khi tôi mới bắt đầu. Ông có một vấn đề tối ưu hóa để giải quyết, với một mục tiêu khá lộn xộn. Giải pháp của ông là tạo ra các dẫn xuất phân tích để tối ưu hóa.
Vấn đề mà tôi thấy là những dẫn xuất này thật khó chịu. Được tạo bằng Macsyma, được chuyển đổi thành mã fortran, chúng là hàng chục câu lệnh tiếp tục dài. Trong thực tế, trình biên dịch Fortran đã khó chịu vì điều đó, vì nó vượt quá số lượng báo cáo tiếp tục tối đa. Trong khi chúng tôi tìm thấy một lá cờ cho phép chúng tôi khắc phục vấn đề đó, có những vấn đề khác.
Trong các biểu thức dài, như thường được tạo ra bởi các hệ thống CA, có nguy cơ hủy bỏ trừ lớn. Tính toán rất nhiều số lớn, chỉ để thấy tất cả chúng triệt tiêu lẫn nhau để mang lại một số nhỏ.
Thông thường các công cụ phái sinh được phân tích thực sự tốn kém hơn để đánh giá so với các công cụ phái sinh được tạo số bằng cách sử dụng các khác biệt hữu hạn. Một gradient cho n biến có thể mất hơn n lần so với chi phí đánh giá hàm mục tiêu của bạn. (Bạn có thể tiết kiệm thời gian vì nhiều thuật ngữ có thể được sử dụng lại trên các công cụ phái sinh khác nhau, nhưng điều đó cũng sẽ buộc bạn phải mã hóa tay cẩn thận, thay vì sử dụng các biểu thức do máy tính tạo ra. biểu thức, xác suất xảy ra lỗi không phải là nhỏ. Hãy chắc chắn rằng bạn xác minh các dẫn xuất này cho chính xác.)
Điểm của câu chuyện của tôi là các biểu thức CA tạo ra có vấn đề của riêng họ. Điều buồn cười là đồng nghiệp của tôi thực sự tự hào về sự phức tạp của vấn đề, rằng anh ấy rõ ràng đang giải quyết một vấn đề thực sự khó khăn vì đại số rất khó chịu. Điều tôi không nghĩ là anh ta cân nhắc là nếu đại số đó thực sự tính toán đúng, liệu nó có hoạt động chính xác không, và nó có hoạt động hiệu quả như vậy không.
Nếu tôi là người cao cấp tại thời điểm đó trong dự án này, tôi sẽ đọc cho anh ấy hành động bạo loạn. Niềm kiêu hãnh của anh ta đã khiến anh ta sử dụng một giải pháp có lẽ phức tạp không cần thiết, thậm chí không kiểm tra xem độ dốc dựa trên sự khác biệt hữu hạn là đủ. Tôi cá là chúng tôi đã dành khoảng một tuần thời gian để chạy tối ưu hóa này. Ít nhất, tôi sẽ khuyên anh ta kiểm tra cẩn thận độ dốc được tạo ra. Nó có chính xác không? Làm thế nào chính xác là nó, so với các dẫn xuất khác biệt hữu hạn? Trên thực tế, có những công cụ xung quanh ngày hôm nay cũng sẽ trả về ước tính lỗi trong dự đoán phái sinh của họ. Điều này chắc chắn đúng với mã phân biệt thích ứng, (derivest) tôi đã viết bằng MATLAB.
Kiểm tra mã. Xác nhận các dẫn xuất.
Nhưng trước khi bạn làm BẤT K of việc này, hãy xem xét nếu khác, các kế hoạch tối ưu hóa tốt hơn là một lựa chọn. Ví dụ: nếu bạn đang thực hiện điều chỉnh theo cấp số nhân, thì rất có khả năng bạn có thể sử dụng một bình phương nhỏ nhất phi tuyến được phân vùng (đôi khi được gọi là bình phương nhỏ nhất có thể tách rời. Tôi nghĩ đó là thuật ngữ được sử dụng bởi Seber và Wild trong cuốn sách của họ.) là để phá vỡ tập hợp các tham số thành tập hợp tuyến tính và phi tuyến nội tại. Sử dụng tối ưu hóa chỉ hoạt động trên các tham số phi tuyến. Với các tham số đó là "đã biết", thì các tham số tuyến tính nội tại có thể được ước tính bằng cách sử dụng bình phương tuyến tính tối thiểu đơn giản. Sơ đồ này sẽ giảm không gian tham số trong tối ưu hóa. Nó làm cho vấn đề trở nên mạnh mẽ hơn, vì bạn không cần phải tìm các giá trị bắt đầu cho các tham số tuyến tính. Nó làm giảm tính chiều của không gian tìm kiếm của bạn, do đó làm cho vấn đề chạy nhanh hơn. Một lần nữa tôi đã cung cấpmột công cụ cho mục đích này , nhưng chỉ trong MATLAB.
Nếu bạn sử dụng các dẫn xuất phân tích, hãy mã hóa chúng để sử dụng lại các thuật ngữ. Đây có thể là một tiết kiệm thời gian nghiêm trọng, và thực sự có thể làm giảm các lỗi, tiết kiệm thời gian của riêng bạn. Nhưng sau đó kiểm tra những con số đó!
codegen
gói đó vì nó có thể tạo mã C hoặc Fortran nhỏ gọn và hiệu quả cho mỗi hoặc tất cả các biểu thức một cách tự động.