Метод спряженого градієнта

Матеріал з testwiki
Перейти до навігації Перейти до пошуку

Шаблон:Сирий переклад

Порівняння збіжності градієнтного спуску з оптимальним розміром кроку (зеленим) та кон'югованим вектором (червоним кольором) для мінімізації квадратичної функції, пов'язаної із заданою лінійною системою. Спряжений градієнт, припускаючи точну арифметику, сходиться не більше n кроків, де n - розмір матриці системи (тут n   =   2).

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

Метод спряженого градієнта також може бути використаний для вирішення необмежених задач оптимізації, таких як мінімізація енергії . Його в основному розробили Магнус Гестенес та Едуард Стіфель [1] які запрограмували його на Z4 .

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

Опис задачі, котру вирішують сполучені градієнти

Припустимо, ми хочемо розв’язати систему лінійних рівнянь

𝐀𝐱=𝐛

для вектора x, де відома n × n матриця A симетрична (тобто A T = A ), позитивно-визначена (тобто x T Ax > 0 для всіх ненульових векторів x в R n ), і реальна, і b також відомо. Позначимо унікальний розв'язок цієї системи через 𝐱* .

Прямий метод

Ми припускаємо, що два ненульові вектори u і v є сполученими (щодо А ), якщо

𝐮𝖳𝐀𝐯=0.

Оскільки A симетрична і позитивно-визначена, ліва частина визначає внутрішній добуток

𝐮𝖳𝐀𝐯=𝐮,𝐯𝐀:=𝐀𝐮,𝐯=𝐮,𝐀𝖳𝐯=𝐮,𝐀𝐯.

Два вектори є сполученими тоді і лише тоді, коли вони ортогональні щодо цього внутрішнього добутку. Будучи сполученим - це симетричне відношення: якщо u є спряженим на v, то v є спряженим на u . Припустимо, що

P={𝐩1,,𝐩n}

являє собою сукупність n взаємно сполучених векторів (щодо А ). Тоді Шаблон:Mvar становить основу для n, і ми можемо висловити рішення Шаблон:Math of 𝐀𝐱=𝐛 виходячи з цього:

𝐱*=i=1nαi𝐩i.

На основі цього розширення ми обчислюємо:

𝐀𝐱*=i=1nαi𝐀𝐩i.

Ліву частину множимо на 𝐩k𝖳 :

𝐩k𝖳𝐀𝐱*=i=1nαi𝐩k𝖳𝐀𝐩i,

підставляючи 𝐀𝐱*=𝐛 і 𝐮𝖳𝐀𝐯=𝐮,𝐯𝐀 :

𝐩k𝖳𝐛=i=1nαi𝐩k,𝐩i𝐀,

потім 𝐮𝖳𝐯=𝐮,𝐯 і використання ik:𝐩k,𝐩i𝐀=0 врожайність

𝐩k,𝐛=αk𝐩k,𝐩k𝐀,

що означає

αk=𝐩k,𝐛𝐩k,𝐩k𝐀.

Це дає наступний метод розв’язання рівняння Шаблон:Math : знайти послідовність n спрямованих напрямків, а потім обчислити коефіцієнти Шаблон:Mvar .

Як ітеративний метод

Якщо ми обережно оберемо сполучені вектори p k, то, можливо, нам не знадобляться всі, щоб отримати гарне наближення до рішення Шаблон:Math . Отже, ми хочемо розглянути метод спряженого градієнта як ітераційний метод. Це також дозволяє приблизно вирішити системи, де n настільки велике, що прямий метод зайняв би занадто багато часу.

Позначимо початкове припущення для Шаблон:Math через Шаблон:Math (можна без втрати загальності вважати, що Шаблон:Math, інакше розглянемо систему Az = b - Ax 0 ). Починаючи з x0 ми шукаємо вирішення і в кожній ітерації ми повинні мати метрику, котра зможєе сказати нам чи ми ближче до вирішення Шаблон:Math, нам це невідомо). Ця метрика випливає з того, що рішення Шаблон:Math також є унікальним мінімізатором наступної квадратичної функції

