ВСТУП
У цій роботі ми розглянемо застосування глибокого навчання за допомогою PyTorch, на основі проєкту "Rock, Paper, Scissors" з 6-го розділу книги Deep Learning with PyTorch Step-by-Step. Він досліджує основні етапи створення моделей глибокого навчання, від підготовки даних до оптимізації гіперпараметрів та візуалізації ефективності.
Але для кращого розуміння ми розглянемо наступні теми: EWMA Meets Gradients, Adam, Visualizing Adapted Gradients, Stochastic Gradient Descent (SGD), Learning Rate Schedulers, Putting It All Together.
1. EWMA Meets Gradients
Експоненціально зважена ковзаюча середня (EWMA) — це техніка, яка використовується для згладжування коливань у часових рядах і застосовується в оптимізації нейронних мереж, де її використовують для згладжування градієнтів і їхнього впливу на оновлення параметрів у сучасних оптимізаторах. EWMA також зменшує вплив різких градієнтів, роблячи оновлення більш стабільними та покращуючи конвергенцію.
2. Adam
Adam (Adaptive Moment Estimation) — це сучасний оптимізатор, який можна використовувати для відстеження середнього значення градієнтів та їхніх квадратів протягом часу.
Основна особливість цього оптимізатора — це використання швидкості SGB з моментумом та адаптацією швидкості навчання за допомогою Adagrad.
Основні компоненти Adam:
- β1: Контролює "момент", тобто, наскільки оптимізатор пам'ятає попередні градієнти для визначення напрямку оновлення.
- β2: Контролює "другий момент", що вимірює мінливість градієнтів. Це допомагає адаптувати швидкість навчання в залежності від величини градієнта.
- ϵ: Дуже мале значення, яке додається для запобігання числових помилок (наприклад, ділення на нуль).
Як працює Adam?
Моменти: На кожному кроці Adam обчислює два "моменти":
- Перший момент (m): Середнє значення попередніх градієнтів.
- Другий момент (v): Середнє значення квадратів попередніх градієнтів.
Корекція: Оскільки оптимізатор починає з нуля, він коригує ці значення, щоб уникнути упередженості на перших етапах.
Оновлення параметрів: З цими виправленими моментами Adam коригує ваги нейронної мережі, обчислюючи нову адаптовану швидкість навчання для кожного параметра.
Основні рівняння:
Підсумок:
- β1 допомагає оптимізатору запам'ятовувати попередні градієнти (напрямок).
- β2 допомагає налаштувати швидкість навчання в залежності від мінливості градієнтів.
- ϵ гарантує, що обчислення будуть стабільними, уникатимемо числових проблем.
3. Visualizing Adapted Gradients
Візуалізація адаптованих градієнтів. Ми побудуємо візуалізації, що показують, як адаптовані градієнти змінюються під час навчання, підкреслюючи ефекти експоненціальних середніх та масштабу градієнтів.
Розуміння цієї еволюції градієнтів допомагає краще визначити проблеми, які можуть виникати через занадто високі швидкості навчання, що може призвести до їхньої стагнації.
Приклад з PyTorch:
Використовуючи Adam:
import torch
import matplotlib.pyplot as plt
# Проста функція втрат
loss_fn = torch.nn.MSELoss()
x = torch.tensor([1.0], requires_grad=True)
y = torch.tensor([0.0])
optimizer = torch.optim.Adam([x], lr=0.1)
gradients = []
for _ in range(100):
optimizer.zero_grad()
loss = loss_fn(x, y)
loss.backward()
gradients.append(x.grad.item())
optimizer.step()
plt.plot(gradients)
plt.xlabel("Ітерації")
plt.ylabel("Градієнт")
plt.title("Еволюція градієнтів у Adam")
plt.show()
4. Stochastic Gradient Descent (SGD)
Розглянемо основи роботи SGD та його варіанти з моментумом і моментумом Нестерова, пояснивши інтуїцію, що стоїть за цими покращеннями.
Основи SGD: У SGD ваги оновлюються лише за допомогою поточного градієнта:
Моментум: Додає інерцію для згладжування різких оновлень:
Моментум Нестерова: Попереджає про наступний крок:
Learning Rate Schedulers
Показати, як різні планувальники швидкості навчання можуть бути застосовані, пояснивши теорію і реалізуючи практичні приклади.
Планувальники швидкості навчання динамічно налаштовують крок навчання. Приклади включають:
- StepLR: Зменшує швидкість навчання поетапно.
- ExponentialLR: Застосовує експоненціальне зменшення.
- CosineAnnealingLR: Імітує охолодження з плавним зниженням.
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.1)
for epoch in range(30):
optimizer.step()
scheduler.step()
print(f"Epoch {epoch}, LR: {scheduler.get_last_lr()}")
6. Збірка всього разом
Засновано на вище згаданих темах, інтегруючи EWMA, Adam, SGD та планувальники швидкості навчання. Як посилання використовуємо розділ книги, який називається "Putting It All Together".
Як фінальний приклад ми інтегруємо обговорені концепції в просту модель:
import torch
from torch.optim import Adam
from torch.optim.lr_scheduler import CosineAnnealingLR
# Фіктивні дані
x = torch.linspace(-1, 1, 100).reshape(-1, 1)
y = x**2
# Модель
model = torch.nn.Sequential(
torch.nn.Linear(1, 10),
torch.nn.ReLU(),
torch.nn.Linear(10, 1)
)
criterion = torch.nn.MSELoss()
optimizer = Adam(model.parameters(), lr=0.01)
scheduler = CosineAnnealingLR(optimizer, T_max=50)
for epoch in range(100):
optimizer.zero_grad()
predictions = model(x)
loss = criterion(predictions, y)
loss.backward()
optimizer.step()
scheduler.step()
if epoch % 10 == 0:
print(f"Epoch {epoch}, Loss: {loss.item()}")
7. Застосування: Rock, Paper, Scissors
Коди тут:
https://github.com/emelynfreire/DeepLearningwithPyTorch
Пояснення кожного етапу знизу:
Розділ: Імпорт бібліотек та початкове налаштування
Пояснення:
Цей блок коду відповідає за імпорт необхідних бібліотек для проєкту та налаштування початкових параметрів. Це включає:
- Імпорт основних бібліотек, таких як
torch
,torchvision
іmatplotlib
, які використовуються для обробки даних, створення моделей і візуалізації результатів. - Налаштування випадкових чисел для забезпечення відтворюваності експериментів.
Розділ: Нормалізація та трансформація даних
Пояснення:
Цей блок виконує підготовку даних перед навчанням, що включає:
- Створення трансформацій, таких як зміна розміру зображень, конвертація у тензори і нормалізація даних.
- Застосування трансформацій до навчальних і тестових наборів для забезпечення правильного формату зображень для обробки моделлю.
- Визначення data loaders, які завантажують дані пакетами, спрощуючи навчання і перевірку моделі.
Розділ: Визначення моделі
Пояснення:
Тут ми визначаємо архітектуру нейронної мережі, яку будемо використовувати для класифікації зображень "Rock, Paper, Scissors". Код включає:
- Створення згорткової нейронної мережі (CNN) з кількома шарами, включаючи згортки, пулинг і дроп-аут для регуляризації.
- Налаштування функції втрат, яка вимірює помилку моделі під час навчання.
- Визначення оптимізатора, який коригує ваги моделі на основі обчислених градієнтів.
Розділ: Тестування інтервалу швидкості навчання
Пояснення:
Цей блок проводить тест для визначення найкращого значення швидкості навчання для моделі. Це досягається через:
- Пошук значень швидкості навчання в певному інтервалі (наприклад, від 1e-4 до 1e-1).
- Коротке навчання моделі для оцінки впливу кожної швидкості навчання на зменшення втрат (loss).
3.
## Візуалізація результатів, де можна ідентифікувати оптимальне значення швидкості навчання на основі графіків.
Розділ: Навчання з циклічним планувальником
Пояснення:
На цьому етапі модель навчається з використанням циклічного планувальника, який динамічно налаштовує швидкість навчання протягом тренування. Це включає:
- Налаштування планувальника, з мінімальними та максимальними значеннями для швидкості навчання.
- Запуск тренування, де планувальник змінює швидкість навчання на кожній ітерації для покращення збіжності.
Розділ: Візуалізація результатів
Пояснення:
Цей блок представляє графіки для аналізу ефективності моделі під час тренування, включаючи:
- Графік втрат, який показує зменшення помилки протягом епох.
- Візуалізація градієнтів, що допомагає зрозуміти, як ваги моделі коригуються.
7. Висновок
Ця робота представила дидактичну реалізацію глибинного навчання з PyTorch, зосереджуючись на хороших практиках, таких як нормалізація даних, тестування швидкості навчання та використання планувальників. Застосування цих технік у практичних проєктах дозволяє оптимізувати моделі та отримати розуміння для реальних застосувань.
8. ДЖЕРЕЛА
Freire, Emelyn. Deep Learning with PyTorch. GitHub Repository. Доступно за посиланням: https://github.com/emelynfreire/DeepLearningwithPyTorch. Доступ: 13 січня 2025.
Godoy, Daniel Voigt. Deep Learning with PyTorch Step-by-Step: A Beginner’s Guide. Independently Published, 2024. Версія 1.2. Доступно за посиланням: https://leanpub.com/pytorch. Доступ: 13 січня 2025.
Перекладено з: Explorando o Capítulo 6 — “Deep Learning with PyTorch”