Connect with us

ШІ 101

Що таке градієнтний спуск?

mm

Що таке градієнтний спуск?

Якщо ви читали про те, як тренуються нейронні мережі, ви майже напевно зустрічали термін “градієнтний спуск” раніше. Градієнтний спуск є основним методом оптимізації продуктивності нейронної мережі, зменшення рівня помилок/похибок мережі. Однак градієнтний спуск може бути трохи важким для розуміння для тих, хто новий у машинному навчанні, і ця стаття буде намагатися дати вам належний інтуїтивний розуміння того, як працює градієнтний спуск.

Градієнтний спуск є алгоритмом оптимізації. Він використовується для покращення продуктивності нейронної мережі шляхом внесення змін до параметрів мережі так, щоб різниця між передбаченнями мережі та фактичними/очікуваними значеннями мережі (відомими як похибка) була якнайменше. Градієнтний спуск приймає початкові значення параметрів і використовує операції, засновані на калькулі, для调整 їхніх значень до тих значень, які зроблять мережу якнайточнішою. Вам не потрібно знати багато калькуля, щоб зрозуміти, як працює градієнтний спуск, але вам потрібно мати розуміння градієнтів.

Що таке градієнти?

Припустимо, що існує граф, який представляє кількість помилок, які робить нейронна мережа. Дно графа представляє точки найменшої помилки, тоді як верх графа – це місце, де помилка є найвищою. Ми хочемо рухатися від верху графа вниз до низу. Градієнт просто спосіб кількісної оцінки відносин між помилкою та вагами нейронної мережі. Відносини між цими двома речами можна графічно представити як нахил, з неправильними вагами, які дають більше помилок. Крутий нахил означає велике зменшення помилок і модель швидко вчиться, тоді як якщо нахил рівний нулю, модель знаходиться на плато і не вчиться. Ми можемо рухатися вниз по нахилу до меншої помилки, розрахувавши градієнт, напрям руху (зміна параметрів мережі) для нашої моделі.

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

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

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

Обчислення градієнтів та градієнтний спуск

Градієнтний спуск починається з місця високої похибки і через多циклічні ітерації робить кроки в напрямку найменшої похибки, маючи на меті знайти оптимальну конфігурацію ваг. Фото: Роман Сузі via Wikimedia Commons, CCY BY SA 3.0 (https://commons.wikimedia.org/wiki/File:Gradient_descent_method.png)

Для виконання градієнтного спуску спочатку потрібно обчислити градієнти. Для цього потрібно знати функцію втрат/функцію витрат. Ми будемо використовувати функцію витрат для визначення похідної. У калькулі похідна просто позначає нахил функції в даній точці, тому ми фактично просто обчислюємо нахил пагорба на основі функції похибки. Ми визначаємо похибку, проходячи коефіцієнти через функцію похибки. Якщо ми представимо функцію похибки як “f”, то ми можемо заявити, що рівняння для розрахунку похибки виглядає наступним чином (ми просто проходимо коефіцієнти через нашу вибрану функцію витрат):

Похибка = f(коефіцієнт)

Потім ми обчислюємо похідну, або визначаємо нахил. Отримання похідної похибки скаже нам, в якому напрямку є зверху або вниз по нахилу, надаючи нам відповідний знак для регулювання наших коефіцієнтів. Ми представимо відповідний напрям як “delta”.

delta = derivative_function(похибка)

Тепер ми визначили, в якому напрямку є вниз по нахилу до точки найменшої похибки. Це означає, що ми можемо оновити коефіцієнти в параметрах нейронної мережі і, можливо, зменшити похибку. Ми оновимо коефіцієнти на основі попередніх коефіцієнтів мінус відповідна зміна значення, визначена напрямом (delta) і аргументом, який контролює величину зміни (розмір нашого кроку). Аргумент, який контролює розмір оновлення, називається “темп навчання” і ми представимо його як “alpha”.

коефіцієнт = коефіцієнт – (alpha * delta)

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

Дуже важливо вибрати правильне значення для темпу навчання (alpha). Вибраний темп навчання повинен бути ні занадто малим, ні занадто великим. Помните, що коли ми наближаємося до точки найменшої похибки, наші кроки повинні ставати меншими, інакше ми можемо пропустити справжню точку найменшої похибки і опинитися на іншому боці. Точка найменшої похибки мала, і якщо наш темп зміни занадто великий, похибка може знову збільшитися. Якщо кроки занадто великі, продуктивність мережі буде продовжувати коливатися навколо точки найменшої похибки, перевищуючи її з одного боку, а потім з іншого. Якщо це відбувається, мережа ніколи не зійде до справжньої оптимальної конфігурації ваг.

Натомість, якщо темп навчання занадто малий, мережа потенційно може зайняти надзвичайно довгий час, щоб зійти до оптимальних ваг.

Типи градієнтного спуску

Тепер, коли ми розуміємо, як працює градієнтний спуск в цілому, давайте розглянемо деякі з різних типів градієнтного спуску.

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

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

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

Блогер і програміст з спеціалізацією у темах Machine Learning і Deep Learning. Даніель сподівається допомогти іншим використовувати силу штучного інтелекту для соціальної добробути.