f(𝐱)=12𝐱𝖳𝐀𝐱𝐱𝖳𝐛,𝐱𝐑n.

Існування унікального мінімізатора очевидно, оскільки його друга похідна задана симетричною позитивно-визначеною матрицею

2f(𝐱)=𝐀,

і що мінімалізатор (виокристовує Df(x) = 0) вирішує початкову задачу очевидно з її першої похідної

f(𝐱)=𝐀𝐱𝐛.

Це говорить про те, щоб перший базовий вектор p 0 був від'ємним градієнтом f при x = x 0 . Градієнт f дорівнює Шаблон:Math . Починаючи з початкової здогадки x 0, це означає, що беремо p 0 = b - Ax 0 . Інші вектори в основі будуть спряжені з градієнтом, звідси і назва метод спряженого градієнта . Зауважимо, що p 0 також є залишковим, передбаченим цим початковим кроком алгоритму.

Нехай r k - залишок на k- му кроці:

𝐫k=𝐛𝐀𝐱k.

Як було зазначено вище, r k - від'ємний градієнт f при x = x k, тому метод спуску градієнтом потребує руху в напрямку r k . Тут, однак, ми наполягаємо, щоб напрямки p k були сполучені один з одним. Практичний спосіб забезпечити це - вимагаючи, щоб наступний напрямок пошуку був побудований з поточного залишкового та всіх попередніх напрямків пошуку. [2] Це дає такий вираз:

𝐩k=𝐫ki<k𝐩i𝖳𝐀𝐫k𝐩i𝖳𝐀𝐩i𝐩i

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

𝐱k+1=𝐱k+αk𝐩k

з

αk=𝐩k𝖳(𝐛𝐀𝐱k)𝐩k𝖳𝐀𝐩k=𝐩k𝖳𝐫k𝐩k𝖳𝐀𝐩k,

де остання рівність випливає з визначення r k . Вираз для αk може бути отримано, якщо підміняти вираз x k +1 на f і мінімізувати його wrt αk

f(𝐱k+1)=f(𝐱k+αk𝐩k)=:g(αk)g(αk)=!0αk=𝐩k𝖳(𝐛𝐀𝐱k)𝐩k𝖳𝐀𝐩k.

Отриманий алгоритм

Наведений вище алгоритм дає найбільш просте пояснення методу спряженого градієнта. Здається, алгоритм, як заявлено, вимагає зберігання всіх попередніх напрямків пошуку та векторів залишків, а також багатьох матричних векторних множень, і, таким чином, може бути обчислювально дорогим. Однак більш детальний аналіз алгоритму показує, що r i є ортогональним до r j, тобто 𝐫i𝖳𝐫j=0, для i ≠ j. І p i - A-ортогональна до p j, тобто 𝐩i𝖳A𝐩j=0, для i ≠ j. Це можна вважати, що в міру просування алгоритму p i і r i охоплюють той самий підпростір Крилова. Якщо r я утворює ортогональну основу відносно стандартного внутрішнього добутку, а p i утворює ортогональну основу відносно внутрішнього добутку, індукованого А. Тому x k можна розглядати як проєкцію x на підпростір Крилова.

Алгоритм детально описаний нижче для розв’язання Ax = b, де A - реальна, симетрична, позитивно-визначена матриця. Вхідний вектор x 0 може бути приблизним початковим рішенням або 0 . Це інша рецептура точної процедури, описаної вище.

𝐫0:=𝐛𝐀𝐱0if 𝐫0 is sufficiently small, then return 𝐱0 as the result𝐩0:=𝐫0k:=0repeatαk:=𝐫k𝖳𝐫k𝐩k𝖳𝐀𝐩k𝐱k+1:=𝐱k+αk𝐩k𝐫k+1:=𝐫kαk𝐀𝐩kif 𝐫k+1 is sufficiently small, then exit loopβk:=𝐫k+1𝖳𝐫k+1𝐫k𝖳𝐫k𝐩k+1:=𝐫k+1+βk𝐩kk:=k+1end repeatreturn 𝐱k+1 as the result

