Ghouls, Goblins, and Ghosts… Boo! А еще про инерцию и масштабирование градиента(SGDm и Adagrad соответственно). Ну и про регуляризацию, да :)

МЕНЮ


Искусственный интеллект
Поиск
Регистрация на сайте
Помощь проекту

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


Датасет, используемый внизу, взят отсюда: https://www.kaggle.com/c/ghouls-goblins-and-ghosts-boo/submissions

Необходимо по набору характеристик обучить модель для классификации.

Весь исходный код туть в ноутбуке — https://github.com/YaphetS7/Kaggle/blob/master/ghouls-goblins-and-ghosts-boo.ipynb

На вкладке Data можно прочитать описание всех полей.

Загружаем данные, проверяем, что вообще имеем:

Значения поля type(Ghoul, Ghost, Goblin) просто заменим на на 0, 1 и 2.

Color — тоже необходимо обработать(нам нужны только числовые значения для построения модели). Для этого воспользуемся LabelEncoder и OneHotEncoder. Подробнее — https://habr.com/ru/post/456294/

Ну, на этом этапе наши данные уже и готовы. Осталось обучить нашу модель.

Сначала применим Adagrad(https://pytorch.org/docs/stable/optim.html#torch.optim.Adagrad):

По своей сущности — это модификация стохастического градиентного спуска, про который я писал в прошлый раз: https://habr.com/ru/post/472300/

Этот метод учитывает историю всех прошлых градиентов для каждого отдельно взятого параметра(идея масштабирования). Это позволяет уменьшать размер шага обучения для параметров, которые имеют большой градиент:

g — масштабирующий параметр(g0 = 0)
? — параметр(вес)
эпсилон — небольшая константа, введённая дабы не допустить деления на ноль

Датасет разделим на 2 части:
Обучающая выборка(train) и валидационная(val):

Обучаем нашу модель:

Здесь у нас, кроме слоёв, только 2 настраиваемых параметра(пока что):
learning rate и n_epochs(кол-во эпох).

В зависимости от того, как мы скомбинируем эти два параметра, могут возникнуть 3 ситуации:
1 — все хорошо, т.е. модель показывает низкий loss на обучающей выборке и высокую точность на валидационной.

2 — underfitting — большой loss на обучающей выборке и низкая точность на валидационной.

3 — overfitting — низкий loss на обучающей выборке, но низкая точность на валидационной.

С первым всё понятно :)
Со вторым, вроде, тоже — поставить больше эпох, поиграться с learning rate'ом

А что делать с третьим? Ответ прост — регуляризация!!!

Раньше мы имели целевую функцию(loss function) вида:
L = MSE(Y, y) без дополнительных слагаемых
Суть регуляризации заключается как раз в том, чтобы, добавив в целевую функцию некоторое слагаемое, «штрафовать» градиент, если он слишком большой. Иными словами — мы накладываем ограничение на нашу целевую функцию.
Существует множество методов регуляризации. Подробнее про L1 и L2 — регуляризацию: https://craftappmobile.com/l1-vs-l2-regularization/#_L1_L2

В методе Adagrad реализована L2 регуляризация, давайте ее и применим!

Сначала для наглядности посмотрим на показатели модели без регуляризации:

lr = 0.01, n_epochs = 500:
loss = 0.44...
Точность: 0.71

lr = 0.01, n_epochs = 1000:
loss = 0.41…
Точность: 0.75

lr = 0.01, n_epochs = 2000:
loss = 0.39…
Точность: 0.75

lr = 0.01, n_epochs = 3000:
loss = 0.367…
Точность: 0.76

lr = 0.01, n_epochs = 4000:
loss = 0.355…
Точность: 0.72

lr = 0.01, n_epochs = 10к:
loss = 0.285..
Точность: 0.69

Здесь видно, что при 4к+ эпох — модель уже оверфитит. Сейчас попробуем избежать этого:

Для этого добавим параметр weight_decay для нашего метода оптимизации:

С теми же параметрами lr и n_epochs получили:
loss = 0.367…
Точность: 0.73

При 4к эпох:
loss = 0.389…
Точность: 0.75

Вышло куда лучше, а добавили мы всего лишь 1 параметр в оптимизаторе :)

Теперь рассмотрим SGDm(это стохастический градиентный спуск с небольшим расширением — эвристикой, если угодно).

Суть заключается в том, что SGD(https://pytorch.org/docs/stable/optim.html#torch.optim.SGD) обновляет параметры весьма сильно после каждой итерации. Логично было бы «сглаживать» градиент, используя при этом градиенты с прошлых итераций(идея инерции):

? — параметр(вес)
µ — гиперпараметр инерции

SGD без параметра momentum:

SGD с параметром momentum:

Получилось не сильно лучше, но суть здесь в том, что есть методы, использующие сразу идеи масштабирования и инерции. Например, Adam или Adadelta, которые сейчас показывают неплохие результаты.


Источник: m.vk.com

Комментарии: