Алгоритм Бройдена — Флетчера — Гольдфарба — Шанно

Материал из testwiki
Перейти к навигации Перейти к поиску

Алгоритм Бройдена — Флетчера — Гольдфарба — Шанно (BFGS) (Шаблон:Lang-en) — итерационный метод численной оптимизации, предназначенный для нахождения локального максимума/минимума нелинейного функционала без ограничений.

BFGS — один из наиболее широко применяемых квазиньютоновских методов. В квазиньютоновских методах не вычисляется напрямую гессиан функции. Вместо этого гессиан оценивается приближенно, исходя из сделанных до этого шагов. Также существуют модификация данного метода с ограниченным использованием памяти (L-BFGS), который предназначен для решения нелинейных задач с большим количеством неизвестных, а также модификация с ограниченным использованием памяти в многомерном кубе (L-BFGS-B).

Данный метод находит минимум любой дважды непрерывно дифференцируемой выпуклой функции. Несмотря на эти теоретические ограничения, как показывает опыт, BFGS хорошо справляется и с невыпуклыми функциями.

Описание

Пусть решается задача оптимизации функционала:

argminxf(x).

Методы второго порядка решают данную задачу итерационно, с помощью разложения функции в полином второй степени:

f(xk+p)=f(xk)+fT(xk)p+12pTH(xk)p,

где H — гессиан функционала f в точке x. Зачастую вычисление гессиана трудоемки, поэтому BFGS алгоритм вместо настоящего значения H(x) вычисляет приближенное значение Bk, после чего находит минимум полученной квадратичной задачи:

pk=Bk1f(xk).

Как правило, после этого осуществляется поиск вдоль данного направления точки, для которой выполняются условия Вольфе.

В качестве начального приближения гессиана можно брать любую невырожденную, хорошо обусловленную матрицу. Часто берут единичную матрицу. Приближенное значение гессиана на следующем шаге вычисляется по формуле:

Bk+1=BkBkskskTBkTskTBksk+ykykTykTsk,

где I — единичная матрица, sk=xk+1xk — шаг алгоритма на итерации, yk=fk+1fk — изменение градиента на итерации.

Поскольку вычисление обратной матрицы вычислительно сложно, вместо того, чтобы вычислять Bk1, обновляется обратная к Bk матрица Ck=Bk1:

Ck+1=(IρkskykT)Ck(IρkykskT)+ρkskskT,

где ρk=1ykTsk.

Алгоритм

дано ε,x0
инициализировать C0
k=0
while ||fk||>ε
    найти направление pk=Ckfk
    вычислить xk+1=xk+αkpk, αk удовлетворяет условиям Вольфе
    обозначить sk=xk+1xk и yk=fk+1fk
    вычислить Ck+1
    k=k+1
end

Литература

  1. Шаблон:Книга
  2. Шаблон:Книга

Шаблон:Методы оптимизации