Це найбільш часто використовуваний алгоритм. Така ж формула для Шаблон:Mvar також використовується в нелінійному методі градієнта Флетчера-Рівза.

Розрахунок альфа та бета-версії

В алгоритмі Шаблон:Mvar вибирається таким, що 𝐫k+1 є ортогональним до r k . Знаменник спрощено від

αk=𝐫k𝖳𝐫k𝐫k𝖳𝐀𝐩k=𝐫k𝖳𝐫k𝐩k𝖳𝐀𝐩k

з тих пір 𝐫k+1=𝐩k+1βk𝐩k . Шаблон:Mvar вибирається таким, що 𝐩k+1 сполучається з p k . Спочатку Шаблон:Mvar є

βk=𝐫k+1𝖳𝐀𝐩k𝐩k𝖳𝐀𝐩k

використовуючи

𝐫k+1=𝐫kαk𝐀𝐩k

і рівнозначно

𝐀𝐩k=1αk(𝐫k𝐫k+1),

чисельник Шаблон:Mvar переписується як

𝐫k+1𝖳𝐀𝐩k=1αk𝐫k+1𝖳(𝐫k𝐫k+1)=1αk𝐫k+1𝖳𝐫k+1

оскільки 𝐫k+1 і r k є ортогональними за конструкцією. Знаменник переписується як

𝐩k𝖳𝐀𝐩k=(𝐫k+βk1𝐩k1)𝖳𝐀𝐩k=1αk𝐫k𝖳(𝐫k𝐫k+1)=1αk𝐫k𝖳𝐫k

використовуючи, що напрямки пошуку p k кон'югуються і знову, що залишки є ортогональними. Це дає Шаблон:Mvar в алгоритмі після скасування Шаблон:Mvar .

Приклад коду в MATLAB / GNU Octave

