Перейти до змісту

Лабораторна робота 11. Градієнтний спуск: як крок змінює поведінку алгоритму

Коротко про роботу

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

Ця робота виконується після лекцій 16. Вона спирається лише на матеріал, який уже пройдено до цього заняття.

▶ Відкрити робочий зошит у браузері

1. Ситуація

Два коефіцієнти регулятора треба налаштувати так, щоб зменшити функцію втрат. Формула градієнта відома, але один і той самий алгоритм може працювати добре або погано залежно від довжини кроку.

Головне питання роботи: Який фіксований крок дає надійну збіжність і як це видно з історії ітерацій?

2. Що вже потрібно знати

Перед початком достатньо розуміти такі речі з попередніх лекцій:

  • градієнт;
  • ітераційний алгоритм;
  • критерій зупинки;
  • норма градієнта;

Якщо якийсь пункт забувся, поверніться до відповідної лекції. У цій роботі нова теорія не вводиться без пояснення.

3. Як перейти від ситуації до математики

Градієнтний спуск повторює один крок: беремо поточну точку, віднімаємо градієнт, помножений на \(\alpha\), і отримуємо нову точку. Уся лабораторна досліджує, що змінюється, коли \(\alpha\) занадто мале або занадто велике.

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

4. Ваш варіант

У notebook змініть тільки один рядок:

STUDENT_X = 1  # поставте свій номер 1..30

Номер варіанта змінює числа, але не дає готового способу розв’язання. Основна частина роботи однакова для всіх: побудувати правильну модель, зробити потрібний вибір і перевірити результат.

Після запуску комірки «Дані вашого варіанта» notebook покаже всі числа, потрібні для роботи. Вручну підставляти STUDENT_X у формули не потрібно. Спочатку подивіться на отримані дані та підпишіть, що означає кожен масив або параметр.

5. Де тут треба подумати

Не обирайте крок лише тому, що «в кінці число менше». Подивіться на всю історію: чи спадає функція, чи коливається, чи ростуть координати.

Перед тим як писати код, дайте собі відповідь на два питання:

  1. Як за історією ітерацій відрізнити повільний крок від нестійкого?
  2. Чому найменше число ітерацій не завжди означає найнадійніший вибір кроку?

Відповідь не треба робити довгою. Достатньо 1–2 речень на кожне питання. Це допомагає перевірити, що ви розумієте задачу до запуску обчислень.

6. Послідовність роботи

Крок 1. Реалізувати одну функцію GD

Функція повинна приймати alpha, старт, max_iter і допуск. Не пишіть окремий алгоритм для кожного кроку.

Крок 2. Зберігати історію

На кожній ітерації записуйте k, x, f(x) і норму градієнта.

Крок 3. Запустити кілька кроків

Використайте малий, помірний і завідомо великий крок.

Крок 4. Класифікувати поведінку

Для кожного запуску визначте: повільна збіжність, стабільна збіжність, коливання або розбіжність.

Крок 5. Обрати робочий крок

Обґрунтуйте вибір історією, а не тільки фінальною точкою.

Крок 6. Незалежно перевірити результат

Для квадратичної функції знайдіть еталонну стаціонарну точку з рівняння \(Qx+c=0\) і порівняйте.

7. Python

Використовуйте: NumPy, Matplotlib.

Не намагайтеся вмістити всю роботу в одну велику комірку. Зручніше мати окремі невеликі блоки: дані → модель → обчислення → перевірка → висновок. Назви змінних повинні показувати їхній зміст.

8. Локальна самоперевірка

У робочому notebook наперед створені назви змінних, які читає автоматична перевірка. Не перейменовуйте їх. Ви самі пишете спосіб розв’язання, але фінальний результат записуєте у визначені змінні.

Змінна Що записати
tested_steps три значення кроку з умови
classification три рядки: "збіжний" або "нестійкий"
chosen_step обраний збіжний крок
x_solution фінальна точка GD
objective_value f(x_solution)
grad_norm норма градієнта у фінальній точці
iterations кількість ітерацій для chosen_step

Після виконання всіх кроків запустіть комірку «Локальна самоперевірка». Для вашого STUDENT_X вона читає наперед обчислені контрольні значення та порівнює з ними всі результатні змінні з таблиці вище. Числові значення порівнюються з указаним допуском; логічні, текстові та дискретні результати — точно. Для множин індексів порядок елементів не має значення, а для напрямів власних векторів враховується еквівалентність v та -v.

  • ✅ OK означає, що всі результатні змінні збігаються з контрольними значеннями в межах заданих допусків.
  • означає, що біля конкретної змінної буде вказано, яке порівняння не пройдено.

Самоперевірка не замінює короткий предметний висновок: після OK поясніть своїми словами, що означає отриманий результат у ситуації цієї лабораторної.

9. Що має бути у звіті

Звіт не повинен бути переписаним notebook. Покажіть вихідні дані, ключові проміжні результати, перевірки та короткий висновок своїми словами. У звіті обов’язково мають бути:

  1. номер вашого варіанта;
  2. вихідні дані, які реально використовувалися;
  3. ключовий проміжний результат, на якому ґрунтується рішення;
  4. фінальний результат;
  5. незалежна числова перевірка;
  6. коротке пояснення, що цей результат означає в початковій прикладній ситуації.

Наприкінці дайте відповідь на головне питання лабораторної одним коротким абзацом.

10. Контрольні питання

  1. Як з історії ітерацій побачити надто великий крок?
Показати відповідь Значення функції може коливатися або зростати, а координати й норма градієнта можуть перестати зменшуватися.
  1. Чому дуже малий крок теж небажаний?
Показати відповідь Алгоритм може бути стабільним, але рухатися до мінімуму надто повільно й витрачати багато ітерацій.