Автоматичне диференціювання (англ. automatic differentiation, AD) в математиці та символьних обчисленнях — спосіб обчислити похідну для функції, яка задана алгоритмом.
AD використовує той факт, що довільна функція в комп'ютерній програмі все одно буде обчислюватись за допомогою арифметичних дій (+, -, *, /) та елементарних функцій стандартних бібліотек (exp, log, sin, cos, і т.д.). Застосовуючи ланцюгове правило, похідна довільного порядку може бути обчислена з заданою точністю, за кількість операцій, що пропорційна кількості операцій для обчислення самої функції.
Автоматичне диференціювання не є:
Символьне диференціювання не завжди ефективне, оскільки деякі функції важко представити єдиним виразом, а чисельне диференціювання призводить до внесення похибок округлення та дискретизації. Обидва ці методи не є зручними для обчислення похідних високих порядків, оскільки похибка і складність значно зростає. Також обидва ці методи є повільними при обчисленні часткових похідних для функції багатьох аргументів. Автоматичне диференціювання вирішує всі ці проблеми, але вводить додаткову програмну залежність.
Основою AD є розклад диференціалів використовуючи ланцюгове правило. Застосувавши його до складеної функції y = g(h(x)) = g(w) отримаємо:
![{\displaystyle {\frac {dy}{dx}}={\frac {dy}{dw}}{\frac {dw}{dx}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/1c080e8b9800bcf116cb4b1a23fb4c46ed3dc15b)
- Рух вперед
Зафіксувавши незалежну змінну, і застосовуючи ланцюгове правило до проміжної функції, отримаємо:
![{\displaystyle {\frac {\partial y}{\partial x}}={\frac {\partial y}{\partial w_{1}}}{\frac {\partial w_{1}}{\partial x}}={\frac {\partial y}{\partial w_{1}}}\left({\frac {\partial w_{1}}{\partial w_{2}}}{\frac {\partial w_{2}}{\partial x}}\right)={\frac {\partial y}{\partial w_{1}}}\left({\frac {\partial w_{1}}{\partial w_{2}}}\left({\frac {\partial w_{2}}{\partial w_{3}}}{\frac {\partial w_{3}}{\partial x}}\right)\right)=\cdots }](https://wikimedia.org/api/rest_v1/media/math/render/svg/937d7cab44c2fd90fbfcc8139dbc18c3240bba4f)
- Рух назад
Застосовуючи ланцюгове правило до початкової функції по нововведеній змінній отримаємо:
![{\displaystyle {\frac {\partial y}{\partial x}}={\frac {\partial y}{\partial w_{1}}}{\frac {\partial w_{1}}{\partial x}}=\left({\frac {\partial y}{\partial w_{2}}}{\frac {\partial w_{2}}{\partial w_{1}}}\right){\frac {\partial w_{1}}{\partial x}}=\left(\left({\frac {\partial y}{\partial w_{3}}}{\frac {\partial w_{3}}{\partial w_{2}}}\right){\frac {\partial w_{2}}{\partial w_{1}}}\right){\frac {\partial w_{1}}{\partial x}}=\cdots }](https://wikimedia.org/api/rest_v1/media/math/render/svg/206c0444486628d70d2617e8eee8a528775e516c)
Рух вперед і назад є крайніми випадками застосування ланцюгового правила. Задача ж обчислення повного Якобіана з мінімальною кількістю операцій є NP-повною.
Застосовуючи рух вперед, помістимо поряд із кожним числом, що використовується для обчислення функії, ще одне, яке міститиме значення похідної. Буквально, замінимо дійсне число
на конструкцію
, де
є дійсним числом, а
є уявною одиницею, такою, що
. Така конструкція називається дуальним числом.
Тоді для арифметичних операцій отримаємо:
![{\displaystyle (a+a'\varepsilon )+(b+b'\varepsilon )=(a+b)+(a'+b')\varepsilon =(a+b)+(a+b)'\varepsilon }](https://wikimedia.org/api/rest_v1/media/math/render/svg/b47f5afe35335b28e0f388a6d1d3242613eafb22)
![{\displaystyle (a+a'\varepsilon )*(b+b'\varepsilon )=ab+(ab'+ba')\varepsilon =ab+(ab)'\varepsilon }](https://wikimedia.org/api/rest_v1/media/math/render/svg/5cbedac7443ea4f33b9e13d72f83e3396d87f80f)
Тобто, уявна частина знову буде містити значення похідної від виразу в дійсній частині.
Запишемо дуальні числа без уявної одиниці у вигляді впорядкованої пари
і використаємо ланцюгове правило для функції двох аргументів
:
![{\displaystyle g(\langle a,a'\rangle ,\langle b,b'\rangle )=\langle g(a,b),\;\;g_{a}(a,b)a'+g_{b}(a,b)b'\rangle }](https://wikimedia.org/api/rest_v1/media/math/render/svg/df6addd07450a92b4009d4e249a8f59c2fdecc09)
де
та
є похідними
по першому та другому аргументу відповідно.
Підставивши замість
арифметичні операції та елементарні функції, отримаємо повний набір операцій над дуальними числами:
![{\displaystyle {\begin{aligned}\left\langle a,a'\right\rangle +\left\langle b,b'\right\rangle &=\left\langle a+b,a'+b'\right\rangle \\\left\langle a,a'\right\rangle -\left\langle b,b'\right\rangle &=\left\langle a-b,a'-b'\right\rangle \\\left\langle a,a'\right\rangle *\left\langle b,b'\right\rangle &=\left\langle ab,a'b+ab'\right\rangle \\\left\langle a,a'\right\rangle /\left\langle b,b'\right\rangle &=\left\langle {\frac {a}{b}},{\frac {a'b-ab'}{b^{2}}}\right\rangle \quad (b\neq 0)\\\sin \left\langle a,a'\right\rangle &=\left\langle \sin(a),a'\cos(a)\right\rangle \\\cos \left\langle a,a'\right\rangle &=\left\langle \cos(a),-a'\sin(a)\right\rangle \\\exp \left\langle a,a'\right\rangle &=\left\langle \exp a,a'\exp a\right\rangle \\\log \left\langle a,a'\right\rangle &=\left\langle \log(a),a'/a\right\rangle \quad (a>0)\\\left\langle a,a'\right\rangle ^{k}&=\left\langle a^{k},ka^{k-1}a'\right\rangle \quad (a\neq 0)\\\left|\left\langle a,a'\right\rangle \right|&=\left\langle \left|a\right|,a'{\mbox{sign}}a\right\rangle \quad (a\neq 0)\end{aligned}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/ba9f95e3be2b44f3b74d869baadf392e8453084e)
Реалізація автоматичного диференціювання можлива через:
|
- Дивитись автоперекладену версію статті з мови «англійська».
- Перекладач повинен розуміти, що відповідальність за кінцевий вміст статті у Вікіпедії несе саме автор редагувань. Онлайн-переклад надається лише як корисний інструмент перегляду вмісту зрозумілою мовою. Не використовуйте невичитаний і невідкоригований машинний переклад у статтях української Вікіпедії!
- Машинний переклад Google є корисною відправною точкою для перекладу, але перекладачам необхідно виправляти помилки та підтверджувати точність перекладу, а не просто скопіювати машинний переклад до української Вікіпедії.
- Не перекладайте текст, який видається недостовірним або неякісним. Якщо можливо, перевірте текст за посиланнями, поданими в іншомовній статті.
- Докладні рекомендації: див. Вікіпедія:Переклад.
|
Диференційовні обчислення |
---|
| Загальне |
|
---|
| Поняття |
|
---|
| Мови програмування |
|
---|
| Застосування |
|
---|
| Апаратне забезпечення |
|
---|
| Програмні бібліотеки |
|
---|
| Втілення |
Аудіовізуальні |
|
---|
| Словесні |
|
---|
| Вирішувальні |
|
---|
|
---|
| Люди |
|
---|
| Організації |
|
---|
| |
|