function x = conjgrad(A, b, x)
    r = b - A * x;
    p = r;
    rsold = r' * r;

    for i = 1:length(b)
        Ap = A * p;
        alpha = rsold / (p' * Ap);
        x = x + alpha * p;
        r = r - alpha * Ap;
        rsnew = r' * r;
        if sqrt(rsnew) < 1e-10
              break;
        end
        p = r + (rsnew / rsold) * p;
        rsold = rsnew;
    end
end

Числовий приклад

Розглянемо лінійну систему Ax = b, задану через

𝐀𝐱=[4113][x1x2]=[12],

ми виконаємо два етапи методу спряженого градієнта, починаючи з початкової здогадки

𝐱0=[21]

щоб знайти приблизне рішення для системи.

Рішення

Для довідки правильне рішення

𝐱=[111711][0.09090.6364]

Наш перший крок - обчислити залишковий вектор r 0, пов'язаний з x 0 . Цей залишок обчислюється за формулою r 0 = b - Ax 0, а в нашому випадку дорівнює

𝐫0=[12][4113][21]=[83].

Оскільки це перша ітерація, ми будемо використовувати залишковий вектор r 0 як наш початковий напрямок пошуку p 0 ; метод вибору p k зміниться в подальших ітераціях.

Тепер обчислимо скалярний Шаблон:Math використовуючи відношення

α0=𝐫0𝖳𝐫0𝐩0𝖳𝐀𝐩0=[83][83][83][4113][83]=73331.

Тепер ми можемо обчислити х 1, використовуючи формулу

𝐱1=𝐱0+α0𝐩0=[21]+73331[83]=[0.23560.3384].

Цей результат завершує першу ітерацію, результатом якої є "покращене" приблизне рішення для системи, x 1 . Тепер ми можемо перейти і обчислити наступний залишковий вектор r 1 за формулою

𝐫1=𝐫0α0𝐀𝐩0=[83]73331[4113][83]=[0.28100.7492].

Наступним нашим кроком у процесі є обчислення скалярного Шаблон:Math яке згодом буде використано для визначення наступного напрямку пошуку p 1 .

β0=𝐫1𝖳𝐫1𝐫0𝖳𝐫0=[0.28100.7492][0.28100.7492][83][83]=0.0088.

Тепер, використовуючи цей скаляр Шаблон:Math, ми можемо обчислити наступний напрямок пошуку p 1, використовуючи відношення

𝐩1=𝐫1+β0𝐩0=[0.28100.7492]+0.0088[83]=[0.35110.7229].

Тепер ми обчислюємо скалярний Шаблон:Math використовуючи нещодавно придбаний p 1, використовуючи той самий метод, що і для Шаблон:Math .

α1=𝐫1𝖳𝐫1𝐩1𝖳𝐀𝐩1=[0.28100.7492][0.28100.7492][0.35110.7229][4113][0.35110.7229]=0.4122.

Нарешті, ми знаходимо х 2, використовуючи той самий метод, що і для знаходження х 1 .

𝐱2=𝐱1+α1𝐩1=[0.23560.3384]+0.4122[0.35110.7229]=[0.09090.6364].

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

Властивості збіжності

Метод спряженого градієнта теоретично можна розглядати як прямий метод, оскільки він дає точне рішення після кінцевого числа ітерацій, що не перевищує розмір матриці, за відсутності помилки округлення . Однак метод градієнта спряжених нестабільний щодо навіть невеликих збурень, наприклад, більшість напрямків на практиці не є сполученими, і точного рішення так і не отримати. На щастя, метод спряженого градієнта може бути використаний як ітераційний метод, оскільки він забезпечує монотонно поліпшення наближень 𝐱k до точного рішення, яке може досягти необхідного допуску після відносно невеликої (порівняно з розміром проблеми) кількості ітерацій. Поліпшення, як правило, лінійне і його швидкість визначається числом умови κ(A) системної матриці A : тим більше κ(A) є, чим повільніше поліпшення. [3]

Якщо κ(A) велика, попередня умова використовується для заміни вихідної системи 𝐀𝐱𝐛=0 з 𝐌1(𝐀𝐱𝐛)=0 такий як κ(𝐌1𝐀) менше, ніж κ(𝐀), Дивіться нижче.

Теорема конвергенції

Визначте підмножину многочленів як

Πk*:={ pΠk : p(0)=1 },

де Πk - це множина многочленів максимального ступеня k .

Дозволяти (𝐱k)k бути ітераційним наближенням точного рішення 𝐱*, і визначити помилки як 𝐞k:=𝐱k𝐱* . Тепер швидкість конвергенції можна приблизно оцінити як [4]

𝐞k𝐀=minpΠk*p(𝐀)𝐞0𝐀minpΠk*maxλσ(𝐀)|p(λ)| 𝐞0𝐀2(κ(𝐀)1κ(𝐀)+1)k 𝐞0𝐀,

де σ(𝐀) позначає спектр, і κ(𝐀) позначає номер умови .

Зауважте, важлива межа, коли κ(𝐀) схиляється до

κ(𝐀)1κ(𝐀)+112κ(𝐀)forκ(𝐀)1.

Ця межа показує більш швидкий коефіцієнт конвергенції порівняно з ітераційними методами Якобі або Гаусса-Сейделя, які масштабуються як 12κ(𝐀) .

Метод попередньо обумовленого градієнта

У більшості випадків попередня підготовка необхідна для забезпечення швидкої конвергенції методу градієнта спряжених. Метод попередньо обумовленого градієнта має такий вигляд:

𝐫0:=𝐛𝐀𝐱0
𝐳0:=𝐌1𝐫0
𝐩0:=𝐳0
k:=0
repeat
αk:=𝐫k𝖳𝐳k𝐩k𝖳𝐀𝐩k
𝐱k+1:=𝐱k+αk𝐩k
𝐫k+1:=𝐫kαk𝐀𝐩k
if rk+1 is sufficiently small then exit loop end if
𝐳k+1:=𝐌1𝐫k+1
βk:=𝐳k+1𝖳𝐫k+1𝐳k𝖳𝐫k
𝐩k+1:=𝐳k+1+βk𝐩k
k:=k+1
end repeat
The result is xk+1

Вищевказаний склад еквівалентний застосуванню методу градієнта спряженого без попереднього обумовлення системи Шаблон:Ref label

𝐄1𝐀(𝐄1)𝖳𝐱^=𝐄1𝐛

де

𝐄𝐄𝖳=𝐌,𝐱^=𝐄𝖳𝐱.

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

Прикладом часто використовуваного попереднього кондиціонера є неповна факторизація Холеського .

Метод гнучких попередньо обумовлених градієнтів

У важкозахисних програмах застосовуються складні попередні кондиціонери, що може призвести до змінної попередньої кондиціонування, що змінюється між ітераціями. Навіть якщо попередній кондиціонер є симетричним позитивно-визначеним на кожній ітерації, той факт, що він може змінитися, робить аргументи вище недійсними, а на практичних тестах призводить до значного уповільнення конвергенції алгоритму, представленого вище. Використовуючи формулу Поляка-Ріб'єра

βk:=𝐳k+1𝖳(𝐫k+1𝐫k)𝐳k𝖳𝐫k

замість формули Флетчер-Рівз

βk:=𝐳k+1𝖳𝐫k+1𝐳k𝖳𝐫k

може різко покращити конвергенцію в цьому випадку. [5] Цей варіант попередньо обумовленого методу градієнта кон'югату можна назвати [6] гнучким, оскільки він дозволяє змінювати попередню умову. Також показано, що гнучка версія [7] є надійною, навіть якщо попередній кондиціонер не є симетричним позитивним значенням (SPD).

Реалізація гнучкої версії вимагає зберігання додаткового вектора. Для фіксованого попереднього кондиціонера SPD, 𝐳k+1𝖳𝐫k=0, тому обидві формули для Шаблон:Mvar еквівалентні в точній арифметиці, тобто без похибки округлення .

Математичне пояснення кращої поведінки конвергенції методу за формулою Поляка-Ріб'єра полягає в тому, що метод в цьому випадку є локально оптимальним, зокрема, він не зближується повільніше, ніж локально оптимальний метод найбільш крутого спуску. [8]

Приклад коду в MATLAB / GNU Octave

function [x, k] = cgp(x0, A, C, b, mit, stol, bbA, bbC)
% Synopsis:
% x0: initial point
% A: Matrix A of the system Ax=b
% C: Preconditioning Matrix can be left or right
% mit: Maximum number of iterations
% stol: residue norm tolerance
% bbA: Black Box that computes the matrix-vector product for A * u
% bbC: Black Box that computes:
%      for left-side preconditioner : ha = C \ ra
%      for right-side preconditioner: ha = C * ra
% x: Estimated solution point
% k: Number of iterations done 
%
% Example:
% tic;[x, t] = cgp(x0, S, speye(1), b, 3000, 10^-8, @(Z, o) Z*o, @(Z, o) o);toc
% Elapsed time is 0.550190 seconds.
%
% Reference:
%  Métodos iterativos tipo Krylov para sistema lineales
%  B. Molina y M. Raydan - {{ISBN|908-261-078-X}}
        if nargin < 8, error('Not enough input arguments. Try help.'); end;
        if isempty(A), error('Input matrix A must not be empty.'); end;
        if isempty(C), error('Input preconditioner matrix C must not be empty.'); end;
        x = x0;
        ha = 0;
        hp = 0;
        hpp = 0;
        ra = 0;
        rp = 0;
        rpp = 0;
        u = 0;
        k = 0;

        ra = b - bbA(A, x0); % <--- ra = b - A * x0;
        while norm(ra, inf) > stol
                ha = bbC(C, ra); % <--- ha = C \ ra;
                k = k + 1;
                if (k == mit), warning('GCP:MAXIT', 'mit reached, no conversion.'); return; end;
                hpp = hp;
                rpp = rp;
                hp = ha;
                rp = ra;
                t = rp' * hp;
                if k == 1
                        u = hp;
                else
                        u = hp + (t / (rpp' * hpp)) * u;
                end;
                Au = bbA(A, u); % <--- Au = A * u;
                a = t / (u' * Au);
                x = x + a * u;
                ra = rp - a * Au;
        end;

Місцево оптимальний метод найбільш стрімкого спуску

І в оригінальному, і в попередньо обумовленому методах градієнта кон'югату потрібно лише встановити βk:=0 щоб зробити їх локально оптимальними, використовуючи пошук лінії, найкрутіші методи спуску . При цій підстановці вектори Шаблон:Math завжди такі ж, як вектори Шаблон:Math, тому немає необхідності зберігати вектори Шаблон:Math . Таким чином, кожна ітерація цих найбільш стрімких методів спуску є дещо дешевшою порівняно з методом спряженого градієнта. Однак останні сходяться швидше, якщо не застосовується (високо) змінна та / або попередній кондиціонер, який не є SPD, див. Вище.

Виведення методу

Метод спряженого градієнта може бути отриманий з кількох різних точок зору, включаючи спеціалізацію методу спряженого спрямування для оптимізації та варіацію ітерації Арнольді / Ланцоса для проблем власного значення. Незважаючи на розбіжність у підходах, ці виводи поділяють загальну тему - доказуючи ортогональність залишків та сукупність напрямків пошуку. Ці дві властивості мають вирішальне значення для розробки добре відомого стислого способу.

Спряження градієнта на нормальних рівняннях

Кон'югат градиентного метод може бути застосований до довільного п матриця з розмірністю м матриці, застосовуючи його до нормальним рівнянням Т А і права частина вектора А Т Ь, так як Т А є симетричною позитивно-полуопределена матрицею для будь-якого А. Результат - це спряжений градієнт у звичайних рівняннях (CGNR).

A T Ax = A T b

Як ітераційний метод не потрібно явно формувати A T A в пам'яті, а лише виконувати матричний вектор і транспонувати множення матричного вектора. Отже, CGNR особливо корисний, коли A є розрідженою матрицею, оскільки ці операції зазвичай є надзвичайно ефективними. Однак недоліком формування нормальних рівнянь є те, що число умови κ ( A T A ) дорівнює κ 2 ( A ), тому швидкість конвергенції CGNR може бути повільною і якість приблизного рішення може бути чутливою до округлення помилки. Пошук хорошого попереднього кондиціонера часто є важливою частиною використання методу CGNR.

Запропоновано кілька алгоритмів (наприклад, CGLS, LSQR). Нібито алгоритм LSQR має найкращу числову стійкість, коли A погано обумовлений, тобто A має велике число умов .

Див. також

Примітки

Шаблон:Reflist

Література

Спосіб спряженого градієнта спочатку був запропонований в

Описи методу можна знайти в наступних підручниках:

Посилання

  • Hazewinkel, Michiel, ed. (2001) [1994], "Conjugate gradients, method of", Encyclopedia of Mathematics, Springer Science+Business Media B.V. / Kluwer Academic Publishers, ISBN 978-1-55608-010-4

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

  1. Шаблон:Cite journal
  2. The conjugation constraint is an orthonormal-type constraint and hence the algorithm bears resemblance to Gram-Schmidt orthonormalization.
  3. Шаблон:Cite book
  4. Шаблон:Cite book
  5. Шаблон:Cite journal
  6. Шаблон:Cite journal
  7. Henricus Bouwmeester, Andrew Dougherty, Andrew V Knyazev. Nonsymmetric Preconditioning for Conjugate Gradient and Steepest Descent Methods. Procedia Computer Science, Volume 51, Pages 276-285, Elsevier, 2015. https://doi.org/10.1016/j.procs.2015.05.241
  8. Шаблон:Cite journal