Функції та похідні - Як навчається ШІ

Кафедра ШІзики

Автор

35 хвилин

Час читання

25.07.2025

Дата публікації

Рівень:
Середній
Теги: #функції #похідні #градієнт #оптимізація #навчання #математика

Лекція 4: Функції та похідні – Як ШІ знаходить найкращі рішення 📈

У попередніх лекціях ми навчилися працювати з даними (вектори та матриці) та трансформувати їх. Але як ШІ дізнається, які саме трансформації потрібні? Як нейронна мережа “навчається” розпізнавати котів чи передбачати погоду? Відповідь криється у функціях та їх похідних!

⚠️ Навчальне спрощення:
Ця лекція спрощує математичні концепції для кращого розуміння. Ми фокусуємося на інтуїції та практичних прикладах, а не на суворих доведеннях. Візуалізації можуть бути схематичними для ясності.

Функції – математичні “трансформери” 🔄

Що таке функція?

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

Уявіть функцію як машину, яка:

  • 📥 Приймає вхідні дані
  • ⚙️ Обробляє їх за правилом
  • 📤 Видає результат

Приклад 1: Кавова машина ☕

Уявіть функцію “приготування кави”:

f(кількість_кави)=міцність_напоюf(\text{кількість\_кави}) = \text{міцність\_напою}

Більш конкретно:

f(x)=2x+1f(x) = 2x + 1

Де:

  • xx – грами кави
  • f(x)f(x) – міцність напою (умовні одиниці)

Обчислення:

  • f(5)=25+1=11f(5) = 2 \cdot 5 + 1 = 11 (5г кави → міцність 11)
  • f(10)=210+1=21f(10) = 2 \cdot 10 + 1 = 21 (10г кави → міцність 21)
  • f(15)=215+1=31f(15) = 2 \cdot 15 + 1 = 31 (15г кави → міцність 31)

Інтерактивна візуалізація:

Приклад 2: Функція помилки робота-кота 🤖🐱

Наш робот-кіт намагається застрибнути на полицю. Функція помилки:

Помилка(v)=(v5)2\text{Помилка}(v) = (v - 5)^2

Де:

  • vv – швидкість стрибка (м/с)
  • 5 м/с – ідеальна швидкість
  • Помилка – наскільки далеко від цілі приземлився кіт

Візуалізація помилки:

Швидкість: 3 4 5 6 7 Помилка: 4 1 0 1 4 Результат: 😿 😐 😸 😐 😿

Ми бачимо, що:

  • При v=5v = 5: помилка = 0 (ідеально! 😸)
  • При v<5v < 5: недоліт (😿)
  • При v>5v > 5: переліт (😿)

Інтерактивна функція помилки:

Функції багатьох змінних 📊

У реальному ШІ функції залежать від багатьох параметрів.

Приклад: Ціна квартири

Ціна=f(площа,кімнати,поверх,район)\text{Ціна} = f(\text{площа}, \text{кімнати}, \text{поверх}, \text{район})

Спрощена модель:

f(x1,x2,x3)=1000x1+50000x25000x3+200000f(x_1, x_2, x_3) = 1000x_1 + 50000x_2 - 5000x_3 + 200000

Де:

  • x1x_1 – площа (м²)
  • x2x_2 – кількість кімнат
  • x3x_3 – поверх
  • 200000 – базова ціна

Приклад розрахунку:

  • Площа: 60 м²
  • Кімнати: 2
  • Поверх: 5
f(60,2,5)=100060+50000250005+200000f(60, 2, 5) = 1000 \cdot 60 + 50000 \cdot 2 - 5000 \cdot 5 + 200000 =60000+10000025000+200000=335000 грн= 60000 + 100000 - 25000 + 200000 = 335000 \text{ грн}

Похідні – швидкість зміни 🏃‍♂️

Інтуїтивне розуміння

Похідна показує, як швидко функція змінюється при зміні її вхідного значення.

Приклад: Швидкість автомобіля 🚗

Якщо положення автомобіля описується функцією:

