بهینه سازی پیشرفته

1 دقیقه |  2020/09/11

Conjugate gradient, BFGS و L-BFGS راه های پیچیده تر و سریع تری برای بهینه سازی $\theta$ به جای گرادیان کاهشی هستند.

پیشنهاد می‌شود که این الگوریتم های پیچیده را خودتان ننویسید (مگر اینکه در محاسبات عددی متخصص باشید)، و به جای آن از کتابخانه ها استفاده کنید، زیرا قبلا آزمایش شده اند و بسیار بهینه شده اند.

ابتدا لازم است تابعی بسازیم که دو مقدار زیر را با ورودی مقدار $\theta$ برگرداند:

$$ \begin{align*} & J(\theta) \newline & \dfrac{\partial}{\partial \theta_j}J(\theta)\end{align*} $$

تابعی می‌نویسیم که هر دو این مقادیر را بر گرداند:

function [jVal, gradient] = costFunction(theta)
  ;jVal = [...code to compute J(theta)...]
  ;gradient = [...code to compute derivative of J(theta)...]
end

سپس می‌توانیم از الگوریتم بهینه سازی ()fminunc در اکتاو به همراه تابع ()optimset برای ساخت یک object شامل تنظیمات و گزینه هایی که می‌خواهیم به عنوان ورودی به تابع ()fminunc بدهیم.

;options = optimset('GradObj', 'on', 'MaxIter', 100)
;initialTheta = zeros(2,1)
   ;[optTheta, functionVal, exitFlag] = fminunc(@costFunction, initialTheta, options)

به عنوان ورودی به تابع ()fminunc:

تابع هزینه، بردار مقادیر تتا، و options را که از قبل درست کرده ایم می‌دهیم.