Як вибрати правильний алгоритм оптимізації?


16

Мені потрібно знайти мінімум функції. Читаючи документи на http://docs.scipy.org/doc/scipy/reference/optimize.html я бачу, що існує кілька алгоритмів, які роблять те саме, тобто знаходять мінімум. Як я можу знати, яку вибрати?

деякі з перелічених алгоритмів

  • Мінімізуйте функцію, використовуючи алгоритм простого спуску.
  • Мінімізуйте функцію за допомогою алгоритму BFGS.
  • Мінімізуйте функцію за допомогою нелінійного алгоритму спряженого градієнта.
  • Мінімізуйте функцію f, використовуючи метод Ньютона-КГ.
  • Мінімізуйте функцію за допомогою модифікованого методу Пауелла.

Моя функція лінійна. розмірність становить приблизно 232750 (саме стільки різних градієнтів мені доводиться обчислювати кожен раз), щоб розрахувати градієнт і вартість один раз, потрібно приблизно 2 хвилини, так що не дешево. Я не думаю, що у мене є обмеження. це детерміновано і безперервно.


Ви повинні дослідити природу вашої проблеми: лінійна вона чи ні? Яка її розмірність? Чи недорого оцінити вашу функцію витрат? Чи можете ви оцінити свої похідні (-і) аналітичні та / або дешеві? У вас є обмеження? Якщо у вас є обмеження, чи можете ви легко поставити свою проблему як нестримну? Будь ласка, детальніше зупиніться на цих питаннях.
usεr11852 повідомляє Відновити Моніку

@ user11852 Це лінійно. розмірність становить близько 50 особливостей, для розрахунку градієнта та вартості потрібно один раз 2 хвилини, так що не дешево. Я не думаю, що у мене є обмеження.
сіямі

Я не впевнений, що ви маєте на увазі під лінійним. Якщо ваша проблема лінійна, градієнт постійний і дешевий для обчислення. Якщо ваша цільова функція лінійна і не має обмежень, мінімальним є -бесконечність (або, можливо, 0).
Павло

@paul: В оптимізації лінійність зазвичай посилається на обмеження, а не на саму функцію. Я (помилково наданий) посилався на "лінійність" стосовно плавності функції, і я думаю, що саме про це йдеться і в ОП. У своїй відповіді я здебільшого грунтувався на тому, що він все-таки сказав "безперервно".
usεr11852 повідомляє Відновити Монік

Відповіді:


14

Виходячи з сказаного: я припускаю, що вам доведеться оптимізувати 50 змінних; Я також припускаю, що у вас виникає ситуація, що дуже дорого знайти аналітичні похідні (не кажучи вже про отримання чисельних даних) і що ваша оптимізація не обмежується.

Дозвольте наголосити, ви трохи невдало спричиняєте між 25-30 та 100 змінними, це трохи зона сутінків, коли справа доходить до вибору між оптимізацією великих або малих масштабів. Сказавши, що хоча нічого не втрачено.

З огляду на те, що навіть похідне перше замовлення дороге, щоб отримати такий вид, вбиває ідею методу Ньютона. Можливо, вам пощастить з Квазі-Ньютоном (BFGS), хоча якщо ваш гессіан трохи діагональний, як би почати. CG зазвичай трохи повільніше, ніж BFGS, так що, ймовірно, це не покращить багато чого; використовуйте його, якщо пам'ять також є проблемою (або просто перейдіть на L-BFGS у такому випадку). Окрім того, враховуючи, наскільки повільно оцінювати свою функцію, простий алгоритм пошуку спуску / лінії буде катастрофічно повільним; те ж саме стосується симуляційного відпалу та інших випадкових варіантів пошуку (я припускаю, що у вас немає доступу до HMC та всього цього джазу).

Отже, коли вам потрібен найкращий удар для вашого долара, коли мова заходить про оцінку однієї функції: перейдіть за методом Пауелла, а також протестуйте COBYLA; незважаючи на обмежений алгоритм оптимізації, оскільки він буде внутрішньо лінійно наближати градієнт вашої функції для прискорення роботи, він зможе скористатися лінійністю вашої функції. Також обов'язково спробуйте NLopt для Python . У них багато оптимізаторів без градієнтів; спробуйте UOBYQA; це дітище Пауелла (Нестримне оптимізація шляхом квадратичних наближень).

Дуже коротко: алгоритми N-CG залежать від обчислення гессіанців, і ваш гессіанський здається дуже дорогим для обчислення. NLCG та BFGS цього не потребують, хоча вони можуть спробувати обчислити його один раз на першому кроці.

Я спеціально залишив алгоритм симплекс, тому що це зовсім інший звір; нічого спільного з градієнтами як такими. Спробуйте, але я не можу реально коментувати це; це дійсно залежить від характеру вашої проблеми.

Для першої хорошої довідки про чисельну оптимізацію Книга CTKelly Ітеративні методи оптимізації ви отримаєте досить далеко, досить приємно.


Для подальшої довідки: можливо, вам буде цікаво перевірити бета-версію Computational Science на Stackexchange на наявність подібних питань.
usεr11852 повідомляє Відновити Монік

дякую за відповідь. Насправді моя розмірність - 232,750. Це кількість градієнтів, які я обчислюю кожного разу. Я роблю оцінку функції та обчислення градієнта на GPU. Це було б сумісно з NLopt?
siamii

Я не використовував NLopt на графічних процесорах, але не бачу очевидної причини, чому це повинно бути проблемою щодо сумісності. Я міг би поставити під сумнів цю проблему, хоча це було частою операцією вводу / виводу від та до GPU.
usεr11852 повідомляє Відновити Моніку

@ usεr11852, Чи можна також обговорити порівняння градієнтного спуску та методів розкладання QR для мінімізації функції лінійної регресії? Чи потрібно мені задати окреме запитання?
Д-р Ніша Арора

@DrNishaArora: Так. Це було б доречно для окремого питання. Будь ласка, дивіться нитку Навіщо використовувати градієнтне спуск для лінійної регресії, коли доступний математичний розчин закритої форми? щоб уникнути дублювання!
usεr11852 повідомляє

1

Можливо, ви повинні отримати собі вступну книгу про числову оптимізацію. Вам потрібно буде врахувати свою функцію, щоб визначитися з алгоритмом.

Серед алгоритмів, які ви згадуєте, важливі відмінності полягають у тому, чи потрібен якобійський чи гессіанський або лише сама функція.

Враховуючи, що це веб-сайт із питань статистики і, таким чином, має справу зі випадковими змінними: переконайтеся, що ваша функція детермінована, можна оцінити таким чином, що дає постійні результати в просторі пошуку.


це детерміновано і безперервно.
siamii
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.