s(t)=5t2s(t) = 5t^2

Де ss – відстань (м), tt – час (с).

Швидкість – це похідна положення за часом:

v(t)=s(t)=10tv(t) = s'(t) = 10t

Що це означає:

  • У момент t=1t = 1: швидкість = 10 м/с
  • У момент t=2t = 2: швидкість = 20 м/с
  • У момент t=3t = 3: швидкість = 30 м/с

Автомобіль розганяється!

Геометричний зміст похідної 📐

Похідна в точці = нахил дотичної лінії до графіка функції в цій точці.

Візуалізація для f(x)=x2f(x) = x^2:

  • У точці x=0x = 0: f(0)=0f'(0) = 0 (горизонтальна дотична)
  • У точці x=1x = 1: f(1)=2f'(1) = 2 (дотична йде вгору)
  • У точці x=2x = 2: f(2)=4f'(2) = 4 (дотична йде вгору крутіше)

Інтерактивна візуалізація f(x) = x² та її похідної:

Правила диференціювання 📝

Основні правила:

  1. Константа: ddx(c)=0\frac{d}{dx}(c) = 0
  2. Степенева функція: ddx(xn)=nxn1\frac{d}{dx}(x^n) = nx^{n-1}
  3. Сума: ddx[f(x)+g(x)]=f(x)+g(x)\frac{d}{dx}[f(x) + g(x)] = f'(x) + g'(x)
  4. Добуток на константу: ddx[cf(x)]=cf(x)\frac{d}{dx}[c \cdot f(x)] = c \cdot f'(x)

Приклад застосування:

Для функції помилки кота:

Помилка(v)=(v5)2=v210v+25\text{Помилка}(v) = (v - 5)^2 = v^2 - 10v + 25

Похідна:

Помилка(v)=2v10\text{Помилка}'(v) = 2v - 10

Що це означає:

  • Коли v<5v < 5: похідна від’ємна → помилка зменшується зі збільшенням швидкості
  • Коли v>5v > 5: похідна додатна → помилка збільшується зі збільшенням швидкості
  • Коли v=5v = 5: похідна = 0 → мінімум помилки!

Візуалізація функції помилки та її похідної:

Градієнт – компас у просторі параметрів 🦭

Часткові похідні

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

Приклад: Функція висоти гори

h(x,y)=(x2+y2)h(x, y) = -(x^2 + y^2)

Це перевернутий параболоїд – як гора з вершиною в (0, 0).

Часткові похідні:

hx=2x\frac{\partial h}{\partial x} = -2x hy=2y\frac{\partial h}{\partial y} = -2y

Градієнт – вектор усіх часткових похідних

Градієнт – це вектор, складений з усіх часткових похідних:

h=(hxhy)=(2x2y)\nabla h = \begin{pmatrix} \frac{\partial h}{\partial x} \\ \frac{\partial h}{\partial y} \end{pmatrix} = \begin{pmatrix} -2x \\ -2y \end{pmatrix}

Ключова властивість: Градієнт вказує в напрямку найшвидшого зростання!

Візуалізація градієнта 🏔️

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

Інтерактивна 3D візуалізація гори:

  • Градієнт вказує в напрямку найшвидшого підйому
  • Від’ємний градієнт вказує в напрямку найшвидшого спуску

Приклад обчислення:

У точці (1,2)(1, 2):

h(1,2)=(2122)=(24)\nabla h(1, 2) = \begin{pmatrix} -2 \cdot 1 \\ -2 \cdot 2 \end{pmatrix} = \begin{pmatrix} -2 \\ -4 \end{pmatrix}

Це означає:

  • Функція спадає швидше в напрямку yy (компонента -4)
  • Щоб піднятися на гору, рухайтесь у напрямку (2,4)(2, 4)

Градієнтний спуск – алгоритм навчання ШІ 🎯

Основна ідея

Градієнтний спуск – це метод пошуку мінімуму функції шляхом руху в напрямку, протилежному градієнту.

