Ghouls, Goblins, and Ghosts… Boo! А еще про инерцию и масштабирование градиента(SGDm и Adagrad соответственно). Ну и про регуляризацию, да :) |
||
МЕНЮ Искусственный интеллект Поиск Регистрация на сайте Помощь проекту ТЕМЫ Новости ИИ Искусственный интеллект Разработка ИИГолосовой помощник Городские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Техническое зрение Чат-боты Авторизация |
2019-10-28 07:45 Датасет, используемый внизу, взят отсюда: 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 части: Обучаем нашу модель: Здесь у нас, кроме слоёв, только 2 настраиваемых параметра(пока что): В зависимости от того, как мы скомбинируем эти два параметра, могут возникнуть 3 ситуации: 2 — underfitting — большой loss на обучающей выборке и низкая точность на валидационной. 3 — overfitting — низкий loss на обучающей выборке, но низкая точность на валидационной. С первым всё понятно :) А что делать с третьим? Ответ прост — регуляризация!!! Раньше мы имели целевую функцию(loss function) вида: В методе Adagrad реализована L2 регуляризация, давайте ее и применим! Сначала для наглядности посмотрим на показатели модели без регуляризации: lr = 0.01, n_epochs = 500: lr = 0.01, n_epochs = 1000: lr = 0.01, n_epochs = 2000: lr = 0.01, n_epochs = 3000: lr = 0.01, n_epochs = 4000: lr = 0.01, n_epochs = 10к: Здесь видно, что при 4к+ эпох — модель уже оверфитит. Сейчас попробуем избежать этого: Для этого добавим параметр weight_decay для нашего метода оптимизации: С теми же параметрами lr и n_epochs получили: При 4к эпох: Вышло куда лучше, а добавили мы всего лишь 1 параметр в оптимизаторе :) Теперь рассмотрим SGDm(это стохастический градиентный спуск с небольшим расширением — эвристикой, если угодно). Суть заключается в том, что SGD(https://pytorch.org/docs/stable/optim.html#torch.optim.SGD) обновляет параметры весьма сильно после каждой итерации. Логично было бы «сглаживать» градиент, используя при этом градиенты с прошлых итераций(идея инерции): ? — параметр(вес) SGD без параметра momentum: SGD с параметром momentum: Получилось не сильно лучше, но суть здесь в том, что есть методы, использующие сразу идеи масштабирования и инерции. Например, Adam или Adadelta, которые сейчас показывают неплохие результаты. Источник: m.vk.com Комментарии: |
|