Автоматичне диференціювання

Матеріал з testwiki
Версія від 21:50, 15 лютого 2025, створена imported>A.sav (clean up, replaced: функії → функції за допомогою AWB)
(різн.) ← Попередня версія | Поточна версія (різн.) | Новіша версія → (різн.)
Перейти до навігації Перейти до пошуку

Автоматичне диференціювання (Шаблон:Lang-en, AD) в математиці та символьних обчисленнях — спосіб обчислити похідну для функції, яка задана алгоритмом.

AD використовує той факт, що довільна функція в комп'ютерній програмі все одно буде обчислюватись за допомогою арифметичних дій (+, -, *, /) та елементарних функцій стандартних бібліотек (exp, log, sin, cos, і т.д.). Застосовуючи ланцюгове правило, похідна довільного порядку може бути обчислена з заданою точністю, за кількість операцій, що пропорційна кількості операцій для обчислення самої функції.

Автоматичне диференціювання не є:

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

Ланцюгове правило вперед і назад

Основою AD є розклад диференціалів використовуючи ланцюгове правило. Застосувавши його до складеної функції Шаблон:Math отримаємо:

dydx=dydwdwdx
Рух вперед

Зафіксувавши незалежну змінну, і застосовуючи ланцюгове правило до проміжної функції, отримаємо:

yx=yw1w1x=yw1(w1w2w2x)=yw1(w1w2(w2w3w3x))=
Рух назад

Застосовуючи ланцюгове правило до початкової функції по нововведеній змінній отримаємо:

yx=yw1w1x=(yw2w2w1)w1x=((yw3w3w2)w2w1)w1x=

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

Використання дуальних чисел

Застосовуючи рух вперед, помістимо поряд із кожним числом, що використовується для обчислення функції, ще одне, яке міститиме значення похідної. Буквально, замінимо дійсне число a на конструкцію (a+aε), де a є дійсним числом, а ε є уявною одиницею, такою, що ε2=0. Така конструкція називається дуальним числом.

Тоді для арифметичних операцій отримаємо:

(a+aε)+(b+bε)=(a+b)+(a+b)ε=(a+b)+(a+b)ε
(a+aε)*(b+bε)=ab+(ab+ba)ε=ab+(ab)ε

Тобто, уявна частина знову буде містити значення похідної від виразу в дійсній частині.

Запишемо дуальні числа без уявної одиниці у вигляді впорядкованої пари a,a і використаємо ланцюгове правило для функції двох аргументів g:

g(a,a,b,b)=g(a,b),ga(a,b)a+gb(a,b)b

де ga та gb є похідними g по першому та другому аргументу відповідно.

Підставивши замість g арифметичні операції та елементарні функції, отримаємо повний набір операцій над дуальними числами:

a,a+b,b=a+b,a+ba,ab,b=ab,aba,a*b,b=ab,ab+aba,a/b,b=ab,ababb2(b0)sina,a=sin(a),acos(a)cosa,a=cos(a),asin(a)expa,a=expa,aexpaloga,a=log(a),a/a(a>0)a,ak=ak,kak1a(a0)|a,a|=|a|,asigna(a0)

Реалізація

Реалізація автоматичного диференціювання можлива через:

Джерела

Шаблон:Перекласти

Шаблон:Диференційовні обчислення