Алгоритм:

  1. Почати з випадкової точки
  2. Обчислити градієнт у цій точці
  3. Зробити крок у напрямку від’ємного градієнта
  4. Повторювати до досягнення мінімуму

Формула оновлення параметрів

θнові=θстаріαf(θстарі)\theta_{\text{нові}} = \theta_{\text{старі}} - \alpha \cdot \nabla f(\theta_{\text{старі}})

Де:

  • θ\theta – параметри (ваги, зміщення тощо)
  • α\alpha – швидкість навчання
  • f\nabla f – градієнт функції втрат

Приклад: Навчання робота-кота 🤖

Повернемося до нашого кота, що вчиться стрибати:

Функція помилки: E(v)=(v5)2E(v) = (v - 5)^2

Похідна: E(v)=2(v5)E'(v) = 2(v - 5)

Процес навчання з α=0.1\alpha = 0.1:

  1. Спроба 1: v0=2v_0 = 2 м/с

    • Помилка: E(2)=(25)2=9E(2) = (2-5)^2 = 9
    • Градієнт: E(2)=2(25)=6E'(2) = 2(2-5) = -6
    • Оновлення: v1=20.1(6)=2.6v_1 = 2 - 0.1 \cdot (-6) = 2.6
  2. Спроба 2: v1=2.6v_1 = 2.6 м/с

    • Помилка: E(2.6)=(2.65)2=5.76E(2.6) = (2.6-5)^2 = 5.76
    • Градієнт: E(2.6)=2(2.65)=4.8E'(2.6) = 2(2.6-5) = -4.8
    • Оновлення: v2=2.60.1(4.8)=3.08v_2 = 2.6 - 0.1 \cdot (-4.8) = 3.08
  3. Спроба 3: v2=3.08v_2 = 3.08 м/с

    • Помилка: E(3.08)=(3.085)2=3.69E(3.08) = (3.08-5)^2 = 3.69
    • І так далі…

Візуалізація прогресу:

Спроба: 1 2 3 4 5 ... 10 Швидкість: 2.0 2.6 3.08 3.46 3.77 ... 4.60 Помилка: 9.0 5.76 3.69 2.36 1.51 ... 0.16 Кіт: 😿 😟 😐 🙂 😊 ... 😸

🎮 Інтерактивна демонстрація навчання:

Тепер подивіться, як це працює в реальному часі! Натисніть “Почати навчання” і спостерігайте, як робот-кіт вчиться правильно стрибати:

Ітерація: 0
Швидкість: 2.0 м/с
Помилка: 9.0

Вибір швидкості навчання ⚡

Швидкість навчання α\alpha критично важлива:

Занадто мала (α=0.01\alpha = 0.01):

Ітерація: 1 10 50 100 200 Помилка: 9.0 8.1 5.2 3.3 1.3 🐌 занадто повільно...

💭 Уявіть: Ви йдете до магазину крихітними кроками по 1 см. Так, ви дійдете, але коли? За годину ви пройдете лише 36 метрів! Ваш робот-кіт так само “повзе” до мети - він витратить всю батарею, поки навчиться стрибати. У реальному світі це означає дні або тижні навчання замість годин.

Оптимальна (α=0.1\alpha = 0.1):

Ітерація: 1 5 10 15 20 Помилка: 9.0 1.5 0.24 0.04 0.006 швидко збігається!

🎯 Ідеальний баланс: Як досвідчений водій на дорозі - не занадто повільно (затримуєте інших), не занадто швидко (небезпечно), а саме з потрібною швидкістю! Кіт робить розумні кроки: спочатку великі, щоб швидко наблизитись, потім менші для точного приземлення. Це як стрільба з лука - треба знайти ідеальну силу натягу: слабко - стріла не долетить, сильно - перелетить мішень.

Занадто велика (α=1.5\alpha = 1.5):

Ітерація: 1 2 3 4 5 Помилка: 9.0 36 144 576 2304 💥 розбігається!

🚀 Катастрофа! Це як намагатися зловити метелика кувалдою - замість наближення до цілі, ви її руйнуєте! Робот-кіт стрибає так сильно, що перелітає через всю кімнату, відбивається від стіни і летить назад. З кожною спробою він відлітає все далі. У нейромережах це призводить до “вибуху градієнтів” - числа стають такими великими, що комп’ютер просто видає помилку.

Ланцюгове правило – фундамент глибокого навчання 🔗

Що таке ланцюгове правило?

Ланцюгове правило дозволяє обчислювати похідні складених функцій.

Якщо y=f(g(x))y = f(g(x)), то:

dydx=dydgdgdx\frac{dy}{dx} = \frac{dy}{dg} \cdot \frac{dg}{dx}

Приклад: Приготування ідеальної піци 🍕

Уявіть процес:

  1. Температура печіЧас випіканняЯкість піци

Математично:

  • tt – температура печі (°C)
  • m=g(t)=600tm = g(t) = \frac{600}{t} – час випікання (хв)
  • q=f(m)=(m15)2+100q = f(m) = -(m - 15)^2 + 100 – якість піци (бали)

Чому саме 15 хвилин? У формулі якості бачимо (m15)2(m - 15)^2 - це означає, що найкраща якість (100 балів) досягається коли m=15m = 15 хвилин. Якщо випікати менше або більше - якість погіршується!

Композиція: q(t)=f(g(t))=(600t15)2+100q(t) = f(g(t)) = -\left(\frac{600}{t} - 15\right)^2 + 100

Як температура впливає на якість?

Використовуючи ланцюгове правило:

dqdt=dqdmdmdt\frac{dq}{dt} = \frac{dq}{dm} \cdot \frac{dm}{dt}

Обчислюємо:

  • dqdm=2(m15)\frac{dq}{dm} = -2(m - 15)
  • dmdt=600t2\frac{dm}{dt} = -\frac{600}{t^2}

Отже:

dqdt=2(600t15)(600t2)\frac{dq}{dt} = -2\left(\frac{600}{t} - 15\right) \cdot \left(-\frac{600}{t^2}\right)

🤔 Що це означає простими словами?

Давайте розберемо на конкретних прикладах:

  1. При 200°C:

    • Час випікання: 600/200 = 3 хвилини (занадто швидко!)
    • Якість: -(3-15)² + 100 = -144 + 100 = -44 бали 🔥
    • Результат: Згоріла зверху, сира всередині!
  2. При 300°C:

    • Час випікання: 600/300 = 2 хвилини (все ще швидко)
    • Якість: -(2-15)² + 100 = -169 + 100 = -69 балів 💀
    • Результат: Вугілля замість піци!
  3. При 40°C:

    • Час випікання: 600/40 = 15 хвилин (ідеально!)
    • Якість: -(15-15)² + 100 = 0 + 100 = 100 балів 🍕✨
    • Результат: Золотиста скоринка, розплавлений сир!
  4. При 30°C:

    • Час випікання: 600/30 = 20 хвилин (занадто довго)
    • Якість: -(20-15)² + 100 = -25 + 100 = 75 балів 😐
    • Результат: Висохла, тверда як камінь

Висновок: Ланцюгове правило показує, як зміна температури (через зміну часу) впливає на якість. При 40°C досягаємо ідеальних 15 хвилин випікання!

Застосування в нейронних мережах 🧠

У нейронній мережі маємо багато шарів:

Вхід → Шар 1 → Шар 2 → ... → Шар N → Вихід x → h₁(x) → h₂(h₁) → ... → hₙ(...) → y

Щоб навчити мережу, потрібно знати, як кожна вага впливає на помилку. Ланцюгове правило дозволяє “передати” градієнт назад через усі шари!

Практичний приклад: Навчання ШІ грати в дартс 🎯

Постановка задачі

ШІ керує силою (ff) та кутом (θ\theta) кидка дротика. Мета – влучити в “яблучко”.

🎮 Уявіть ситуацію:

  • Робот стоїть на відстані 3 метри від дартс-дошки
  • “Яблучко” знаходиться на координатах (3, 1.7) - на висоті 1.7м (стандартна висота)
  • Робот кидає з висоти 1.5м (рука робота)
  • Робот може контролювати:
    • Швидкість кидка (vv): від 0 до 15 м/с
    • Кут кидка (θ\theta): від -45° до +45° (в радіанах)

Реалістична функція польоту (з гравітацією!):

Час польоту до мішені: t=3vcosθt = \frac{3}{v\cos\theta}

Висота дротика при влучанні: h=1.5+vsinθtgt22h = 1.5 + v\sin\theta \cdot t - \frac{g \cdot t^2}{2}

Де g=9.8g = 9.8 м/с² - прискорення вільного падіння

Функція промаху:

d(v,θ)=h1.7d(v, \theta) = |h - 1.7|

📐 Що відбувається фізично:

  • При θ=0°\theta = 0° (горизонтально): дротик відразу починає падати вниз
  • При θ>0°\theta > 0°: дротик летить по параболі вгору, потім вниз
  • При θ<0°\theta < 0°: дротик летить вниз (небезпечно!)
  • Чим більша швидкість, тим менше дротик встигає впасти

Реалістичні приклади:

  • v=8v=8 м/с, θ=0°\theta=0°: час польоту 0.375с, падає на 0.69м → влучає на висоті 0.81м (промах 0.89м) 😢
  • v=10v=10 м/с, θ=10°\theta=10°: летить по дузі, влучає на висоті 1.65м (промах 0.05м) 😊
  • v=12v=12 м/с, θ=5°\theta=5°: майже ідеально! Влучає на 1.71м (промах 0.01м) 🎯

Функція втрат:

L(v,θ)=d(v,θ)2L(v, \theta) = d(v, \theta)^2

Чому квадрат? Щоб більші промахи “карались” сильніше. Промах 2см дає втрату 4, а промах 10см - вже 100!

Градієнтний спуск для двох параметрів

🧮 Як робот вчиться?

Робот використовує градієнти, щоб зрозуміти, як змінити силу та кут:

Часткові похідні (інтуїтивно):

  • Lv\frac{\partial L}{\partial v} - “Якщо я кину швидше, дротик влучить вище чи нижче?”
  • Lθ\frac{\partial L}{\partial \theta} - “Якщо я підніму кут вгору, це компенсує падіння від гравітації?”

Фізична інтуїція:

  • Збільшення швидкості → менше часу в польоті → менше падіння від гравітації
  • Збільшення кута → дротик летить вище, але повільніше по горизонталі → більше часу падати

Математично:

Lv=2ddv\frac{\partial L}{\partial v} = 2d \cdot \frac{\partial d}{\partial v} Lθ=2ddθ\frac{\partial L}{\partial \theta} = 2d \cdot \frac{\partial d}{\partial \theta}

🎯 Стратегія навчання:

  1. Кинути дротик з поточними параметрами
  2. Виміряти промах
  3. Обчислити, в який бік треба змінити силу та кут
  4. Зробити маленький крок у правильному напрямку
  5. Повторити!

Процес навчання:

# Початкові параметри (робот починає з наївного налаштування!)
v = 8.0      # швидкість: 8 м/с (думає що сильно, але гравітація!)
θ = 0.0      # кут: 0° (кидає прямо, не враховує падіння)
α = 0.1      # швидкість навчання

# Фізичні константи
g = 9.8      # гравітація (м/с²)
distance = 3.0  # відстань до мішені (м)
target_height = 1.7  # висота "яблучка" (м)
robot_height = 1.5  # висота кидка (м)

# 10 ітерацій навчання
for i in range(10):
    # Крок 1: Обчислюємо траєкторію
    t = distance / (v * cos(θ))  # час польоту
    h = robot_height + v * sin(θ) * t - 0.5 * g * t * t  # висота влучання
    miss = abs(h - target_height)  # промах по висоті
    
    # Крок 2: Обчислюємо градієнти
    # "Як зміна параметрів вплине на висоту?"
    grad_v = calculate_gradient_v(v, θ)  # наприклад: -2.1 (швидше = вище!)
    grad_θ = calculate_gradient_θ(v, θ)  # наприклад: +5.3 (кидай вгору!)
    
    # Крок 3: Оновлюємо параметри
    v = v - α * grad_v  # 8.0 - 0.1*(-2.1) = 8.21 (трохи швидше)
    θ = θ - α * grad_θ  # 0.0 - 0.1*(5.3) = 0.053 рад (~3°)
    
    # Крок 4: Результат
    print(f"Спроба {i+1}: промах = {miss:.3f}м, v={v:.1f}м/с, θ={degrees(θ):.1f}°")
    
    # Фізика працює! Робот навчився компенсувати гравітацію!

Візуалізація результатів:

Спроба 1: 🎯........................ (89 см нижче!) Спроба 3: 🎯.................. (42 см нижче) Спроба 5: 🎯............ (12 см нижче) Спроба 7: 🎯...... (5 см нижче) Спроба 10: 🎯.. (2 см) Влучив! 🎉

🎮 Інтерактивна демонстрація навчання дартс:

Подивіться, як робот вчиться кидати дротики! Натисніть “Почати навчання” і спостерігайте, як градієнтний спуск допомагає роботу знайти правильну комбінацію швидкості та кута:

Ітерація: 0
Швидкість: 8.0 м/с
Кут: 0.0°
Промах: 0.89 м

🔍 Що відбувається за кадром:

Початок (Спроба 1):

  • Швидкість: 8.0 м/с, Кут: 0° (кидає прямо)
  • Результат: дротик падає на 0.89м нижче цілі!
  • Гравітація “з’їла” висоту за 0.375 секунди польоту
  • Градієнти кричать: “Кидай вгору! І швидше!”

Середина навчання (Спроба 5):

  • Швидкість: ~10.5 м/с, Кут: ~8°
  • Промах зменшився до 0.12м
  • Робот зрозумів: треба кидати під кутом вгору
  • Баланс між швидкістю та кутом майже знайдено

Фінал (Спроба 10):

  • Швидкість: ~11.2 м/с, Кут: ~6.5°
  • Промах всього 2 см!
  • Ідеальний компроміс: достатньо швидко (менше падіння) + правильний кут (компенсація гравітації)

💡 Ключові спостереження:

  1. Спочатку прогрес швидкий (5.2 → 3.1 см за 2 кроки)
  2. Потім уповільнюється (потрібна точність)
  3. Ніколи не досягає ідеального 0 (завжди є маленька похибка)
  4. Це нормально! В реальному світі 2 мм - чудовий результат

Підсумок та ключові концепції 🎓

Що ми вивчили:

  1. Функції – математичні правила трансформації даних

    • Описують зв’язки між змінними
    • Можуть мати одну або багато змінних
  2. Похідні – швидкість зміни функцій

    • Показують напрямок та крутизну зміни
    • Основа для оптимізації
  3. Градієнт – вектор часткових похідних

    • Вказує напрямок найшвидшого зростання
    • Ключ до навчання в багатовимірному просторі
  4. Градієнтний спуск – алгоритм оптимізації

    • Рух проти градієнта до мінімуму
    • Швидкість навчання контролює розмір кроку
  5. Ланцюгове правило – похідні складених функцій

    • Дозволяє навчати глибокі мережі
    • Основа алгоритму зворотного поширення

Чому це важливо для ШІ? 🤖

  • Навчання = оптимізація: ШІ навчається мінімізуючи функцію втрат
  • Градієнти показують напрямок: Куди рухати параметри для покращення
  • Ланцюгове правило масштабується: Працює для мереж з мільйонами параметрів
  • Автоматичне диференціювання: Сучасні фреймворки обчислюють градієнти автоматично

🎯 Головне правило:
Похідна показує напрямок найшвидшої зміни функції.
Градієнтний спуск йде проти цього напрямку, щоб знайти мінімум.
Це основа навчання всіх нейронних мереж!